Forum: Mikrocontroller und Digitale Elektronik Viele Schalter verarbeiten


von Timo (Gast)


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!

von Stefan (Gast)


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.

von Barny (Gast)


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

von Fabian H. (hdr)


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.

von Timo (Gast)


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 :)

von Karl H. (kbuchegg)


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.

von Sam .. (sam1994)


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.

von Christian (Gast)


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

von Alexander S. (esko) Benutzerseite


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

von Timo (Gast)


Angehängte Dateien:

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?

von Stefan (Gast)


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.

von Vlad T. (vlad_tepesch)


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.

von Timo (Gast)


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?

von Timo (Gast)


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.

von Peter D. (peda)


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

von Peter D. (peda)


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

von Timo (Gast)


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

von Achim M. (minifloat)


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.

von Timo (Gast)


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 
:)

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.