Program:
/* Calculations * Fosc = 48MHz * * PWM Period = [(PR2) + 1] * 4 * TMR2 Prescale Value / Fosc * PWM Period = 200us * TMR2 Prescale = 16 * Hence, PR2 = 149 or 0x95 * * Duty Cycle = 10% of 200us * Duty Cycle = 20us * Duty Cycle = (CCPR1L:CCP1CON<5:4>) * TMR2 Prescale Value / Fosc * CCP1CON<5:4> = <1:1> * Hence, CCPR1L = 15 or 0x0F */ //#include<p18f4550.h> #include<xc.h> //unsigned char count=0; //bit TIMER,SPEED_UP; void main(void) { unsigned int i; TRISCbits.TRISC2 = 0; //CCP1 pin as output CCP1CON = 0b00101100; //Select PWM mode; Duty cycle LSB CCP1CON<4:5> = <1:1> T2CON = 0b00000010; //Prescalar = 16; Timer2 OFF GIE=1; TRISAbits.TRISA4=0; while(1) { TMR2=0; PR2 = 250; CCPR1L = 2; //Duty cycle 1% TMR2IF=0; TMR2ON = 1; //Timer2 ON for(int i=2;i<255;i+=50) { CCPR1L=i; for(int j=0;j<1000;j++) for(int k=0;k<10000;k++); LATAbits.LATA4=~LATAbits.LATA4; } } }
Output: