Forum: Compiler & IDEs Timer1 Interrupt löst Reset aus??


von Thomas (Gast)


Angehängte Dateien:

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

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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.

von Thomas (Gast)


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!!

von Johann L. (gjlayde) Benutzerseite


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.

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
Noch kein Account? Hier anmelden.