HI Hannes!
Danke für deine schnelle Antwort.
Habe den Variablen in volatile Variablen geändert. Die If/Else rausgeschmissen und in switch case geändert.
Leider bestand das Problem immer noch. Des Rätzels Lösung war, den Toggelbefehl in "else if (c == 2)" in - LED ein - warten - LED aus - warten - zu ändern. Jetzt läuft es fast so wie ich mir das vorgestellt habe.
Das einzige Problem das jetzt noch besteht ist, dass ich den Schalter teilweise mehrmals betätigen muss um das Blinkmuster zu verändern.
Woran kann das denn liegen?
Hier nochmal der geänderte Code:
Gruß AlexCode:#define F_CPU 1000000UL #include <util/delay.h> #include <avr/io.h> #include <avr/interrupt.h> #include <stdio.h> #define LED1 0 #define LED2 1 #define LED3 2 #define LED4 3 //variablen für interrupt volatile int a = 1; volatile int b = 2; volatile int c; volatile int d; int main(void) { //I/O-Ports einstellen DDRB = 0b00001111; //Einstellung Interrupt PORTD = 0b00000100; GIMSK = (1<<INT0); //Globale interrupts aktivieren sei(); //Wert in Variable setzen c = 2; while (1) { switch(c) { case 1: PORTB |= ((1<<LED1) | (1<<LED3)); //LED1 und 3 ein PORTB &= ~((1<<LED2) | (1<<LED4)); //LED2 und 4 aus _delay_ms(500); PORTB |= ((1<<LED2) | (1<<LED4)); //LED2 und 4 ein PORTB &= ~((1<<LED1) | (1<<LED3)); //LED1 und 3 aus _delay_ms(500); break; case 2: PORTB |= ((1<<LED1) | (1<<LED2) | (1<<LED3) | (1<<LED4)); //LED1-4 ein _delay_ms(500); PORTB &= ~((1<<LED1) | (1<<LED2) | (1<<LED3) | (1<<LED4)); //LED1-4 aus _delay_ms(500); break; } } } ISR(INT0_vect) { { //switch case Abfrage switch(c) { case 1: d = b; break; case 2: d = a; break; default: PORTB &= ~((1<<LED1) | (1<<LED2) | (1<<LED3) | (1<<LED4)); } c = d; return; _delay_ms(250); } }







Zitieren

Lesezeichen