PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfängerfrage Globale Variablen [Gelöst]



Teddynator
13.01.2009, 22:02
Hallo... habe ein kleines Problem mit einer globalen Variablen
Das Programm ist nur ein Versuch um die Interrupt Funktion zu testen.
LED 1 soll leuchten wenn der Interrupt eintritt, zugleich soll die Variable a auf 1 gesetzt werden. Nun wird im Hauptprogramm die Variable a abgefragt, wenn sie 1 ist, soll LED 2 leuchten. Mein Problem: LED 2 leuchtet nicht. Woran könnte das liegen?

Ich verwende MyAVR und einen Atmega 8.

Wäre schön wenn mir jemand helfen könnte.

Vielen Dank schonmal


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

char a = 0;
void init(void) //Initialisierung
{

DDRD = 0b11100000; //Pin 765 = Output 0-4 = Input
DDRC = 0b00111000; //status LED ausgänge (Port C: 3,4,5)

GICR|=(1<<INT0); //enables ext Interrupt (Pin 4, INT0)
MCUCR = 0b00000011; //Steigende Flanke an INT0 Löst aus
sei (); //Global Interrupt enable
}
ISR(INT0_vect)
{
a = 1; //setzte a auf 1
PORTC |= (1 << PC5); //schalte 1. LED ein
}
void main(void)
{
init();
while (1);
{
if (a == 1) //wenn a = 1
{
PORTC |= (1 << PC4); //schalte 2. LED ein
}
}
}

Gock
13.01.2009, 22:38
Auf die Schnelle:
deklariere char a mal als volatile oder schalte die Optimierung aus.
Habe die Initialisierung jetzt nicht geprüft und zur Hardware kann ich natürlich auch nicht sagen...
Gruß

thewulf00
14.01.2009, 08:16
Genau wie Gock gesagt hat, sollte es an VOLATILE liegen. Im Hauptprogramm liest er einmalig die Variable aus dem RAM und dann prüft er nur noch das Register auf Deine '1'.
Wird aber nun der RAM auf eine '1' gesetzt, übernimmt das Hauptprogramm diese nicht, da es nicht weiß, dass sich was geändert hat, so dass es die Variable nicht erneut aus dem RAM liest.

Also einfach der Variablendeklaration ein VOLATILE vorsetzen, dann weiß der Compiler bescheid.

Teddynator
14.01.2009, 17:14
Erst mal danke euch beiden

@Gock: was meinst du mit Optimierung ausschalten? wie macht man das?

volatile Hat nichts bewirkt, gleiches Problem wie vorher

EDIT: Hat sich erledigt. habe nach der while Schleife versehentlich ein Semikolon gesetzt. Jetzt funktionierts