Forum: Mikrocontroller und Digitale Elektronik Taster-Matrix Code von Peda auf AVR


von Frank (Gast)


Angehängte Dateien:

Lesenswert?

Guten Morgen zusammen.

Ich würde gerne den Code von Peter Danegger für eine Tastatur Matrix auf 
einem AVR Atmega 8 nutzen.

Es soll später eine Tastatur werden mit 4 Spalten und 5 Reihen also 20 
Taster
eine C routine habe ich schon aber da werden meine Taster nicht 
entprellt. Bei der Routine von Peter ist aber direkt eine Entprellung 
drin und deshalb wollte ich die Verwenden.

Nur ich bekomme beim Compilieren einige Fehlermeldungen die ich schon 
nich ganz nachvolziehen kann.

Warum zum Beispiel wird das array valid_keys nicht erkannt ?! sowie alle 
andern sachen auch ?

könnte mir vieleicht jmd auf die Sprünge helfen ?

Schönen Gruß
Frank
1
../Tastermatrix.c:30: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'valid_keys'
2
../Tastermatrix.c:31: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'last_keys'
3
../Tastermatrix.c: In function 'InitKeyboard':
4
../Tastermatrix.c:39: error: 'valid_keys' undeclared (first use in this function)
5
../Tastermatrix.c:39: error: (Each undeclared identifier is reported only once
6
../Tastermatrix.c:39: error: for each function it appears in.)
7
../Tastermatrix.c:40: error: 'last_keys' undeclared (first use in this function)
8
../Tastermatrix.c: In function 'GetKey':
9
../Tastermatrix.c:53: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'ROW'
10
../Tastermatrix.c:53: error: 'ROW' undeclared (first use in this function)
11
../Tastermatrix.c:53: error: expected expression before ']' token
12
../Tastermatrix.c:61: error: 'valid_keys' undeclared (first use in this function)
13
../Tastermatrix.c:66: error: 'last_keys' undeclared (first use in this function)

von Volkmar D. (volkmar)


Lesenswert?

Frank schrieb:
> ../Tastermatrix.c:30: error: expected '=', ',', ';', 'asm' or '__attribute__' 
before 'valid_keys'

Im Code steht:
static uchar idata valid_keys[3];    // last returned values

Was soll das 'idata' bedeuten? Ohne diesem müßte die Variablendefinition 
erkannt werden.

von Frank (Gast)


Lesenswert?

jop jetzt funktioniert es zu compilieren. Jetzt muss ich den Code nur 
noch für meine Bedürfnisse ein wenig anpassen. Aber da kommen bestimmt 
auch noch fragen- Ich melde mich gleich bestimmt nochmal grins

Danke für die Hilfe

von Peter D. (peda)


Lesenswert?

Der AVR-GCC kennt keine Memory-Typen.
"idata" und "code" löschen oder leer definieren.


Peter

von Frank (Gast)


Angehängte Dateien:

Lesenswert?

So da bin ich nochmal - Grüß dich Peter, da ist ja quasi der direkt 
Ansprech Partner ;).


Wie du schon gelesen hattest wollte ich deine Routine mal für den AVR 
umstricken, weil ich eine 4x5 Tastatur habe.
Meinen Code habe ich hier mal angehangen es läuft noch nicht wirklich. 
Wahrscheinlich habe ich es doch noch nicht ganz verstanden. Ich 
erläutere mal wie ich die Hardeware aufgebaut habe und wie ich die 
Software verstanden habe.

Meine Taster habe ich ähnlich dem Bild angeschlossen:
Meine Columns gehen an: PB0 bis PB3
Meine ROWs gehen an: PC0 bis PC4 + je einen 470 OHM widerstand


So in der Software selbst setzte ich PORTB auf Eingang und schalte die 
Pullups ein, so sollte ein kein Taster gedrückt ist immer ein High 
eingelesen werden.

in der GetKey Funktion wird passiert dann folgendes:
in dem Array ROW sind die Bitmuster der einzelnen Reihen abgelegt.

Dann kommt die for-scheife in der alle 5 Reihen durchgegangen wird.
dafür werden alle Ausgänge auf High gelegt und ein Ausgang auf Low.
Dann kommen erstmal 2x "NOP" damit die Ausgänge sicher auf LOW gehen.
Dadurch könnte ich wenn in dieser Reihe ein Taster gedrückt wird ein LOW 
einlesen.

Und dann kommt die Auswertung von der Routine - aber die habe ich noch 
nicht so ganz verstanden.


Stimmt das denn erstmal soweit ?

von Frank (Gast)


Angehängte Dateien:

Lesenswert?

Soo ich habe das nun mal alles etwas erweitert und etwas nachgedacht.


Ich hatte noch einen kleinen Fehler drin. Und zwar in der Auswahl der 
ROW muss natürlich das DDR Register verändert werden und die momentan 
auszulesende Reihe auf Ausgang und 0V gelegt werden.


Nur habe ich nun noch folgendes Problem ich habe den folgenden Code der 
im anhang ist geflasht an PORTC hängen 8 LEDs, diese sollen mir die 
key_nr mitteilen. Bei der LED Leiste wird mir eine '0010 1011' dezimal 
43 angezeigt.

Wenn ich nun die Taste 1 Drücke dann sehe ich eine '00101010' also eine 
dezimal 42. Das 8te bit toggelt bei jedem Tastendruck.

Bei der Taste 2 sieht es dann wie folgt aus '00101001' eine dezimal 41.
also die Tasten stimmen schon bei den andern Tasten ist es halt genau so 
bei der Taste 3 geht dann immer bit 0 und bit 1 aus wenn man sie drückt

Aber woher kommt dieser Offset zu anfang? der rest sollte ja eigentlich 
so passen.

Vieleicht erbarmt sich ja nochmal jemand und kann über den code schauen. 
vieleicht isset ja nur ein blöder fehler.

lieben gruß
Frank

von Frank (Gast)


Lesenswert?

Ne irgendwie hab ich Murks gemacht O_o


wenn ich die while schleife oben aus dem Programm gegen
die heri tausche
1
while(1){
2
  
3
  PORTD = GetKey();
4
  
5
  }


das zählt er an PORTD immer um 1 Hoch bis über dezimal 50 und dann 
dauerts etwas und dann fängt er wieder bei 0 an.

Irgendwie versteh ich das alles nicht so richtig grml.

Was wird denn in der Auswertung nach dem die Reihe ermittelt wurde 
gemacht? Könnte das vieleicht jmd mal in worte fassen ? Das wäre super 
nett


Gruß
Frank

von Manfred S. (Firma: Manfred) (xfred343)


Lesenswert?

Taster-Matrix auf AVR

Hi, passt vielleicht nicht ganz dazu, aber ist vielleicht eine 
Alternative:

ich habe beste Erfahrungen beim Anschließen einer Matrixtastatur am 
Analogport des Mikroprozessors über Widerstandsnetzwerk gemacht, die 
Widerstände sollten aber eher niederohmig sein. Jedem Analogwert-Bereich 
wird eine Taste zugeordnet. Zwischen Tastenmatrix und Prozessor brauche 
ich dann nur 2 oder 3 Leitungen (DATA und Plus oder auch Ground für LED 
oder Beeper-Rückmeldung)

Beim Auswerten habe ich dann folgendes programmiert:
1) Analog-Samples werden mit einen Timer alle 5ms eingelesen
2) Das Analog-Sample wird einer Taste zugeordnet und ein Tastenzähler 
erhöht
3) Die Taste mit den höchsten Häufigkeiten und mehr als 60% relative 
Häufigkeit erreicht hat, ist die gedrückte Taste.

Die Häufigkeitsbestimmung funktioniert einwandfrei, einfache 
Entprellmethoden haben nicht so recht funktioniert, denn bei der mir 
verwendeten Conrad-Billig-Tastatur (Conrad-Billig - ist diesmal 
ausnahmesweise kein Widerspruch ;-)) kann es beim Drücken und Loslassen 
zu längeren Verfälschungen des Analogwertes kommen.

Aber zu diesem Thema gibts von Peter Dannegger ja auch schon einiges..
Beitrag "Tastenmatrix auslesen über nur 2 Leitungen"

von Frank (Gast)


Lesenswert?

jo das habe ich auch schon öfters gesehn aber was passiert wenn der 
Kontakt bei den Tastern immer schlechter wird im Lauf der Jahre? dann 
ändert sich ja auch der Kontaktwiderstand der Taster ?


Nun im Anhang meine überarbeitet version wenn ich nun die Tasten Drücke 
bekomme ich den Binär Code am LED Port angezeigt wenn ich die Taste 
loslasse wird der Port wieder gelöscht.

Nur muss ich das nun noch entprellen. Da hab ich den Kommentar von PeDa 
in der Routine nicht verstanden "call with debouncing time 
(10..200msec)"


ansonsten läuft es denke ich ?! :)


Gruß
Frank

von Frank (Gast)


Lesenswert?

jo das habe ich auch schon öfters gesehn aber was passiert wenn der 
Kontakt bei den Tastern immer schlechter wird im Lauf der Jahre? dann 
ändert sich ja auch der Kontaktwiderstand der Taster ?


Nun im Anhang meine überarbeitet version wenn ich nun die Tasten Drücke 
bekomme ich den Binär Code am LED Port angezeigt wenn ich die Taste 
loslasse wird der Port wieder gelöscht.

Nur muss ich das nun noch entprellen. Da hab ich den Kommentar von PeDa 
in der Routine nicht verstanden "call with debouncing time 
(10..200msec)"

Vieleicht kann da ja Peter oder jemand anderes noch ein Statement zu 
geben.

ansonsten läuft es denke ich ?! :)


Gruß
Frank

von Frank (Gast)


Angehängte Dateien:

Lesenswert?

Hier der Anhang

von Volkmar D. (volkmar)


Lesenswert?

Frank schrieb:
> Da hab ich den Kommentar von PeDa
> in der Routine nicht verstanden "call with debouncing time
> (10..200msec)"

Das heißt das die GetKey-Funktion regelmäßig alle 10 bis 200msec 
aufgerufen werden soll.

Frank schrieb:
> jo das habe ich auch schon öfters gesehn aber was passiert wenn der
> Kontakt bei den Tastern immer schlechter wird im Lauf der Jahre? dann
> ändert sich ja auch der Kontaktwiderstand der Taster ?

Wenn das der Fall ist, dann kannst Du die Tasten wegwerfen...

von Manfred S. (Firma: Manfred) (xfred343)


Lesenswert?

> Wenn das der Fall ist, dann kannst Du die Tasten wegwerfen...
oder dem lieben Conrad zurückgeben und Geld für ein Eis retournehmen

von Frank (Gast)


Lesenswert?

Volkmar Dierkes schrieb:
> Frank schrieb:
>> Da hab ich den Kommentar von PeDa
>> in der Routine nicht verstanden "call with debouncing time
>> (10..200msec)"
>
> Das heißt das die GetKey-Funktion regelmäßig alle 10 bis 200msec
> aufgerufen werden soll.


Damit habe ich aber noch keine Entprellung der Taster realisiert oder ?!

sorry das ich mich erst jetzt melde aber ich lag die lezten 2 Tage flach 
:/

von Volkmar D. (volkmar)


Lesenswert?

Frank schrieb:
> Damit habe ich aber noch keine Entprellung der Taster realisiert oder ?!

Ich habe die Routine jetzt mir nicht ins letzte Detail angeschaut, aber 
es wird ein Last-State gespeichert:
1
    last_keys[i] = column;        // for next debouncing

der jeweils überprüft wird:
1
        if( key == (last_keys[i] & mask) ){    // debouncing

Somit findet wohl ein Entprellen mit der Zeit statt, mit der die Routine 
aufgerufen wird. D.h. solange 0 zurückkommt, ist nichts gedrückt, bzw. 
nicht eindeutig/lang genug gedrückt.

Frank schrieb:
> sorry das ich mich erst jetzt melde aber ich lag die lezten 2 Tage flach

Hoffe, das es wieder besser geht und Dir obiges hilft.

Gruß
Volkmar

von Heiko W. (Gast)


Lesenswert?

Frank schrieb:
> Meine Taster habe ich ähnlich dem Bild angeschlossen:
> Meine Columns gehen an: PB0 bis PB3
> Meine ROWs gehen an: PC0 bis PC4 + je einen 470 OHM widerstand

Hallo,

Darf ich fragen, wieso du zwischen den Anschlüssen die Widerstände 
geschaltet hast?

Gruß

Heiko

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.