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
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.
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
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 ?
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
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
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"
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
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
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...
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
:/
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
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