Reset per Software

Gast #232964
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
Gast #232965
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?
Gast #232966
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
Gast #232967
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
Gast #232968
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
Gast #232969
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.