Guten Tag, ich programmiere schon eine Weile an einer Propeller Clock herum und habe die Ausgabe am laufen. Mit Timer1 messe ich die Dauer eines Umlaufes, wenn der überläuft dreht es sich zu langsam. Nu stelle ich fest dass wenn ich den Propeller anhalte oder langsam drehen lasse, dass sich die Variablen (Stunde, Minute, Sekunde) auf die Anfangswerte zurücksetzen. Kann das jemand erklären? Mein Code ist im Anhang, ich nutze einen Atmega32. danke für euren Input, Gruss Thomas
Ist wohl eher Timer0?
1 | //#############count clock here ################################
|
2 | ISR (TIMER0_COMP_vect) //Timer0 Interrupt |
3 | {
|
4 | sei(); //allow nested iRQ |
Wenn du IRQs kaskadieren willst/musst, dann solltest du in dieser ISR vor dem SEI den TIMER0_COMP deaktivieren und zum Ende der ISR nach einem CLI wieder aktivieren.
Hallo Johann, da stehe ich gerade auf dem Schlauch. Zweck der Übung ist es, dass Timer2 und externer 12 Uhr Interrupt die Sekundenzählung(Timer0) unterbrechen dürfen, dieser ist weniger zeitkritisch. Warum muss ich im Timer0 IRQ seinen eigenen IRQ deaktivieren? Der wird doch erst viel später wieder erwartet und unterbricht sich ja nicht selbst. Ausserdem hat der Timer0 mit der Drehzahl nix zu tun, das Problem müßte dann ja immer auftreten, kommt aber nur wenn ich den externen Interrupt länger nicht feuere (Propeller steht oder dreht langsam). Kannst das mal erklären? Danke sehr!!
Thomas wrote: > Hallo Johann, > da stehe ich gerade auf dem Schlauch. Zweck der Übung ist es, dass > Timer2 und externer 12 Uhr Interrupt die Sekundenzählung(Timer0) > unterbrechen dürfen, dieser ist weniger zeitkritisch. > Warum muss ich im Timer0 IRQ seinen eigenen IRQ deaktivieren? Der wird > doch erst viel später wieder erwartet und unterbricht sich ja nicht > selbst. Sicher? Durch Auftreten einer Timer2-IRQ/Ext-IRQ dauert die Timer0-ISR ja länger, so daß der IRQ möglicherweise getriggert wird, wenn die ISR noch am laufen ist. Die Stelle ist mit beim Überfliegen deines Codes ins Auge gesprungen. Ob sie mit deinem Problem was zu tun hat, kann ich nicht sagen. Jedenfalls ist es eine kritische Stelle. > Ausserdem hat der Timer0 mit der Drehzahl nix zu tun, das Problem müßte > dann ja immer auftreten, kommt aber nur wenn ich den externen Interrupt > länger nicht feuere (Propeller steht oder dreht langsam). > Kannst das mal erklären? Timer0-ISR wird durch (Nicht)-Auftreten von X-IRQ beeinflusst, und zwar nicht nur seine Latenz, sondern auch seine Dauer. Die T2-ISR ist sehr komplex, es gibt SPI-Warteschleifen und ich sehe mindestens 4 Modulos. Und dann: Bist du sicher, daß es nicht zu einer Race-Condition wegen nicht-atomaren Zugriffs auf eine deiner nicht 8-Bit-Werte kommt? Also zB IRQ schlägt zu innerhalb einer Schreib-OP auf einen int? Du setzt auch T2-Zähler und OCR. AFAIR wird keine IRQ getriggert, wenn man von Hand TCNTn auf OCRn setzt: da nochmal das Handbuch befragen. Und ausschliessen, daß es Probleme gibt, wenn OCR2 verkleinert wird weil T2 ne komplette Runde dreht.
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.