mikrocontroller.net

Forum: Compiler & IDEs Software Reset Mega8


Autor: Felix Jankowski (feejai)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Walter (Gast)
Datum:

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

Walter

Autor: Felix Jankowski (feejai)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: FeeJai (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marco S. (masterof)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: FeeJai (Gast)
Datum:

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

Autor: Marco S. (masterof)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.