3x4 Tastenmatrix - Reduzierung auf 5 Portpins?

OP #1935079
Lesenswert?

Ich möchte eine Fernbedienung mit einer 12er Tastatur (3x4 Matrix) und 
einem ATtiny44 Prozessor entwerfen. Die 3 Spalten der Tastenmatrix 
sollen dabei einen Interrupt auslösen (zum Aufwecken des UC).

Insgesamt benötige ich so 7 Portpins nur für die Tastenmatrix und für 
die restlichen Anforderungen fehlen mir 2 Portpins!

- Wie kann ich die Tastenmatrix auf max. 5 Portpins reduzieren?
- Expander 74HC138?
#1935182
Lesenswert?

Könntest du bitte mir zuliebe mal eine Ausnahme machen und mir die Nase 
putzen? Macht Mutti bei den Kinderchen schliesslich auch. Ich komme 
nämlich grad nicht drauf, wie die Variante 4 mit einer fertigen 
3x4-Matrix zurecht kommt (ohne diese aufzutrennen und neu zu 
verdrahten).
Gast #1935222
Lesenswert?

Hallo,
je nach Controller könnte evt. sowas funktionieren. So brauchst du 
allerdings schaltbare Pullups und Downs. Doppelte Tastenanschläge dürfen 
auch nicht vorkommen. Ich hoff mal das ich kein Denkfehler drin habe. 
Sobald beide eingänge High/Tristate sind geht der letzte an. Falls der 
Controller Tristate kann, kann man das Signal noch invertiere. Kostet 
aber noch ein Transistor.
Gruß
Peter
Angehängte Dateien:
#1935240
Lesenswert?

Peter Daneggers ADC-Variante lässt sich so erweitern, dass sie auch aus 
dem Sleep-Mode aufwecken kann. Dazu schliesst man R1 nicht an Vcc an, 
sondern am Interrupt-Pin, mit Pullup 47K an Vcc.

Bei normaler Tastenabfrage ist der Interrupt-Pin ein Ausgang auf "high", 
das ergibt Peters Schaltung. Im Sleep-Modus ist er ein Eingang.
#1935306
Lesenswert?

A. K. schrieb:
> Peter Daneggers ADC-Variante lässt sich so erweitern, dass sie auch aus
> dem Sleep-Mode aufwecken kann. Dazu schliesst man R1 nicht an Vcc an,
> sondern am Interrupt-Pin, mit Pullup 47K an Vcc.

Man braucht keinen extra Pin.
Man macht den Widerstand so groß, daß bei gedrückter Taste <0,3*VCC 
anliegen und nimmt den Pin-Change-Interrupt zum Aufwachen.


Peter
#1935510
Lesenswert?

Heimo G. schrieb im falschen Thread:

> An welchen Stellen der Tastenmatrix soll die die Pins für den
> Pinchange-Interrupt anschließen, damit ich eindeutige Pegel bekomme?

Er meint den ADC-Pin selbst, in einer Doppelrolle. Einerseits als 
analogem ADC-Eingang für die individuelle Tastenerkennung, andererseits 
als Digitaleingang mit Pin-Change Funktion um den Controller 
aufzuwecken.

Allerdings setzt das voraus, dass R1 grösser dimensioniert wird, damit 
die Spannung bei egal welcher gedrückten Taste nicht über 1/3 Vcc liegt. 
Sonst funktioniert das mit dem Pinchange-Interrupt nicht.
Gast #1935520
Lesenswert?

Hallo.

Ich habe gerade so etwas mit einer Zehnertastatur und dem ATtiny45 
gebaut (siehe Schaltbild im Anhang). Funktioniert wunderbar. Mein 
Fernseher gehorcht schon auf Tastendruck. Den Beamer, den NF-Verstärker, 
den HD-Recorder und den SAT-Receiver kriege ich da auch noch integriert. 
Endlich haben die x Fernsteuerungen ausgedient.
Der Quarz ist wahrscheinlich überkandidelt, weil die IR-Receiver breit 
wie Scheunentore reagieren. Aber man will ja möglichst genau die 38,4 
kHz einhalten. Oder sind es 36 oder 40 kHz?

mfg
gerd
Angehängte Dateien:
Gast #1935626
Lesenswert?

> Wie sieht es da denn mit dem Stromverbrauch aus? Sleep-Mode mit Wakeup
> durch Taste geht ja schlecht, diese Variante gibt das nicht her.

Bei 3 V und mit ADC-Int 0,5 mA. Das mit dem Stromverbrauch habe ich - 
ganz altmodisch - mit einem Schalter gelöst (Stromverbrauch im 
ausgeschalteten Zustand << 100 nA, dürfte auch noch deutlich besser sein 
als bei Wake-Up, siehe Anhang).

Umdimensionierung des Netzwerks wäre ein Leichtes, wenn ich bloss das 
blöde OpenOffice-Rechensheet auf meinen fünf Festplatten finden könnte.

Jetzt sehe ich erst mal zu, ob ich die anderen Geräte analysiert kriege. 
Jede Fernsteuerung macht andere Signalfolgen. Daran kann man schön 
sehen, was man mit Normung für segensreiche Wirkungen erreichen kann.

mfg
gerd
Angehängte Dateien:
#1935885
Lesenswert?

gerd schrieb:
> Umdimensionierung des Netzwerks wäre ein Leichtes, wenn ich bloss das
> blöde OpenOffice-Rechensheet auf meinen fünf Festplatten finden könnte.

Schau Dir mal meinen Code an.
Da macht das Rechnen einfach der Compiler, man muß nur die 3 
Widerstandswerte eintragen.

Man muß bei meiner Schaltung den Widerstand gegen VCC nur so groß 
machen, daß low sicher erkannt wird.
Und wenn für den hochohmigsten Tastenwert 1,25V nicht überschritten 
werden, vergleicht man einfach nur die untersten 8Bit.
ADCH muß aber trotzdem ausgelesen werden (dummy read).


Peter
Gast #1936772
Lesenswert?

Peter Dannegger schrieb:
> Schau Dir mal meinen Code an.
> Da macht das Rechnen einfach der Compiler, man muß nur die 3
> Widerstandswerte eintragen.

Davon halte ich nicht so arg viel, weil ich die Widerstandsverhältnisse 
gerne selbst im Griff haben will. Die Widerstandsverhältnisse sind arg 
nichtlinear, weil so gut wie alles von allem abhängt. Und da hat man 
schnell eine Nichtlinearität drin.

Wenn man keine Ordnung hält, muss man alles noch mal erfinden. Im Anhang 
ein Abbild des Berechnungssheets, mit Kurve für die Optimierung, und das 
alles bei 8 Bit Auflösung (ADLAR). Wie man sieht, ist das trotzdem recht 
robust.

> Man muß bei meiner Schaltung den Widerstand gegen VCC nur so groß
> machen, daß low sicher erkannt wird.

Wenn ich das Datenblatt richtig verstehe, sind das 0,5*VCC.

> Und wenn für den hochohmigsten Tastenwert 1,25V nicht überschritten
> werden, vergleicht man einfach nur die untersten 8Bit.
> ADCH muß aber trotzdem ausgelesen werden (dummy read).

10 Bit Auflösung sind eigentlich nicht nötig. Anbei noch den Rechensheet 
für die höhere Mindestspannung.

mfg
gerd
Angehängte Dateien:
#1937112
Lesenswert?

gerd schrieb:

> Wenn ich das Datenblatt richtig verstehe, sind das 0,5*VCC.

Nein.

Vil = 0,3*Vcc.
Vih = 0,6*Vcc

D.h. der nutzbare ADC-Bereich ist grösser wenn man nicht 0,0..0,3*Vcc 
sondern 0,6..1,0*Vcc nutzt, die Leitung im Ruhezustand also high ist. In 
Peters Variante müsste man die Matrixverschaltung dazu einfach auf den 
Kopf stellen.
#1937436
Lesenswert?

Peters Vorschlag war, die Matrix im Ruhezustand auf high zu halten, dis 
Tasten ziehen dann auf 0..33%Vcc (Datasheet wäre 0..30%). Wakeup erfolgt 
also bei high=>low. Die Methode, in Ruhe high und aktiv low zu arbeiten, 
ist halt eine alte liebgewordene Tradition aus TTL-Zeiten.

Bei niedriger Vcc müsste man das auf 0..20%Vcc anpassen, was den 
ADC-Bereich schon etwas einschränkt. Kann man natürlich auch machen, nur 
ist das Verfahren ja völlig spiegelsymmetrisch. Vertauscht man die Rolle 
von Vcc und GND, dann darf sich das ADC-Signal für die Tasten im Bereich 
70-100%Vcc bewegen und der Pinchange-Interrupt für Wakeup reagiert auf 
low=>high.

Wenn das immer noch zu kompliziert klingt, dann such dir einen 
Übersetzer ;-).
#1937464
Lesenswert?

Fast. R1 muss soweit vergrössert werden, dass die Spannung bei jedem 
Tastendruck mindestens 70%Vcc beträgt.

Ausserdem hast du die Doppelfunktion des ADC/Pinchange-Pins immer noch 
nicht kapiert. Findet sich jemand, der ihm das mit einfacheren Worten 
eintrichtern kann als ich?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren