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.
@Holomino, deine Tastenentprellung habe ich noch nicht in Gänze verstanden.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 } }
Wie kann man aus einem ISR, einen Wert zurück geben, außer eine erneute volatile-Variable zu verwenden?
Euch ein angenehmes Wochenende
Lesezeichen