www.mikrocontroller.net

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


Autor: Werner (Gast)
Datum:

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

Autor: Fly (Gast)
Datum:

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

Autor: Kai G. (runtimeterror)
Datum:

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

Autor: Kai G. (runtimeterror)
Datum:

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

Autor: Werner (Gast)
Datum:

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

Autor: Ulrich harms (Gast)
Datum:

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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Kai G. (runtimeterror)
Datum:

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

Autor: Björn Wieck (bwieck)
Datum:

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

Autor: Werner (Gast)
Datum:

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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

int main( void )
{
  for(;;){
    einstell();
    programm();
  }
}


Peter

Autor: Karsten Donat (karstendonat)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.
cli();
wdt_enable (WDTO_15MS);
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

Autor: Karsten Donat (karstendonat)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal der komplette Quellcode.

Karsten

Autor: Wolfhard (Gast)
Datum:

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

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.