[AVR/C] Problem mit Tastaturmatrix-Programmierung

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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.