Forum: Mikrocontroller und Digitale Elektronik Reset im Programm wie geht das? atmega 8, avr gcc


von Werner (Gast)


Lesenswert?

Hallo,
gibt es eine Möglichkeit im Programm einen Reset durchzuführen?
Wenn ja kann mir bitte jemand sagen wie das geht.
Oder ist dazu der Watchdog notwendig?

Ich verwende einen Atmega 8, das Programm ist in C geschrieben.

Der PC6 ist als Reseteingang (mit Taster) verwendet.

von Fly (Gast)


Lesenswert?

Wenn du einen HW Reset willst ist der Watchdog gut. WD starten und 
warten bis es passiert :)

von Kai G. (runtimeterror)


Lesenswert?

Ich würde spontan mit einem freien I/O die Reset-Leitung auf Ground 
ziehen (also einfach den Taster mit einem Transistor kurzschließen).

Watchdog ist auf jeden Fall 'ne lustige Idee :)

Ich schau mal, ob's noch eine andere Möglichkeit laut Datenblatt gibt.

Wenn dein Code zu Programmbeginn den Controller ordentlich 
initialisiert, sehe ich keinen dringenden Grund den Controller zu 
resetten. Ein Sprung zum Programmanfang reicht da.

Warum genau möchtest du den Resetten?

Gruß

Kai

von Kai G. (runtimeterror)


Lesenswert?

Habe gerade nochmal das Kapitel "System Control and Reset" überflogen 
und keinen Hinweis darauf gefunden, dass man einen regulären Reset per 
Software auslösen kann.

Die einzigen Optionen sind: Power-on Reset, External Reset, Watchdog 
Reset, Brown-out Reset

von Werner (Gast)


Lesenswert?

Eigentlich will ich nur wieder ganz zum Anfang springen.
Bevor ich in die Endlosschleife gehe und nur noch die Interrupts 
erledigt werden.

Kann man vielleicht den Resetpin PC6 Software mäßig auf 0 ziehen?

Der Reset würde mir nämlich garantieren das ich immer den selben 
Anfangszustand habe.



Den Reset auf 0 zu ziehen über einen Ausgang kann ich leider nicht 
machen da ich alles belegt habe. Der Atmega ist so zu sagen gut 
ausgenützt (von den I/O's her) :).

Ein goto im Programm ist zwar nicht elegant, aber wenn's funkt kann man 
es ja machen.


Werd's morgen mal probieren.

von Ulrich harms (Gast)


Lesenswert?

Wenn ein GOTO nicht geht, könnte man inline Assembler (RJMP 0 ) 
benutzen, nicht gerade C conform, sollte aber gehen.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

RJMP 0 ist solange okay, wie das Programm alle Initialisierungen, die 
der Controller dann nicht machen kann, selber erledigt. Ansonsten eher 
gefährlich. Der Watchdog ist als "richtige" RESET-Quelle erste Wahl.

von Peter D. (peda)


Lesenswert?

Ich weiß ja nicht, was für ein merkwürdiges Gerät Du bauen willst, aber 
ein Reset ist in der Regel äußerst unerwünscht (wie z.B. bei Deinem PC).

Alle Ausgänge werden hochohmig, d.h. alle LEDs gehen aus, alle Relais 
fallen ab, alle Einstellungen (Variablen) werden vergessen usw.

Machs besser wie bei einem PC, d.h. wenn eine Task beendet ist, geht sie 
zurück zur Mainloop.

Wichtige Tasks, z.B. Uhrzeit zählen, laufen dann im Hintergrund 
(Interrupts) weiter.


Peter

von Kai G. (runtimeterror)


Lesenswert?

By the way: RJMP 0 springt nicht wirklich an den Anfang. Es macht 
einfach nichts... wie NOP

Besser wäre eine der folgenden Methoden zu verwenden:
- CEI -> JMP start
- CLR T -> PUSH T -> RET
- CLR Z -> IJMP

Am saubersten ist ein Reset über den Watchdog oder Hardware. Beim 
Watchdog das Abschalten der Interrupts nicht vergessen!

Wie oben schon erwähnt ist ein Reset nicht üblich - es heißt eher, dass 
deine Initialisierungen nicht sauber genug sind.

Nach einem Firmware-Update per Boot-Loader sehe ich einen Reset teilw. 
noch ein.

Gruß

Kai

von Björn W. (bwieck)


Lesenswert?

Werner wrote:

> Den Reset auf 0 zu ziehen über einen Ausgang kann ich leider nicht
> machen da ich alles belegt habe. Der Atmega ist so zu sagen gut
> ausgenützt (von den I/O's her) :).

könnte doch einen Sprung zu direkt dem Programmteil der nach RESET
kommt...

> Ein goto im Programm ist zwar nicht elegant, aber wenn's funkt kann man
> es ja machen.
>
>
> Werd's morgen mal probieren.

Ja, ein Goto ist nicht elegant, ein Sprung zu RESET in ASM ist aber 
mindestens genauso unelegant.

Wenn Dein Programm einen Reset benötigt um zu funktionieren hast Du 
schon
was falsch gemacht.

Probleme an den Resultaten zu kurieren bringt nicht viel.

Grüße
Björn

von Werner (Gast)


Lesenswert?

Der Grund dafür wäre, das man per Taster ein paar Einstellungen (Prg 
Vorgaben) machen kann.
Um nicht dauernd Rechenzeit zu vergeuden würde ich das am Anfang machen 
und danach das Programm laufen lassen.
Ich möchte nämlich dass die Abtastzeit ziemlich gleichmäßig bleibt.

Wenn ich jetzt aber etwas ändern will, muss ich aus und wieder 
einschalten.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

>By the way: RJMP 0 springt nicht wirklich an den Anfang. Es macht
>einfach nichts... wie NOP

Schon recht. Sollte JMP $0000 heißen. Ist aber nur in ATMEGAs verfügbar.

von Peter D. (peda)


Lesenswert?

Werner wrote:

> Wenn ich jetzt aber etwas ändern will, muss ich aus und wieder
> einschalten.

Dann mach ne Loop un die Parametereinstellung und das Programm:
1
int main( void )
2
{
3
  for(;;){
4
    einstell();
5
    programm();
6
  }
7
}


Peter

von Karsten D. (karstendonat)


Angehängte Dateien:

Lesenswert?

Hi,

hab das Problem mit dem Reset auch. Allerdings will ich den Bootloader 
von Peter Dannegger per Software aktivieren.

Ziel ist die automatische aktualisierung aus der ATMega IDE heraus. 
Bisher muss man noch einen Hardware-Reset auslösen. Ist aber nicht 
wirklich toll. Vor allem wenns keinen Taster dafür gibt g

Ich hab das mit dem Watchdog probier, leider hängt sich der Controller 
dabei auf und ist nur mit abziehen der Versorgungsspannung wieder 
reaktivierbar (selbst Hardware-Reset mit Draht bringt nichts), und nach 
dem einschalten muss man ihn im Hardware Reset halten bis der Bootloader 
übertragen werden kann.
1
cli();
2
wdt_enable (WDTO_15MS);
3
while (1);

Davor wird noch der UART von Peter Flury initialisiert und sendet einen 
String. Daran sieht man halt das er auch das eigene Programm nicht von 
vorn beginnt.

(der Reset wird Testweise schonmal im Initbereich gemacht. 
Auskommentiert ist aber der gleiche Hänger auch im Hauptprogramm)

Ciao

Karsten

von Karsten D. (karstendonat)


Angehängte Dateien:

Lesenswert?

Hier mal der komplette Quellcode.

Karsten

von Wolfhard (Gast)


Lesenswert?

Hallo,

ist zwar ein recht alter Thread, aber aufgrund sehr aktueller 
Erfahrungen habe ich eine relativ elegante Möglichkeit gefunden:
wdt_reset() sorgt bei _nicht_-aktiviertem Watchdog für einen sofortigen 
Watchdogreset.

Viele Grüße,
Wolfhard

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.