PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Variabeln aus Interrupt übergeben



surfer
13.10.2004, 14:40
Irgendwie funktioniert bei mir ein Programm wegen einer Variabel, die in einem Interrupt (Timer) gesetzt wird nicht...

Ist es überhaupt möglich, dass die im Interrupt gesetzte Variable (global! am Programmkopf initialisiert!) auch auf das Hauptprogramm übernommen wird?
Ich lass eine Schleife rotieren, solange bis der Timer seinen Überlauf bekommt und im Timerinterrupt wird die Variabel gestzt, die die Schleife im Hauptprogramm beendet... was leider nicht funktioniert...

Schicke auch noch den Code dazu... Merci


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

int a; // Globale Variable a initialisieren

timer_init (void) // Timer Initialisierung
{
TIMSK = _BV(TOIE1);
TCNT1 = 0; // Für ca. 1a berechnet mit 64er Prescaler
TCCR1B = _BV(CS11) | _BV(CS10);
}

SIGNAL (SIG_OVERFLOW1) // Timer Interrupt
{
a=1; // Globale Variable a auf 1 setzen
TCNT1=0; // Timer zurücksetzen
return;
}

int main (void) // Hauptprogramm
{
cli(); // Interrupts deaktivieren
DDRA=0xFF; // Ausgänge definieren
DDRB=0x00; // Eingänge definieren
timer_init(); // Timer Initialisierung aufrufen
while(1) // Endlosschleife
{ // Interrupts deaktivieren
a=0; // Globale Variable a auf 0 setzen
outp(0x00,PORTA); // LED's löschen
if(PINB==0x01) // Falls Taster gedrückt
{
outp(0xFF,PORTA); // LED's leuchten lassen
sei(); // Interrupts aktivieren
while(a==0); // Schleife --> rotiert solange die Globale Variable 0 enthält <-- Hier hängt das Programm!!!
cli(); // Interrupts deaktivieren
}
}
}

13.10.2004, 16:14
Tja, ein Blick in die WinAVR-Doku hätte dir verraten, dass man die Variable per volatile deklarieren muss. Jedes gute Tutorial natürlich auch.

surfer
13.10.2004, 16:25
Danke vielmals...