Variable lokal, global

Gast #77440
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;
}
}
Gast #77441
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
Gast #77443
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.