Ok, im Hauptprogramm nutzt das nichts. Das muss schon die Interrupt-Routine wasserdich machen:
interrupt:
Originalzustand sichern
Eigentlicher Code
Originalzustand restaurieren
reti
Axo, ok, das wär natürlich ne Heidenarbeit, den Fehler dann zu finden, wieder was dazu gelernt
Ist denn meine Änderung so richtig, weiß net, ob du sie gefunden hast, also hab in der ersten Zeile im "loop:" das hier dazugeschrieben:
Und vor dem reti in "pruefZaehler:" das hier;in statusreg, SREG ;SREG sichern
Und natürlich oben mein "statusreg" mit .def definiert.out SREG, statusreg SREG wiederholen
Gruß
Thomas
Ok, im Hauptprogramm nutzt das nichts. Das muss schon die Interrupt-Routine wasserdich machen:
interrupt:
Originalzustand sichern
Eigentlicher Code
Originalzustand restaurieren
reti
Disclaimer: none. Sue me.
Axo, also loop bleibt gleich und verändern tut sich dann nur noch preufZaehler:
Code:pruefZaehler: in statusreg, SREG inc zaehler ;Zählregister um 1 erhöhen ldi tmp, time ;Hier wird der Timer vorgelaen und zwar mit 255-90 out TCNT0, tmp ;Er läuft 90 mal durch, bevor ein Interrupt auftritt out SREG, statusreg reti ;wieder zurück, wo du hergekommen bist
Jepp, that's it!
Disclaimer: none. Sue me.
Eine kleine Verbesserung des Codes gibt's noch, wenn du in loop nicht bei Gleichheit rausspringst, sondern bei Ungleichhiet zurück nach loop
Gruß, Georg-Johann
Disclaimer: none. Sue me.
Axo, weil nachher dann eh "zeitum:" kommt, oder? Najo, ok, das ist aber wirklich nur ne Kleinigkeit![]()
Hallo ihr Drei!
Der Thread mausert sich ja langsam zu einem richtig komplexen Tutorial!
Herzlichen Glückwunsch, vor allem Dir, Thomas, Du hast das Glück alles beigebracht zu bekommen und entwickelst Dich rasch zu einem "Fortgeschrittenen"! ;o)
Macht weiter so!
PS:
Ich habe eben die ganzen verpassten Posts nachgelesen, ist ja schon einiges! *lol*
Hehe, dank dir Florian für das Kompliment.
Aber fühl mich trotzdem "schlecht", weil ich Sebastians 1. Frage nicht beantworten kann. *g*
Ich denke er ziehlt darauf ...
Denk' nochmal nach, derzeit hast Du nur eine Interruptquelle, was würde bei mehreren passieren bzw. wenn diese alle nahezu gleichzeitig ... *auf den mund hau*
Ahh, ok, hab die Antwort, poste sie nachher, muss essen *g*
So, nun die Antwort:
Also die Interruptroutinen sollten so kurz wie möglich gehalten werden, da, wenn er in einer Routine drinne ist, keine andere aufgerufen werden kann.
Und wenn ein Interrupt zu dem Zeitpunkt ausgelöst wird, wo er gerade in einer anderen Interruptroutine drinne ist, dann kann das andere Interrupt nicht ausgelöst werden.
Denn nur nach dem Befehl "reti" können Interrupts wieder ausgelöst werden, deshalb muss dieser Befehl so schnell wie möglich auftreten.
Hoffe, das ist so richtig, ist ein wenig durcheinander, aber man muss ja auch erstmal mit den Fachbegriffen klarkommen
Gruß
Thomas
Lesezeichen