- Labornetzteil AliExpress         
Ergebnis 1 bis 3 von 3

Thema: Variabeln aus Interrupt übergeben

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    06.07.2004
    Beiträge
    122

    Variabeln aus Interrupt übergeben

    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

    Code:
    #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
    		}
       } 
    }

  2. #2
    Gast
    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.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    06.07.2004
    Beiträge
    122

    DANKE!

    Danke vielmals...

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen