Forum: Mikrocontroller und Digitale Elektronik 70 Taster an Atmega


von Thorsten001 (Gast)


Lesenswert?

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?

von willi (Gast)


Lesenswert?

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

von hannes (Gast)


Lesenswert?

na tastatur matrix mit 4/16 decodern wäre vieleicht eine idee ?

von Vlad T. (vlad_tepesch)


Lesenswert?

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)

von Thorsten001 (Gast)


Lesenswert?

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?

von Axel K. (axel)


Lesenswert?

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.

von Jörg S. (joerg-s)


Lesenswert?

I2C I/O ICs mit Interrupt Ausgang...

von Helmut L. (helmi1)


Lesenswert?

>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

von Thorsten001 (Gast)


Lesenswert?

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

von Helmut L. (helmi1)


Lesenswert?

In 10mS kannst du viele Tasten abfragen. So langsam ist die CPU nun auch 
wieder nicht.

von Axel K. (axel)


Lesenswert?

70 Tasten könntest du sogar problemlos mit einem 10bit ADC Pin abfragen. 
Das ganze inkl. "Auswerteschleife" würde nichtmal 1ms dauern.

von Thorsten001 (Gast)


Lesenswert?

Ist das mit dem ADC nicht zu Störanfällig?

von Thorsten001 (Gast)


Lesenswert?

Ist das mit dem ADC nicht zu störanfällig?

von Axel K. (axel)


Lesenswert?

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.

von Simon K. (simon) Benutzerseite


Lesenswert?

Dann darf man aber nur max. eine Taste gleichzeitig drücken.

von Helmut L. (helmi1)


Lesenswert?

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

von Kay I. (imperator)


Lesenswert?

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

von MaWin (Gast)


Lesenswert?

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

von Vlad T. (vlad_tepesch)


Lesenswert?

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)

von Kay I. (imperator)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von Thorsten001 (Gast)


Lesenswert?

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?

von Thorsten001 (Gast)


Angehängte Dateien:

Lesenswert?

Shit sorry jetzt hab ich vergessen das Bild anzuhängen!

Hier wirds nachgeliefert!

SORRY!!!!

von Michael M. (mikmik)


Angehängte Dateien:

Lesenswert?

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

von Helmut L. (helmi1)


Lesenswert?

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

von Ferry (Gast)


Lesenswert?

und wie schaltet man die Dioden? In Reihe zum Taster?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von Gast4 (Gast)


Lesenswert?

Ist da nicht ne alte PS2-Tastatur umbauen einfacher?

Gast4

von Thorsten001 (Gast)


Lesenswert?

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

von Thorsten001 (Gast)


Lesenswert?

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?

von Thorsten001 (Gast)


Angehängte Dateien:

Lesenswert?

Sorry ich hasse Anhänge, die vergess ich einfach immer!

von Helmut L. (helmi1)


Lesenswert?

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

von Thorsten001 (Gast)


Lesenswert?

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?

von Thorsten001 (Gast)


Lesenswert?

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?

von Helmut L. (helmi1)


Lesenswert?

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

von Thorsten001 (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.