www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 70 Taster an Atmega


Autor: Thorsten001 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: willi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: hannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
na tastatur matrix mit 4/16 decodern wäre vieleicht eine idee ?

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Thorsten001 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Axel Krüger (axel)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg S. (joerg-s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
I2C I/O ICs mit Interrupt Ausgang...

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thorsten001 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Helmut Lenzen (helmi1)
Datum:

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

Autor: Axel Krüger (axel)
Datum:

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

Autor: Thorsten001 (Gast)
Datum:

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

Autor: Thorsten001 (Gast)
Datum:

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

Autor: Axel Krüger (axel)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann darf man aber nur max. eine Taste gleichzeitig drücken.

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kay I. (imperator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: MaWin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Kay I. (imperator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thorsten001 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Thorsten001 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Shit sorry jetzt hab ich vergessen das Bild anzuhängen!

Hier wirds nachgeliefert!

SORRY!!!!

Autor: Michael M. (mikmik)
Datum:
Angehängte Dateien:
  • preview image for m.PNG
    m.PNG
    1,02 KB, 497 Downloads

Bewertung
0 lesenswert
nicht 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

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ferry (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und wie schaltet man die Dioden? In Reihe zum Taster?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Gast4 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist da nicht ne alte PS2-Tastatur umbauen einfacher?

Gast4

Autor: Thorsten001 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Thorsten001 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Thorsten001 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Sorry ich hasse Anhänge, die vergess ich einfach immer!

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thorsten001 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Thorsten001 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thorsten001 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.