[AVR/C] Problem mit Tastaturmatrix-Programmierung

Gast #2551034
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
Gast #2551350
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren