Forum: Mikrocontroller und Digitale Elektronik Reset per Software


von Tabaluga (Gast)


Lesenswert?

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

von crazy horse (Gast)


Lesenswert?

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?

von Tim O. (Gast)


Lesenswert?

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

von Peter Dannegger (Gast)


Lesenswert?

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

von Tabaluga (Gast)


Lesenswert?

@ 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

von Peter Dannegger (Gast)


Lesenswert?

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

von Tabaluga (Gast)


Lesenswert?

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