Forum: Mikrocontroller und Digitale Elektronik Reset des Atmega64 im Code ausführen


von Almir D. (alme)


Lesenswert?

Hallo

Bin gerade am C-Programmieren. Wollte nur wissen ob man einen ATmega64 
im Code selbst Reseten kann mit einem Befehl.. Geht das?
Danke für eure Antwort

mfg Almir

von Hugin (Gast)


Lesenswert?

Ja, man lässt den Watchdog zuschnappen

von Wolfgang H. (Firma: AknF) (wolfgang_horn)


Lesenswert?

Hi, Almir,

> Bin gerade am C-Programmieren. Wollte nur wissen ob man einen ATmega64
> im Code selbst Reseten kann mit einem Befehl.. Geht das?

asm("jmp 0x00000")funktioniert - aber nur im Prinzip.
Weil die Power On Sequence nicht ausgeführt wird, welche alle Timer, IOs 
und Register zurücksetzt.
Nach diesem Sprung weiß die CPU nicht mehr, in welchem Zustand sich der 
Prozessor gerade befindet. Dafür hat sie keine Zeit verloren.

Diesen Sprung habe ich in meinem Bootloader mit voller Absicht, denn 
genau da soll die USART weiter funktionieren ohne Datenverlust.

Sonst meide ich so was wie die Pest und bevorzuge, den Watchdog auf 
minimale Wartezeit zu stellen und auszulösen.

Ciao
Wolfgang Horn

von H.Joachim S. (crazyhorse)


Lesenswert?

Und dann gibts noch die Möglichkeit, wenn man einen Portpin frei hat, 
diesen mit dem Reset zu verbinden...

von Almir D. (alme)


Lesenswert?

Hallo zusammen!

Danke für eure Antworten!! Das Problem wäre somit gelöst :-)

Gruss Almir

von Peter D. (peda)


Lesenswert?

Almir D. schrieb:
> Wollte nur wissen ob man einen ATmega64
> im Code selbst Reseten kann mit einem Befehl..

Im Prinzip geht das.
Es zeigt allerdings, daß der Programmierer total die Kontrolle über sein 
eigenes Programm verloren hat und nun zum allerletzten Rettungsring 
greifen muß.

Besser, das Schiff bleibt schwimmen und geht vom Kapitän (Programmierer) 
kontrolliert auf den nächsten Kurs.


Peter

von Heinz L. (ducttape)


Lesenswert?

Och, ich schaff das problemlos, jedesmal wenn ich 'n Interrupt aufruf 
ohne Interruptroutine. :)

Wobei, es gibt IMO durchaus Fälle wo die einfachste und sogar stabilste 
Lösung ein Reset ist, beispielsweise nach dem Aufspielen neuer Firmware. 
Damit erreicht man sehr zuverlässig einen stabilen und vorhersehbaren 
Ausgangszustand.

von Hugin (Gast)


Lesenswert?

wie hast du es gelöst ?

- Watchdog zuschnappen lassen ?
- Portpin löst an der Resetleitung einen Reset aus ?
- IRQ-Irrfahrt
- PC an die 0000 springen ?

von Almir D. (alme)


Lesenswert?

Hugin schrieb:
> wie hast du es gelöst ?

Ich habe jetzt vorläufig den Reset an einen Pin des uP`s gehängt. Hat 
mich interessiert, ob das irgendwie sonst eine Beinflussung ergibt. 
Klappt prima! Ich werde es jedoch mit dem Watchdog machen, weil das auf 
meiner gelayouteten Platine nicht so schön aussieht :)
Muss nur noch im Datenblatt nachschauen wie ich es machen muss

von Almir D. (alme)


Lesenswert?

Peter Dannegger schrieb:
> Im Prinzip geht das.
> Es zeigt allerdings, daß der Programmierer total die Kontrolle über sein
> eigenes Programm verloren hat und nun zum allerletzten Rettungsring
> greifen muß.

Das Problem bei mir ist das es mit einem USB-Stecker verbunden ist. Wenn 
ich den USB-Stecker ziehe wird die SLEEP Leitung des USB-Treibers LOW. 
Diese Leitung führt direkt zum Prozessor. Sobald dies geschieht blinkt 
eine LED auf meiner Platine.
Nun steckt man das USB-Kabel wieder ein und es gibt Signalverzerrungen. 
Diese lösen bei mir einen Interrupt aus...

ISR(USART0_RX_vect)
{
  receive_UART();            //sobald ein Zeichen empfangen wird, 
receive_UART ausführen
}

Nach dem Einstecken des USB-Steckers macht mein Programm was es will...

von Peter D. (peda)


Lesenswert?

Das ist aber nicht direkt ein Problem des USB.
Sobald man bei einer UART-Verbindung das Kabel steckt oder einen 
Teilnehmer einschaltet, kann es einen Low-Pegel geben, der als Startbit 
interpretiert wird.
Daher sollte auf der UART immer ein Protokoll laufen, welches Daten, die 
nicht dem Protokoll entsprechen, einfach ignoriert.
Z.B. man hat ein bestimmtes Zeichen oder Zeichensequenz für den Beginn 
eines Frame definiert und alles davor wird weggeschmissen.


Peter

von Andreas (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Im Prinzip geht das.
> Es zeigt allerdings, daß der Programmierer total die Kontrolle über sein
> eigenes Programm verloren hat und nun zum allerletzten Rettungsring
> greifen muß.

Sicherlich kommt Mißbrauch von Softresets vor, aber zu behaupten, dass 
ein Softreset grundsätzlich den Kontrollverlust des Programmieres 
dokumentiert, ist natürlich Quatsch.

von H.Joachim S. (crazyhorse)


Lesenswert?

Finde ich auch.
Habe auch so eine Anwendung. Parameterdaten werden während des Betriebs 
geändert (seriell ins EEprom), anschliessend Neustart mit den neuen 
Werten.
Klatsch, Reset, fertig.

von Sven P. (Gast)


Lesenswert?

H.joachim Seifert schrieb:
> Finde ich auch.
> Habe auch so eine Anwendung. Parameterdaten werden während des Betriebs
> geändert (seriell ins EEprom), anschliessend Neustart mit den neuen
> Werten.
> Klatsch, Reset, fertig.

Genau das haben die Programmierer bei Microsoft auch lange Jahre 
gemacht. Ganz getreu dem Motto: Keine Ahnung, wies System grad aussieht. 
Egal, machen wir einen Neustart.

Vollständige Initialisierer sind in jedem Fall so einer 
Sintflut-Programmierung vorzuziehen.

von H.Joachim S. (crazyhorse)


Lesenswert?

Tja, und genau das macht der MC bei einem Reset.
Hardware wird in einen definierten Ausgangszustand gebracht, benötigte 
Teile initialisiert, Daten geladen und los gehts.
Seh nicht, wo da ein Problem sein soll.

von Sven P. (Gast)


Lesenswert?

H.joachim Seifert schrieb:
> Tja, und genau das macht der MC bei einem Reset.
> Hardware wird in einen definierten Ausgangszustand gebracht, benötigte
> Teile initialisiert, Daten geladen und los gehts.
> Seh nicht, wo da ein Problem sein soll.

Das Problem fängt an, wenn am Prozessor vielleicht mehr als nur ein 
Display dranhängt. Wenn beim Setzen von neuen Parametern nicht sämtliche 
Peripherie neustartet. Wenn die Anwendung komplexer wird und der 
Neustart länger dauert...

von H.Joachim S. (crazyhorse)


Lesenswert?

Mich wundert, dass es überhaupt noch MC-Anwendungen gibt, die ohne 
Notstromversorgung daherkommen, um noch schnell ein komplettes image auf 
einen externen Datenträger schreiben zu können, um dann nach Rückkehr 
der Hauptversorgung den letzten gültigen Zustand direkt wiederherstellen 
zu können. Diese Entwicklung ist komplett an mir vorbeigegangen...
Meine Systeme müssen mit gelegentlichem Ausschalten klarkommen, 
üblicherweise also mit einem power-on-reset.
Ich seh keinen prinzipiellen Unterschied zwischen einem erzwungenen 
externen reset und einem gewollten Neustart. In beiden Fällen läuft die 
gleiche Sequenz ab.
jmp 0 ist ne andere Geschichte (aber selbst das würde bei mir i.a. 
funktionieren, ich geh nicht davon aus, dass sich die Peripherie im 
Zustand nach reset befindet, sondern schreibe das explizit rein. Ab und 
zu muss dieser "Rundumschlag" allerdings der stets begrenzten 
Flash-Grösse weichen)

von Sven P. (Gast)


Lesenswert?

H.joachim Seifert schrieb:
> jmp 0 ist ne andere Geschichte (aber selbst das würde bei mir i.a.
> funktionieren, ich geh nicht davon aus, dass sich die Peripherie im
> Zustand nach reset befindet, sondern schreibe das explizit rein. Ab und
> zu muss dieser "Rundumschlag" allerdings der stets begrenzten
> Flash-Grösse weichen)
Und siehst du, genau das ist dann Schwachsinn.

Einerseits möchtest du einen Hard-Reset erzwingen, weil der nämlich die 
Register definiert vorbelegt. Andererseits verlässt du dich dann aber 
doch nicht drauf.

Warum also die Initialisiererei nicht ordentlich verpacken (wenig 
Aufwand, du hast sie ja ohnehin schon ausprogrammiert) und jede Menge 
Flexibilität gewinnen?


Ich möchte als Benutzer halt nicht jedes Mal wieder ne zehnteilige 
Grundstellungsfahrt durchfahren, wenn ich irgendeinen Parameter 
verändert habe.

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.