Reset im Programm wie geht das? atmega 8, avr gcc

Gast #721935
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.
#721959
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
Gast #721970
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.
#722140
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
#722257
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
#722286
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
Gast #722321
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.
#736386
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
Angehängte Dateien:
Gast #804949
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren