Forum: Mikrocontroller und Digitale Elektronik Fehlersuche Tastenentprellung


von Stephan M. (johnwurst)


Lesenswert?

Hi,

ich versuche mich gerade an einem größeren Projekt (eine Art 
Bordcomputer fürs Auto), bei dem ich es mir nicht erlauben kann Zeit in 
einem delay zu vertrödeln. Deshalb habe ich mich am Pollen von Tasten 
versucht. Leider nur mit mäßigem Erfolg. Das Entprellen funktioniert 
nicht so richtig, wie es soll. Erst mal der Code:

1
//Prozessor ist in AVR Studio auf mega8 festgelegt
2
//Clock intern 8 MHZ
3
 
4
// Ein- und Ausgaberegister laden
5
#include <avr/io.h>
6
#include <avr/interrupt.h>
7
8
9
10
11
12
/////////////
13
//globale Variablen
14
////////////
15
16
17
volatile uint8_t flag;     //Flag für TimerInterrupt0
18
19
uint8_t drueck = 0;     //Zähler für Zustand "Taste gedrückt"
20
21
22
int main() {
23
 
24
25
// IO konfigurieren
26
//0xFF = Ausgang, 0x00 = Eingang 
27
 
28
  DDRC = 0xFF;
29
  DDRD = 0X00;
30
  PORTD |= (1<<PD3); //Pin3 Pullup aktivieren -> Taster zieht auf 0
31
     
32
 
33
// Timer0 konfigurieren
34
    TCCR0 |= (1<<CS02);        // Vorteiler 256
35
    TIMSK |= (1<<TOIE0);       // Timer Overflow Interrupt freischalten 
36
                             // Überlauf alle 8,19ms
37
 
38
// Interrupts freigeben
39
     sei();
40
 
41
// Endlose Hauptschleife
42
   while(1) {
43
            
44
    if (flag == 1) { // Timer Interrupt0; 8ms vergangen
45
            flag=0;
46
           
47
        //Tasterabfrage mit Entprellung
48
        //wenn 4x gleicher Zustand -> entprellt
49
            
50
        if(!(PIND & (1<<PD3))) {     //PD3 auf 0 gezogen 
51
                drueck ++;
52
        }
53
        else { //Taste nicht mehr gedrückt
54
            drueck = 0;
55
        }
56
57
        if(drueck >= 8){  //Taste bei 4 aufeinander folgenden Interrupts gedrückt
58
               drueck = 0;
59
               PORTC ^= (1<<PC1);
60
              }
61
62
      
63
        }
64
  
65
  }
66
}
67
68
69
//Timer0 Overflow, tritt alle 8ms auf
70
 
71
ISR( TIMER0_OVF_vect ) {
72
    flag = 1;
73
}

Das Programm soll also bei jedem Interrupt Overflow testen ob die Taste 
gedrückt ist und das auch für weitere 8Interrupts bleibt, also 64ms 
lang. Zum Loslassen müsste man nach meinem Verständnis wieder genauso 
lange Zeit haben. Leider funktioniert das ganze mehr als schäbig :( 
Woran liegts?

Gruß
Stephan

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.