Advertisement
Guest User

pwm

a guest
Dec 11th, 2019
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.13 KB | None | 0 0
  1. #include <xc.h>                                     //PIC hardware mapping
  2. #include<pic16f1829.h>
  3. #define _XTAL_FREQ 500000                            //Used by the XC8 delay_ms(x) macro
  4. //totale stap cycle van 256 stappen duurt 8 seconde elke stap duurt dus 32 miliseconde elke instrucite duurt  0,008 mili seconde 32/0,008 = 4000 stappen nodig maar de timer heeft maar 255 stappen dus gebruik maken van post of pre scalar.dus een scalar van 1:16.
  5. #define vertraging32 60500 //= 32000 (milisec) / 16 (want prescalar = 1:2 en 65536 (2^16) - 2000 = 63536)
  6.  
  7. //config bits that are part-specific for the PIC16F1829
  8. #pragma config FOSC=INTOSC, WDTE=OFF, PWRTE=OFF, MCLRE=OFF, CP=OFF, CPD=OFF, BOREN=ON, CLKOUTEN=OFF, IESO=ON, FCMEN=ON
  9. #pragma config WRT=OFF, PLLEN=OFF, STVREN=OFF,BORV = LO, LVP=OFF
  10.  
  11.  
  12. typedef enum {
  13.     dim,
  14.     fel,
  15.     noppes
  16. } knop;
  17.  
  18. unsigned int index = 0;
  19. volatile knop vroeger = dim;
  20. volatile knop nu = noppes;
  21.  
  22. void init(void) {
  23.     //setup clock
  24.     OSCCON = 0b00111000; //500KHz clock speed
  25.     //set up leds
  26.     TRISC = 0; //all LED pins are outputs
  27.     LATC = 0;
  28.     //set up button
  29.     TRISAbits.TRISA2 = 1; //switch as input
  30.     ANSELAbits.ANSA2 = 0; //digital switch
  31.  
  32.     //setup the PWM
  33.     CCP2CON = 0b00001100; //PWM mode single output
  34.     PR2 = 255; //Frequency at 486Hz. Anything over ~60Hz will get rid of any flicker
  35.     //PWM Period = [PR2 + 1]*4*Tosc*T2CKPS = [255 + 1] * 4 * (1 / 500KHz) * 1
  36.     CCPTMRSbits.C2TSEL = 0b00; //select timer2 as PWM source
  37.     T2CONbits.T2CKPS = 0b00; //1:1 prescaler
  38.     T2CONbits.TMR2ON = 1; //start the PWM
  39.  
  40.     //setup TIMER1 as the delay
  41.     T1CON = 0x10; // Fosc/4, prescaler 1:2, tmr1 of
  42.     //1:256 prescaler for a delay of: (insruction-cycle * 256-counts)*prescaler = ((8uS * 256)*256) =~ 524mS
  43.  
  44.     TMR1IE = 1;
  45.     PIE1bits.TMR1IE = 1; //enable the TMR4 rollover interrupt
  46.     PIR1bits.TMR1IF = 0;
  47.     //setup interrupt on change for the switch
  48.     INTCONbits.IOCIE = 1; //enable interrupt on change global
  49.     IOCANbits.IOCAN2 = 1; //when SW1 is pressed, enter the ISR
  50.  
  51.     PEIE = 1;
  52.     GIE = 1; //enable global interupt
  53. }
  54.  
  55. void __interrupt() ISR() {
  56.     if (PORTAbits.RA2 == 0 && IOCAFbits.IOCAF2 == 1) {
  57.         IOCAFbits.IOCAF2 = 0; //flag = clear
  58.         if (vroeger == dim) {
  59.             vroeger = fel;
  60.             nu = fel;
  61.         } else {
  62.             vroeger = dim;
  63.             nu = dim;
  64.         }
  65.     } else if (PORTAbits.RA2 == 1 && IOCAFbits.IOCAF2 == 1) {
  66.         IOCAFbits.IOCAF2 = 0;
  67.         nu = noppes;
  68.     }
  69.  
  70.     if (PIR1bits.TMR1IF == 1) {
  71.         PIR1bits.TMR1IF = 0;
  72.         TMR1 += vertraging32;
  73.  
  74.         switch (nu) {
  75.             case noppes:
  76.                 break;
  77.  
  78.             case dim:
  79.                 if (index > 0) {
  80.                     index--;
  81.                 }
  82.                 break;
  83.  
  84.             case fel:
  85.                 if (index < 255) {
  86.                     index++;
  87.                 }
  88.                 break;
  89.         }
  90.     }
  91.  
  92.     CCPR2L = ((PWM_Lookup[index] >> 2) & 0xFF);
  93.     CCP2CONbits.DC2B = ((PWM_Lookup[index] >> 8) & 0x03);
  94. }
  95.  
  96. void main() {
  97.     init();
  98.  
  99.     while (1) {
  100.  
  101.     }
  102.  
  103.  
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement