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.
Lesezeichen