Forum: Mikrocontroller und Digitale Elektronik [AVR/C] Problem mit Tastaturmatrix-Programmierung


von Daniel (Gast)


Lesenswert?

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

von Krapao (Gast)


Lesenswert?

Ich habe eine Wechselwirkung beim Umschalten Ausgang/Eingang im 
Verdacht. Schau mal im Disassembler, ob der GCC die Funktionen inlinen 
tut und dadurch die Umschaltung von Eingang mit Pullup auf Ausgang LOW 
unmittelbar aufeinander folgt. Ich würde mal vor das Setzen Ausgänge 
oder zwischen die get...() Funktionen ein weiteres asm volatile ("NOP"); 
schreiben.

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.