Nur mal so zum Verständnis;
Diese Methode verbindet eine Timer-Interruptabfrage aller Eingänge kombiniert mit einer Entprellung >>> Toll!
Ich stelle mir das ALS ANFÄNGER so vor;
1. Zustand aller aktiven I/O-Eingänge wird in Variablen gespeichert.
2. Timer löst nach 10ms einen Timer-Interrupt aus
3. Wieder werden alle Eingangszustände ab gefragt und nmit den gespeicherten verglichen
4.1. keine Statusänderung, wird ab 2. wiederholt
4.2. Statusänderung erkannt
5. der betroffene Eingang wird noch 5-10 mal im 10ms Takt abgefragt
6. bestätigt sich die Statusänderung, wird eine entsprechende Variable (Eingang X==1) weiter verarbeitet
Das war übrigens mein gestriger Gedanke, eine "Listenabfrage" mit dem INT0, bis die verlockung winkte, dass jeder Eingang seinen eigenen Interrupt hat.
Dann war mein erster Gedanke doch nicht sooooo schlecht.
- - - Aktualisiert - - -
Zur Verdeutlichung meiner möglichen Abfrage-Struktur;
// PORTs setzen
//Gesamtes Register auslesen
uint8_t ZustandPA = PORTA;
uint8_t ZustandPB = PORTB;
//einzelne PORTs auslesen
uint8_t ZustandPA4 = PORT & (1<<PA4);
uint8_t ZustandPB5 = PORT & (1<<PB5);
// beliebig erweiterbar
//INT0 oder TIM1_COMPA_vect Interrupt wird ausgelöst ...
if ((PORTA != ZustandPA) || (PORTB != (ZustandPB)); // wenn sich irgend etwas an den Eingängen verändert
{
if ((PINA & (1<<PA4)) != ZustandPA4; {...mach was...} // wenn ungleich, dann mach was
if ((PINB & (1<<PB5)) != ZustandPB5; {...mach was...} // wenn ungleich, dann mach was
// beliebig erweiterbar
}
Lesezeichen