Forum: Compiler & IDEs Variable lokal, global


von Ulrich Bosch (Gast)


Lesenswert?

Hallo,

ich möchte gerne eine Variable im Hauptprogramm durch das Ausführen
eines Interrupts hervorrufen. Ich habe die Variable als globale
Variable definiert. Der Interrupt verändert die Variable Licht auch.
Aber nach der Rückkehr zu dem Hauptprogramm wird der alte Wert der
Variablen wieder übernommen.
Vor dem Interrupt- Sprung wird der alte Wert erst mit einem PUSH
Befehl gesichert und bei dem Rücksprung wieder mit dem POP Befehl  der
Variablen zugewiesen.
Ich wollte eigentlich den neuen Wert weiter verwenden.
Eine globale Variable müsste sich doch auch in den Unterprogrammen
verändern lassen.
Bei meinem PRG ist das Verhalten aber doch wie bei einer lokalen
Variablen.
Wo habe ich einen Fehler gemacht?
Ulrich

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

char Licht;
int Initialisierung()
{
DDRC=255;
Licht=1;
}
Timer()
{
TIMSK=64;
OCR1AL=65;
TCCR1B=9;
sei();
}
INTERRUPT(SIG_OUTPUT_COMPARE1A)
{
if (Licht==0x80)
Licht=1;
else
Licht<<=1;
}
int main()
{
Initialisierung();
Timer();

while(1)
{
PORTC=~Licht;
}
}

von Conlost (Gast)


Lesenswert?

Hallo,
die Variable wird wie du schreibst auf den Stack gelegt zu Beginn
der Interruptroutine und nach dem abarbeiten der routine wieder
vom Stack geholt.
Das ist auch richtig so, wenn die Variable danach wieder vom
Hauptprogramm mit dem alten Wert benötigt wird.
Wenn du nun diese Variable in der Interruptroutine veränderst
und im Hauptprogramm weiterverarbeiten willst, so darf du
sie nicht vorher auf den Stack legen und nacher wieder vom
Stack zurückholen.
Ich hoffe ich habe nun keinen Mist erzählt. :-)
Jedenfalls ist es so in Assembler und in C sollte es eigentlich
genauso sein.

Gruß,
Arno

von Florian Pfanner (Gast)


Lesenswert?

Hallo,

schreib mal
volatile char Licht;


Gruß, Florian

von Ulrich Bosch (Gast)


Lesenswert?

Hallo,

in Assember ist mir diese Sache  bekannt. Nur wenn ich in „c“ das
Programm schreibe, werden die Befehle vom Programm umgesetzt und dort
kam dann immer die Sache mit Push u.s.w. heraus.
Mit dem Hinweis von volatile als Vorsatz bei der Variablen Deklaration
bin ich weiter gekommen.
Bedanke mich für die schnelle Beantwortung der Frage. Gibt es
eigentliche eine gute Quelle, (Buch  oder online ) von der man diese
Informationen  und Begründungen bekommen kann?
Schön wäre auch eine deutschsprachige Quelle, da mein Englisch nicht so
perfekt ist.

Ulrich

von Jörg Wunsch (Gast)


Lesenswert?

Die avr-libc Doku, dort besonders die FAQ.  Die von Dir gestellte
Frage hat nicht umsonst Platz 1 in der FAQ abbekommen...

von Ulrich Bosch (Gast)


Lesenswert?

Vielen Dank Jörg

Ulrich

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.