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.