;
; void interrupt() // 125-usec (1000 cycle) interrupts
; { pir1.TMR2IF = 0; // clear TMR2 interrupt flag
; if(--frame == 0) // if 20-msec servo period
; { duty = servo; // refresh duty cycle work variable
; frame = 160; // reset 20-msec frame counter
; }
; if(duty > 250) // if duty cycle > 125 usecs
; ccpr1l = 250; // do a 100% duty cycle frame
; else // else
; ccpr1l = duty; // do a 0..100% duty cycle frame
; duty -= ccpr1l; // adjust duty cycle variable
; }
;
org 0x004
radix dec
v_int
banksel PIR1 ; bank 0 |B0
bcf PIR1,TMR2IF ; clear TMR2 interrupt flag |B0
decfsz frame,F ; 20-msec interval? |B0
bra prep ; no, branch, else |B0
movf ServoLo,W ; refresh "duty" variable |B0
movwf DutyLo ; |B0
movf ServoHi,W ; |B0
movwf DutyHi ; |B0
movlw 160 ; reset "frame" counter |B0
movwf frame ; |B0
prep
movlw 250 ; |B0
subwf DutyLo,W ; |B0
movlw 0 ; |B0
subwfb DutyHi,W ; |B0
movlw 250 ; assume 100% duty cycle |B0
skpc ; skip if duty >= 250 |B0
movf DutyLo,W ; else use "duty" |B0
banksel CCPR1L ; bank 5 |B5
movwf CCPR1L ; duty cycle for next period |B5
banksel DutyLo ; bank 0 |B0
subwf DutyLo,F ; |B0
movlw 0 ; |B0
subwfb DutyHi,F ; |B0
retfie ; |B0
;