#include __CONFIG(FOSC_INTOSC & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & CP_OFF & CPD_OFF & BOREN_ON & CLKOUTEN_OFF & IESO_OFF& FCMEN_OFF); __CONFIG(PLLEN_ON & LVP_OFF); #define SVO PORTAbits.RA0 unsigned char svoPos; //servo position void wait_ms(int value){ T2CON = 0b00000111; //T2=ON int i; for(i = 0; i < value; i++){ TMR2 = 0; while(1){ if(TMR2 > 64) break; } } T2CON = 0b00111001; //T2=OFF } static void interrupt isr(void){ if(TMR1IF == 1){ TMR1IF = 0; //intrrupt crear TMR1H = 216; //counter reset(20mSec long) TMR1L = 239; TMR4 = 0; //puls width counter crear PR4 = svoPos; //puls width set SVO = 1; //puls ON }else if(TMR4IF == 1){ TMR4IF = 0; //interrupt crear SVO = 0; //puls OFF } } void main(){ //---Clock setting--- OSCCON = 0b01111000; //16MHz //---IO setting--- ANSELA = 0b00000000; //All PORTA are Digital TRISA = 0b00000000; //0:output 1:input ANSELB = 0b11111110; //RB0 is Digital TRISB = 0b11111110; //0:output 1:input //---Timer1 setting--- T1CON = 0b00110000; //T1 setting (FOSC/4, 1:8 = 1000count/mS) TMR1IF = 0; TMR1IE = 1; //T1 interrupt enable TMR1H = 216; //counter reset(20mSec long) TMR1L = 239; //---Timer4 setting--- T4CON = 0b00000011; //FOSC/4, 1:64 62.5count/mS @16MHz TMR4IF = 0; TMR4IE = 1; //T4 interrupt disable TMR4 = 0; //---Interrupt set--- PEIE = 1; //Periferal interrupt enable GIE = 1; //General interrupt enable //---Timer start--- TMR1ON = 1; TMR4ON = 1; //---servo drive--- while(1){ svoPos = 94; //center wait_ms(2000); svoPos = 31; //-90deg wait_ms(2000); svoPos = 156; //+90deg wait_ms(2000); } }