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.
Bemerkung: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 } }
- 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?






Zitieren


Lesezeichen