Reset durch Software

Gast #2066430
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
#2066472
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.
Gast #2066492
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.
Gast #2066494
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.
#2066508
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.
Gast #2066815
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

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