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...
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.
> 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?
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?