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:
Code:
#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);
}
}
Gruß Alex
Lesezeichen