Soft' PWM for that many outputs is difficult but you might be able to reduce 'overhead' using one of the following assembler methods;
Good luck on your project Sir. Regards, Mike
Code:; ; 6 bit (single port), 256 step, 20 cycles (isochronous) for 16F ; movf led+5,W ; led[5] duty cycle, 0..255 |B0 subwf dcy,W ; C = led[5] >= dcy |B0 rlf shadow,F ; |B0 movf led+4,W ; led[4] duty cycle, 0..255 |B0 subwf dcy,W ; C = led[4] >= dcy |B0 rlf shadow,F ; |B0 movf led+3,W ; led[3] duty cycle, 0..255 |B0 subwf dcy,W ; C = led[3] >= dcy |B0 rlf shadow,F ; |B0 movf led+2,W ; led[2] duty cycle, 0..255 |B0 subwf dcy,W ; C = led[2] >= dcy |B0 rrf shadow,F ; |B0 movf led+1,W ; led[1] duty cycle, 0..255 |B0 subwf dcy,W ; C = led[1] >= dcy |B0 rlf shadow,F ; |B0 movf led+0,W ; led[0] duty cycle, 0..255 |B0 subwf dcy,W ; C = led[0] >= dcy |B0 rlf shadow,F ; |B0 xorlw 0xFF ; for active hi outputs |B0 movwf PORTB ; update LEDs |B0 ; ; bump duty cycle counter ; movlw b'00111111' ; just in case |B0 incf dcy,F ; bump duty cycle counter |B0 skpnz ; end-of-period? no, skip, else |B0 movwf shadow ; reset shadow |B0Code:; ; 6 bit (single port), 256 step, 15 cycles (isochronous) for 18F ; movf dcy,W ; duty cycle counter, 0..255 cpfsgt Led+0 ; if(Led[0] >= dcy) bcf Shadow,0 ; Shadow.0 = 0 cpfsgt Led+1 ; if(Led[1] >= dcy) bcf Shadow,1 ; Shadow.1 = 0 cpfsgt Led+2 ; bcf Shadow,2 ; cpfsgt Led+3 ; bcf Shadow,3 ; cpfsgt Led+4 ; bcf Shadow,4 ; cpfsgt Led+5 ; bcf Shadow,5 ; movff Shadow,LATB ; ; ; bump duty cycle counter ; movlw b'00111111' ; just in case infsnz dcy,F ; if end-of-period movwf Shadow ; reset shadow




Bookmarks