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.