Fehlersuche Tastenentprellung

OP #1539856
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.