Zitat Zitat von DerSchatten
Hm, wo ist der Fehler? ...
Mit meinen bescheidenen Kenntnissen in C tue ich mir immer schwer, daher auch meine Unfähigkeit (und Abneigung), Codebruchstücke auf Fehler zu durchleuchten. Vor allem bei minimalistischen Kommentaranteilen.

Bei mir gibt es Tasten, die beim Drücken den zugehörigen Eingang - mit internem PullUp - einfach auf GND legen. Ich habe mir für die Tastenverwaltung eine Timerroutine geschrieben, die mit 100 Hz eine ISR aufruft. Darin wird u.a. dies gemacht:
Code:
// Globale Deklarationen und so:

 #define rLED    3              // Rote LED       auf PB3
 #define TAU     1              // Taster "Aufwärts", PB1
 #define TAB     2              // Taster "Abwärts",  PB2 = "Start"Taste

  volatile uint8_t TABsts;      // Status derTaste TAB
                                //   = 0 <=> nicht gedrückt, =1 <=> gedrückt
  volatile uint8_t TAUsts;      // Status derTaste TAU, wie oben
  volatile uint8_t TABcnt;      // Counter für Taste TAB
  volatile uint8_t nTABcnt;     // Counter für Taste notTAB
  volatile uint8_t TAUcnt;      // Counter für Taste TAU, wie oben
  volatile uint8_t nTAUcnt;     // Counter für Taste notTAU, wie oben
                                //
// ================================================================================
// ===  Nicht unterbrechbare ISR für timer1 =======================================
// Interrupt mit ca. 100 Hz/10 ms. Diese ISR wird benutzt
//   A  zum Auslesen der Tasten
//      Nach Ende der Routine sind die Tastenstati in den Statusbytes
// ...
//
 ISR(TIM1_COMPA_vect)           // Vektor 4 (1 ... 4 !!!)                 doc S  50
 {                                
 ...
// - -  Zuerst für TAB   - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 TABsts = (!(PINB & (1<<TAB))); // Status von Taste TAB holen
                                  
 if (TABsts)                    // Taste TAB gedrückt?
 {                                
   if (TABcnt < 254)            // Wenn counter < 250
   {                              
     TABcnt     ++;             //   dann hochtackern
     nTABcnt    = 0;            //   und Nicht-TABcount auf Null setzen
   }                              
 }                                
 else                           // Taste TAB ist nicht gedrückt
 {                                
   if (nTABcnt < 254)           // Wenn Not-counter < 250
   {                              
     nTABcnt    ++;             //   dann hochtackern
     TABcnt     = 0;            //   und TABcount auf Null setzen
   }                              
 }                                
// .... und so weiter
// ================================================================================


// ================================================================================
// ===  Initialisierung fuer Timer1 tiny85 ========================================
// ===    Interner Oszillator, 8 MHz mit CKDIV8   =================================
 void TC1TMR_init(void)         // Init Tmr/Cntr1, 8-Bit auf ca. 100 Hz = 10 ms
 {	                          
  TCCR1  |=  (1<<CTC1);         // Timer im CTC-Mode, Top=OCRA            doc S  92
  TCCR1  |=  (1<<CS12)|(1<<CS11)|(1<<CS10);
                                // Prescaler Clock1/64                    doc S  93
  OCR1C   =   152;      // Preset/Preload = 152 => getestet ca. 0,010s @ 1,0Mhz
  TIMSK  |=  (1<<OCIE1A);       // Tmr/Cntr1 CompareA interrupt enabled
 }                                
// ================================================================================
So - damit kann ich im main oder sonstwo bequem feststellen, ob und wie lange eine Taste gedrückt wurde - alles über 2,5 sec ist eben "ewig". Ausserdem ist damit auch feststellbar, wie lange die Taste nach dem letzten Drücken gelöst wurde - auch hier beginnt die Ewigkeit schon bei 2,5 sec. Läuft problemlos - und ist recht resistent gegen Spikes und so.

Zitat Zitat von DerSchatten
Hat vielleicht jemand ein einfacheres Beispiel für mich ...
Ob das für Dich nun einfach(er) ist, weiß ich natürlich nicht.