Hi, wenn zwei Timer parallel laufen (natürlich verschieden schnell), können die sich in die Quere kommen? Eigentlich schaltet der Mega (in meinem Fall Mega32) doch das Interrupt Enable Bit ab, wenn er eine ISR betritt, oder? Gruß Henrik
Henrik wrote: > Hi, > wenn zwei Timer parallel laufen (natürlich verschieden schnell), können > die sich in die Quere kommen? > Eigentlich schaltet der Mega (in meinem Fall Mega32) doch das Interrupt > Enable Bit ab, wenn er eine ISR betritt, oder? Wenn wir mal Design Fehler auf dem Chip ignorieren, sehe ich eigentlich keine Möglichkeit, wie sich 2 Timer in die Quere kommen können. Ja, das IE-Bit wird während der Ausführung einer ISR abgeschaltet und mit dem reti in der ISR wieder eingeschaltet. Solange man also nicht selbst an diesem Bit in einer ISR rumspielt, ist es nicht möglich, daß eine ISR von einer anderen ISR unterbrochen wird.
Das einzige was passieren kann ist, das der Interrupt des Timers der zu spät kommt etwas verzögert ausgeführt wird.
Sehr merkwürdig. Ich hatte Dutzende "Abstürze" (Resets, oder Sprünge zur Adresse 0). Nachdem ich nun einen Timer abgeschaltet habe, scheint es zu laufen. Jedenfalls hat es 4x ~15 Minuten OHNE Reset überlebt, während es vorher geschätzt zwischen 30 sek und 5 Min gedauert hat, bis ein Reset kam. Erklären kann ich es nicht, was da schiefläuft. Ich weiß auch noch nicht, ob es nun wirklich geht; paar Mal klappte es ja.
Henrik wrote: > Sehr merkwürdig. > > Ich hatte Dutzende "Abstürze" (Resets, oder Sprünge zur Adresse 0). > Nachdem ich nun einen Timer abgeschaltet habe, scheint es zu laufen. > Jedenfalls hat es 4x ~15 Minuten OHNE Reset überlebt, während es vorher > geschätzt zwischen 30 sek und 5 Min gedauert hat, bis ein Reset kam. > > Erklären kann ich es nicht, was da schiefläuft. Ich weiß auch noch > nicht, ob es nun wirklich geht; paar Mal klappte es ja. Ich tippe mal auf einen Programmfehler.
Nur wie kann der denn dann resetten? Oder wieso kann er zur Adresse 0 zurückspringen...?
Vielleicht weil Du keine Interruptserviceroutine definiert hast. Oder einen illegallen Speicherzugriff machtst. Oder der Stack überläuft. Oder einen Pointer nicht initialisiert hast...
Die beiden Timer ISRs hab ich; Stack hat noch 700 Byte frei :) Pointer sind an dieser Stelle keine. Das Merlwürdige ist halt: es läuft eine Zeit normal, bis es dann abschmiert. Und zwar nicht reproduzierbar. Manchmal nach 30 s, manchmal nach 5 Minuten, wie es grade will ...
Henrik wrote: > Die beiden Timer ISRs hab ich; Stack hat noch 700 Byte frei :) > Pointer sind an dieser Stelle keine. > > Das Merlwürdige ist halt: es läuft eine Zeit normal, bis es dann > abschmiert. Und zwar nicht reproduzierbar. Manchmal nach 30 s, manchmal > nach 5 Minuten, wie es grade will ... Könnte natürlich auch eine schmutzige Spannungsversorgung sein oder ein Wackelkontakt. Ich tippe aber weiterhin auf einen Fehler im Programm :-)
Die Spannung ist sauber. Die hatte zwar Spikes drauf, die sind aber weg. Und Wackelkontakt halte ich für unwahrscheinlich; auch wenn man gar nix macht, stürzt es ab.
Ich frage mich, wie lange es noch dauert, bis er den Wink mit dem Zaunpfahl versteht. Fangen wir beim Naheliegensten an. Dazu tippe ich immer noch auf einen Fehler im Programm.
Hallo, nun nerv ihn doch mal nicht so, Karl Heinz, ist schließlich die neue Software der Ariadne, die kann er nicht so einfach rumzeigen... Gruß aus Berlin Michael
Nö, wollen wir nicht. Aber Du kannst den Code ja soweit reduzieren, bis der Fehler gerade noch so auftritt. Und wenn Du den Fehler bis dahin nicht sebst gefunden hast, postest Du den Rest hier. Und dann schauen wir mal ;-) Gruss Andy
Henrik wrote: > Ihr wollt 2000 Zeilen Code lesen? Nun dann... Bei der Codegröße bin ich mir zu 99.9% sicher, dass der Fehler im Programm liegt. Hilft alles nichts: Entweder mit jemand anderem einen Code-Review durchführen oder abspecken, abspecken, abspecken. Das Programm auf das absolute Minimum reduzieren und und dann sukzessive Codeteile wieder einbauen, bis der Fehler wieder auftritt. Und dann hoffen, dass sich das Problem im zuletzt zugefügten Baustein zeigt. Du bist nicht der Einzige, der 'große' (*) Projekt debuggen muss. (*) 2000 Zeilen sind für einen Desktop Rechner noch nicht wirklich groß. Auf einem AVR hast du natürlich ohne JTAG nicht wirklich dieselben Debug-Möglichkeiten. Also muss man sich behelfen. Aber die Strategie: Ich schreibe fehlerfreien Code, also muss der Fehler irgendwo entweder im Compiler oder in der Hardware sein funktioniert in der Praxis nicht. In praktisch allen Fällen ist es irgendein Fehler im Code. Das muss auch keinem peinlich sein, jeder von uns hat schon die dümmsten Fehler gemacht und stunden/tagelang danach gesucht. Heisse Kandidaten sind immer irgendwelche Array-Overflows und da ganz speziell immer wieder String-Verarbeitung.
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.