Vilken AVR använder du?
Man brukar aktivera interrupts globalt, sei(), efter att alla interruptinställningar gjorts. Vanligtvis placeras den precis innan huvudloopen startar.
> "Kopplingen mellan looparna och interruptrutinen verkar väldigt osäker." <-- Vad menar du?
Jag tänkte främst på din jämförelse med variabeln 'dutyCycle'. Visserligen har du så långa delays i looparna i main(), så det inte borde ställa till med några problem. Men lösningen känns ändå inte 100% säker.
Om du kör med samma frekvens på alla 8 kanaler så borde du kunna få in det i en vanlig timer-interrupt.
Kan man inte göra något sånt här?
Kod: Markera allt
volatile uint8_t pwm[8];
timerinterrupten()
{
static uint8_t counter = 0;
uint8_t i;
if (counter == 0)
PORTB = 0x00;
for (i=0; i<sizeof(pwm); i++)
if (counter > pwm[i])
PORTB |= _BV(i);
counter++;
}
edit: Lite kodfix och stavfel
edit2: kodfix igen