#include <p18f1320.h>
#pragma config WDT = OFF, LVP = OFF, OSC = INTIO2
#define ServoPin PORTBbits.RB4
#define ServoTris TRISBbits.TRISB4
#define ServoBit 4
void low_isr();
int isrServoPos;
#pragma code low_vector=0x18 //setup the ISR vector
void low_interrupt (){
_asm GOTO low_isr _endasm //jump to interrupt handler
}
#pragma code
#pragma interruptlow low_isr //the actual ISR
void low_isr(){
static unsigned char PortState; //to remember previous state
if((PortState^PORTB)&(1<<ServoBit)){ //has the servo pin changed?
if(PORTB&(1<<ServoBit)){ //is it the start of a pulse
TMR1L=0;
TMR1H=0; //yes, so start timer
T1CONbits.TMR1ON=1;
}else{ //must be end of pulse
T1CONbits.TMR1ON=0; //so, stop timer 1
isrServoPos=TMR1H*256+TMR1L; //Store 16 bit timer value
}
}
PortState=PORTB; //keep copy of previous state
INTCONbits.RBIF=0; //clear interrupt flag
}
#pragma code
void main(void){
int ServoPos;
OSCCON=0x70; //8MHz please
ADCON1=0x7f; //no ADC
INTCON2bits.NOT_RBPU=0; //WPU on
T1CON=0; //init timer 1
ServoTris=1; //servo pin set to input
INTCONbits.RBIE=1; //port B change interrupt enabled
INTCONbits.GIE=1; //Global interrupts enabled
while(1){
if(isrServoPos!=ServoPos)
ServoPos=isrServoPos;
}
}