mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Viele Schalter verarbeiten


Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe vor eine Platte mit 100 Schaltern zu versehen und würde gerne 
dann mit Hilfe eines Atmega8 die Zustände (An/Aus) an den Computer 
schicken.
Der Atmega8 hat ja (soweit ich das beurteilen kann) nur 8 Ausgänge. 
Jetzt hab ich hier ein bisschen gesucht und würde diese mit einem bzw. 
wohl eher mehreren Schieberegistern erweitern.
Dann könnte ich doch die Daten über das TXD-Pin des Atmega8 an die 
serielle Schnittstelle (welche genau?) meines PCs senden!? Werden 
eigentlich jedes Mal alle Zustände übertragen oder könnten auch nur die 
Zustände übertragen werden, die sich geändert haben?
Man merkt, dass ich die ganzen Zusammenhänge erst sehr oberflächlich 
verstehe und daher wäre es super, wenn mir jemand genauer erklären 
könnte wie das alles Zusammenhängt, was ich für mein Vorhaben vielleicht 
nochmal genauer lesen sollte und was ich mir eigentlich außer dem 
Atmega8 genau kaufen müsste.
Vielen Dank schonmal!

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach es doch über eine A/D -Wandler.
Da brauchste nur einen Port und gut ist.
An jedem Schalter einen Widerstand und dann auslesen.

Autor: Barny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Les dir erst einmal die Tutorien dieser Seite durch.

Vor allem den Abschnitt Porterweiterung und UART.

Dass ist genau dass was du brauchst.

der ATmega8 hat übrigens mehr als 8 I/O's

Autor: Fabian H. (hdr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schieberegister sind schon okay.

Du nimmst einfach 3 GPIO Pins deines Megas:

1 - Input
2 - Clock
3 - Strobe

Dann:

1. Impuls auf Strobe geben, dadurch übernehme die Schieberegister den 
aktuellen Wert, der von aussen angelegt ist in das interne Register.
2. Ein Clock Impuls geben.
3. Ein internes Hilfsregister (also ein Byte in deinem mega) einmal nach 
links schieben
4. Das Signal an deinem Input einlesen und in an Bit 0 des 
Hilfsregisters kopieren.
5. Schritt 2 bit 5 insgesamt 8 mal wiederholen
6. Prüfen, ob TX_COMPLETE der Uart gesetzt ist. (also warten)
7. Hilfsregister nach UDR0 kopieren.
8. Bei 1. oder 2. fortsetzen

Das ist das Grundprinzip.
Du könntest auch erst alle werte einlesen und dann in einem Frame 
übertragen, damit die Syncronisation gegeben ist.

Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, vieles verstehe ich allerdings noch nicht wirklich :)
Ich werd mir morgen mal ein Atmega8 besorgen und mich in den Tutorials 
weiter arbeiten. Dann frag ich eventuell nochmal hier nach :)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein Eröffnungsposting klingt allerding danach, als ob du noch überhaupt 
keine Erfahrung mit µC hast.
Daher der gut gemeinte Rat: Leg dein Projekt erst mal zur Seite und sieh 
zu, dass du Schalter erst mal normal, direkt an einem µC Pin, abfragen 
kannst.

Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, ich würd eher ein Schieberegister für 10 Ausgänge und ein anderes 
für 10 Eingänge verwenden -> Matrix Tastatur.

AD Wandler und 1 Port: bei 100 Tastern??? Zeig mir das mal.

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timo schrieb:
> Hallo,
> ich habe vor eine Platte mit 100 Schaltern zu versehen und würde gerne
> dann mit Hilfe eines Atmega8..

Was mich immer wieder ein wenig wundert ist, dass das Werkzeug 
ausgewählt wird, bevor das Problem eigentlich durchdacht oder verstanden 
wurde..

Autor: Alexander Schmidt (esko) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für dich dürfte der KeyWarrior von CodeMercs ideal sein.
> KeyWarrior8 Chips unterstützen Tastaturen mit bis zu 8x8 Tasten.
>  * USB
>  * Kundenspezifische Tastenbelegung, in-System programmierbar
>  * Verfügbar im SSOP48 Gehäuse oder DIL40 Modul
http://www.codemercs.com/index.php?id=38&L=1

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

Bewertung
0 lesenswert
nicht lesenswert
Mh aber 8x8 wären ja nicht genug...
Ich hatte noch eine Idee, wie ich mit einem Ausgang 4 Schalter abfragen 
könnte von der ich aber nicht genau weiß ob sie klappt:
Die genauen Werte weiß ich jetzt nicht aber wenn ich z.B. aus dem 
Ausgang PD0 10V rausschicke, dann könnte ich doch die Schaltung im 
Anhang dahinterschalten. Die Zahlen an den Widerständen sollen nur 
Verhältnisse darstellen. Die Schalter gelten in diesem Fall als gedrückt 
wenn sie offen sind. Sind alle Schalter zu fließen die 10V. Drücke ich 
nun z.B. Schalter 1 und Schalter 3 muss der Strom über zwei Widerstände 
fließen. Einmal mit "1" und einmal mit "4". Sinn würde es machen, wenn 
die "8" für 5 Ohm steht. die "4" für 2,5 Ohm die "2" für 1,25 Ohm und 
die "1" für 0,62 Ohm.
Wenn ich nun Schalter 1 und 3 drücke bleibt also von den 10V nur noch 
10V - 2,5 - 0,62 = 6,88V. Wenn ich nun diesen Wert irgendwie messen 
könnte, ließe sich daraus ja immer genau sagen, welche Schalter gedrückt 
wurden.
Warscheinlich hab ich gerade Ohm und Volt ziemlich stümperhaft vermischt 
aber das Prinzip ist hoffentlich klar geworden.
Ich schicke eine Spannung raus und je nach gedrücktem Knopf werden 
Widerstände zugeschaltet, die sich exponentiell erhöhen. Dadurch kann 
dann, wenn die Spannung gemessen wird, ein Rückschluss auf die 
gedrückten Knöpfe gezogen werden.
Kann das so Funktionieren? Wie würde ich die Spannung denn eigentlich 
messen?

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie ich oben schon geschrieben habe.
Man sollte auch lesen was jemand schreibt.
Häng einen Widerstand dran am Schalter und lies den
Wet mit einem A/D Wandler ein und werte es aus.
Wenn es mit einem Port zu eng wird, dann nimm halt 2 oder 3 oder
wieviel du auch immer willst.

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan schrieb:
> Wie ich oben schon geschrieben habe.
> Man sollte auch lesen was jemand schreibt.
> Häng einen Widerstand dran am Schalter und lies den
> Wet mit einem A/D Wandler ein und werte es aus.
> Wenn es mit einem Port zu eng wird, dann nimm halt 2 oder 3 oder
> wieviel du auch immer willst.

Lass die AD Wandler weg, was soll das?
eine simple 8x16 Tastenmatrix mit entweder
1 x SIPO und 2 x PISO SRs oder
2 x PISO und 1 x SIPO SRs

die kann man alle Kaskadieren und an eine SPI hängen.
die Eingaberegister dann wieder an MISO

für ersteres:

Man schiebt dann 1 byte mit einem gesetzten Bit rein.
latcht die Ausgabe.
latcht die Eingabe und schiebt 2 bytes raus, wo man dann die eingehenden 
Bytes benutzt.

Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry das hatte ich zu Beginn nicht richtig verstanden.
Aber das Problem ist ja, dass ich jeden Schalter erkennen will. Wenn ich 
bei jedem Schalter den gleichen Widerstand ranhänge würde es ja kein 
Unterschied machen, ob ich z.B. Schalter 1 und 2 oder Schalter 1 und 3 
drücke. Um das Problem zu Lösen ist mir halt nur der exponentielle 
Anstieg der Widerstände eingefallen. Die Frage ist dann jetzt nur, ob so 
ein A/D Wandler hier fein genug ist um die Unterschiede zu erkennen?

Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Vlad aber bei einer Tastenmatrix kann ich doch wieder nicht jeden Druck 
erkennen oder? Also wenn z.B. 20 Tasten auf einmal gedrückt werden will 
ich ja genau erkennen welche 20 es sind.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vlad Tepesch schrieb:
> eine simple 8x16 Tastenmatrix

Ich würde 2 * 74HC164 nehmen (= 16 Ausgänge) und die 8 Eingänge direkt 
vom ATmega8 mit internen Pullups.
Sollen mehr als 2 Schalter geschlossen sein, braucht jeder Schalter noch 
ne Diode in Reihe.


Peter

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timo schrieb:
> Also wenn z.B. 20 Tasten auf einmal gedrückt werden will
> ich ja genau erkennen welche 20 es sind.

Du schiebst ein 0-Bit raus und liest das Eingangsbyte ein.
Dann schiebst Du 12-mal weiter und liest jedesmal das Byte ein.
Und diese 13 Byte haben dann 104 Bits, eins je Schalter.


Peter

Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok danke, ich denk ich werd erstmal ohne Schieberegister anfangen und 
wenn es klappt was zum Computer zu senden mich dann mal zunächst an 
einem davon versuchen :)
Mir ist gerade noch etwas eingefallen: Ein billiges (Musik-)Keyboard hat 
ja eigentlich auch mehrere Tasten und man kann auch viele auf einmal 
drücken. Wie machen die das denn da? Hat der µC dann vielleicht einfach 
massig Eingänge oder benutzen sie da auch Schieberegister? Sonst könnte 
ich ja vielleicht etwas von einem Keyboard "zweckentfremden"?

Autor: Joachim K. (minifloat)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timo schrieb:
> Ein billiges (Musik-)Keyboard hat
> ja eigentlich auch mehrere Tasten

Wenn das billige Midi-Keyboard einen MIDI-Ausgang hat, können 128 
verschiedene Tasten Unterschieden werden. Der Trick bei Midi ist, dass 
nur Änderungen übertragen werden. Die Anschlagstärke bekommst du quasi 
geschenkt noch dazu. Wenn dein Rechner einen 
15Pol-Analog-Joystick-Anschluss besitzt, sind da meist auch Midi in und 
Midi out mit drauf. Das wäre also ne Lösung. Es gibt auch recht günstige 
USB-MIDI-Adapter.

In so billigen MIDI-Keyboards sitzt zum Tastendruck-Erkennen meist ein 
ASIC(Anwendungs-Spezifisches IC). Die Anschlagstärke wird durch einen 
Trick ermittelt: eigentlich sind es zwei Schalter pro Taste, die kurz 
hintereinander betätigt werden. Es wird die Zeit zwischen diesen beiden 
Tastendrücken gemessen; Kürzer=="du hast stärker auf die Taste 
gehauen"==Mehr Anschlagstärke.

mfg mf

PS: An Unterlagen zu den ASICs zum Abfragen der Tasten komt man meist 
nur schlecht ran. Einfacher wäre es das Teil direkt n den Rechner zu 
hängen.
BTW: Es gibt auch USB-MIDI-Keyboards, die dann direkt an den Rechner 
gesteckt werden. Das Adaptergefummel oder die Schaltung an den 15pol 
Anschluss entfällt dann.

Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah danke, sehr interessant!
Dann müssen die ja sogar 256 (2 * 128) Schalter verarbeiten?!
(Wie genau ist also nicht bekannt?)
Das wäre natürlich eine Idee ein fertiges USB-Keyboard zu nehmen. Ist 
nur fragwürdig ob ich das so zerlegt kriege, dass es in meine Box passt 
:)

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.