Matrixtastatur mit ATmega8 Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte
Autor |
Matrixtastatur mit ATmega8 |
|
|
|
|
BID = 409106
elektroluchs Gesprächig
Beiträge: 194 Wohnort: Austria
|
|
Hallo!
Ich habe versucht, eine Matrixtastatur mit einem ATmega8 abzufragen, und es ist mir auch teilweise geglückt.
"Teilweise" heißt, dass meine Ausgabeleds bei den Tastern Ta5, Ta9 und Ta13 nicht reagieren, wenn ich die Schaltung laut Schaltplan betreibe.
Alle anderen Tasten funktionieren.
Wenn ich aber die 1k5 Widerstände weglasse, so funktionieren auch diese Tasten.
Ein anderes Phänomen betrifft das gleichzeitige drücken von Tasten. Laut Programm sollte die Taste, die als erstes abgefragt wird angezeigt werden und die andere wird ignoriert.
In der Praxis ist das auch so, wenn ich aber zwei Tasten betätige, die in einer Spalte sind (z. B. Ta7 und Ta11) dann schaltet das gesamte Port D auf '0' ->keine LED leuchtet.
Vielleicht weiß ja jemand was zu diesem merkwürdigen Verhalten, ich kann's mir nicht erklären.
Schaltplan und Assemblerlisting sind angehängt
mfg |
|
BID = 409114
perl Ehrenmitglied
Beiträge: 11110,1 Wohnort: Rheinbach
|
|
Zitat :
| Wenn ich aber die 1k5 Widerstände weglasse, so funktionieren auch diese Tasten. | Miss mal die Widerstände nach. Vielleicht ist einer defekt.
Im übrigen ist die gezeigte Schaltung blanker Unsinn, denn der Prozessor kann so niemals zwischen z.B. Ta5, Ta6, Ta7, Ta8 unterscheiden. Eine Tastaturmatrix ist anders aufgebaut.
Wenn du N-Key-Rollover realisieren willst, sind Dioden in der Matrix erforderlich um die Kontakte gegeneinander zu entkoppeln.
Vielleicht sind diese Dioden in deiner Matrix schon vorhanden, z.B. in den Tasten eingebaut, und weil du sie falsch angeschlossen hast, funktioniert die Gechichte nicht so wie erhofft.
_________________
Haftungsausschluß:
Bei obigem Beitrag handelt es sich um meine private Meinung.
Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet werden.
Besonders VDE0100; VDE0550/0551; VDE0700; VDE0711; VDE0860 beachten ! |
|
BID = 409118
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
perl hat Recht,
Die Tasten sind nicht sehr sinnvoll angeordnet.
Sie müssen zeilen- und spaltenweise angeordnet werden.
Die Widerstände würde ich komplett weglassen, die machen eigentlich nicht viel Sinn.
Sie sollten so wie im Anhang verschaltet werden.
Edit: Die Pull-Up-Widerstände sollten aber unbedingt angeschaltet bleiben, da sonst die offenen Eingänge rumhängen würden.
_________________
[ Diese Nachricht wurde geändert von: DonComi am 23 Feb 2007 17:56 ]
|
BID = 409126
perl Ehrenmitglied
Beiträge: 11110,1 Wohnort: Rheinbach
|
Zitat :
| Die Widerstände würde ich komplett weglassen, die machen eigentlich nicht viel Sinn. |
Doch, bei einer einfachen Matrix, die keine Dioden hat, braucht er die Widerstände an den Ausgängen des µC, weil sonst beim gleichzeitigen Drücken zweier Tasten Kurzschlüsse zwischen Ausgängen mit unterschiedlichen Pegeln entstehen können.
Mancher µC verkraftet das nicht und selbst wenn, kann das zum Zusmmenbrechen der Speisespannung und Programmabsturz führen.
_________________
Haftungsausschluß:
Bei obigem Beitrag handelt es sich um meine private Meinung.
Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet werden.
Besonders VDE0100; VDE0550/0551; VDE0700; VDE0711; VDE0860 beachten !
|
BID = 409129
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Ich seh es ein, bei dem Drücken zweier Tasten hast du natürlich vollkommen Recht!!
Mein Fehler.
_________________
[ Diese Nachricht wurde geändert von: DonComi am 23 Feb 2007 18:16 ]
[ Diese Nachricht wurde geändert von: DonComi am 23 Feb 2007 18:18 ]
|
BID = 409132
perl Ehrenmitglied
Beiträge: 11110,1 Wohnort: Rheinbach
|
Nein, auch bei deiner Schaltung, die ja die eigentlich gemeinte ist, sind die Widerstände nicht sinnlos. Schau mal genau hin!
De rien.
_________________
Haftungsausschluß:
Bei obigem Beitrag handelt es sich um meine private Meinung.
Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet werden.
Besonders VDE0100; VDE0550/0551; VDE0700; VDE0711; VDE0860 beachten !
[ Diese Nachricht wurde geändert von: perl am 23 Feb 2007 18:21 ]
|
BID = 409134
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Siehe mein Edit.
Habs kapiert was du meintest. Wenn ich zwei Tasten drücke, dann wird ein Ausgang des µCs, der z.B. grade auf LOW liegt über den Taster mit HIGH kurzgeschlossen.
Macht Sinn.
_________________
|
BID = 409142
elektroluchs Gesprächig
Beiträge: 194 Wohnort: Austria
|
Zitat :
| Im übrigen ist die gezeigte Schaltung blanker Unsinn |
Ich habe beim Abzeichnen von meiner Handskizze nicht genau genug hingeschaut, tut mir leid.
Im Anhang nun die richtige Schaltung(nach der auch aufgebaut und getestet wurde).
Im Übrigen sind in den Tastern keine Dioden integriert und die Widerstände sind in Ordnung.
mfg
|
BID = 409150
perl Ehrenmitglied
Beiträge: 11110,1 Wohnort: Rheinbach
|
Dann liegts am Programm.
Wenn ich das richtig sehe, steckt hier der Fehler:
Zitat :
| loop2:
in temp1,PORTB ;weiterschieben der '0'
lsr temp1
ori temp1,0x80
out PORTB,temp1 |
Die 0 wird ja durch das linke Nibble geschoben und durch das OR mit 80 vor dem out verhinderst du, daß Bit 7 jemals low wird.
MPLAB hat doch einen guten Simulator. Warum benutzt du ihn nicht?
_________________
Haftungsausschluß:
Bei obigem Beitrag handelt es sich um meine private Meinung.
Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet werden.
Besonders VDE0100; VDE0550/0551; VDE0700; VDE0711; VDE0860 beachten !
|
BID = 409158
elektroluchs Gesprächig
Beiträge: 194 Wohnort: Austria
|
Zitat :
|
qry_keyboard:
ldi taste,0x00 ;init
ldi temp1,0xFF
out PORTB,temp1
cbi PORTB,7 ;erste Zeile auf '0' setzen, zur Abfrage
ldi rows,0x04 ;einstellen der Tastaturreihen für eine 4x4 Tastatur
rjmp label1
loop2:
in temp1,PORTB ;weiterschieben der '0'
lsr temp1
ori temp1,0x80
out PORTB,temp1
label1:
ldi mask_pinb,0x01
.
.
.
dec rows ;Schleife zum Weiterschalten der Zeilen
brne loop2 |
@perl
Der von dir beschriebene Fehler tritt nicht auf, es sei denn der Simulator vom AVR Studio spielt mir einen Streich.
Ich habe das Programm schon oft durchsimuliert, auch mit den Szenarien, die mir Schwierigkeiten bereiten, aber in der Praxis verhält sich die Geschichte dann leider anders.
Aufgrund der Tatsache, dass mir das Programm, beim Weglassen der Widerstände die Tastatur richtig kodiert ins Port D schreibt, kann ich einen Softwarefehler beinahe ausschließen.
mfg
|
BID = 409225
Jornbyte Moderator
Beiträge: 7178
|
Mal ein Beispiel (5 Jahre alt)
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
|
BID = 409234
elektroluchs Gesprächig
Beiträge: 194 Wohnort: Austria
|
Danke, Jornbyte für deine Beispiele, ich werde mir die so schnell wie möglich zu Gemüte führen, wenn ich besser ausgeschlafen bin.
Da es schon sehr viele Antworten gegeben hat, aber ich leider noch nicht weiter bin, werde ich mal etwas zusammenfassen.
Ich will eine Matrixtastatur mit einem yC auslesen und gehe davon aus, dass nur immer genau eine Taste gedrückt wird. Dieser einen Taste ist eine Zahl von 0-F zugewiesen(siehe Schaltplan). Mein yC macht nichts anderes als herauszufinden welche Taste gedrückt wurde, und diese als 4bit Zahl am Port D auszugeben. Das 5te bit (kbhit) signalisiert, dass irgendeine Taste gedrückt wurde.
Soweit, sogut. Theoretisch, also in der Simulation, funktioniert das einwandfrei, jedoch in der Praxis ergeben sich zwei Probleme.
1.)Wenn ich die Schaltung mit den 1k5 Widerständen betreibe, so reagiert der Controller nicht mehr auf den Tastendruck von Ta5, Ta9 und Ta13. Alle anderen Tasten werden anstandslos eingelesen.
Wenn ich die 1k5 Widerstände entferne, so wird die komplette Tastatur perfekt eingelesen. Das kann ich aber nicht machen, denn wenn man ohne diese Widerstände zwei Tasten gleichzeitig betätigt, so gibt der ATmega wahrscheinlich Rauchzeichen von sich.
2.)Wenn ich (mit 1k5 Widerständen) zwei Taster die in einer Spalte angeordnet sind (z.B. Ta7 und Ta11), gleichzeitig betätige so setzt der Controller mein Port D auf '0', was er laut Programm nicht sollte.
Das Programm sollte so reagieren, dass die zuerst abgefragte Taste ausgegeben wird und die die danach betätigt wird, einfach ignoriert wird. Wenn ich z. B. Ta8 und Ta11 gleichzeitig drücke funktioniert das auch so.
Ich weiß, dass sich diese Fehler merkwürdig anhören und offensichtlich schwer zu beseitigen sind, aber vielleicht gibt es ja jemanden, der noch ein Ass im Ärmel hat und mir hilft.
mfg
elektroluchs
|
BID = 409241
Jornbyte Moderator
Beiträge: 7178
|
Zitat :
| Das Programm sollte so reagieren, dass die zuerst abgefragte Taste ausgegeben wird und die die danach betätigt wird, einfach ignoriert wird. |
Genau das macht mein Beispiel. Das Umstellen der Port's sollte nicht schwer fallen.
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
|
BID = 409317
elektroluchs Gesprächig
Beiträge: 194 Wohnort: Austria
|
@Jornbyte
Ich hab' mir jetzt deinen Code durchgeschaut und die Lösung für mein Problem gefunden. Ich hatte ein Timingproblem, d.h. die Zeit zwischen Umschalten der Ausgänge und Einlesen der Eingänge, an denen Ta5, Ta9 und Ta13 liegen, war offensichtlich zu kurz.
Ich habe dem Code nun zwei "nop"s spendiert und nun läufts wie geschmiert(siehe Auszug aus meinem Code).
Zitat :
| out PORTB,temp1
label1:
ldi mask_pinb,0x01
nop ;Zeit zum Umschalten geben
nop
sbis column1 ;überprüfen, ob ein Eingang '0' ist |
Damit wäre das gelöst --> Danke an Jornbyte
@all
Der 2. Punkt von meinem letzten Post ist allerdings noch offen. Ich werde da natürlich auch dranbleiben, aber falls jemandem etwas einfällt, einfach posten.
mfg
elektroluchs
PS: Falls sich jemand die Tastenentprellung angeschaut hat, würde mich ein kleines Feedback interessieren, ich hab mir die nämlich selbst ausgedacht und vielleicht gibts ja was zu verbessern.
|
BID = 409446
elektroluchs Gesprächig
Beiträge: 194 Wohnort: Austria
|
So liebe Forumuser, ich habs endlich geschafft. Auch mein zweites Problem ist gelöst.
Folgendes hat mir zu schaffen gemacht. Wenn man zwei Taster, die in einer Spalte angeordnet sind, gleichzeitig drückt, so verbindet man eigentlich zwei Ausgänge und einen Eingang miteinander (statt nur einen Ausgang mit einem Eingang). Dadurch wurde der betreffende Eingangs-Pin nicht mehr low sondern high.
Das Problem war also, dass man einen Portpin auf zwei Arten auf high bringen kann (Taster loslassen oder noch einen Taster drücken). Das wurde von meinem Programm falsch interpretiert und somit kam es auch zur Fehlfunktion.
Die zweite o.g. Möglichkeit musste eliminiert werden und das hab' ich mittels "Wood and Meadow" Dioden gemacht(siehe angehängter Schaltplan).
Somit ist die Sache gegessen. Danke nochmal an alle die etwas beizutragen hatten und falls jemand auch gerne so eine Matrixtastatur hätte, hab' ich aktuellen Schaltplan und funktionierendes Assemblerlisting angehängt.
Jetzt wird gefeiert...
Schönen Abend noch
elektroluchs
|
|
Zum Ersatzteileshop
Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum
Datenschutz
Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland
gerechnet auf die letzten 30 Tage haben wir 19 Beiträge im Durchschnitt pro Tag heute wurden bisher 5 Beiträge verfasst © x sparkkelsputz Besucher : 182422433 Heute : 1473 Gestern : 5459 Online : 326 29.11.2024 10:49 5 Besucher in den letzten 60 Sekunden alle 12.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
|
xcvb
ycvb
0.0532059669495
|