Forum: Compiler & IDEs Software Reset Mega8


von Felix J. (feejai)


Lesenswert?

Guten Abend!

Mittels einer Routine werden die vom UART empfangenen Daten
ausgewertet. Bei 0xA0 soll der Controller einen Resetdurchführen. Ich
habe das folgendermaßen erledigt:

case 0xA0:
  //cli();
  LCD_Clear();
  asm volatile ("rjmp 0x0000");
  break;

Komischerweise funktioniert dies nur, wenn man den Befehl zweimal
hintereinander sendet, beim ersten mal passier gar nichts. Weis jemand
con euch warum?

von Walter (Gast)


Lesenswert?

vermutlich funktioniert deine Auswerteroutine nicht, aber die hast du ja
nicht verraten ...

Walter

von Felix J. (feejai)


Lesenswert?

das ist die von peter fleury. funktioniert mit allen anderen wunderbar.
dann einfach mit switch (c) { und die cases.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Hmm, was macht ein RJMP 0, berechnet er noch den Offset, oder
springt er einfach 0 Bytes?

Ich würde einen Funktionszeiger nehmen, der mit 0 initialisiert
ist.

Du bist dir auch darüber im Klaren, dass ein RJMP 0 kein
Reset ist?  Die Hardware wird nicht initialisiert, die Interrupts
sind noch aktiv.

von FeeJai (Gast)


Lesenswert?

Nein, das war mir so nicht klar. Interrupts schalte ich vorher aus. Ist
nur momentan auskommentiert, weil er beim ersten mal zwar die
interrupts ausschaltet, aber nicht neustartet. Wieso wird die Hardware
nicht initialisiert? Ich dachte mit rjmp springt er wieder an den
anfang...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Wieso wird die Hardware
> nicht initialisiert?

Weil ein (Hardware-)Reset intern alle IO-Register auf ihre
dokumentierten Defaults stellt, ein [R]JMP 0 nicht.

Wenn du natürlich wirklich jedes möglicherweise geänderte
Stück Hardware selbst initialisierst, ist es kein Problem.

von Marco S. (masterof)


Lesenswert?

um intern einen echten Reset zu machen aktiviere den Watchdog auf 15ms
(kleinster Möglichkeit) und geh dann in eine warteschleife nach ca 15ms
wird der atmega8 neugestartet

von FeeJai (Gast)


Lesenswert?

ja, danke für den tipp. aber wieso funktioniert das rjmp nicht?

von Marco S. (masterof)


Lesenswert?

du sagst nur dem PC(Programmcounter) die nächste abzuarbeitende Befehl
liegt unter der Adresse 0x000 und mehr nicht.

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.