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