www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Reset durch Software


Autor: David (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe folgende Frage/Problem:
Chip: Attiny13

Der Speicherplatz ist ziemlich voll, ca. 99%.
Nun habe ich ein Programm, dass je nach Anfangszustand von Ports (High 
oder Low) etwas bestimmtes tut. Nach Ausführung soll das Programm wieder 
resettet werden, d.h. alle Variablen wieder so belegt werden, wie im 
Ausgangszustand. (Der Bediener kann während das Programm läuft die 
Anfangszustände wieder manipulieren und somit einen anderen Teil des 
Programms aufrufen/starten).
Alle Variablen manuell dann auf Ausgangszustand zu belegen, kostet 
zuviel Speicher.

Daher mein Gedanke, durch den Watchdog einen Softwarereset beizuführen. 
Dies klappt leider nicht so wie ich will. Greift der WD einmal ein, so 
startet das Programm an laufenden Band neu.

Gibt es einen extra Befehl beim WD wie ich das komplette Programm 
resette? Oder eine andere Möglichkeit, einen vollständigen Reset per 
Software zu erzeugen?

Danke,
David

Autor: R. Max (rmax)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du den WD per Software (nicht per Fuse) eingeschaltet hast, kannst 
Du ihn (IIRC) nach dem Reset auch wieder abschalten.

Alternativ kannst Du dafür sorgen, daß Dein Programm den Watchdog aktiv 
bedient und wenn es einen Reset erzwingen will, damit aufhört.

Wenn es bei dem Reset nur um die erneute Initialisierung der Variablen 
geht, und es nicht nötig ist, auch die Hardware zurückzusetzen, kannst 
Du den Watchdog-Reset auch weglassen und einfach an die Adresse 0 
springen.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du könntest auch saubere Startups programmieren, wenn es dein freier 
Programmspeicher zulässt. Dann stellt sich dir das Problem erst 
garnicht.

Denk mal an Windows damals(tm): Ständig Neustarts nötig... mit sauberen 
Initialisierungen wäre das nicht passiert.

Autor: DerPfarrer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit dem Sprung an die Adresse 0 bringt in sich nichts, da die 
Speicherzellen erhalten bleiben. Wenn Du direkt nach dem Reset jedoch 
eine Initialisierung durchläufst, in der die Variablen gezielt gesetzt 
werden, dann wird es funktionieren, wie Du willst.

Autor: R. Max (rmax)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DerPfarrer schrieb:
> Das mit dem Sprung an die Adresse 0 bringt in sich nichts, da die
> Speicherzellen erhalten bleiben.

Nach dem Sprung auf 0 sind die alten Werte in der Tat zunächst noch da, 
dann wird aber (ich postuliere mal C) der vom Compiler generierte 
Initialisierungscode durchlaufen. Der eigene Programmcode findet, wenn 
er schließlich angesprungen wird, die Variablen genau so vor, wie nach 
einem Reset.

Autor: qwert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Portpin an den Resetpin hängen und den Port als Ausgang und Low setzen 
;)

Autor: citb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du rufst Deine Funktion init(), die am Anfang Deines Programmes steht 
(stehen sollte) auf.

citb

Autor: qwert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Du rufst Deine Funktion init(), die am Anfang Deines Programmes steht
>(stehen sollte) auf.

Aber irgendwann ist der Stack voll.

Autor: citb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sollte nicht am Anfang der init() das Setzen des Stacks stehen?
OK, muss heissen: Du springst zum Anfang Deiner ...

citb

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
David schrieb:
> Alle Variablen manuell dann auf Ausgangszustand zu belegen, kostet
> zuviel Speicher.

Du ziehst das Init() einfach mit in die Main-Loop, fertig.


Peter

Autor: David (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Darf ich mal leise Fragen, was alles in eine init() Funktion gehört bzw. 
was man dort am geschicktesten hinein programmiert?
Ich schreibe dort "nur" das setzen der Register (Ein/Ausgänge, 
Interrupts-Konfigurationen, Timer-Konfigurationen).
Die Variablen bzw. Vorbelegung der Variablen die ich z.B. global brauche 
(für Interrupts) lege ich ja global fest außerhalb des Hauptprogramms 
(main) und kann diese doch nicht im Hauptprogamm initialisieren, sonst 
wären diese nur lokal. Die Variablen, die dann nur im Hauptprogramm 
verwendet werden, definiere ich dort.

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.