Langes Drücken funktioniert nur bei einem Taster

OP #1917511
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
}
Angehängte Dateien:

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.