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
Für Assembler kommt direkt von avr-gcc und kann als Vorlage dienen: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; }
Die Bits werden in "port" aufgesammelt und gemeinsam ausgegeben.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







Zitieren

Lesezeichen