;******************************************************************
; K8LH Soft-8 PWM Method *
;******************************************************************
;
; unsigned char Led[] = { 0,14,37,7,50,7,42,0 }; // 0..255 values
;
; unsigned char Interval = 0; // 0..255
; unsigned char Toggle[256]; //
;
; void isr_hi ()
; { if (PIR1bits.CCP1IF == 1) // if CCP1 "special event trigger"
; { PIR1bits.CCP1IF = 0; // clear CCP1 interrupt flag
; LATB ^= Toggle[Interval]; // update PWM output channel
; Toggle[Interval++] = 0; // clear array for next period
; if(Interval == 0) // if end of period, refresh array
; { Toggle[Led[0]] |= 1; // insert b0 output toggle bit
; Toggle[Led[1]] |= 2; // insert b1 output toggle bit
; Toggle[Led[2]] |= 4; // insert b2 output toggle bit
; Toggle[Led[3]] |= 8; // insert b3 output toggle bit
; Toggle[Led[4]] |= 16; // insert b4 output toggle bit
; Toggle[Led[5]] |= 32; // insert b5 output toggle bit
; Toggle[Led[6]] |= 64; // insert b6 output toggle bit
; Toggle[Led[7]] |= 128; // insert b7 output toggle bit
; Interval = 0; // reset for new period
; Toggle[0] ^= ~LATB; // initialize 1st toggle element
; }
; }
; }
;
; 78.125 Hz, 256 steps = 50.0 usec interrupts
;
; 9 cycles during int 0..254 and 28 cycles during int 255
;
Led equ 0x00 ; Led[8] (8 bytes)
Toggle equ 0x100 ; Toggle[256], 100..1FF
org 0x0008
v_inthi
bcf PIR1,TMR2IF ; clear timer 2 interrupt flag |
movf INDF0,W ; |
xorwf LATB,F ; LATB ^= Toggle[Interval] |
clrf INDF0 ; Toggle[Interval] = 0 |
incfsz FSR0L,F ; all 256 steps? yes, skip, else |
retfie FAST ; exit |
movf Led+0,W ; |
bsf PLUSW0,0 ; Toggle[Led[0]] |= 0b00000001 |
movf Led+1,W ; |
bsf PLUSW0,1 ; Toggle[Led[1]] |= 0b00000010 |
movf Led+2,W ; |
bsf PLUSW0,2 ; Toggle[Led[2]] |= 0b00000100 |
movf Led+3,W ; |
bsf PLUSW0,3 ; Toggle[Led[3]] |= 0b00001000 |
movf Led+4,W ; |
bsf PLUSW0,4 ; Toggle[Led[4]] |= 0b00010000 |
movf Led+5,W ; |
bsf PLUSW0,5 ; Toggle[Led[5]] |= 0b00100000 |
movf Led+6,W ; |
bsf PLUSW0,6 ; Toggle[Led[6]] |= 0b01000000 |
movf Led+7,W ; |
bsf PLUSW0,7 ; Toggle[Led[7]] |= 0b10000000 |
comf LATB,W ; |
xorwf Toggle,F ; Toggle[0] ^= ~LATB |
retfie FAST ; |
;