Forum: Mikrocontroller und Digitale Elektronik Kommen sich zwei Timer in die Quere?


von Henrik (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Mike R. (thesealion)


Lesenswert?

Das einzige was passieren kann ist, das der Interrupt des Timers der zu 
spät kommt etwas verzögert ausgeführt wird.

von Henrik (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Henrik (Gast)


Lesenswert?

Nur wie kann der denn dann resetten?
Oder wieso kann er zur Adresse 0 zurückspringen...?

von Matthias Kölling (Gast)


Lesenswert?

Vielleicht weil Du keine Interruptserviceroutine definiert hast. Oder 
einen illegallen Speicherzugriff machtst. Oder der Stack überläuft. Oder 
einen Pointer nicht initialisiert hast...

von Henrik (Gast)


Lesenswert?

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 ...

von Karl H. (kbuchegg)


Lesenswert?

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 :-)

von Henrik (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Michael U. (amiga)


Lesenswert?

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

von Henrik (Gast)


Lesenswert?

Ihr wollt 2000 Zeilen Code lesen? Nun dann...

von andy (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.