microcontroller mit telefontastatur

hi leute! folgendes: ich will oben genannte tastatur(alle 12 tasten einzeln herausgefuehrt) an meinen at89s8252 h?ngen.

um nur 2 portpins verwenden zu muessen, waere mein plan zwei 8-bit schieberegister (SR1,SR2) (z.b.74hc164,singleIn paral.Out) mit den ausgaengen an die 12 leitungen zu schlieszen. der dataeingang von SR1 liegt an dauerplus, SR2 bekommt sein data vom hoechstwertigen bit von SR1.die gemeinsame leitung der tasten geht invertiert als eingang an einen portpin. in einer abfrageroutine(alle 20ms?) sendet ein uC-ausgangspin dann einen

1-0 impuls an die /clk eingaenge beider SR. wird dann am uC-eingangspin eine null eingelesen ist taste1 gedrueckt. wird eine eins eingelesen(taste1 nicht gedrueckt), sende den naechsten impuls an /clk und lies wieder aus (taste2) usw. bis taste#. das 13.bit (bit6 SR2) wird mit den clear-eingaengen beider SR verbunden, wenn also bis dorhin geshiftet wird, ist keine taste gedrueckt und die SR-ausgaenge werden fuer die naechste abfrage resetet.

wuerde gern wissen ob ich irgendwelche denkfehler gemacht habe.

ein problem stellt sich noch im initialzustand: welchen wert nehmen die ausgaenge von so einem 74hc164 nach power-on an? 1-0 zufallsmuster?

sollte ich das zu verkorkst erklaert haben, sagt mir bescheid und ich werde eine zeichnung uploaden.

thanx martin widler

Reply to
martin widler
Loading thread data ...

Wenn ich Deine Beschreibung richtig verstanden habe, dann gibt's hier einige Probleme.

Wenn Du alle Tasten ohne Entkopplung (durch Dioden oder Widerstaende) an die gemeinsame Leitung anschliesst, dann erzeugst Du beim gleichzeitigen Druecken zweier Tasten einen Kurzschluss der Schieberegister-Ausgaenge. Das ist nicht so gut...

Ausserdem: wozu der Inverter?

Dieses Verfahren wird falsche Ergebnisse liefern, soferne noch vor dem Ende des Auslesezyklus eine "niedrigere" Taste gedrückt wird. Wenn z.B. knapp vor dem Auslesen der sechsten Taste die zweite gedrueckt wird, dann wird Dein µC trotzdem annehmen, dass die sechste Taste gedrueckt wurde, da er ja nicht weiss, von welcher Taste die Eingangsleitung aktiviert wurde (es sind ja alle niedriegeren Leitungen auf 1). Insbesondere waehrend der Prellzeiten der Tasten wird es lustige Effekte geben.

Du musst von einem Zufallsmuster ausgehen. Das ist bei Deinem Abfrageverfahren aber ein Problem. Denn grundsaetzlich wuerde man in solch einem Fall nach dem Power-On einmal alle Bits aus dem Register hinausschieben. Das geht aber hier nicht, da auf Grund des fest verdrahteten Schieberegister-Resets und des fix auf 1 gelegten seriellen Einganges der µC nicht wissen kann, nach wievielen Impulsen der gewuenschte Zustand (alle Bits 0) erreicht ist.

Natuerlich koenntest Du den Reset-Eingang des Registers ueber ein Gatter zusaetzlich mit der Reset-Leitung des Prozessors verbinden, sodass das Register bei einem Hardware-Reset gelöscht wird. Oder Du opferst doch eine dritte Portleitung und steuerst damit den Reset-Eingang an.

Ich wuerde empfehlen, statt des Schieberegisters mit parallelen

*Ausgaengen* eines mit parallelen *Eingaengen* (z.B. 74HC165) zu verwenden, Du brauchst dann allerdings drei Portleitungen (Load, Clock und Data). Die Tasten verbinden die Dateneingaenge z.B. mit Masse und haengen ueber ein je einen Pull-up Widerstand (aus einem Widerstands-Array, dann braucht's nicht viel Platz) an Plus. Zum Auslesen aktivierst Du zuerst kurz den Load-Eingang und liest dann per Clock und Data der Reihe nach die Bits ein.

Alternativ koennte man statt des Schieberegisters auch einen Zaehler mit dekodierten Ausgaengen verwenden (z.B. zwei kaskadierte 4017). Da ist dann nach jedem Taktimpuls genau ein Ausgang auf 1, welcher dann (wie bei Deinem Vorschlag) ueber die jeweilige Taste (und per Diode entkoppelt) mit dem Portpin verbunden ist. Fuer eine saubere Initialisierung sollte man aber auch hier den Reset-Eingang des Zaehlers ansteuern koennen, sodass man wieder drei Portleitungen braucht.

Bei µCs mit eingebautem A/D-Wandler gaebe es dann noch die Moeglichkeit, die Tasten ueber unterschiedliche Widerstaende an den gemeinsamen Eingang anzuschliessen und damit einen Spannungsteiler aufzubauen. Dann kann man aus der gemessenen Spannung die gedrueckte Taste ermitteln. Je nach Wert der Widerstaende, Anzahl der Tasten und Aufloesung des Wandlers wird es aber unter Umstaenden nicht moeglich sein, mehrere gleichzeitig gedrueckte Tasten korrekt zu identifizieren.

--
Gruesse,
Pascal Le Bail, Wien
Meine Absenderadresse ist derzeit inaktiv. Siehe .
Reply to
Pascal Le Bail

martin widler schrieb im Beitrag ...

Du findst bei Atmel und bei Microchip dutzende von Application Notes in denen eine Tastatur mit dem uC verbunden wird, z.B.

formatting link
AVR242 "Multiplexing LED Drive & a 4x4 Keypad". So was zeugt, das es viel klueger ist, wenn man ALLE anzuschliessenden Elemente in der Gesamtheit betrachtet und dabei entdeckt, das man I/O-Pins doppelt verwenden kann. Das spart extra Decoderchips. Lern von den AppNotes.

Allerdings. Was hast du fuer eine merkwuerdige Tastatur ? Gerade Telefon hat niemals 12 einzelne Tasten sondern immer eine Matrix.

--
Manfred Winterhoff, reply-to invalid, use mawin at despammed.com
homepage: http://www.geocities.com/mwinterhoff/
de.sci.electronics FAQ: http://dse-faq.elektronik-kompendium.de/
Read 'Art of Electronics' Horowitz/Hill before you ask.
Lese 'Hohe Schule der Elektronik 1+2' bevor du fragst.
Reply to
MaWin

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.