Hallo Ich möchte den Timer2 als Impulszähler verwenden, getriggert von einem externen Takt (Rechteck-Impulse) an TOSC1 (PB6). Ich habe jetzt das Problem, dass der Interrupt nach Freigabe ständig ausgelöst, ohne dass der Takt überhaupt anliegt. Hier meine Initialisierung von Timer2 DDRB &= ~_BV(PB6); // PB6/XT1 input TIMSK2 &=~(_BV(OCIE2A)|_BV(OCIE2B)|_BV(TOIE2)); ASSR |= _BV(EXCLK); ASSR &= ~_BV(AS2); TCCR2A = 0x00; TCCR2B |= 0x01; TCNT2 = (uint8_t)MAX_COUNTS-IMPULSES; // 255-25 OCR2A = 0x00; OCR2B = 0x00; while (ASSR&0x1F); TIMSK2 |= _BV(TOIE2); TIFR2 |= _BV(TOV2); und die ISR dazu ISR (TIMER2_OVF_vect) // timer2 overflow interrupt { imp++; TCNT2 = (uint8_t)(MAX_COUNTS-IMPULSES;); } Weiss jemand ob der Timer2 überhaupt mit einem externen asynchronen Takt betrieben werden kann. Oder ist der Timer2 nur für einen externen 32kHz Quarz ausgelegt. mfg tom
> ASSR |= _BV(EXCLK); > ASSR &= ~_BV(AS2); Könnte es eventuell sein, dass die Bits beide gesetzt sein müssen? Wenn AS2 gelöscht ist, wird der Timer doch vom I/O-Clock getaktet. EXCLK selektiert nur innerhalb der asynchronen Betriebsart, ob ein Quarz an TOSC1 und TOSC2 oder ein Takt an TOSC1 verwendet werden soll.
> ASSR |= _BV(EXCLK); > ASSR &= ~_BV(AS2); Hier liegt vermutlich der Fehler. Wenn AS2 0 ist, wird der Timer intern getaktet. Du willst aber externen Takt.
Genial, das tut. Mein Problem war auch noch dass ich die Portinitialisierung DDRB &= ~_BV(PB6) vor kurzem noch nach der Timer2 Initialisierung hatte, dann bekommt man auch Probleme. vielen dank tom
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.