Hallo, ich habe hier ein vermutlich ganz einfaches Problem aber ich weiß einfach nicht wie ich es lösen soll: Timer 1 löst alle 100us aus, in der ISR ist dann ein switch der Abwechselnd unterschiedliche Ding macht. Das Problem ist jetzt dass der Timer immer erst wieder weiter läuft wenn die ISR verlassen wird, obwohl ich die neuen Zählerwerte gleich zu beginn wieder schreibe: ISR(TIMER1_OVF_vect) { cli(); TCNT1H = 0xff; TCNT1L = 0x12; .... sei(); } Das Problem ist dadurch natürlich dass die Interrupts nicht konstant alle 100us ausgelöst werden sondern je nachdem wie viel es in dem speziellen Fall zu tun gibt dauert es immer etwas bis viel länger. Wie kann man das denn beheben? Vielen Dank schon mal Lloyd
Hi Für solche Zwecke gibt es den CTC-Modus. Der Vergleichswert wird in ein Comparerregister geladen. Beim Erreichen des Wertes wird ein Interrupt ausgelöst und der Timer wird automatisch wieder auf Null gesetzt. Du brauchst dich nur um deine eigentliche ISR kümmern. MfG Spess
Und nimm das cli() und sei() raus. Das ist nicht nur überflüssig, sondern sogar kontraproduktiv.
Ok cli und sei habe ich raus genommen, habe aber noch den selben Effekt. Passiert im CTC Modus nicht genau das selbe und es wird erst weitergezählt wenn ich die ISR verlasse?
Kann es sein, das die Abarbeitung deiner Interruptroutine länger als 100us dauert? Kannst es ja in der Art prüfen: if (TIFR & (1 << OCF1A)) { puts("TIMER OVERFLOW\n"); } (Bit anpassen)
Hi >Passiert im CTC Modus nicht genau das selbe und es wird erst >weitergezählt wenn ich die ISR verlasse? Nein. Der Zähler läuft sofort weiter. MfG Spess
Danke euch allen! Lag tatsächlich daran dass die ISR teilweise länger dauerte als die Zeit zwischen 2 Interrupts.
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.