Forum: Mikrocontroller und Digitale Elektronik viele Tasten an MC? Frage zu Schaltungsmöglichkeiten


von Santiago (Gast)


Lesenswert?

Hallo,

aus einem alten Fax habe ich ca. 40 Einfachsttaster, aus denen ich mir 
gerne eine Tastatur für den MC bauen würde (ich weiß - rein 
wirtschaftlich macht das wenig Sinn, aber ich hoffe, dabei was zu 
lernen). Die Taster haben nur 2 Pins - deshalb denke ich mal, dass keine 
Matrix aufgebaut werden kann.

In einem anderen Fred las ich, dass der 74HC165 wohl ein geeigneter 
Kandidat wäre. Der 74HC166 scheint ähnlich zu funktionieren.
Kann mir jemand den Unterschied der beiden Käfer erklären?

Ich vermute mal, dass sich die Teile ähnlich kaskadieren lassen, wie 
z.B. ein 74HC595 für die andere Richtung?

Macht das so Sinn, oder gibt es einen Trick, wie man die Tasten 
schneller/einfacher einlesen könnte, ohne die Anzahl der verwendeten 
Pins signifikant zu erhöhen?

von Rahul D. (rahul)


Lesenswert?

>Die Taster haben nur 2 Pins - deshalb denke ich mal, dass keine
>Matrix aufgebaut werden kann.

Falsch gedacht. Siehe Application Note 240 von Atmel:
http://www.atmel.com/dyn/resources/prod_documents/doc1232.pdf

von Santiago (Gast)


Lesenswert?

Hallo Rahul,

danke für den Link, aber ich verstehe nicht, wie ich das mit Tastern, 
die nur 2 Pins haben, realisieren kann.
Bislang dachte ich, so eine Matrix-Schaltung geht nur mit Tastern, die 2 
Kanäle schalten können (also x und y getrennt haben)

In der Appnote steht leider nicht, wie ich den Taster anschließen muss, 
damit es keine Kurzschlüsse zwischen allen Leitungen gibt.

Wenn mir jemand in der Richtung auf die Sprünge helfen könnte, würde 
mich das sehr freuen.

von Roland P. (pram)


Lesenswert?

du musst jeweils eine X und Y Leitung miteinander verbinden.
Hier ists nochmal etwas detailierter:
http://www.rentron.com/PicBasic/serkey16.gif

Zum Auswerten legt der MC dann der Reihe nach an B0..B3 eine Spannung 
und schaut wo sie an B4..B7 wieder raus kommt.

von Santiago (Gast)


Lesenswert?

Ah, jetzt ... Ja!

Der Kurzschluss ist also kein faux pas, sondern Program.
Danke, Roland, für die Erleuchtung :)

Also wie sonst auch - entweder schnell mit vielen Pins, oder langsamer 
mit vielen Takten ...

von Sven S. (stepp64) Benutzerseite


Lesenswert?

Mach am besten eine 8x5 Matrix. Leg die 8 Spalten an einen Port und die 
5 Zeilen an einen anderen. Nun aktivierst du eine Zeile und liest auf 
dem anderen Port die Spalten aus. Dann die 2. Zeile aktivieren und so 
weiter bis zur 5. Nun hast du 5 Bytes im µC und kannst daraus die 
gedrückte Taste ermitteln.

Gruß
Sven

von Spess53 (Gast)


Lesenswert?

Hi

> Nun aktivierst du eine Zeile und liest auf...

Besser erst mal alle Zeilen aktivieren. Damit kannst du feststellen, ob 
überhaupt eine Taste gedrückt ist. Wenn ja, dann zeilenweise aktivieren, 
um die Taste zu identifizieren.

MfG Spes

von Santiago (Gast)


Lesenswert?

Hallo,

danke für die vielfältigen Vorschläge.

Kann mir jemand sagen, ob es sowas wie einen 74HC165/-166 mit Interrupt 
ala PCF8574 gibt?

Also Idee ist folgende: um einen Mittelweg aus Pinanzahl und 
µC-Belastung zu erreichen, würde ich gerne per Interrupt erfahren, ob 
überhaupt irgendeine Taste gedrückt wurde. Anschließend könnte ich dann 
über div. Schiebereien feststellen, welche Taste gedrückt wurde.
Gut, ich könnte auch alle Leitungen per Gatter verknüpfen und zum µC 
führen, aber wenn es so einen PISO-Chip gäbe, der interruptfähig ist, 
wäre mir wohler (weniger Bauteile).

Mit 2 PCF8574 ließe sich das wohl auch erreichen, nur vor dem 
I²C-Geraffel möchte ich mich noch etwas drücken ;)

von Rahul D. (rahul)


Lesenswert?

Du könntest jeder Taste noch eine Diode spendieren, die dann mit einer 
Seite alle zusammengefasst werden und auf einen Interrupt-Eingang gehen.

In den Atmel Application Notes gibt es noch eine AN zu dem Thema...

von Matthias L. (Gast)


Lesenswert?

>würde ich gerne per Interrupt erfahren..

Ist nicht unbedingt zu raten, da Tasten prellen.

Nimm nen Timerinterrupt und Taste zB alle 10ms ab.

von Rahul D. (rahul)


Lesenswert?

>Ist nicht unbedingt zu raten, da Tasten prellen.

>Nimm nen Timerinterrupt und Taste zB alle 10ms ab.

Zum Aufwachen sollte es gehen...

Was soll der Controller denn noch so alles machen, ausser die Tasten 
einzulesen? Tasten zu pollen ist eigentlich Standard, da die 
Abfrageintervalle im Gegensatz zur Prozessorgeschwindigkeit Aeonen sind.

von Santiago (Gast)


Lesenswert?

Hallo,

>Ist nicht unbedingt zu raten, da Tasten prellen.

Das juckt mich im Moment rel. wenig - aber dazu gleich mehr.

>Nimm nen Timerinterrupt und Taste zB alle 10ms ab.

Genau das wollte ich nicht. Ist jetzt nicht so, dass ich ne kritische 
Anwendung hätte und von den Zeiten ginge es allemal, aber ich halte es 
für Verschwendung, ständig Register zu schieben, obwohl nix anliegt.
Das ist was anderes, wenn man mal eben prüft, ob ein bestimmter Pin 
einen erwarteten Zustand hat.
... aber mit der ganzen Schieberei.

> Zum Aufwachen sollte es gehen...

Genau so dachte ich es. Zum Aufwachen reicht ein Ping (ob der prellt 
oder nicht ist unerheblich).
Bis ich dann die Register durchgeschoben habe, um alle Tasten zu prüfen, 
ist das Prellen der Taster schon lange vorbei (falls nicht, könnte ich 
die Tasten auch eine Zeitscheibe später abfragen - das soll nicht das 
Problem sein).

> Was soll der Controller denn noch so alles machen, ausser die Tasten
> einzulesen? Tasten zu pollen ist eigentlich Standard, da die
> Abfrageintervalle im Gegensatz zur Prozessorgeschwindigkeit Aeonen sind.

Wie gesagt, mir geht es im Moment nicht darum, eine kritische Anwendung 
mit Tasten zu versorgen, sondern ich möchte ein Tastaturmodul erstellen, 
welches ich bei Bedarf einfachst anwenden kann.
Wenn dann der µC was richtiges zu tun bekommt, möchte ich ihn nicht 
durch unnützes Pollen von der Arbeit abhalten.
Ein anderer Aspekt wäre der, dass man den µC auch in den Stromsparmodus 
schicken und dann per Pinchange wieder aufwecken könnte.

Im Moment könnte ich mit 4 Pins auskommen (ohne mir I²C an die Backe zu 
pinnen) - 2 für jede Richtung. Einen Pin könnte man sicher noch für den 
Tasteninterrupt mistbrauchen...
... dann hätte ich 40 Taster an 4 Pins (mit Platz für Erweiterung) - das 
wäre akzeptabel.
... vielleicht sogar die Daten auf einen gemeinsamen Pin legen, dann 
wären es nur noch 3 Pins. Da wäre dann die Frage, beeinflusst das 
Ausgangsschieberegister den Pinzustand, wenn ich diesen auf Eingang 
umschalte?

> Du könntest jeder Taste noch eine Diode spendieren, die dann mit einer
> Seite alle zusammengefasst werden und auf einen Interrupt-Eingang gehen.

Wenn ich die Schaltung richtig verstehe, werden die Dioden 
zusammengefasst und an einen Eingangspin gelegt. Der braucht sicher noch 
einen Pullup-Widerstand um die Tastenänderung mit zu bekommen?!?

Hm, ginge auch - ein Eingangsschieberegister mit Interruptfunktion - 
kennt Ihr nicht / gibt es nicht?

von Guido Körber (Gast)


Lesenswert?

Hm, die Frage ist ob Du was sinnvolles oder was sinnloses lernen willst.

Tastenfelder fragt man nicht so ab wie Du es vorhast weil es sinnlose 
Verschwendung von Hardware wäre (was nicht heisst, dass es keine Leute 
gibt die es trotzdem so machen).

Das Prellen hat die unangenehme Eigenschaft genau nicht vorbei zu sein 
wenn Du zufällig vorbei kommst und die Tasten abfragst. Schalterprellen 
liegt je nach Schaltkontakt bis in den einstelligen 
Millisekundenbereich. Zwischen einem Interrupt bis zur Abfrage der 
Tasten diese Teit zu verbraten, das ist sinnlose Resourcenverschwendung.

Richtig macht man sowas mit einem Timerinterrupt. Fragt die ganze Matrix 
etwa alle 4ms ab, prüft ob sich seit dem letzten mal was verändert hat 
und wartet bis nach einer Veränderung ca. 10-20ms immer der gleiche 
Status rauskommt.

Will man Strom sparen, dann braucht man einen Microcontroller, der durch 
Pegelwechsel an einem Pin aufwachen kann. Alle Y Treiber auf low ziehen, 
Interrupts an den X Eingängen aktivieren und schlafen gehen.

BTW: Die Y Treiber müssen Open-Drain oder Open-Collector sein, sonst 
hast Du Probleme beliebige Tastenkombinationen erkennen zu können. Wenn 
völlig beliebige Kombinationen notwendig sind muss an jede Taste ohnehin 
eine Diode (dann ist das mit dem Open-Drain wieder egal), sonst gibt es 
Phantom-Keys sobald Tasten in einer bestimmten Kombination gedrückt 
werden.

von Peter D. (peda)


Lesenswert?

Santiago wrote:
> Wie gesagt, mir geht es im Moment nicht darum, eine kritische Anwendung
> mit Tasten zu versorgen, sondern ich möchte ein Tastaturmodul erstellen,
> welches ich bei Bedarf einfachst anwenden kann.
> Wenn dann der µC was richtiges zu tun bekommt, möchte ich ihn nicht
> durch unnützes Pollen von der Arbeit abhalten.

Was Du für aufwendig hältst und was wirklich CPU-Zeit verschlingt, sind 
2 verschiedene Dinge.

Z.B. der AVR arbeitet mit 20MHz und alle 20ms fragst Du die Tasten 
seriell ab, mal großzügig 500 Zyklen dafür veranschlagt.
Dann ergibt das eine CPU-Last von:
1
500 / 20e6 / 20e-3 = 0,1%

Und diese 0,1% kannste einfach ignorieren, das ist Pillepalle.

Für die CPU-Belastung ist nicht die absolute Zyklenzahl entscheidend, 
sondern das Verhältnis zum Aufrufintervall.


Peter

von ich (Gast)


Lesenswert?


von Santiago (Gast)


Lesenswert?

Hallo,

> Zwischen einem Interrupt bis zur Abfrage der
> Tasten diese Teit zu verbraten, das ist sinnlose Resourcenverschwendung.
>
> Richtig macht man sowas mit einem Timerinterrupt.

Hey, ich schrieb nirgendwo, dass ich busy warten wollte. Klar hätte ich 
(irgendwo) einen Timer verwendet.

Aber wenn Ihr meint, das das Kwatsch ist, was ich denke - ok.
Dann lasse ich mir die Sache nochmal durch den Kopp gehen ;)

Habt Dank für Eure zahlreichen Antworten!

von autoexec (Gast)


Lesenswert?

Man kann die Taster (mit Dioden) auch so schalten dass man z.B. für eine 
3*4 Matrix nur 4 Portpins braucht. Dann darf aber nur eine Taste auf 
einmal gedrückt sein.

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.