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?
vermutlich funktioniert deine Auswerteroutine nicht, aber die hast du ja nicht verraten ... Walter
das ist die von peter fleury. funktioniert mit allen anderen wunderbar. dann einfach mit switch (c) { und die cases.
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.
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...
> 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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.