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?
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
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.
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.
"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."
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...
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.
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 ....
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
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
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.
