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
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. ...
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
"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.
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.
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. ...
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.