Servus Leute,
ich hoffe, ihr könnt mir bei einem (für mich) etwas kuriosen Problem
helfen. Ich habe mich in den letzten Tagen mit V-USB beschäftigt und
diverse Projekte aufgebaut. Nun wollte ich HIDkeys
(http://www.obdev.at/products/vusb/hidkeys.html) in eine Zehnertastatur
für den Computer umbauen. Grundlage ist eine 3x4-Tastaturmatrix.
Der originale Hidkeys-Code funktioniert problemlos, USB-Gerät wird
erkannt. Das ganze läuft mit einem 15 MHz-Quarz (F_CPU korrekt
eingestellt).
Hardware entspricht Hidkeys, die originalen Schalter sind alle entfernt,
stattdessen ist die Tastatur angeschlossen:
Rows: PORTB, Bits 0..3
Cols: PORTC, Bits 0..2
Der Rest der Ports ist nicht beschaltet.
Nun zu meinem Problem: Ich habe die Funktion keyPressed für meine
Bedürfnisse angepasst und das Scannen der Cols und Rows in eigene
Funktionen ausgelagert, um das Problem deutlicher zu beschreiben.
1 | static uchar GetCols(void)
|
2 | {
|
3 | DDRB = 0x0F;
|
4 | PORTB = 0xF0;
|
5 |
|
6 | DDRC = 0xF8;
|
7 | PORTC = 0x07;
|
8 |
|
9 | asm volatile ("NOP");
|
10 |
|
11 | // read columns
|
12 | if (! (PINC & 0x04)) return 3;
|
13 | if (! (PINC & 0x02)) return 2;
|
14 | if (! (PINC & 0x01)) return 1;
|
15 |
|
16 | return 0;
|
17 | }
|
18 |
|
19 | static uchar GetRows(void)
|
20 | {
|
21 | DDRC = 0x07;
|
22 | PORTC = 0xF8;
|
23 |
|
24 | DDRB = 0xF0;
|
25 | PORTB = 0x0F;
|
26 |
|
27 | asm volatile ("NOP");
|
28 |
|
29 | // read rows
|
30 | if (! (PINB & 0x08)) return 9;
|
31 | if (! (PINB & 0x04)) return 6;
|
32 | if (! (PINB & 0x02)) return 3;
|
33 | if (! (PINB & 0x01)) return 0;
|
34 |
|
35 | return 0;
|
36 | }
|
37 |
|
38 | static uchar keyPressed(void)
|
39 |
|
40 | {
|
41 | uchar r, c;
|
42 | r = 0;
|
43 | c = 0;
|
44 |
|
45 | r = GetRows();
|
46 | c = GetCols();
|
47 |
|
48 | return (r+c);
|
49 | }
|
Wird nur GetRows() oder nur GetCols aufgerufen, klappt alles, die
Tasten (natürlich nur Zeilen bzw Spalten jeweils gleichen Werten) werden
korrekt erkannt. Damit sollte auch die Hardware in Ordnung sein
(richtige Ports, Leitungen korrekt angeschlossen).
Werden aber beide Befehle nacheinander aufgerufen (wie im o.g. Code),
spielt die Tastatur verrückt, es werden falsche Tasten ausgegeben,
teilweise auch dann, wenn keine Taste gedrückt ist.
Gruß,
Daniel