Forum: Mikrocontroller und Digitale Elektronik Frage zur Schaltzeit vom 74HC138N


von Wolfgang (wolle_wolle)


Angehängte Dateien:

Lesenswert?

Moin,

ich nutze den 3-8 Decoder 74HC138N (DIP16 Gehäuse), um den Zustand von 
16 mechanischen Tastschaltern mit einen Atmega328P zu verarbeiten. Der 
Decoder ist notwendig, weil ich nur 5 Anschlüsse am Atmega328P frei 
habe.

Schaltung:jeweils 2 Taster liegen an einem Ausgang (Y0 bis Y7) des 
Decoders, und jeweils 8 Taster sind zu einer Bank zusammen gefasst. 
Jeder Taster ist mit einer Diode gegen Übersprechen geschützt. Siehe 
Skizze, Sorry für die Handzeichnung, musste gerade schnell gehen.

Ich nutze PC0, PC1 und PC2 als Digital Output für die Adressleitungen 
(A, B und C am Decoder) sowie PB0 und PB1 als Digital Input mit internen 
Pull-Ups für den Anschluss der zwei Taster-Bänke.

Das funktioniert auch. Allerdings muss nach dem Umschalten der Decoder 
Ausgänge eine Zeitverzögerung einbauen, bevor die Taster-Zustände sicher 
gelesen werden können. Was mich etwas verwirrt, denn die Propagation 
Delay Time des 74HC138 liegt beim Betrieb mit 5V und Raumtemperatur 
immer unter der Cycle Time des Atmega (16MHz -> 62,5ns). Konkret muss 
ich 4 Cycle Times nach dem Wechsel der Adresse warten, erst dann sind 
die adressierten Schalter auch auf GND gesetzt. Ich hätte erwartet, dass 
ich nur eine Cycle Time warten muss.

Wo liegt mein Denkfehler?

von Christian E. (cerker)


Lesenswert?

An PB0 und PB1 müssen die schwachen internen Pullups die 
Leitungskapazität aufladen bei einem L-H Übergang (der letzte Taster war 
gedrückt, der nächste ist es nicht). Die haben so 30kOhm, bei 10pF 
Leitungskapazität (schnell zusammen in so einer Matrix) sind das schon 
300ns Zeitkonstante.

Nutze externe Pullups von 2-5kOhm dann sollte das passen.

Gruß,
Christian

von Jens M. (schuchkleisser)


Lesenswert?

Wolfgang schrieb:
> Wo liegt mein Denkfehler?

An der unendlichen Geschwindigkeit des Strom bei der Ausbreitung durch 
den Decoder in die Dioden und Schalter. :D
Und da ist ja auch (k)ein Pullup und vollkommen irrelevante 
Leitungskapazitäten im Weg.
Plus das der Prozessor schneller die Befehle abarbeitet, als die IO 
funktioniert: Das lesen des Eingangs aus dem Befehl n+1 passiert extrem 
knapp vor dem schreiben des Ausgangs im Befehl n.
Das ist einfach die Füsick, die dir da reinspielt.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Wenn ein Taster öffnet muss die Eingangskapazität des Atmega erst noch 
aufladen, der hängt dann in der Luft. Zwei Pull-up-Widerstände könnten 
helfen.

von Andreas B. (abm)


Lesenswert?

"Reading the Pin Value
Independent of the setting of Data Direction bit DDxn, the port pin can 
be read through the PINxn register bit. As shown in Ports as General 
Digital I/O, the PINxn register bit and the preceding latch constitute a 
synchronizer. This is needed to avoid metastability if the physical pin 
changes value near the edge of the internal clock, but it also 
introduces a delay."

von Wolfgang (wolle_wolle)


Lesenswert?

Muchas gracias für die schnellen Antworten! Ich hab tatsächlich nur in 
Richtung Decoder geschaut. Total vernagelt. Man sollte sowas nicht 
Morgens auf die Schnelle zusammen basteln, sondern erst mal einen Kaffee 
nehmen und denken...

von Michael B. (laberkopp)


Lesenswert?

Wolfgang schrieb:
> Wo liegt mein Denkfehler?

Deine HC138 Eingänge haben keine pull down Widerstände, da wird der 
Eingang nur durch den Leckstrom der Dioden nach Masse gezogen.

Lege 10k von jedem Eingang nach Masse.

16 Dioden, 1 IC und 8 Widerstände sind natürlich viel Aufwand für 16 
Taster.

von Wastl (hartundweichware)


Lesenswert?

Wolfgang schrieb:
> Ich hab tatsächlich nur in
> Richtung Decoder geschaut. Total vernagelt.

Mit zwei Käfern á la 74HC165 würdest du dir Leitungen zum
Controller sparen und weniger von hinten durch die Brust ins
Auge programmieren müssen. Dioden zum "Entstören" bräuchtest
du auch keine ....

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Wenn man genug Kaffee getrunken hat, kann man auch zur Erkenntnis 
gelangen, dass man sich den 74138 komplett sparen kann, indem man 
Charlieplexing macht (Mit 5 GPIOs gehen bis zu 4x5 = 20 Tasten).
https://en.wikipedia.org/wiki/Charlieplexing
Kapitel: Input data multiplexing

Gruss
WK

von Axel S. (a-za-z0-9)


Lesenswert?

Michael B. schrieb:
> Wolfgang schrieb:
>> Wo liegt mein Denkfehler?
>
> Deine HC138 Eingänge haben keine pull down Widerstände, da wird der
> Eingang nur durch den Leckstrom der Dioden nach Masse gezogen.
>
> Lege 10k von jedem Eingang nach Masse.

Soll das ein Scherz sein? Oder bist du nur 5 Tage zu früh?

Wolfgang schrieb:
> Ich nutze PC0, PC1 und PC2 als Digital Output

von Rainer W. (rawi)


Lesenswert?

Christian E. schrieb:
> Die haben so 30kOhm, bei 10pF Leitungskapazität (schnell zusammen in
> so einer Matrix) sind das schon 300ns Zeitkonstante.

Zu den angenommenen 10pF Leitungskapazität (zzgl. Eingangskapazität) 
kommen dann noch die Sperrschichtkapazitäten der jeweils 8 Dioden (bei 
1N4148 bspw. noch gut 30 pF).

Axel S. schrieb:
> Soll das ein Scherz sein? Oder bist du nur 5 Tage zu früh?

Laberkopp halt - heute ist doch Freitag ...

Wolfgang schrieb:
> Konkret muss ich 4 Cycle Times nach dem Wechsel der Adresse warten,
> erst dann sind die adressierten Schalter auch auf GND gesetzt. Ich
> hätte erwartet, dass ich nur eine Cycle Time warten muss.

Lies die Werte doch unmittelbar BEVOR du die Adresse am Decoder änderst. 
Dann kannst du die Umschaltzeit anderweitig nutzen. Sinnvollerweise 
reicht es doch, alle paar Millisekunden nach den Tasten zu gucken, d.h. 
du hast alle Zeit der Welt.

: Bearbeitet durch User
von Wolfgang (wolle_wolle)


Lesenswert?

Lesen unmittelbar vor dem Setzen der neuen Adresse: hab ich 
zwischenzeitlich gemacht, geht auch. Mir ging es bei der Frage eher um 
das Verständnis (und ich hätte selbst auf die genannten Einflüsse kommen 
müssen...).

Mit externen 3,3k Pull-Ups reduziert sich die Verzögerung auf 2 Zyklen. 
Schick. Was die Kapazitäten angeht: Das 74HC138 Datenblatt gibt die 
Propagation Time bei einer kapazitiven Last von 50pF an, das hatte mir 
auf den ersten schnellen Blick gereicht. Tja.

Schieberegister anstatt 3-8 Decoder: geht auch, und 16 Dioden gegen ein 
IC einzutauschen ist eine überdenkenswerte Option. Den 74HC138 hatte ich 
hier herum liegen, Dioden sowieso, so ist meine Schaltung zustande 
gekommen.

Was mich aber gerade wirklich fett nach vorne gebracht hat, ist das 
Charlieplexing. Vielen Dank für den Tipp, das kannte ich noch nicht. 
Genial. Ich musste etwas nachdenken, bis ich die Schalter-Variante 
verinnerlicht hab. Für mich bietet sie neben der Schaltungs-Reduzierung 
den Vorteil, dass ich 4 Schalter gleichzeitig lesen kann. Das 
vereinfacht meinen Code sehr.

Also Danke nochmal an alle!

von Mi N. (msx)


Lesenswert?

Wastl schrieb:
> Mit zwei Käfern á la 74HC165 würdest du dir Leitungen zum
> Controller sparen und weniger von hinten durch die Brust ins
> Auge programmieren müssen. Dioden zum "Entstören" bräuchtest
> du auch keine ....

Oder auch CD4021 - bei Bedarf einfach melden.
Großer Vorteil dabei: ob 16, 32 oder 64 Eingänge, es braucht keine 
weiteren Anschlüsse am µC. Zudem ist es egal ob Taster oder Schalter 
angeschlossen werden.

von Falk B. (falk)


Lesenswert?

Wolfgang schrieb:
> ich nutze den 3-8 Decoder 74HC138N (DIP16 Gehäuse), um den Zustand von
> 16 mechanischen Tastschaltern mit einen Atmega328P zu verarbeiten. Der
> Decoder ist notwendig, weil ich nur 5 Anschlüsse am Atmega328P frei
> habe.

Alternativ kann man die Taster analog einlesen, spart noch mehr IOs.

Beitrag "Re: ATtiny keine Pins mehr frei"
Beitrag "Re: Arduino Nano, Drehpotentiometer mit Rasten und Endanschlag"

von Jens G. (jensig)


Lesenswert?

Rainer W. schrieb:
> Sinnvollerweise
> reicht es doch, alle paar Millisekunden nach den Tasten zu gucken, d.h.
> du hast alle Zeit der Welt.

Entprellen muss er ja auch noch, da muss er sich ohnehin reichlich Zeit 
nehmen ...

von Klaus R. (klausro)


Lesenswert?

Dergute W. schrieb:
> Charlieplexing (Mit 5 GPIOs gehen bis zu 4x5 = 20 Tasten).

IMHO "gehen" zwar 20 LEDs, aber nur 10 Tasten...

von Wolfgang (wolle_wolle)


Lesenswert?

Nach ein paar Tests mit Charlieplexing, seltsamen Problemen und Stöbern 
im Internet fand ich: es gibt auch mit vorgeschalteten Dioden noch ein 
Ghosting-Problem mit Schaltern. Eine Erklärung und Lösungsansatz fand 
ich hier: https://github.com/thanks4opensource/markoplexing
Taugt für mich nicht, aber wenn man die Schalter analog lesen kann und 
die mehrfachen Diodendurchläufe damit erkennt, bringt das Verfahren bei 
Schaltern noch Sinn (im Text ist das sehr gut erläutert). Beim Plexen 
von LEDs ist es auf jeden Fall eine coole Nummer.
Es ist echt spannend, worauf man so stößt wenn man die Gemeinde um Hilfe 
bittet. Oder, wie es bei der Sesamstraße heisst: wer nicht fragt bleibt 
dumm.

von Hans (hansmd)


Lesenswert?

Hallo,
würde Dir den IC MM74C922 für solche Zwecke
empfehlen wenn Dein geplantes Layout noch
Änderungen zulässt. Kein Tastenprellen und
eifach im Umgang.

Abendgruß aus MD
Hans

von Michael B. (laberkopp)


Lesenswert?

Hans schrieb:
> Hallo,
> würde Dir den IC MM74C922 für solche Zwecke
> empfehlen wenn Dein geplantes Layout noch
> Änderungen zulässt. Kein Tastenprellen und
> eifach im Umgang.

Geht heute halt billiger und sortimentssparender mit einen zweiten uC.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

Wolfgang schrieb:
> Nach ein paar Tests mit Charlieplexing, seltsamen Problemen und Stöbern
> im Internet fand ich: es gibt auch mit vorgeschalteten Dioden noch ein
> Ghosting-Problem mit Schaltern. Eine Erklärung und Lösungsansatz fand
> ich hier: https://github.com/thanks4opensource/markoplexing
> Taugt für mich nicht,

Warum? Du willst 16 Schalter auslesen. Das Projekt zeigt, wie es geht!
Und in deiner Skizze sind PC0-PC4 benutzt, das sind die ADC-IOs!

von Bauform B. (bauformb)


Lesenswert?

Mit vier Analogeingängen und 16 Tastern geht es rein analog aber besser 
und mit halb soviel Bauteilen: 4 Pull-Widerstände und ein 
Spannungsteiler aus 4 gleichen Widerständen liefert 4 Spannungen für die 
4 Spalten der Tastermatrix.

Man kann immer noch bis zu 4 gleichzeitige Taster eindeutig erkennen, 
nur nicht beliebige Kombinationen.

Bonus: Alle Signale an den Tastern sind rein statisch. Das Programm muss 
nichts umschalten, nur noch die 4 ADC-Kanäle lesen; multiplexen kann der 
ADC hoffentlich selber.

von Maxim B. (max182)


Lesenswert?

Wastl schrieb:
> Mit zwei Käfern á la 74HC165 würdest du dir Leitungen zum
> Controller sparen

Dann lieber HCS165, die haben auch Schmitt-Trigger. Ich benutze 
HCS-Serie an solchen Stellen seit ein paar Jahren.
Man kann dann ~CS von SPI mit SH/~LD über RC verbinden und noch ein Pin 
sparen: dann wird Tastenzustand automatisch geladen wenn ~CS von 
Tastatur auf "0" gesetzt wird.

Nachteil im Vergleich mit direkten Anschluss von Tasten an 
Mikrocontroller: für jeden Eingang von HCS165 braucht man externe 
Pullup-Widerstand.

Es gibt noch eine Möglichkeit: MCP23S17. Dann hat man 16 Eingänge mit 
Pullup, die auch über SPI gelesen sein können. Nachteil: ein Byte mehr 
bei Datenaustausch mit Mikrocontroller und Notwendigkeit, MCP23S17 
initialisieren. D.h. etwas komplizierter in Programm.

Für Entprellen benutze ich seit Jahren der Code:
Beitrag "Universelle Tastenabfrage mit 2 Tastenerkennung"
vor dem
1
i = key_state ^ ~key_pin;
 schreiben:
1
key_pin = kn;
 statt "kn" eine Funktion, die Tasten liest, z.B. über SPI.
Wenn wir mehr als 8 Tasten brauchen, dann statt uint8_t einfach uint16_t 
oder uint32_t verwenden.


Bauform B. schrieb:
> Mit vier Analogeingängen und 16 Tastern geht es rein analog aber besser
Diese Variante finde ich schlecht, da ca. 200x langsamer. Außerdem 
digitale Zustände (wie bei Taster) über analoge Umweg abzulesen heißt 
zusätzlich und nicht unbedingt notwendige Störungsquelle.
Und noch: mit HC(HCS)165 oder MCP23S17 kann man beliebige 
Tastenkombinationen, die zusammen gedruckt, ablesen. Analoge Umweg macht 
das nicht möglich.

Mit HCS165 habe ich vor drei Jahren Orgelpedal gemacht. 30 Tasten mit 
Optocoppler TCRT5000L, direkt (mit 3k9 Pullup) mit HCS165 verbunden. 
Zuerst werden LED von Optocoppler geschaltet, dann nach 20 us LD-Impuls 
für HCS165, um Tasten abzulesen. 20 us waren nach Experimenten optimal.
Es sind 5 Module mit Tastenteilung für Optocoppler: 2x für 5 Tasten 
(C-Cs-D-Ds-E), 2x für 7 Tasten (F-Fs-G-Gs-A-B-H) und noch ein 
7-Tasten-Modul für obere c1-cs1-d1-ds1-e1-f1 benutzt. Somit reichte es 2 
Platinen zu bestellen, da sowieso mindestens je 5 Stück gemacht werden. 
Jede Platine hat je 2 langen Befestigungslöcher, somit wird genaue Lage 
bestimmt. Alle Platinen sind nacheinander seriell geschaltet (da 
Schieberegister). Deshalb konnte ich alles zu dem Mikrocontroller recht 
sparsam anschließen: SCK, DI und ~LD, separate Pins für LED von 
Optocoppler (je zwei für "+" und für "-"), +5V und GND (2x), insgesamt 
10 Pins Badewannestecker.

: Bearbeitet durch User
von Jobst M. (jobstens-de)


Lesenswert?

Bauform B. schrieb:
> Mit vier Analogeingängen und 16 Tastern geht es rein analog aber besser
> und mit halb soviel Bauteilen: 4 Pull-Widerstände und ein
> Spannungsteiler aus 4 gleichen Widerständen liefert 4 Spannungen für die
> 4 Spalten der Tastermatrix.
>
> Man kann immer noch bis zu 4 gleichzeitige Taster eindeutig erkennen,
> nur nicht beliebige Kombinationen.

Wenn man nicht vier gleiche Widerstände benutzt, kann man sogar alle 16 
Tasten gleichzeitig eindeutig erkennen.

Gruß
Jobst

von Maxim B. (max182)


Lesenswert?

Jobst M. schrieb:
> Wenn man nicht vier gleiche Widerstände benutzt, kann man sogar alle 16
> Tasten gleichzeitig eindeutig erkennen.

Wie lange braucht ADC?
Auch mit ungleichen Widerständen 16 Tasten mit Erkennung von 
gleichzeitig gedruckten wäre zu viel. Nicht machbar. Irgendwann habe ich 
versucht, notwendige für diese Variante Widerstände zu berechnen. 
Ergebnis: 10 bit ADC zu ungenau dafür.

: Bearbeitet durch User
von Jobst M. (jobstens-de)


Lesenswert?

Maxim B. schrieb:
> Wie lange braucht ADC?

Genau so lange, wie mit 4 gleich großen Widerständen.
Und es funktioniert.

Gruß
Jobst

von Hans W. (hanswieland)


Lesenswert?

Maxim B. schrieb:
> Wie lange braucht ADC?

Spielt keine Rolle, weil er unabhängig von der CPU laufen kann.

: Bearbeitet durch User
von Maxim B. (max182)


Lesenswert?

Hans W. schrieb:
> Spielt keine Rolle, weil er unabhängig von der CPU laufen kann.

Ich glaube, Taste, die von Natur aus digital ist (ein oder aus), über 
ADC abzulesen, hier ist etwas unnatürliches.
Auch wie gesagt, mit ADC gibt es Problem, mehrere gleichzeitig gedruckte 
Tasten zu erkennen.

Ich kannte eine chinesische Platine, die so macht. Aber ich war nicht 
begeistert davon. Selbst verwende ich nur digitale Varianten. Alle die 
oben beschrieben: als Matrix, über Schieberegister und über MCP23S17, 
das habe ich in meinen Platinen benutzt.

Es gibt noch HT16K33, I2C LED-Treiber mit Möglichkeit, bis 13x3 Tasten 
Matrix abzufragen und entprellen. 30 St. habe ich in meinem Lager, aber 
noch nie benutzt.

: Bearbeitet durch User
von Hans W. (hanswieland)


Lesenswert?

Maxim B. schrieb:
> Ich glaube, Taste, die von Natur aus digital ist (ein oder aus), über
> ADC abzulesen, hier ist etwas unnatürliches.
> Auch wie gesagt, mit ADC gibt es Problem, mehrere gleichzeitig gedruckte
> Tasten zu erkennen.

Zahlreiche genau so gebaute Bedienfelder in der Unterhaltunfselektronik 
funktionieren so. Auch bei namhaften Marken.

von Maxim B. (max182)


Lesenswert?

Na ja... Wie sagt ein bekannter Tontechniker: man darf alles, hier in 
Deutschland gibt es keine Audiopolizei :)

Ja, gut zu erinnern. Ich mache mal eine Platine mit HT16K33 für Giga. 
Und teste, wie das alles zusammen läuft. Da IC wie geschrieben von 4,5 
bis 5,5 Volt läuft, brauche ich dann wohl so etwas wie PCA9517D als 
Pegelwandler. Obwohl so auch für MAX7219 steht (4.0 bis 5.5 Volt), 
trotzdem läuft IC auch mit 3V3.

: Bearbeitet durch User
von Hans W. (hanswieland)


Lesenswert?

Maxim B. schrieb:
> brauche ich dann wohl so etwas wie PCA9517D als Pegelwandler

In der Regel kannst du den I2C Bus mit 3.3V betreiben, auch wenn die 
angeschlossenen IC eine 5V Versorgung haben. Die Bus-Spannung gibst du 
selber durch die beiden Pull-Up Widerstände vor.

Der MAX7219 hat keine I2C Schnittstelle, und verlangt mindestens 3,5V 
als High Pegel. Für den bräuchtest du ganz andere Pegewandler.

: Bearbeitet durch User
von Maxim B. (max182)


Lesenswert?

Hans W. schrieb:
> Der MAX7219 hat keine I2C Schnittstelle, und verlangt mindestens 3,5V
> als High Pegel. Für den bräuchtest du ganz andere Pegewandler.

Trotzdem läuft MAX7219 zusammen mit NUCLEO-H723ZG mit 3V3 VCC. Ich habe 
in August damit experimentiert.

Ob HT16K33 mit 3V3 VCC läuft, kann man wohl nur nach Experiment sagen.

: Bearbeitet durch User
von Hans W. (hanswieland)


Lesenswert?

Maxim B. schrieb:
> Trotzdem läuft MAX7219 zusammen mit NUCLEO-H723ZG mit 3V3 VCC. Ich habe
> in August damit experimentiert.

Das glaube ich dir. Empfehlen wird es hier allerdings niemand.

von Manfred P. (pruckelfred)


Lesenswert?

Maxim B. schrieb:
> Ich glaube, Taste, die von Natur aus digital ist (ein oder aus), über
> ADC abzulesen, hier ist etwas unnatürliches.

Wenn Du das sagst ...

> Auch wie gesagt, mit ADC gibt es Problem, mehrere gleichzeitig gedruckte
> Tasten zu erkennen.

Die Frage ist, warum man das will oder braucht.

> Ich kannte eine chinesische Platine, die so macht. Aber ich war nicht
> begeistert davon. Selbst verwende ich nur digitale Varianten.

Das ist Deine Religion, Taster mit Widerstand sollen in vielen Autos 
vorgekommen sein.

Ich habe in einem Gerät 9 Tasten mit Widerständen an einem Arduino, 
funktioniert bestens und zuverlässig. Gleichzeitigkeit wäre dort sinnlos 
und wird abgefangen.

Maxim B. schrieb:
> Obwohl so auch für MAX7219 steht (4.0 bis 5.5 Volt),
> trotzdem läuft IC auch mit 3V3.

Pfuscher.

Hans W. schrieb:
> In der Regel kannst du den I2C Bus mit 3.3V betreiben, auch wenn die
> angeschlossenen IC eine 5V Versorgung haben.

Pfuscher.

Maxim B. schrieb:
> Ob HT16K33 mit 3V3 VCC läuft, kann man wohl nur nach Experiment sagen.

Pfuscher.

Hans W. schrieb:
> Empfehlen wird es hier allerdings niemand.

Ebenso wenig wie I2C ohne Pegelwandler.

Beitrag #8029164 wurde vom Autor gelöscht.
von Martin G. (Firma: kamaste.it GmbH) (myg63)


Lesenswert?

Ein offener Eingang an einem 74HC-Bauteil ist unzulässig.
Du musst klare Pegel anliefern. Entweder mit einem Taster der umschaltet 
von GND auf VCC oder mit einem Pullup-Widerstand.
So üblich sind 10kOhm - 100kOhm.

Weiterhin muss Deine Software so laufen, dass das Prellen der Tasten 
wirksam unterdrückt wird. Das liegt meist so im Bereich von 10-50 ms.

von Michael B. (laberkopp)


Lesenswert?

Maxim B. schrieb:
> Trotzdem läuft MAX7219 zusammen mit NUCLEO-H723ZG mit 3V3 VCC. Ich habe
> in August damit experimentiert

Deiner.


Geht er kaputt und du kaufst Ersatz miss das keineswegs weiterhin 
funktionieren.

Wenn es nicht nur manchmal sondern immer funktionieren soll, bleibt man 
besser innerhalb der Datenblattgrenzen.

Eine 5 Tonnen Brücke hält auch den 20 Tonnen Lkw aus. Manchmal.

: Bearbeitet durch User
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
Noch kein Account? Hier anmelden.