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.
Eine etwas deutlichere Beschreibung des Problems könnte helfen. Dass bei Reset alles neu initialisiert wird ist i.d.R. Absicht.
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.
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.
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?
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).
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.
theodor schrieb: > Zwischen stuhl und Tastatur befände sich nur die Maus... In der Art "in the internet, noone knows I'm a mouse"?
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.
theodor schrieb: > Zwischen stuhl und Tastatur befände sich nur die Maus... Während der Programmentwicklung sollte sich da noch etwas mehr befinden.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.