Gast
#2243600
Hallo, ich hab ein etwas seltsames Verhalten: Beim ersten Mal nach dem Reset vom AVR wird der CCA vom Timer1 zu früh ausgelöst, danach scheint es immer korrekt zu laufen. Es dürfte wohl in der Initialisierung etwas faul sein... nur komme ich nicht drauf, hat wer einen Tipp für mich? Hier der Code vom Starten des Timers: void timer_init(void) { timer_reset(); TCCR1B = (TCCR1B & ~T1_PRESCALE_MASK) | T1_PRESCALE; } void TIM_reset(void) { TIMSK1 &= ~_BV(OCIE1A); TIMSK1 &= ~_BV(OCIE1B); OCR1A = 0; OCR1B = 0; TCNT1 = 0; } Interrupt aktivieren an CCA: uint8_t timer_attach_CCA(uint16_t count, void(*callback)(void)) { uint16_t value = count; if(callback_CCA) { return T1CCA_RESERVED; } value = value + TIM_Get_Value1(); OCR1A = value; callback_CCA= callback; TIMSK1 |= _BV(OCIE1A); return T1_OK; } ISR(TIMER1_COMPA_vect) { TIMSK1 &= ~_BV(OCIE1A); if (callback_CCA) { callback_CCA(); } callback_CCA=0; } In der Applikation wird dann timer_attach_CCA aufgerufen, wie gesagt beim ersten Mal wird die Funktion(callback) fast sofort ausgeführt ca. 20 Timerticks später, bei den Nachfolgenden exakt zu dem Eingstellten Zeitpunkt. (Habs mit Oszi und AVR Debugging versucht einzugrenzen nur komme ich nicht auf das Problem) Danke!