Forum: Mikrocontroller und Digitale Elektronik Funktion zur variabeln initialisierung


von theodor (Gast)


Lesenswert?

Gibt es eine Möglichkeit, eine Funktion einmalig aufzurufen welche 
Variabeln nach anlegen der Spannung initialisiert, ich möchte nicht nach 
jedem reset bzw nach interrupt rückkehr neu initialisieren.

von (prx) A. K. (prx)


Lesenswert?

Eine etwas deutlichere Beschreibung des Problems könnte helfen. Dass bei 
Reset alles neu initialisiert wird ist i.d.R. Absicht.

von (prx) A. K. (prx)


Lesenswert?

Abhängig von der Entwicklungsumgebung lassen sich Speicherbereiche 
definieren, die einen Reset unverändert überleben, sofern die Spannung 
erhalten blieb. Bei Powerup- oder Brownout-Reset kann man dann eine 
explizite Initialisierung vornehmen, aber es bei Watchdog- und Pin-Reset 
unterlassen.

von theodor (Gast)


Lesenswert?

Ich habe ein Interrupt, es verändert Variabeln welche ich im 
Hauptprogramm weiter nutze, komme ich aus dem Interrupt zurück wird ein 
Reset ausgelöst was ich generell schon ich sag mal schwachsinnig finde 
da ja von Timer bis zum LCD alles neu initialisiert wird mit werten, die 
schon in den jeweiligen Registern stehen.

Nun möchte ich einmalig bei Programmstart sobald die Spannung kommt, 
gewisse Variablen einen Startwert geben der soll sich aber nicht mit 
jedem Reset wieder einstellen.
Nun habe ich überlegt, die Variablen bei beenden des Interrupts auf den 
Stack zu retten und nach dem Reset wieder vom Stack zu holen doch auch 
da ist das Problem, dass der Stack dann bei neustart des Programms ganz 
andere Werte holen würde als wenn er schon Mal ein Interrupt hatte.

Dann hatte ich eine Variable erstellt, vor Initialisierung frage ich ob 
sie 0 ist wenn ja Initialisiere, nach Initialisierung gebe ich ihr ein 
Wert was die Initialisierung überspringt doch da ist das Problem Wird 
ein Reset durch das Interrupt ausgelöst ist alles okey, wird das Reset 
ausgelöst weil ich neu Programmiere so ist die Variable immer noch 0xFF 
und daher wird nicht initialisiert.

Was ich genau möchte ist, die initialisierungsphase überspringen wenn er 
aus einem Interrupt kommt, jedoch aufgerufen wird wenn er programmiert 
wurde bzw die Spannung neu anliegt.

von STK500-Besitzer (Gast)


Lesenswert?

theodor schrieb:
> komme ich aus dem Interrupt zurück wird ein
> Reset ausgelöst was ich generell schon ich sag mal schwachsinnig finde
> da ja von Timer bis zum LCD alles neu initialisiert wird mit werten, die
> schon in den jeweiligen Registern stehen.

Warum ist das so?

von (prx) A. K. (prx)


Lesenswert?

theodor schrieb:
> Ich habe ein Interrupt, es verändert Variabeln welche ich im
> Hauptprogramm weiter nutze, komme ich aus dem Interrupt zurück wird ein
> Reset ausgelöst was ich generell schon ich sag mal schwachsinnig finde

Normalerweise geht es bei Rückkehr von einem Interrupt exakt da weiter, 
wo unterbrochen wurde, nicht mit Reset. Andernfalls sitzt das Problem 
wahrscheinlich zwischen Stuhl und Tastatur (das PEBKAC Phänomen).

von theodor (Gast)


Lesenswert?

Zwischen stuhl und Tastatur befände sich nur die Maus...
1
.org 0x0000
2
rjmp    Init           
3
.org OVF0addr
4
rjmp    timer0_overflow

Nach Interrupt und nach jedem Reset wird doch der Resethandler 
aufgerufen oder verstehe ich das falsch.

So wie AK das sagt währe es ja super.

von (prx) A. K. (prx)


Lesenswert?

theodor schrieb:
> Zwischen stuhl und Tastatur befände sich nur die Maus...

In der Art "in the internet, noone knows I'm a mouse"?

von STK500-Besitzer (Gast)


Lesenswert?

theodor schrieb:
> Nach Interrupt und nach jedem Reset wird doch der Resethandler
> aufgerufen oder verstehe ich das falsch.

Jein.
Aus einem Interrupt wird per RETI zurück gesprungen.
Das sorgt dafür, dass die zuletzt auf dem Stack gespeichte Adresse 
angesprungen wird.

von Wolfgang (Gast)


Lesenswert?

theodor schrieb:
> Zwischen stuhl und Tastatur befände sich nur die Maus...

Während der Programmentwicklung sollte sich da noch etwas mehr 
befinden.

von theodor (Gast)


Lesenswert?

Dank euch, so ist das wenn man nichts ausprobiert, ich habe den Leuten 
geglaubt die mir mist erzählt haben und es einfach Probiert,

AK hast rechts ich kann bei Initialisierung Variablen verändern diese 
bleiben nach dem Interrupt und werden nicht neu gesetzt.

So bin ich zufrieden.

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.