Ich habe mir eine feine 4x4 Tastatur gekauft, die nur einen Eingangspin benötigt: http://www.wvshare.com/product/A_D-Keypad.htm Solange keine Taste gedrückt ist liegt der Pin auf 5V (bzw. VCC). Bei einer gedrückten Taste liegt die Spannung unter 4.8 V. Das kann man schön pollen und zuverlässig umwandeln. Wenn ich den Pin A0 benutze und einen Pin Change Interrupt bekomme ich nur die obere Tastaturhälfte, bei der die Spannung unter 2,5 V fällt - "natürlich!" werdet Ihr sagen. Ich war zugegebenermaßen überrascht. Nun also die Preisfrage: wie läßt sich (vielleicht mit geschicktem Umschalten zwischen ADComparator und ADConverter) etwas bauen, das bei unter 4.8 V triggert aber dann trotzdem die Analog-Digital-Wandlung nicht stört? Ist ein Spannungsteiler, der die Spannung aus der Tastatur halbiert, die einzige einfache Möglichkeit? Müßte dann so 1,6 MOhm sein...
:
Verschoben durch User
Wie wäre es, wenn du gar nicht auf einen Interrupt setzt, sondern einfach die Spannung am Pin per ADC zyklisch abfrägst? Dann ist es einfach, zu erkennen, ob eine Taste gedrückt ist...
Hallo Georg, warum studiert Du nicht das Beispiel auf der von Dir verlinkten Webseite. Dort steht alles, aber auch alles, was Du wissen musst. Es gibt sogar ein gutes Beipiel, wenn auch für den anspruchsvollen ST32F..., das Dir die notwendigen Schritte vorgibt. Gruß Roman
Hallo Roman, die Web-Seite habe ich gelesen und natürlich habe ich das auch schon längst ausprobiert: Pollen geht. Das wollte ich auch mit dem ersten Absatz meines Postings gesagt haben. Ich möchte die Tastatur aber in meinem Projekt "Taschenrechner", naja, eher "Tischrechner", einsetzen. Und der Rechner soll zwischen den Tastendrücken schlafen, wenn er nicht gerade rechnet. Deshalb möchte ich auch mit der Analogtastatur einen Interrupt auslösen, der den Rechner weckt. Vielleicht durch Vergleichen der Eingangsspannung mit 4.8V? Leider kann man auf dem ATmega328 nur entweder den Vergleicher oder den AD-Wandler benutzen. Ich habe versucht, in der Interrupt-Routine umzuschalten, aber wahrscheinlich habe ich das falsch gemacht oder nicht lange genug gewartet - wie auch immer: ich lese nur Müll mit analogRead(), aber vielleicht darf ich diese Routine im Interrupt gar nicht benutzen? Statt blödsinnig alles Mögliche(TM) auszuprobieren, frage ich lieber mal die Gemeinde. Gruß Georg
Georg Bisseling schrieb: > Deshalb möchte ich auch mit der Analogtastatur einen Interrupt auslösen, > der den Rechner weckt. Wär natürlich nützlich, die Schaltung der Tastatur zu kennen. Aber wenn ich mal annehme, dass jede Tastatur einen Widerstand gegen GND schaltet und für alle zusammen ein Pullup gegen VCC existiert, dann geht das schon - wenn andersrum, dann bitte im Geiste wenden. "VCC" Anschluss über Widerstand an VCC. So dimensioniert, dass die Taste mit der höchsten Spannung maximal 40% von VCC liefert. Ohne Taste gibts 100% von VCC, mit einer Taste maximal 40%. Die Spannungswerte der Tasten sind dann nicht mehr linear, aber das sollte nicht stören. Wenn es doch stört: "VCC" Anschluss zusätzlich an einen 2. I/O-Pin hängen. Im Ruhezustand ist der offen/Eingang. Gibt prima Interrupt. Für Identifikation der Taste diesen Pin als Ausgang "high" schalten. Gibt dann normale Spannungswerte.
:
Bearbeitet durch User
Georg Bisseling schrieb: > Und der Rechner soll zwischen den > Tastendrücken schlafen, wenn er nicht gerade rechnet. Wie tief und warum? Bei einem Tischrechner mit Netzteil ist es egal, ob man 5mW einspart.
Hallo Georg, nun haben wir ja ein paar Informationen zur CPU usw.. Du könntest einen analogen Komparator vorschalten der einen Interrupt auslöst sobald die Spannung unter 5Volt fällt. Ist aber nur der Schönheit wegen, siehe PeDa's Ausführungen zum Leistungsbedarf. Gruß Roman
A. K. schrieb: > "VCC" Anschluss über Widerstand an VCC. So dimensioniert, dass die Taste > mit der höchsten Spannung maximal 40% von VCC liefert. Ohne Taste gibts > 100% von VCC, mit einer Taste maximal 40%. Die Spannungswerte der Tasten > sind dann nicht mehr linear, aber das sollte nicht stören. Ja, das meinte ich mit dem Stichwort Spannungsteiler. Das werde ich mal probieren.
RomanK schrieb: > Hallo Georg, > > nun haben wir ja ein paar Informationen zur CPU usw.. Du könntest einen > analogen Komparator vorschalten der einen Interrupt auslöst sobald die > Spannung unter 5Volt fällt. Ist aber nur der Schönheit wegen, siehe > PeDa's Ausführungen zum Leistungsbedarf. > > Gruß > > Roman Nach einem kurzen Blick auf die Komparatoren im DIP-Gehäuse, die Reichelt so anbietet, denke ich, daß die viel zu viel Leistung verbraten. Da werde ich wohl die Spannungsteileridee verfolgen. Aber ausprobieren kann man das für die paar Cent ja trotzdem mal...
Georg Bisseling schrieb: > Aber ausprobieren kann man das für die paar Cent ja trotzdem mal... Dann aber bitte auch nachmessen, wie winzig die Stromersparnis ist gegenüber Power-Down und Polling im Watchdoginterrupt (16ms). Falls der Unterschied überhaupt meßbar ist.
Peter Dannegger schrieb: > Dann aber bitte auch nachmessen, wie winzig die Stromersparnis ist > gegenüber Power-Down und Polling im Watchdoginterrupt (16ms). > Falls der Unterschied überhaupt meßbar ist. Peda, Du meinst all diese Hin und Her zu den verschiedenen Schlafmodi der Atmel-Prozessoren ist verlorene Liebesmüh'? Auch bei Batteriebetrieb? Schade, aber eleganter wäre es trotzdem...
Liebe Leute, ich bin ja ganz neu hier in diesem Forum, habe aber schon ein paar Threads gelesen. Und sowohl dort als auch hier in diesem Thread meine ich ein Muster zu erkennen: Jemand fragt, wie etwas geht, und ihm wird geantwortet, daß er etwas anderes machen soll. Wenn jemand tatsächlich auf dem Holzweg ist, dann ist sicher hilfreich auch andere Lösungswege anzudeuten, aber man sollte doch schon erstmal die Frage genau lesen. Bitte schaut doch mal, ob Euch das auch auffällt. Ich halte mich selbst für einen alten, grantigen Besserwisser. Insofern sollte ich mich hier pudelwohl fühlen. ;-)
Also mit Besserwisserei hat es nichts zu tun, wenn einige Leute hier (manchmal etwas trocken) sagen, dass eine Idee nichts bringt. Leider wird hier auch gerne mal herum getrollt... Es gilt für sich selbst zu entscheiden, welchen und wessen Rat man annimmt. Trotzdem kann man einen eingeschlagenen Weg auch gegen den Rat der erfahrenen User hier weiter verfolgen, weil es einem um eine andere Sache geht. Aus Energieersparnis Gründen macht der Ansatz AVR + externe OP-Schaltung keinen Sinn, weil der OP mehr Geld kostet, als man an der Stromrechnung in vertretbarem Zeitraum je sparen könnte. Selbst, wenn wenn man die Versandkosten nicht beachtet: 2kWh sind ca 60ct entspricht 1 OPA bei 5mW Ersparnis sind das 400.000h Betrieb also 16.000 Tage oder 45 Jahre. Aber vielleicht will der TS einfach was zu OP Schaltungen lernen und dann macht das durchaus Sinn. Wenn es um den Tischrechner als solches geht und die Hauptaufgabe der Rechner und sein Energieverbrauch ist, dann würde ich dem TS raten auf einen STM32L152 zu wechseln dessen konfigurierbare OPs können frei mit ADC und Comparator verschaltet werden. Zudem benötigt er weniger Energie als ein AVR und kann sehr viel feiner in seiner Taktung und damit seinem Stromverbrauch angepasst werden. Sollte die Anzeige bereits extern gelöst sein, kann man auch einen STM32L151 nehmen oder die Stromaufnahme noch einmal halbieren und auf einen STM32L0 gehen, der hat IMHO keine ADCs, aber durch die freie Konfigurierbarkeit von PLLs, Clocks und ADC sollte sich einiges machen lassen, was dazu führt, dass er einen AVR sehr weit unterbietet. Gruß Ulrich
Hallo zusammen, wenn es in dem Falle wirklich um die Stromersparnis und Kosten geht, empfehle ich den guten alten Ausschalter. Kostet zwar mehr als ein paar Batterien im Jahr, aber ist effizient. Gruß Roman P.S.: Wer kommt in der heutigen Zeit noch auf die Idee eine Tischrechner bauen zu wollen. Hier wird das Prinzip alles mit einem MC machen zu wollen zu Tode geritten. Dafür gibt es heutzutage doch hochintegrierte IS's.
Georg Bisseling schrieb: > Auch bei Batteriebetrieb? Hat niemand behauptet. Aber eh man an der HW rumpfriemelt, sollte man erstmal die SW Möglichkeiten probieren. Z.B. Power-Down mit Watchdoginterrupt zum Aufwachen. Man kann auch den CPU-Teiler einschalten, wenn nix zu tun ist. Usw.
:
Bearbeitet durch User
Georg Bisseling schrieb: > Ist ein Spannungsteiler, der die Spannung aus der Tastatur halbiert, die > einzige einfache Möglichkeit? Nein. Die andere einfache Möglichkeit ist die "Umkehrung" dieses Ansatzes. Also so: Vcc o----- | - | | Rv | | - | *---------------IOx | Vcc ----- ----| key | | pad |----ADCx ----| | | Gnd ----- | --- Dat Dingens wird auf zwei Arten betrieben. Im normalen Modus (also bei wachem AVR) ist IOx auf Ausgang konfiguriert und gibt High aus. Das Keypad hat dann (fast) die volle Betriebsspannung. Die Pegel der Tasten werden nur geringfügig nach unten verschoben sein. Genau das ist der Hauptvorteil dieser "umgekehrten" Variante, der Störabstand der Tastatur im Normalbetrieb wird nur wenig verringert. Zum Einschlafen macht man nun folgendes: IOx auf Eingang umkonfigurieren (nicht vergessen neben DDRx auch PORTx zurückzusetzen!), dann mindestens einen Takt warten, Pegel an PINx checken. Wenn low, nicht einschlafen, dann ist noch irgendeine Taste gedrückt, ansonsten zuständigen PCINT aktivieren und einschlafen. Nun muß bloß noch Rv passend dimensioniert sein, so daß bei Druck auf die Taste, die normalerweise am ADC-Pin 4,8V erscheinen läßt, der Pegel an PINx sicher als Low gelesen wird. Dann wird bei dieser und jeder anderen Taste der Interrupt ausgelöst. In der ISR schaltet man dann den PCINT wieder ab, konfiguriert IOx wieder als H-Ausgang und alles ist wieder gut. Nunja, der Nachteil der Konstruktion ist natürlich, daß man einen zusätzlichen Pin benötigt. Aber dagegen steht neben o.g. Hauptvorteil als weiterer Vorteil, daß das auch mit ältlichen AVRs funktioniert, die kein PCINT für jeden Pin haben. Da kann man dann nämlich einen der INTx-Pins zum Aufwecken verwenden, die typischerweise sowieso niemals mit einem ADC-Pin zusammenfallen.
c-hater schrieb: > Vcc > o----- > | > - > | | Rv > | | > - > | > *---------------IOx > | Vcc ----- > ----| key | > | pad |----ADCx > ----| | > | Gnd ----- > | > --- Das ist ja doppelt schön, also erstmal die Schaltungsidee als auch die Darstellung als ASCII-Art. Danke für die Mühe! Georg
Neu Teile sind eingetroffen, und ich hatte Zeit etwas zu spielen: Der einfache Spannungsteiler, also einfach ein zusätzlicher Vorwiderstand vor den internen 9,8 kOhm Pullupwiderstand, funktioniert leider nicht. Ist der Widerstand sehr groß, dann fallen einige Tasten (bei 10bit AD-Wandlerauflösung) zusammen. Ist der Widerstand zu klein dann fällt die Eingangsspannung nicht unter die hier schon einmal genannten 40% VCC. Bei einem Widerstand von 220kOhm hat man sogar beide Effekte: Key0 und Key1 sind nicht sicher zu unterscheiden und der digitale Wert für die Spannung bei Key15 liegt bei 412 (von 1023). Als nächstes werde ich die Idee mit dem Komparator probieren...Mist gerade sehe ich, daß Reichelt einen Transistor statt des Komparators eingetütet hat. Dann also die Idee mit dem zusätzlichen Ausgang...
:
Bearbeitet durch User
Was ist denn eigentlich an dem Knacktaster-Ding als "fein" zu bezeichnen? Und wie sähe es aus, wenn man den GND Fusspunkt dieses Dings offen lässt? Ist dann am Ausgang eine Spannung gen VCC zu messen, sobald ein beliebiger Taster gedrückt wird, bzw. 0V ohne Druck? Dann lässt sich darüber ein Pinchange auslösen, GND kann über einen Portpin bereit gestellt werden, sobald der uC aufgewacht ist.
> Das ist ja doppelt schön, schreiben - und dann nicht richtig auswerten... Ich finde, dass der Beitrag von c-hater recht überzeugend aussieht. - Aber, wenn man die Tasten-Auswertung macht, ohne dass IOx das AD-keypad mit (fast)Vcc versorgt, kommt natürlich der von dir beschriebene Mist raus! Die Verschiebung der Potentiale (bei IOx = High und Ix < 0,5 mA) sollte wirklich minimal sein und mit einer minimal angepassten Vergleichstabelle selbst bei 8 Bit AD locker zu beherrschen sein. - Aber IOx muss vor der AD-Wandlung High-Potential liefern! Die Taste 15 des keypads (mit 4,7107 V @ 5 V) bringt einen Widerstand von 163 kOhm in Reihe mit 10 kOhm zur Wirkung. Macht 173 kOhm. Bei Rv >= 820 kOhm erreicht man auch mit dieser Taste einen satten Low-Pegel von <= 20 % von Vcc (< 1 V @ 5V). Ich würde aber noch zu etwas Entstörung Rf / Cf raten: Die Tastatur ist mit offenen Tasten ein guter Empfänger für jede ungewünschte Störeinstrahlung! > Vcc > o----- > | > - > | | Rv = 820 k > | | > - > | Rf = 1 k > *------===---------------*----IOx > | | > | Vcc ----- | > ----| key | === Cf = 1 n > | pad |----ADCx | > ----| | --- > | Gnd ----- > | > --- Rf ist hier hauptsächlich zum Schutz von Taste 0 gedacht. Auch 1 nF, geladen mit 5 V, liefert ohne Vorwiderstand kurzzeitig einen "ungesunden" Strom für die Taste. Ein Cf dürfte auch in der Leitung zu ADCx nicht schaden.
Oldie schrieb: > Ich finde, dass der Beitrag von c-hater recht überzeugend > aussieht. Das finde ich auch und werde das auch so ausprobieren. > - Aber, wenn man die Tasten-Auswertung macht, ohne dass IOx > das AD-keypad mit (fast)Vcc versorgt, kommt natürlich der von > dir beschriebene Mist raus! Naja, je nach Dimensionierung der in der Tastatur verwendeten Widerstände hätte es doch sein können, daß es einen "passenden" Vorwiderstand gibt. Schließlich war ich auf diese Idee ja auch schon selbst gekommen und mußte mich davon überzeugen, daß sie nicht funktioniert bevor ich die bessere Lösung von c-hater ausprobiere. Ich danke Dir für Deine Überlegungen zu Dimensionierung des Vorwiderstandes. Du schlägst vor, IOx und ADCx mit einem Tiefpass zu schützen, das ist mir ein wenig zu viel Aufwand. Zumal ich die analoge Tastatur ja wegen des auf den ersten Blick geringeren Schaltungsaufwandes interessant fand, Zugegeben: der Aufwand entsteht ja dadurch, daß ich nicht pollen, sondern einen Interrupt auslösen möchte. In der Zwischenzeit habe ich auch eine ganz normale Tastenmatrix in meinem Tascherechnermodell verwendet. Bisher habe ich da noch keine "spontanen" Tastendrücke durch Störeinstrahlung erlebt.
MWS schrieb: > Was ist denn eigentlich an dem Knacktaster-Ding als "fein" zu > bezeichnen? "Fein" ist, daß man nur einen Pin am MUC benötigt, statt acht. Aber das Tippgefühl ist und bleibt grauslig. Ich bin für Alternativvorschläge dankbar. Ein Nummernblock mit PS/2-Anschluß von Cherry für 40 € wäre aber irgendwie unsportlich... > > Und wie sähe es aus, wenn man den GND Fusspunkt dieses Dings offen > lässt? Ist dann am Ausgang eine Spannung gen VCC zu messen, sobald ein > beliebiger Taster gedrückt wird, bzw. 0V ohne Druck? Die Taster schalten den Ausgang über einen Widerstand auf GND. Das kann also nicht funktionieren.
:
Bearbeitet durch User
Georg Bisseling schrieb: > Aber das Tippgefühl ist und bleibt grauslig. Das sind ja nur die nackten Stößel. Es fehlt noch die Frontplatte mit den Tastenkappen. Nimm besser eine fertige 4*4 Matrix und papp die 7 Widerstände selber ran.
Georg Bisseling schrieb: > Der einfache Spannungsteiler, also einfach ein zusätzlicher > Vorwiderstand vor den internen 9,8 kOhm Pullupwiderstand, funktioniert > leider nicht. Natürlich nicht, die 1/0 Schaltschwelle eines uC Digitaleingangs ist einfach zu ungenau. Der Komoarator, bei vielen AVR eingebaut, braucht einen externen Spannungsteiler von ca. 49k/1k und der frisst zu viel Strom. Lege Plus der Tastatur nicht an +5V sondern einen I/O Pin, den du in sleep auf Eingang mit internem pull up schaltest. Wird eine Taste gedrückt, weckt er per pin change den Prozessor auf. Dann schaltest du den pin auf Ausgang auf HI und der A/D Wandler bestimmt den Tastendruck. Das kostet in sleep 0 Strom.
Georg Bisseling schrieb: > Die Taster schalten den Ausgang über einen Widerstand auf GND. Das kann > also nicht funktionieren. Hab' erst jetzt den Schaltplan der Tastatur gesehen, der Gesamtwiderstand, betrachtet man VCC zu GND, beträgt 170k im größten Fall bei gedrücktem Key15. Würde man GND der Tastatur an einen ext. Int-Pin mit Widerstand von 330k auf GND hängen, so löst jeder Tastendruck einen Interrupt aus, der den µC aufweckt. Im laufenden Betrieb wird dieser Pin auf Ausgang und Low gesetzt. Hab' aber gesehen, dass es in dieser Art bereits vorgeschlagen wurde. MaWin schrieb: > Lege Plus der Tastatur nicht an +5V sondern einen I/O Pin, den du in > sleep auf Eingang mit internem pull up schaltest. Das haut nicht hin, nimm den internen Pullup mit 40k an, dann zieht die Tastatur im ungünstigsten Fall mit 170k gegen GND, was bei 5V VCC ein Spannung von ca. 4V am Int-Pin ergibt, da triggert noch gar nix.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.