Erst einmal vielen Dank für eure Mühe!
Folgenden Code finde ich sehr einfach und übersichtlich.
Bei "volatile uint8_t RegA_akt = PINA" hat der Compiler gemeckert, daher den Umweg über InitKeys().
Tastenentprellung ist noch nicht drin.
Code:
volatile uint8_t RegA_akt; // übergeordnete Variable
void InitKeys(void)
{
RegA_akt = PINA; // aktuelles Register A wird gespeichert
}
ISR (PCINT0_vect) // Interrupt, aus Bank0, wird ausgelöst
{
uint8_t Auswahl = 0;
uint8_t RegA_neu = PINA;
uint8_t RegA_diff = RegA_akt ^ RegA_neu; // veränderte Bits werden mit 1 belegt
if((RegA_diff & (1<<PINA4)) != 0) // PA4 wurde verändert
{
if((RegA_neu & (1<<PINA4)) == 0) Auswahl=40; // PA4 ist low
if((RegA_neu & (1<<PINA4)) != 0) Auswahl=41; // PA4 ist high
}
if((RegA_diff & (1<<PINA5)) != 0) // PA5 wurde verändert
{
if((RegA_neu & (1<<PINA5)) == 0) Auswahl=50; // PA5 ist low
if((RegA_neu & (1<<PINA5)) != 0) Auswahl=51; // PA5 ist high
}
switch(Auswahl)
{
case 40: LEDaus(); Auswahl=0; InitKeys(); break; // PA4 low
case 41: LEDein(); Auswahl=0; InitKeys(); break; // PA4 high
case 50: SUMaus(); Auswahl=0; InitKeys(); break; // PA5 low
case 51: SUMein(); Auswahl=0; InitKeys(); break; // PA4 high
}
}
@Holomino, deine Tastenentprellung habe ich noch nicht in Gänze verstanden.
Wie kann man aus einem ISR, einen Wert zurück geben, außer eine erneute volatile-Variable zu verwenden?
Euch ein angenehmes Wochenende :cool: