Frage zur Schaltzeit vom 74HC138N

OP #8028312
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?

Angehängte Dateien:
#8028316
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

#8028317
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.

#8028320
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."

#8028400
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
OP #8028522
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!

#8028537
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.

#8028547
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"

OP #8028614
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.

#8028680
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!

#8028916
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.

#8028921
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
#8028990
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

#8028999
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
#8029038
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
#8029044
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
#8029060
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
#8029130
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.
(Firma: kamaste.it GmbH) #8029709
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.

#8029733
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

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