Forum: Mikrocontroller und Digitale Elektronik Langes Drücken funktioniert nur bei einem Taster


von Bastian F. (bastian_f)


Angehängte Dateien:

Lesenswert?

Angelehnt an http://www.rn-wissen.de/index.php/Taster-Abfrage_in_C habe 
ich etwas rumgespielt und auch noch versucht den Code zu verstehen.
Beides hat noch nicht ganz funktioniert...
Es funktioniert nur das lange Drücken von Taster 1.
Bei 0 und 2 passiert nichts.
Alle Taster sind gleich geschaltet (Pull Down mit 10k).
(Habe auch die Taster selber mal getauscht um einen Hardware"schaden" 
auszuschließen, änderte aber nichts)
Kann mir jemand erklären woran das liegen könnte?

Hier der Code:
1
#define F_CPU 1000000
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
#include <util/delay.h> 
5
#include "taster.h"
6
#include "taster.c"
7
8
SIGNAL (SIG_OVERFLOW0)
9
{
10
    static unsigned char count_ovl0;
11
    unsigned char ovl0 = count_ovl0+1;
12
13
    if (ovl0 >= 39)
14
    {
15
        get_taster (0, PINB & (1<<PB0));
16
    get_taster (1, PIND & (1<<PD7));
17
    get_taster (2, PIND & (1<<PD6));
18
        
19
        ovl0 = 0;
20
    }
21
22
    count_ovl0 = ovl0;
23
}
24
25
void ioinit()
26
{
27
28
  PORTD |= 1 << PD7;
29
  PORTD |= 1 << PD6;
30
  PORTB |= 1 << PB0;
31
 
32
    /* Timer0 ohne Prescaler starten */
33
    TCCR0 = 1 << CS00;
34
 
35
    /* Timer0-Overflow-Interrupt aktivieren */
36
    TIMSK |= (1 << TOIE0);
37
}
38
39
int main()
40
{
41
   
42
     DDRC = 255;
43
    ioinit();
44
 
45
    /* Taster konfigurieren (#define NUM_TASTER 3 in taster.h) */
46
    tasten[0].mode = TM_SHORT;
47
    tasten[1].mode = TM_LONG;
48
    tasten[2].mode = TM_REPEAT;
49
 
50
    /* Interrupts global aktivieren */
51
    sei();
52
53
    /* Hauptschleife */
54
    while (1)
55
    {
56
        signed char tast = taster;
57
  
58
        switch (tast)
59
        {
60
            default:
61
            case NO_TASTER:
62
  
63
            break;
64
    
65
            case 0:
66
            
67
        PORTC |= (1 << PC3);
68
      
69
      break;
70
            
71
      case 0+TASTER_LONG:
72
            
73
          PORTC &= ~( (1 << PC5) | (1 << PC4) | (1 << PC3) );
74
75
            break;    
76
77
            case 1:
78
             
79
        PORTC |= (1 << PC4);
80
81
            break;
82
        
83
            case 1+TASTER_LONG:
84
        
85
        PORTC &= ~( (1 << PC5) | (1 << PC4) | (1 << PC3) );
86
                
87
            break;
88
89
      case 2:
90
91
        PORTC |= (1 << PC5);
92
      
93
      break; 
94
95
      case 2+TASTER_LONG:
96
97
        PORTC |= (1 << PC5) | (1 << PC4) | (1 << PC3);
98
        
99
      break;
100
        }
101
  
102
        if (tast != NO_TASTER)
103
            taster = NO_TASTER;
104
105
        /* ********************************** */
106
        /* Weiterer Code in der Hauptschleife */
107
    }
108
}

von Bastian F. (bastian_f)


Lesenswert?

Schon gut...
Habs grade selber gesehen...

Lesen und verstehen for the win:

    /* Taster konfigurieren (#define NUM_TASTER 3 in taster.h) */
    tasten[0].mode = TM_SHORT;
    tasten[1].mode = TM_LONG;
    tasten[2].mode = TM_REPEAT;

von Peter D. (peda)


Lesenswert?


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.