Die Initialisierung ist soweit ok. Es ist allerdings u.U. besser, TCCR0 wirklich zu setzen, damit alle Bits den gewünschten Wert haben. Sollte bei dir aber egal sein.
Wenn ich's recht sehe, willst du so was wie Timeouts machen: Nen Port an und nach ner bestimmten Zeit wieder aus, wahrscheinlich unterschiedliche Zeiten für die verschiedenen Ports...Code:void Timer_Inits(void) { //Timer Interrupt=(Quarzfreq 16000000/8Bit-Ueberlauf 256)/ Prescaler 1024= 16mS //letzte 3 Bit von Timer Clock Control: Prescaler = Quarz/1024: TCCR0 = (1 << CS00) | (1 << CS02); //Timer Interrupt Mask Register Bit 1 setzen fuer Timer Overflow Interrupt enable: TIMSK |=(1<<TOIE0); }
Du könntest dir eine Struktur machen mit Countdown-Werten, die du setzt und die in der ISR bis aus 0 zurückgezählt werden, eine Einheit pro Tick (16ms):
Dadurch werden in jedem Tick die Elemente von countdown, die nicht 0 sind, um 1 erniedrigt.Code:typedef struct { uint8_t takt; uint8_t bass; ... } countdown_t; volatile countdown_t countdown; SIGNAL (SIG_OVERFLOW0) { uint8_t i = sizeof (countdown_t); uint8_t * cd = (uint8_t *) &countdown; cd += i; do { uint8_t wert = *(--cd); if (wert) *cd = wert-1; } while (--i); }
Code:int main() { ioinit(); Timer_Inits(); sei(); // Hauptschleife while (1) { if (countdown.takt == 0) { countdown.takt = 200; countdown.bass = 20; PORTC |= (1 << 1); } if (countdown.bass == 0) { PORTC &= ~(1 << 1); } }







Zitieren

Lesezeichen