PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 20 Taster, Schieberegister, Interruptproblem



Schottky
20.05.2010, 13:03
Ich habe einen ATmega1284, dieser hat 32 I/O.

Dann habe ich 20 Taster, UART, SPI und I2C in Betrieb, eine LCD-Anzeige
8 Eingänge und 4 Ausgänge und 6 LEDs.
Also habe ich ein Problem damit die 20 Taster anzuschließen.
Meine Lösung wäre ein Schieberegister gewesen. Aber um Polling vermeiden zu können dachte ich an Interrupt.
Nur wie wertet man von 20 Leitungen die Flanken aus (positiv und negativ, ich möchte jede Flanke als Interrupt werten) und gibt die auf ein ODER und schließt die an den ATmega1284 an.
Edit: Die steigende und fallende Flanke brauche ich vorallem weil bei den 20 Tastern auch Schalter dabei sind.

Was könnt Ihr mir für eine Lösung vorschlagen?

BurningWave
20.05.2010, 17:26
Falls die Tasten nicht gleichzeitig gedrückt werden müssen, könnten alle über jeweils unterschiedliche Widerstände an eine ADC-Pin parallel angesclossen werden. Du erhälst nun für jede Taste einen anderen ADC-Wert. Falls doch Tasten gleichzeitig gedrückt werden müssen, kannst du evtl. 2 ADC-Pins nehmen oder mit einem neuen ADC-Wert der sich aus den nun parallel geschaltenen Widerständen ergibt, experimentieren (evtl. kannst du auch eine Taste an 2 Pins anschließen und dann irgendwie errechnen, welche gedrückt ist/sind).

justin
20.05.2010, 17:37
Das wäre dann aber wieder Polling. Ich würde bald sagen, die einfachste und platzsparendste Variante ist, die Taster alle (als Matrix oder einzeln) an irgendeinen kleinen µC anzuschließen und mit diesem wiederum einen Interrupt im Atmega1284 auszulösen. Die Pins könnte man durchnummerieren und die "Adresse" und "steigend"/"fallend" ebenfalls an den großen Atmega weiterreichen. Das bräuchte dann allerdings auch 7 Pins.

Gruß Justin

Edit: Oh, ich seh grade, die 8 Ausgänge und 4 Eingänge sind nochmal extra?! Dann reichen die Pins natürlich wieder nicht.

BurningWave
20.05.2010, 17:43
Das bräuchte dann allerdings auch 7 Pins.

Nein, eine Pin reicht, wenn man die Daten seriell übergibt (evtl. TWI (I²C) verwenden?).

justin
20.05.2010, 17:59
Hab ich auch schon überlegt, aber das wirkt mir irgendwie nicht viel einfacher und resourcensparender, als Polling.

Schottky
21.05.2010, 06:14
@justin Einen zweiten Mikrocontroller setze ich ungern ein.

Auch einen größeren Mikrocontroller möchte ich vermeiden.

Wenn es also doch noch eine Möglichkeit gibt das zu lösen, dann lasst es mich wissen.

Kampi
21.05.2010, 08:14
Was ist den wenn du 2 Interrupt Eingänge benutzt? Also einen für die positive Flanke und einen für die negative Flanke. Das kannst du in der Interruptkonfiuration im Programm festlegen.

Config Int0 = Rising
Config Int1 = Falling

Und die 20 Taster schließt du dann an ein ODER an und das ODER dann an Int0 und Int1.
So gibt das ODER bei einem Tastendruck eine positive Flanke raus. DIese wird dann am Int0 detektiert und der springt dann in die ISR. Sobald du den Taster wieder los lässt "entsteht" eine negative Flanke und der Controller springt in eine andere ISR.
Alternativ kannste das auch so machen das du 2 ODER-Gatter nimmst und du die Taster dann sowohl an das 1. ODER und an das 2. ODER anschließt.

Edit: Sorry meinte ODER Gatter keine UND

Schottky
21.05.2010, 10:44
Manchmal ist die Lösung so einfach.

@Kampi
Deine Lösung hört sich gut an und gefällt mir recht gut.
Ich ärgere mich nur gerade das ich nicht selbst darauf gekommen bin.


Wenn jemand noch eine andere Lösung hat interessiere ich mich dafür auch. Weil es nie schlecht ist wenn man für ein Problem mehrere Lösungen parat hat, vorallem für die Zukunft.

Ich werde jetzt mal ein paar UND einkaufen.

Vielen Dank.

Kampi
21.05.2010, 11:34
Hab dir mal eine Skizze gemacht wie ich das mit den ODER meine.....
Das mit den UND war falsch hab da was durcheinander geworfen, weil ich nebenbei was mit UND-Gattern gemacht habe.

http://s7.directupload.net/file/d/2166/o4aldlrn_pdf.htm

sast
21.05.2010, 11:56
Edit: Die steigende und fallende Flanke brauche ich vorallem weil bei den 20 Tastern auch Schalter dabei sind.

Wenn ein Schalter auf H steht kommen aber dann keine anderen Interrupts mehr durch die sich mit LH Flanke melden.

Sonst müsstest du aus dem Schaltersignal einen Impuls machen.

Die intelligenteste Lösung dürfte dann doch wieder ein µC sein.

sast

Kampi
21.05.2010, 12:57
Und wenn er die Schalter wieder seperat macht? Also dann insgesamt 4 ODER-Gatter.
2 für die Taster, jeweils steigende und fallende Flanke
2 für die Schalter, jeweils steigende und fallende Flanke

FriLu
21.05.2010, 13:38
Hallo,
hast du noch auf dem I²C-Bus Platz für drei PCF 8574 (Portexpander)?
Die haben einen Int-Ausgang (OpenCollektor), der meldet eine Zustandsänderung an seinen Eingängen (Rückstellung durch Auslesen oder Wegnahme des Signals).
MfG Lutz

Kampi
21.05.2010, 15:18
Stimmt. Das geht ja auch. Und da kann er dann, wenn er es nicht mit einem INT machen will auch mit den einzelnen Ports machen. jeder PCF gibt 8 Ports und 3 Stück sind 24 Ports. Und du verbrauchst quasi keinen zusätzlichen Port am Controller.

wkrug
22.05.2010, 08:11
Wie wärs damit:

Du nimmst einen 1 aus 20 Encoder ( kann man auch aus 3 Stück 1 aus 8 Encodern machen ).
Dieser Encoder braucht 5 Adressleitungen.
Die Taster werden an den Ausgängen dieser Encoder angeschlossen und ein Eingang des Controllers über Pullup Widerstand mit den anderen Anschlüssen aller Taster verbunden.
Ist ein Taster gedrückt, wird bei entsprechenden Adresse des Encoders der Eingang auf LOW gezogen.

Man braucht bei dieser Methode also 6 Portpins.
Das System ist natürlich wieder ein Polling.

Alternativ könnte man die Adressierung der Matrix über einen Binärzähler realisieren.
Dann könnte man wieder die Methode mit den 2 Interrupts am Controller verwenden.
Allerdings muß man dann dafür sorgen, das zumindest einmal pro Durchlauf ein Interrupt stattfindet - Zum Beispiel wenn kein Taster gedrückt ist, oder alle gedrückt sind.
Die Adressleitungen dieses Zählers müssten aber trotzdem mit dem 1284 verbunden werden, damit man weiß, welche Taste gerade addressiert wurde.

Ein externer Controller, der über eine Matrix die Tasten überwacht und bei einer Änderung die Daten per SPI an den Steuercontroller übergibt dürfte aber vom Hardwareaufwand und der Portpin Anzahl die günstigere Methode sein.
Der Tastaturcontroller wäre dann der SPI Master, weil dann die Tastenübergaberoutine am 1284 wieder im Interrupt laufen kann.

peterfido
22.05.2010, 09:47
Bevor ich 3 PCFs, ODER Gatter, Encoder oder sonstwas nehme, würde ich dann doch lieber auf einen weiteren MC zurückgreifen...

Schottky
27.05.2010, 15:53
Das mit den PCFs hört sich sinnvoll an.

Das mit den UND hätte schon funktioniert aber auch nur bedingt. Da hätte nochmal genauer darüber nachdenken sollen.

Ich werde also jetzt ein paar PCF 8574 auf die Bestellliste setzen.

Ich denke das, das Problem damit aus der Welt geschafft ist.