;
; within the interrupt service routine after saving context
;
;
incf PWMCTR,f ; increment master PWM counter
movf PWMCTR,W ;
xorlw d'100' ; cycled through all 100 values?
bnz test ; no, branch, else
clrf SHADOW ; turn on all LEDs in shadow GPR
clrf PWMCTR ; and reset master PWM counter
;
; test each LED PWM setting each interrupt against the PWMCTR
; value and turn off the shadow LEDx bit when PWMLEDx = PWMCTR
;
movf PWMCTR,W ; get current PWM count [00..99]
xorwf PWMLED0,W ; same as LED 0 PWM value?
skpnz ; no, skip, else
bsf SHADOW,0 ; turn off LED 0 bit in shadow GPR
;
movf PWMCTR,W ; get current PWM count [00..99]
xorwf PWMLED1,W ; same as LED 1 PWM value?
skpnz ; no, skip, else
bsf SHADOW,1 ; turn off LED 1 bit in shadow GPR
;
movf PWMCTR,W ; get current PWM count [00..99]
xorwf PWMLED2,W ; same as LED 2 PWM value?
skpnz ; no, skip, else
bsf SHADOW,2 ; turn off LED 2 bit in shadow GPR
;
movf PWMCTR,W ; get current PWM count [00..99]
xorwf PWMLED3,W ; same as LED 3 PWM value?
skpnz ; no, skip, else
bsf SHADOW,3 ; turn off LED 3 bit in shadow GPR
;
movf PWMCTR,W ; get current PWM count [00..99]
xorwf PWMLED4,W ; same as LED 4 PWM value?
skpnz ; no, skip, else
bsf SHADOW,4 ; turn off LED 4 bit in shadow GPR
;
movf PWMCTR,W ; get current PWM count [00..99]
xorwf PWMLED5,W ; same as LED 5 PWM value?
skpnz ; no, skip, else
bsf SHADOW,5 ; turn off LED 5 bit in shadow GPR
;
movf PWMCTR,W ; get current PWM count [00..99]
xorwf PWMLED6,W ; same as LED 6 PWM value?
skpnz ; no, skip, else
bsf SHADOW,6 ; turn off LED 6 bit in shadow GPR
;
movf PWMCTR,W ; get current PWM count [00..99]
xorwf PWMLED7,W ; same as LED 7 PWM value?
skpnz ; no, skip, else
bsf SHADOW,7 ; turn off LED 7 bit in shadow GPR
;
; finally, update PORTB from the SHADOW GPR
;
movf SHADOW,W ; get SHADOW LED bits
movwf PORTB ; update PORTB
;
; clear the interrupt flag, restore context, and return from interrupt
;