Hallo zusammen! Ich bin langsam am verzweifeln! Ich möchte einen Software-Reset auslösen, also per Software den µC resetten, wenn in externer Interrupt kommt. Ich springe einfach an Adresse 0 und dann sollte alles von vorn anfangen, doch laufen die Timer nach dem Reset nicht mehr. Ich habe mir schon die Inhalte der Register TCON, TMOD, IE und IP ausgeben lassen, jeweils vor und nach dem Reset, aber die Inhalte stimmen überein. Was läuft das schief?? Ich behelfe mich jetzt mit dem Watchdog-Timer, aber ich finde das ist keine elegante Lösung :-( Hat da jemand eine Idee? Thx Tabi
hatten wir vor kurzem hier, such mal danach. Aber im Prinzip hast du die beste Lösung schon selbst gefunden - watchdog. Was ist dir daran nicht elegant genug? Bzw. was wäre an einer anderen Lösung eleganter?
Moin moin.. Wenn noch nen I/O Pin frei ist, bau dir doch den sich selbst reset-enden Prozessor per I/O-Leitung mit Inverter gegen \Reset .. aber das ist ja dann kein "Software-Reset" .. Gruss, Tim
Die Timer laufen schon, bloß Du kriegst keinen Interrupt mehr. Du hast nämlich kein RETI gemacht und deshalb denkt die 8051-CPU, sie ist immer noch im Interrupthandler. Und wenn Dein externer Interrupt die hohe Priorität hat, können sogar noch 2 Interrupts am Laufen sein. D.h. dann must Du 2 RETIs machen um alle Interrupts zu beenden. Peter
@ Peter: Das hört sich logisch an. Wenn ich so schnell drüber nachdenke, macht doch ein RETI nichts anderes, als ein RET-Befehl und setzt gleichzeitig noch das EAL-Bit oder nicht? Weil ich im Programmstart dieses Bit auch wieder setze, muss ich doch dann kein RETI machen - also nach meinen Überlegungen. Offenbar sind die falsch, aber was macht RETI denn noch? Weil mir fällt grad nicht wirklich ein Weg ein, vor dem Reset 2 mal RETI auszuführen, weil er doch dann 2 mal springt und zwar an ein mir zu dem Zeitpunkt unbekanntes Ziel. Oder sollte ich auf den Stack 2 Adressen legen, die dann angesprungen werden? Ist ne Idee, oder? Was mich aber wie gesagt interessiert, um das auch wirklich zu verstehen: Was macht RETI genau, dass es ohne dies solche Problemen gibt? Tabi
Der 8051 hat eine Hardware-Prioritätslogik, d.h. er merkt sich zu jeder Prioritätsstufe, ob ein Interrupt gerade abgearbeitet wird. Das EA-Bit wird nirgends beeinflußt, sonst könnte ja die Prioritätslogik nicht funktionieren. Die 2 RETis gehen z.B. so: ... call leave_interrupts call leave_interrupts ... leave_interrupts: reti Peter
Ah ja! Alles klar. Ich komme also um die RETI's nicht herum, wenn ich springen will. Ist ne gute Lösung so :-) Dankeschön!!! Tabi
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.