Timer1 Interrupt löst Reset aus??

Gast #1130390
Lesenswert?

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
Angehängte Dateien:
Gast #1131036
Lesenswert?

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!!
Persönliche Seite #1131302
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren