www.mikrocontroller.net

Forum: Compiler & IDEs Variable lokal, global


Autor: Ulrich Bosch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}
}

Autor: Conlost (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Florian Pfanner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

schreib mal
volatile char Licht;


Gruß, Florian

Autor: Ulrich Bosch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (Gast)
Datum:

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

Autor: Ulrich Bosch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank Jörg

Ulrich

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.