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