Hallo,
die meisten Tasterprobleme werden meiner Erfahrung nach auch durch diese kleinen Modifikationen an PollSwitch gelöst:
Code:
unsigned char PollSwitch (void){
unsigned int i;
// Kehrt sofort zurück, falls kein Taster gedrückt ist
if (PIND & SWITCHES) return 0;
DDRD |= SWITCHES; // Port-Bit SWITCHES als Output
SWITCH_ON; // Port-Bit auf HIGH zur Messung
ADMUX = (1 << REFS0) | SWITCH; // AVCC reference with external capacitor
Sleep (10); // Kondensator Zeit geben
ADCSRA |= (1 << ADSC); // Starte AD-Wandlung
while (!(ADCSRA & (1 << ADIF))); // Ende der AD-Wandlung abwarten
ADCSRA |= (1 << ADIF); // AD-Interupt-Flag zuruecksetzen
i = ADCL + (ADCH << 8); // Ergebnis als 16-Bit-Wert
DDRD &= ~SWITCHES; // Pin SWITCHES als Eingang
SWITCH_OFF; // Pull-Up abschalten
Sleep (5);
return ((10240000L / (long)i - 10000L) * 63L + 5000L) / 10000;
}
Die Abfrage des INT1/PD3"=Pins sofort zu Beginn ist eher eine Performance=Frage und unterbindet das Anwerfen des Wandlers, wenn sowieso keiner der Taster gedrückt ist.
Wesentlich wichtiger ist das Rücksetzen von PD3 auf Input&PullUpOff direkt nach der Messung.
In der ursprünglichen Version von PollSwitch wird lediglich SWITCH_OFF (=PORTD &= ~(1 << PD3)) durchgeführt, was PD3 als Output/GND hinterlässt. Damit lädt sich Kondensator C7 nach dem ersten Aufruf von PollSwitch nur noch auf die durch den Spannungsteiler R24/R23 (1k/1M) erzeugte Spannung auf (jedenfalls solange kein Taster gedrückt ist). Der nächste Aufruf von PollSwitch setzt PD3 zu Beginn zwar wieder auf HighPegel, wodurch eine zweckmäßige Messung prinzipiell gelingen kann -- Jedoch zeigt das Ergebnis wohl durch das träge Aufladen des Kondensators oftmals auch dann einen gedrückten Taster an, wenn tatsächlich keiner gedrückt ist.
Natürlich muss unter Umständen zusätzlich noch der bekannte Multiplikator (bei mir 63) angepasst werden, damit überhaupt sinnvolle Werte zurückgegeben werden können. Die jedoch mitunter auch nach dieser "Kalibrierung" verbleibende gröbste Verwirrung der Taster -- nämlich die Fehlanzeige eines gedrückten Tasters -- sollte durch das Rücksetzen von PD3 behoben werden.
HTH
Thomas
Lesezeichen