Forum: Mikrocontroller und Digitale Elektronik Probleme mit ATtiny12


von Timo (Gast)


Angehängte Dateien:

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

von ...HanneS... (Gast)


Lesenswert?

http://www.mikrocontroller.net/articles/Entprellung
http://www.mikrocontroller.net/forum/read-1-140056.html#140946

Wenn du es ordentlich machen willst, wirst du um einen Timer-Interrupt
nicht herum kommen. Die Abfrage eines Tasters mittels Pin-Interrupt
bringt einfach mal nix! Und Warteschleifen im Interrupt sind sowiso
tabu.

...

von Timo (Gast)


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

von Alisa 1387 (Gast)


Lesenswert?

"Verwenden kann ich die jedenfalls so nicht, da ich gar
nicht weiss, wie und wo ich das einbauen muss."

Lad doch Peters Code einfach in den Simulator. Dann siehst du doch was
abgeht.

von Timo (Gast)


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.

von ...HanneS... (Gast)


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.

...

von Andi (Gast)


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

von ...HanneS... (Gast)


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.

...

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.