Hallo, Ich würde gern 70 Taster an einen Atmega (8 oder 16) anschließen... Dazu habe ich jetzt ein paar Fragen: Was ist geschickter? Matrix oder per ADC die Tasten auslesen? Kann ich totz abfrage von 70 Tastern noch eine USB-Schnittstelle (per Software-USB) am selben Atmega betreiben, oder soll ich lieber einen extra Atmega dafür benutzen? Wenn ich einen zweiten ATMega nehmen sollte, dann Hardware oder Software SPI?
ich würde die taster in einzelne gruppen aufteilen, und jede gruppe an einen AD-kanal hängen. wenn du nicht die ganze zeit ad-wandlungen machen möchtest, könntest du die einzelnen taster noch über dioden (oder eine andere beschaltung) an einen externen interrupt pin legen. nachteil der ad-methode und der dioden-schaltung sind eben die zusätzlichen bauteile. wenn du 17 pins frei und über hast spricht auch nix gegen eine 7x10 bzw 8x9 matrix
du könntest auch ne Matrix bauen und an die spalten ein paar paar parallel-in-serial-out-Shiftregister und an die Zeilen serial-in-parallelout-SRs dranhängen. da brauchst du insgesammt nur 5 Pins (gemeinsamer reset, 2x daten, 2xclock)
OK, dann schonmal danke euch allen! Aber ich denke vom Bauteilaufwand nehme ich am Besten die Matrixlösung, hab ja sowieso genug Pins am Atmega... Aber bekomme ich auf dem dann auch noch ein Software-USB zum Laufen?
Ich würde an deiner Stelle einen 2. Atmega nehmen. Die beiden Atmegas kannst du dann einfach mit einer Leitung via HW-Uart vernetzen und könntest dann sogar dessen Interrupt "Onrxd" verwenden.
>Aber bekomme ich auf dem dann auch noch ein Software-USB zum Laufen? Bei dem bisschen Tastenmultiplexen langweilt sich der AVR und schaut die ganze Zeit zum Fenster raus. Gruss Helmi
Ok das heißt ich müsse das locker mit einem packen, solange ich die Voraussetzungen von VUSB beachte, oder? Hab leider noch nicht so viel Erfahrung mit USB, hab nur gelesen, dass ich alle 10ms micht beim OS melden muss damit...
In 10mS kannst du viele Tasten abfragen. So langsam ist die CPU nun auch wieder nicht.
70 Tasten könntest du sogar problemlos mit einem 10bit ADC Pin abfragen. Das ganze inkl. "Auswerteschleife" würde nichtmal 1ms dauern.
also ich hatte mal 10 tasten an einem 8 Bit ADC. 70 Tasten entsprechen 14,xx Counts Pro Taste. Du führst 2 AD Wandlungen aus - beide Wandlungen müssen inetwa das gleiche Ergebnis liefern (+- x Counts). Da du weisst, das z.b taste 35 zwischen 505 und 520 Counts ergeben muss und du einen AD Wert von 512 hast, teilst du dann 512 / Spannweite_Counts_pro_Taste und erhälst deine taste. So inetwa habe ich das gemacht und das hat tadellos funktioniert.
>Dann darf man aber nur max. eine Taste gleichzeitig drücken.
Auch bei der einfachen Matrixschaltung ohne Entkoppeldioden darf man
nicht beliebige Tasten geleichzeitig drücken.
ich würde es so ähnlich machen, wie vlad_tepesch schon vorschlug... 9x 74HC165 in Serie schalten und dann per SPI auslesen. Taster 8-15 Taster 0-7 ╔════════════════════╗ ╔════════════════════╗ ║ 74HC165D ║ ║ 74HC165D ║ ... ────>║ D_in D_out ║─────>║ D_in D_out ║───> MISO ... +─>║ Load ║ +─>║ Load ║ ... +─|─>║ Clk ║ +─|─>║ Clk ║ | | ╚════════════════════╝ | | ╚════════════════════╝ | | | | ...─|─+─────────────────────────|─+───────────────────────────< IO-Pin ...─+───────────────────────────+─────────────────────────────< Clock je nach räumlicher Ausdehnung Deiner Schaltung solltest Du aber zusätzliche Treiber vorsehen ... Gruß, Kay
> Ist das mit dem ADC nicht zu störanfällig? Bei nur wenigen Tasten pro Analogeingang nicht, man könnte sogar die ganzen Tasten in einer WiderstandsmMatrix verschalten und mit nur 2 Analogeingaengen wie bei einem resistiven Touchpad trotzdem die gedrückte Taste ermittelb, aber: > Auch bei der einfachen Matrixschaltung ohne Entkoppeldioden darf > man nicht beliebige Tasten geleichzeitig drücken. bei Analogauswertung gar nicht. Mach's mit einer Matrix, jede USB-Tastatur macht's dir vor.
wenn die Anzahl der Bauteile keine so große rolle spielt ist dass die beste lösung, da braucjh man nur 3 Pins. die Andere Variante wär ja matrixaufbau, nur halt nicht direkt an den µC, sondern auch über shiftregister. durch eins schiebt man eine einzelne 1 rein und aktiviert damit eine spalte und ließt dann aus dem parallel-in-serial-out Shifts die Zustände der Tasten dieser Spalte aus. sind alle bits draußen. schiebt man die 1 eins weiter und ließt die nächste spalte aus. Hab mich oben nur geirtt. man brauch bei den Zeilen noch einen zusätlichen Pin zum latchen ins SR. Dafür kann man den reset weglassen, mann muss nur amanfang genug 0en in das serielle SR shiften, damit wirklich nur eine 1 drin steckt. Die Zahl der gleichzeitig gedrückten Tasten sollte bei beiden Varianten egal sein. PS: wie erstellt man denn so schicke ASCII-Schaltbilder, ohne stundenlang rumzufummeln? Edit: wie funktioniert die Tastenerkennung mit dem ADC? indem ich jeder Taste nen anderen Widerstand gebe? ist sehr schaltungs/Bauteilaufwenig, oder? Seh da eigendlich nur Nachteiole (ok, die benötigten µC Pins sind wenig)
Ich kenn's nur mit stundenlang rumfummeln ... natürlich lässt sich das beschlaunigen, wenn man schon irgend ein Beispiel hat, aus dem man die Zeichen kopieren kann Übrigens ... dem permanent treibenden Output des Shiftregister kann man mit einem 74HC1G125 begegen. Dieser Baustein buffert das Signal und schaltet seinen Output bei Bedarf hochohmig (den Steuer-Pin kann man mit Load koppeln). Somit kann der SPI auch noch weitere Gesprächspartner bedienen.
Analog ist störanfälliger und benötigt mehr Bauteile. Bringt nur was, wenn es auf möglichst wenige Anschlüsse ankommt (Kabel-FB beim MP3-Player). Ich würde ne 8*9 Matrix nehmen mit nem MC. Der MC hat den Vorteil, daß die Ausgänge open drain geschaltet werden können und die Eingänge mit internem Pullup. Man braucht also null zusätzliche Bauteile. Mit Schieberegistern braucht man dagegen zusätzlich Dioden an den Ausgängen und Widerstände an den Eingängen. Die Dioden braucht man, damit es keinen Kurzschluß gibt, wenn mehrere Tasten gedrückt werden. Die Matrix erkennt außerdem in jedem Fall 2 gleichzeitig gedrückte Tasten. Peter
Ich kann doch die Tasten per µC komplett speisen oder? Dann dürfte doch aber auch kein Kurzschluss passieren auch ohne Dioden, hab mal ein Beispiel rangehängt zum zeigen wie ich mir das vorstelle. PB2 und PB3 sind dabei ganz normale Ausgänge, die nacheinander die einzelnen Tasterspalten auf Masse schalten. PB1 und PB0 haben ja sowieso einen internen PullUp, den ich ja aktivieren kann... Auch wenn ich jetzt 2 Taster gleichzeitig drücke müsste es ja funktionieren oder? Noch kurz zu USB: Ich habe gesehen, dass die Möglichkeit mit einem LowDrop-Spannungsregler am Besten sein soll. Einen Atmega8 wollte ich allerdings nicht nehmen, da ich hier einfach zu wenig aneinanderhängende Ports habe und dann sowohl Spalten als auch Zeilen nicht per simplen Shift multiplexen kann. Klar mit 9x8-Matrix kann ich auch nur die Spalten oder die Zeilen shiften, aber immerhin... Oder spielt das keine Rolle? Ich hatte mir dann den ATmega16 rausgesucht, aber festgestellt, dass der bei 3,3V nicht mit 16MHz Clock betrieben werden kann oder geht das trotzdem und gibt keine Probleme mit USB?
Shit sorry jetzt hab ich vergessen das Bild anzuhängen! Hier wirds nachgeliefert! SORRY!!!!
Na ja, so wie's da auf dem plan gezeichnet ist, klappts wohl nicht. Wenn an PB2 high is und dann an PB0 high liegt weis man ja nicht ob S11 oder S13 gedrückt ist. Nehme mal an Du hast es eh so gemeint wie's ich da nochmal (freihändig in paint!) hingebastelt hab. ;) Alle spalten der reihe nach auf High, und immer dann wenn eine spalte high ist, bei der zeile guckn ob high anliegt. ist denke ich (so wieviele andere vorposter auch) die einfachste variante. mik
Naja auch bei dieser Schaltung koennen die Ports kurzgeschlossen werden. Schalte doch einfach bei jedem Ausgangsport einen kleinen Widerstand von rund 1KOhm in Reihe zur Strombegrenzung. Gruss Helmi
Ferry schrieb:
> und wie schaltet man die Dioden? In Reihe zum Taster?
Ja, aber mal am Rande: Ist dein Google kaputt? Such doch mal in den
Bildern nach Tastaturmatrix oder Matrixtastatur und Schaltplan.
Oder such hier im Forum, du bist nicht der erste, der sowas macht...
Äh na klar sorry ist ja total falsch angeschlossen... Aber meine Eingangspins sind doch schon mit Widerständen zur Strombegrenzung ausgestattet oder? PS: Zeilen will ich als Eingang und Spalten als Ausgang machen... Dann haben doch meine Zeilen sowieso ne strombegrenzung...
So jetzt hab ich mal nen Schaltplan erstellt... Kann mir jemand sagen ob es so funktioniert? (Auch wenn mehrere Tasten aufeinmal gedrückt werden?) Der Atmega hat ja einen internen Pulldown-Widerstand an jedem Eingang, somit müsste ich ja die Leitungen nicht per 10K-Widerstand auf Masse legen, oder? Den Kondensator und die Analogversorgung kann ich auf offen lassen, wenn ich kein ADC benötige oder ist das für USB doch erforderlich?
>Aber meine Eingangspins sind doch schon mit Widerständen zur Strombegrenzung >ausgestattet oder? Was haben deine Eingangspins mit Kurzschluessen an den Ausgangspins zu tun ? Wenn du 2 Tasten drueckst dann schliesse du 2 Reihen oder Spalten kurz.
Stimmt na klar, dafür war ich blind! Und einen 1K-Widerstand an den Ausgängen schafft abhilfe? Verträgt sich das denn auch mit den Pullups/Pulldowns der Eingänge?
So hab jetzt noch überall 1,5K Widerstände an die Ausgänge in Reihe geschalten... Wenn ich es per PullUp mache müsste es doch dann mit Masse schalten funktionieren oder? Damit meine ich, ich schalte eine Zeile nach der anderen auf Masse, habe ich dann ein Low Signal auf dem Eingangspin, dann weiß ich dass der Taster gedrückt wurde! Oder geht das so nicht?
>Wenn ich es per PullUp mache müsste es doch dann mit Masse schalten >funktionieren oder? Richtig aller nacheinander auf Masse Schalten. >Damit meine ich, ich schalte eine Zeile nach der anderen auf Masse, habe >ich dann ein Low Signal auf dem Eingangspin, dann weiß ich dass der >Taster gedrückt wurde! So isses dann hast du die Taste gefunden. Du must nur mit den Widerstaenden aufpassen das sie den Pullup Widerstand des Einganges unter die Schwelle fuer Low ziehen koennen. Diese Widerstaende kannst du aber noch kleiner machen so rund 470Ohm bis 1 Kohm Es sollen im Kurzschlussfall halt nicht mehr als die maximalen 20 mA pro Ausgang darueber fliessen.
Habs im Datenblatt nachgelesen die Eingangspins haben ein Widerstand zwischen 20 und 50 kOhm. Da ich ja nur mit 3,3V arbeite kann ich ja dann auch nur 200-300 Ohm-Widerstände nehmen... Aber mal ne Frage ob ich das wieder nicht sehe bzw. übersehe... Ich kann auch erkennen, wenn zwei Taster gleichzeitig gedrückt sind, oder?
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.