Matrixtastatur mit ATmega8

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 29 11 2024  12:55:39      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte

Gehe zu Seite ( 1 | 2 Nächste Seite )      


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)


PDF anzeigen



_________________
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




      Nächste Seite
Gehe zu Seite ( 1 | 2 Nächste Seite )
Zurück zur Seite 0 im Unterforum          Vorheriges Thema Nächstes Thema 


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 11 Beiträge verfasst
© x sparkkelsputz        Besucher : 182423087   Heute : 2129    Gestern : 5459    Online : 446        29.11.2024    12:55
6 Besucher in den letzten 60 Sekunden        alle 10.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0379629135132