Hi Russ,

Have you considered using timer derived periodic interrupts and performing just one PWM "step" per interrupt? Perhaps spreading out 256 "steps" across the 8.333-msec period (8333-usecs/256 = 32.55-usec interrupts)?

Here's another method like Darrel's which would work well if you group the outputs consecutively (B7..B3 or B4..B0 for example). Updating the port from a 'shadow' register allows precise bit update timing (multiple bits with same duty cycle value will update at exactly the same time).

Regards, Mike

Code:
;
;  1/256th step, 18 cycles (isochronous), active high output
;  on duty cycle match until end-of-period
;
        clrf    shadow          ; clear 'shadow'                  |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
        rlf     shadow,F        ;                                 |B0
        movf    led+1,W         ; led[1] duty cycle, 0..255       |B0
        subwf   dcy,W           ; C = led[1] >= dcy               |B0
        rrf     shadow,F        ;                                 |B0
        movf    led+0,W         ; led[0] duty cycle, 0..255       |B0
        subwf   dcy,W           ; C = led[0] >= dcy               |B0
        rlf     shadow,W        ; W = led 'step' output           |B0
        movwf   PORTB           ; update LEDs                     |B0
        incf    dcy,F           ; bump duty cycle counter         |B0
;