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?
>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
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...
>würde ich gerne per Interrupt erfahren..
Ist nicht unbedingt zu raten, da Tasten prellen.
Nimm nen Timerinterrupt und Taste zB alle 10ms ab.
>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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.