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; } }
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
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
Die avr-libc Doku, dort besonders die FAQ. Die von Dir gestellte Frage hat nicht umsonst Platz 1 in der FAQ abbekommen...
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.