hallo,
Ich habe gerade ein wenig überlegt wie ich mehrere Tasten über einen µC
einlesen könnte und mir ist die idee gekommen.
Alle Tasten sind auf einen Externen-Interrupt gelegt (natürlich
voneinander gekoppelt) und zusätzlich jeweils auf einen Eingang an einem
Schieberegister (o.Ä.).
Bei einem Tastendruck wird ein Interrupt aufgerufen der das
Schieberegister ausliest und ermittelt welche Taste bzw. Tasten betätigt
wurde/n.
Damit könnte man sich viele Pins sparen.
Möglich?
Natürlich geht das.
Aber warum denkst du, du bräuchtest einen Interrupt dafür?
Sieh alle 10 Millisekunden am Schieberegister nach, ob ein Pin seinen
Wert geändert hat und du wirst auch keinen Tastendruck verpassen. Aus
Sicht eines µC bewegst du dich in extremer Zeitlupe, wenn du einen
Taster drückst. An dieser Stelle schaden Interrupts mehr als sie nützen
(Ausnahme: Taster muss den µC aus dem Tiefschlaf holen)
Joar das Problem ist nur das der µC in der main-schleife schon ziemlich
beschäftigt ist.
Müsste mal ausmessen ob die zeit reicht.
Danke für die schnellen und vor allem hilfreichen Antworten.
timo91 schrieb:> Joar das Problem ist nur das der µC in der main-schleife schon ziemlich> beschäftigt ist.> Müsste mal ausmessen ob die zeit reicht.
Das Sichwort heißt: Timer
Und in der ISR macht man dann auch gleich noch die Entprellung mit rein.
timo91 schrieb:> Müsste mal ausmessen ob die zeit reicht.
Lass halt am Ende der der Mainloop einen freien Pin toggeln. Dann
einfach da die Frequenz messen und mit 2 Multiplizieren(wegen toggeln).
Das ist dann auch ungefähr die Frequenz, mit der auch die Knöppe
abgefragt werden würden.
mfg mf
Karl Heinz Buchegger schrieb:> timo91 schrieb:>> Joar das Problem ist nur das der µC in der main-schleife schon ziemlich>> beschäftigt ist.>> Müsste mal ausmessen ob die zeit reicht.>> Das Sichwort heißt: Timer> Und in der ISR macht man dann auch gleich noch die Entprellung mit rein.
Das würde unnötig Timer und Leistung verbraten. Ob jetzt hin und wieder
ein externer interrupt ausgelöst wird oder immer nach einer bestimmten
zeit.
Mini Float schrieb:> timo91 schrieb:>> Müsste mal ausmessen ob die zeit reicht.>> Lass halt am Ende der der Mainloop einen freien Pin toggeln. Dann> einfach da die Frequenz messen und mit 2 Multiplizieren(wegen toggeln).> Das ist dann auch ungefähr die Frequenz, mit der auch die Knöppe> abgefragt werden würden.> mfg mf
Jop danke :)
Hätte aber auch die Möglichkeit im Geschäft am Oszi.
-- Son Oszi zuhause zu haben wär schon was feines :D
timo91 schrieb:> Das würde unnötig Timer und Leistung verbraten.
Quatsch.
Wenn du die 0.1% Rechenleistung nicht mehr hast, dann machst du etwas
grundlegend falsch.
> Ob jetzt hin und wieder> ein externer interrupt ausgelöst wird oder immer nach einer bestimmten> zeit.
Der Problemkreis lautet: Entprellung!
Dort liegt dein Problem, warum externe Interrupts bei Tastern keine gute
Idee sind.
Aber bitte - machs wie du willst. Das Forum ist voll mit Beiträgen von
Leuten die sich mit Tastern am externen Interrupt herumgeärgert haben
und dann doch irgendwann eingesehen haben, dass die anderen Poster doch
nicht so dämlich sind und schon wissen, was sie einem nahelegen.
Ich möchte mich als µC-Anfänger nicht zu sehr aufplustern, aber da wo
ich herkomme (PC-Programmierung) ist der Weg Tastendruck -> Interrupt
eigentlich der sauberste und normalerweise verwendete.
Das ermöglicht z.B. auch, den µC in einen clocklosen Sleep-Modus zu
versetzen, was richtig Strom spart.
Man kann die Taster gegen GND legen und ein Widerstandsnetzwerk als
Pullup-Widerstände verwenden. Dann kann die Leitungen an den Tastern mit
einem Dioden-NAND (gemeinsame Anoden) zum INTx-Eingang (mit Pullup)
zusammenführen.
Das ganze lässt sich auch mit einem Ausgangs-Schieberegister (4015)
kombinieren, um eine Matrix-Tastatur zu realisieren.
Ich habe das mal gemacht und so eine alte Grundig TP650 TV-Fernbedienung
(mit viel Platz innen) in ein Musikinstrument für meine (2-jährige)
Tochter verwandelt.
Philipp Klostermann schrieb:> Ich möchte mich als µC-Anfänger nicht zu sehr aufplustern, aber da wo> ich herkomme (PC-Programmierung) ist der Weg Tastendruck -> Interrupt> eigentlich der sauberste und normalerweise verwendete.
Wir sind aber nicht am PC.
Deine Tastendrucke sind schon im Keyboard aufbereitet worden.
Hier am µC haben wir es mit rohen Tastern zu tun.
Und ehe du weiterredest, such dir bitte mit der Forensuche einen der
Tasterthreads raus (es gibt sicherlich tausende davon) und/oder lies
diesen Artikel
Entprellung
Philipp Klostermann schrieb:> Ich möchte mich als µC-Anfänger nicht zu sehr aufplustern, aber da wo> ich herkomme (PC-Programmierung) ist der Weg Tastendruck -> Interrupt> eigentlich der sauberste und normalerweise verwendete.
Und wie entprellst Du die 1-12 Interrupts, die Du bekommst, wenn die
Taste einmal(!) gedrückt wird?
Ich hol schon mal Popcorn...
Philipp Klostermann schrieb:> Man kann die Taster gegen GND legen und ein Widerstandsnetzwerk als> Pullup-Widerstände verwenden. Dann kann die Leitungen an den Tastern mit> einem Dioden-NAND (gemeinsame Anoden) zum INTx-Eingang (mit Pullup)> zusammenführen.
Bauteilfriedhof nennt man sowas.
Es ist nicht so, dass ich mich mit dem Thema Tastenentprellung nicht
schon beschäftigt habe. Den besagten Artikel habe ich schon gelesen, und
mich zum Thema auch schon im Forum (z.B. in den Tasterfreds) geäußert.
Karl Heinz Buchegger schrieb:> Deine Tastendrucke sind schon im Keyboard aufbereitet worden.
Ja, von einem Baustein, der mit der Aufgabe ähnlich unterfordert ist,
wie ein µC. Eigentlich ist ein µC ziemlich geeignet. diesen Baustein zu
ersetzen.
Frank M. schrieb:> Und wie entprellst Du die 1-12 Interrupts, die Du bekommst, wenn die> Taste einmal(!) gedrückt wird?
Die werden verschluckt, weil ich erst mal auf "sei" verzichte, bis ich
INTx in EIMSK/GICR gelöscht habe, hauptsächlich um mich nicht selbst mit
Interrupts voll zu hauen wenn ich Spannungen auf die einzelnen Spalten
lege, um die Zeilen einzulesen, aber mit positiver Nebenwirkung auch zum
Entprellen. Bis der Auslesevorgang, bei dem 64 Bits durch
Schieberegister geschoben werden, zu Ende ist, und der Interrupt wieder
aktiviert wird, ist das mit dem Prellen auch vorbei.
Anbei eine Aufnahme von einem Tastenprellen in einem Spice-tauglichen
Format. Damit habe ich meinen Entprellkram gelöst.
Stupido schrieb:> Bauteilfriedhof nennt man sowas.
Na ja, 8 Dioden und ein RN passen noch in ein einzelnes Grab. ;-)
Philipp Klostermann schrieb:> Ja, von einem Baustein, der mit der Aufgabe ähnlich unterfordert ist,> wie ein µC.
Ich weiß nicht, wie es jetzt ist, aber vor USB waren in den
PC-Tastaturen durchweg 8048 bzw. 8051 verbaut.
Philipp Klostermann schrieb:> Eigentlich ist ein µC ziemlich geeignet. diesen Baustein zu> ersetzen.
Warum sollte man einen µC durch einen µC ersetzen?
Peter
> Damit könnte man sich viele Pins sparen
Aber braucht eine externen Chip.
Wie ungeschickt.
Man kann z.B. Taster Widerstände überbrücken lassen und liest einen
Analogwert an einem A/D-Wandler ein den heute fast jeder uC hat, da geht
ein Pin zumindest für 16 Taster, oft auch für mehr.
Man kann auch mit einem Taster irgendwelche der meist sowieso
vorhandenen uC-Ausgänge auf einen Eingang koppeln, dann kann man durch
schnelles durchspielen der Ausgänge erkennen, welcher Taster gedrückt
wurde.
Oder man nimmt nicht ständig den winzigsten uC den man bekommen kann
(ATtiny) und rüstet mit externen Chips bis zum Erbrechen auf, sondern
man greift einfach mal zu einem handlichen 40 oder 100 poligen uC, der
Geiz muß ja auch mal ein Ende haben.
Es gibt viele Lösungen, ein externes Schieberegister ist sicher nicht
die eleganteste.
Peter Dannegger schrieb:> Ich weiß nicht, wie es jetzt ist, aber vor USB waren in den> PC-Tastaturen durchweg 8048 bzw. 8051 verbaut.
Es ist eigentlich relativ egal, wie der Baustein heißt, in jedem Fall
verbringt er seine meiste Zeit mit Warten und ist mit seiner Aufgabe
jeweils schnell fertig, und somit genauso unterfordert, wie ein anderer
µC es wäre.
Peter Dannegger schrieb:> Warum sollte man einen µC durch einen µC ersetzen?
Das war doch nur hypothetisch.
MaWin schrieb:> Aber braucht eine externen Chip.>> Wie ungeschickt.
Da hast Du sicherlich Recht, aber es gibt einzelne Fälle, bei denen
diese Lösung einfach sinnvoller ist. Nicht jeder kann BGA löten (oder
traut sich da ran) und für Hobbyisten ist der nächstgrößere µC (z.B.
ATmega8 TQFP -> ATmega16 TQFP) manchmal so viel größer, dass er sich auf
ein kleines Layout nicht mehr platzieren lässt. Ich hatte in der o.g.
"Orgel" z.B. besser einen ATmega8 durch 4014 und 4015 ergänzen können,
als ihn durch einen ATmega16 zu ersetzen. Die Platine wäre mit einem
TQFP-44 zu breit geworden, und hätte in der Breite nicht mehr zwischen
die Stützwände in der Fernbedienung gepasst. Da dränge es sich auf, in
die Länge zu gehen und dort platzsparend kleine SO-16 ICs
unterzubringen.(Siehe Pdf.)
Philipp Klostermann schrieb:> Da hast Du sicherlich Recht, aber es gibt einzelne Fälle, bei denen> diese Lösung einfach sinnvoller ist. Nicht jeder kann BGA löten (oder> traut sich da ran) und für Hobbyisten ist der nächstgrößere µC (z.B.> ATmega8 TQFP -> ATmega16 TQFP) manchmal so viel größer, dass [...]
Ich verstehe nicht, warum man plötzlich den Prozessor wechseln muss,
wenn man eines der von MaWin skizzierten Konzepte für eine "Tastatur" am
µC verwendet. Der SW-Aufwand ist derart minimal und übersteigt deshalb
bzgl. des Speicherplatz-Bedarfes bestimmt nicht Deine nötigen
Schieberegister-Routinen in dem Maße, dass man direkt auf den
"nächtgrößeren µC" wechseln müsste.
P.S.
Deine Geschichte, wie Du die zuviel erzeugten Interrupts "verschlucken"
willst, um die Taster zu entprellen, halte ich für abenteuerlich. Ich
gehe daher nicht näher auf so einen Schwachsinn ein.
Frank M. schrieb:> Ich verstehe nicht, warum man plötzlich den Prozessor wechseln muss,> wenn man eines der von MaWin skizzierten Konzepte für eine "Tastatur" am> µC verwendet. Der SW-Aufwand ist derart minimal und übersteigt deshalb> bzgl. des Speicherplatz-Bedarfes bestimmt nicht Deine nötigen> Schieberegister-Routinen in dem Maße, dass man direkt auf den> "nächtgrößeren µC" wechseln müsste.
Es geht nicht um den Platzbedarf der Software, sondern um die Anzahl der
benötigten Pins, wenn man auf viele Taster oder eine Matrix-Tastatur
zugreifen möchte. Die Matrix der von mir genannten Fernbedienung hat
eine Größe von 8*8 + Page-Eingang. Wenn man dann noch z.B. TXD und RXD
und einen der OC-Ausgänge benutzen möchte und ein/zwei Leitungen für das
CS eines Digitalpotis verwenden will, wird es beim ATmega8(8) eng, was
die freien Pins angeht.
Nachtrag:
Was Deinen Einwand besonders bescheuert macht, ist das schon der Titel
des Threads in 3 Worten darauf hinweist, das es um Pins geht. Sag mal:
Nimmst Du das, was Du liest auch bewusst war?
> P.S.> Deine Geschichte, wie Du die zuviel erzeugten Interrupts "verschlucken"> willst, um die Taster zu entprellen, halte ich für abenteuerlich. Ich> gehe daher nicht näher auf so einen Schwachsinn ein.
Und ich gehe auf solche platten persönlichen Angriffe nicht ein. Nur
soviel: Es funktioniert zuverlässig und ist konzeptionell sauber. - Nur
Du scheinst es nicht verstanden zu haben. :-D
Naja ich dachte es ist relativ leicht möglich die Tasten komplett zu
entprellen.
Das Problem ist eben nur das ich keinen Timer mehr frei habe.
Über die sache mit dem A/D-Wandler hab ich mir auch schon gedanken
gemacht war aber nicht sicher ob es eine gute lösung wäre. Haut von den
pins her glaub auch nicht mehr hin.
Ich denke ich werde die Tasten in einem bereits verwendeten Timer
einfach auslesen.
Sry hattet ja doch Recht =D