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?
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.
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.
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 ...
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
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
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 ;)
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...
>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.
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?
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.
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
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!
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.