Forum: Mikrocontroller und Digitale Elektronik V-USB und Taster


von fechu (Gast)


Lesenswert?

Guten Tag alle zusammen,

Mein Problem dreht sich um V-USB. Allerdings nicht wie die meisten 
Threads hier um den Grundaufbau. Das habe ich alles und läuft auch 
wunderbar. Allerdings treten bei mir Probleme auf, wenn ich zusätzlich 
zur USB Schnittstelle noch 2 Taster einbaue.

Mein Code sieht wie folgt aus:
1
char buttonState(uint8_t pin)
2
{
3
    static unsigned char zustand[3];
4
    char rw = 0;
5
    
6
    if(zustand[pin] == 0 && !(PINB & (1<<pin)))   //Taster wird gedrueckt (steigende Flanke)
7
    {
8
        zustand[pin] = 1;
9
        rw = 1;
10
        _delay_ms(10);
11
    }
12
    else if (zustand[pin] == 1 && !(PINB & (1<<pin)))   //Taster wird gehalten
13
    {
14
        zustand[pin] = 2;
15
        rw = 0;
16
    }
17
    else if (zustand[pin] == 2 && (PINB & (1<<pin)))   //Taster wird losgelassen (fallende Flanke)
18
    {
19
        zustand[pin] = 3;
20
        rw = 0;
21
        _delay_ms(10);
22
    }
23
    else if (zustand[pin] == 3 && (PINB & (1<<pin)))   //Taster losgelassen
24
    {
25
        zustand[pin] = 0;
26
        rw = 0;
27
    }
28
    
29
    return rw;
30
}
31
32
int main(void)
33
{
34
    // Set the registers
35
    DDRB |= (1 << PB1) | (1 << PB2); // The LEDs
36
    DDRB |= (0 << PB3) | (0 << PB4); // The Buttons
37
    PORTB |= (1 << PB3) | (1 << PB4); // Activate PullUps
38
    
39
    wdt_enable(WDTO_1S);    // Enable 1s watchdog timer
40
    
41
    // Initialize USB
42
    usbInit();
43
44
    // Turn LEDs on while initialization
45
    PORTB |= (1 << PB1) | (1 << PB2);
46
47
 
48
    /*  Block */
49
    usbDeviceDisconnect();
50
    wdt_reset();
51
    _delay_ms(500);
52
    usbDeviceConnect();
53
    /* Block */
54
    
55
    // Initialization finished. turn LEDs off.
56
    PORTB &= ~((1 << PB1) | (1 << PB2));
57
 
58
    
59
    // Enable Interrupts
60
    sei();
61
    
62
    while(1) {
63
        
64
        usbPoll();
65
        wdt_reset();
66
        
67
        if (buttonState(PB3)) { // The right button
68
            status ^= (1 << 1);
69
            PORTB ^= (1 << PB1);
70
        }
71
        
72
        if (buttonState(PB4)) { // The left button
73
            status ^= (1 << 0);
74
            PORTB ^= (1 << PB2);
75
        }
76
        
77
        PORTB ^= (1 << PB1);
78
    }
79
    
80
    return 0;
81
}

Wenn ich den Block der mit zwei Kommentarblöcken umschlossen ist (in 
main()) auskommentiere funktionieren die beiden Taster mit den LEDs 
wunderbar. Ein Druck auf die Taste bringt die LED zum leuchten und ein 
weiterer Druck auf die Taste löscht die LED wieder aus. Sobald ich aber 
den Block nicht mehr auskommentiere. Wird das Gerät wunderbar als USB 
Device erkannt. Allerdings funktionieren meine Taster nicht mehr. Ich 
kann mir dieses Verhalten nicht erklären.

Kann mir jemand weiterhelfen? Oder muss ich die Taster an einem anderen 
Ort als in der Main schlaufe überprüfen und ggf. die LEDs 
an/ausschalten.
Ich bin um jede Hilfe sehr dankbar. Ich weiss wirklich nicht wo der 
Fehler liegen könnte.

von Karlheinz (Gast)


Lesenswert?

Hallo,

zwei Dinge springen mir ins Gesicht

> static unsigned char zustand[3];

zu klein dimensioniert wegen Aufruf mit PB3/PB4

und was ist das

> DDRB |= (0 << PB3) | (0 << PB4); // The Buttons

von fechu (Gast)


Lesenswert?

Ah stimmt. Dimensionierung stimmt natürlich nicht. Das habe ich 
angepasst.

Die andere Zeile ist für mich, damit ich weiss wo die Buttons sind. Sie 
bringt natürlich gar nichts. Das ist mir bewusst.

Das Problem lag nicht nur bei der Software. Zusammen mit der Anpassung 
der Dimensionierung des Arrays war auch noch eine Lötstelle nicht ganz 
korrekt.

Vielen Dank für die Hilfe.

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.