Probleme mit ATtiny12

Gast #167825
Lesenswert?

Guten Morgen allerseits,

ich hab ein Problem mit meinem uC und dem Interrupt.
Soweit läuft das Programm gut. Aber manchmal hängt er sich nach einem
Interrupt auf, bzw. registriert diesen dann einfach nicht mehr und
springt nicht dorthin, wo er hinspringen sollte.
Kann sich mal jemand den Quellcode anschauen und mir vielleicht einen
Tip geben ?

Vielen Dank im voraus
Angehängte Dateien:
Gast #167827
Lesenswert?

Vielen Dank Hannes.
Timerinterrupts hab ich mir in meinen schlauen Scripten schon mal
angeguckt, aber nicht wirklich verstanden.
Was ich aber noch viel weniger verstehe, ist diese Entprell-Routine von
dir oder wem auch immer.
Die Erklärung dazu (auf welche Routine die jetzt auch immer bezogen
war, der Thread ist ja doch ziemlich konfus) wirft leider nur noch viel
mehr Fragen auf. Verwenden kann ich die jedenfalls so nicht, da ich gar
nicht weiss, wie und wo ich das einbauen muss.
Aber wie gesagt, vielen Dank für die Hilfe.

Grüße
Timo
Gast #167829
Lesenswert?

simulatoren sind immer so trocken. und mir fehlt die zeit, um mich da
gerade intensiv damit zu beschäftigen. ausserdem denke ich, dass mir
der simulator nicht alle meine fragen beantworten kann.
aber ich wälze nochmal bücher, wenn wieder zeit vorhanden ist.
Gast #167830
Lesenswert?

Der Code ist nicht von mir, sondern von Peter Dannegger. Ich hatte ihn
lediglich analysiert und erklärt, weil in diesem Thread danach gefragt
wurde. Dabei gab es einige Missverständnisse, was den Thread auf den
ersten Blick etwas konfus erscheinen lässt.

Was ist denn eigentlich an einem Timer-Interrupt so schwer zu
verstehen?
Der Timer erzeugt alle n Takte einen Interrupt ("Pulsschlag" des
Programms). Am Einfachsten geschieht das mit dem Überlauf des Timers 0.
In der ISR wird dann der Timer wieder auf Startwert gesetzt (falls man
ihn nicht frei durchlaufen lassen möchte) und andere zeitabhängige
Dinge (Tastenentprellung, Verzögerungszähler, Zeitzählung, ADC-Abfragen
usw.) erledigt bzw. angestoßen. Wird in der ISR das SREG verändert, dann
ist noch das SREG zu sichern und wiederherzustellen, damit im
Hauptprogramm keine "Fehlentscheidungen" provoziert werden.

...
Gast #167831
Lesenswert?

Hi Timo!

Der Tiny12 hat keinen RAM!
Also kann dieser nicht X-beliebig viele Rücksprung-Adressen auf einen
RAM pushen (push und pop gibs bei dem sowieso nicht).
Dafür hat der Tiny12 einen 3-Deep Hardware Stack mit jeweils 9 Bit,
also können max. 3 Rücksprungadressen gespeichert werden.
Du verwendest eine Pausen-Routine welche wiederum Pause2 und von dort
aus Pause 3 mit RCALL aufruft.
Dadurch ist der 3-deep Stack voll und wenn dann noch der Interrupt
kommt, welcher ja auch als Sub aufgerufen wird, ist es aus.
Spätestens bei dem RCALL in der Timer-ISR.
Versuche mal Deine Pausen-Funktion ohne RCALLs zu ändern und pass auf,
das inkl. Interrupt max. 3 CALLs entstehen können.


MfG
Andi
Gast #167832
Lesenswert?

Stimmt... (Moin Andi...)

Jetzt, wo es Andi schreibt, sehe ich es auch.
Ich muss gestehen, dass ich das Programm nur flüchtig angesehen habe.
Nach Erkennen der Tastenabfrage und Warteschleifen und der Feststellung
"sowas macht man nicht" war mit meiner Analyse Schluss.

...

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