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!
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
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.
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 :)
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.
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.
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..
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 Modulhttp://www.codemercs.com/index.php?id=38&L=1
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?
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.
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.
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?
@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.
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
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
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"?
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.
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
:)