Mein Beispielcode aus dem Wiki (Artikel PWM) umgesetzt nach C, hier für 8 Kanäle, sie sämtilch an einem 8-Bit-Port ausgegeben werden, uns zwar pwm[0] an Pin0, etc

Code:
typedef struct
{
    uint8_t tick;
    uint8_t duty;
} pwm_t;

pwm_t pwm[8];

void job_pwm (uint8_t max)
{
    uint8_t i;
    //uint8_t max = 100;
    uint8_t port = 0;
    
    uint8_t * ppwm = (uint8_t*) & pwm[0];
    
    for (i= sizeof (pwm) / sizeof (pwm[0]); i > 0; i--)
    {
        uint8_t tick = * ppwm + 1;
        
        if (tick >= max)
            tick = 0;
            
        * ppwm++ = tick;
        
        port >>= 1;
        
        if (tick < * ppwm++)
            port |= 0x80;
    }
    
    PORTB = port;
}
Für Assembler kommt direkt von avr-gcc und kann als Vorlage dienen:
Code:
.global	job_pwm
job_pwm:
	ldi r20,lo8(0)	 ;  port,
	ldi r30,lo8(pwm)	 ;  ppwm,
	ldi r31,hi8(pwm)	 ;  ppwm,
	ldi r21,lo8(8)	 ;  i,
.L26:
	ld r19,Z	 ;  tick,* ppwm
	subi r19,lo8(-(1))	 ;  tick,
	cp r19,r24	 ;  tick, max
	brlo .L24	 ; ,
	ldi r19,lo8(0)	 ;  tick,
.L24:
	st Z+,r19	 ; , tick
	lsr r20	 ;  port
	ld r18,Z+	 ;  tmp50,
	cp r19,r18	 ;  tick, tmp50
	brsh .L23	 ; ,
	ori r20,lo8(-128)	 ;  port,
.L23:
	subi r21,lo8(-(-1))	 ;  i,
	brne .L26	 ; ,
	out 56-0x20,r20	 ; , port
	ret
Die Bits werden in "port" aufgesammelt und gemeinsam ausgegeben.