Forum: Mikrocontroller und Digitale Elektronik Reset durch Software


von David (Gast)


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

von R. M. (rmax)


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.

von Sven P. (Gast)


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.

von DerPfarrer (Gast)


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.

von R. M. (rmax)


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.

von qwert (Gast)


Lesenswert?

Portpin an den Resetpin hängen und den Port als Ausgang und Low setzen 
;)

von citb (Gast)


Lesenswert?

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

citb

von qwert (Gast)


Lesenswert?

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

Aber irgendwann ist der Stack voll.

von citb (Gast)


Lesenswert?

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

citb

von Peter D. (peda)


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

von David (Gast)


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.

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.