Hallo Leute.
Habe an meinem Code weiter gearbeitet, hänge aber gerade an Tasten-/Kontaktentprellung fest.
Bis auf folgende Anweisung mit "i"-Schleife, funktioniert alle einwandfrei - dank Eurer anregungen!
"i" in RegA_Abfrage() sollte die 10ms-Schleifen hoch zählen. Sind 30ms (Entprellzeit) keine Veränderung vorgekommen, werden die veränderten Eingänge ausgewertet und verarbeitet.
Irgendwo scheint sich hier ein Logikfehler zu verstecken, da RegA_Auswertung() nicht mehr angesprochen wird.
Code:
ISR(TIM1_COMPA_vect)
{
OverflowZaehler++;
EingIntervall++;
if(OverflowZaehler >= 60000) // 1ms*60 000 = 1Min // uint16_t 0…65.535
{
OverflowZaehlerReset();
}
if (EingIntervall==10) // alle 10[ms] werden die Eingangskontakte abgefragt
{
RegA_Abfrage(); // Eingänge auf Veränderung analysiert
EingIntervall=0;
}
}
void RegA_Abfrage(void)
{
uint8_t RegA_neu;
uint8_t RegA_dif;
uint8_t i;
RegA_neu = PINA; // PINA-Regist. wird ausgelesen
if(((RegA_dif = RegA_akt ^ RegA_neu) !=0) && i>=3) // Änderungen gegenüber Vor-Interrupt=1 UND >=30ms
{
RegA_Auswertung(RegA_dif, RegA_neu); // Pins einzeld auswerten
i=0;
}
i++;
RegA_akt = RegA_neu; // akt. PINA in Vor-Interrupt speichern, für den nächsten ISR
}
void RegA_Auswertung (uint8_t RegA_dif, uint8_t RegA_neu) // Pins einzeld auswerten
{
uint8_t RegA_high;
uint8_t RegA_low;
uint8_t Zuweisung=0;
RegA_high = RegA_dif & RegA_neu; // Pins von 0 auf 1 = 1
RegA_low = RegA_dif & ~RegA_neu; // Pins von 1 auf 0 = 1
if(((RegA_high & (1<<PINA4)) != 0) && (PA4frei==1)) Zuweisung=41; // PA4 wurde high
if(((RegA_low & (1<<PINA4)) != 0) && (PA4frei==1)) Zuweisung=40; // PA4 wurde low
if(((RegA_high & (1<<PINA5)) != 0) && (PA5frei==1)) Zuweisung=51; // PA5 wurde high
if(((RegA_low & (1<<PINA5)) != 0) && (PA5frei==1)) Zuweisung=50; // PA5 wurde low
switch(Zuweisung)
{
case 41: LEDrt_ein; Zuweisung=0; break; // PA4 high
case 40: LEDrt_aus; Zuweisung=0; break; // PA4 low
case 51: SUM_ein; Zuweisung=0; break; // PA5 high
case 50: SUM_aus; Zuweisung=0; break; // PA5 low
}
}
Bemerkung:
- OverflowZaehler ist static und wird mit 1ms, über Timer-Interrupt getaktet/hoch gezählt.
- PA4frei, PA5frei static-Var., kommen aus dem main und schalten die jeweiligen Pin ein/aus.
- RegA_akt, RegA_neu, EingIntervall sind static-Var.
- - - Aktualisiert - - -
Fehler gefunden!
"i" muss eine static-Variable sein!
Klappt jetzt prime - was haltet ihr von der Struktur?
Lesezeichen