Forum: Mikrocontroller und Digitale Elektronik -MCP23017 - INPUT_PULLUP mit INPUT verbinden


von Thomas M. (thomas_m453)


Angehängte Dateien:

Lesenswert?

Hallo!

Ich arbeite gerade an einem ATMEGA Projekt und möchte eine PCB 
erstellen, die mir eine DartMatrix auslesen kann. Ziel soll es sein, das 
ich eine x-beliebige Dartmatrix anschließen und auslesen kann und 
anschließend nur via Software/Config die Pins definiere der 
Master/Slave-Linien.

Die Grundidee war, dass ich über einen MCP23017 und MCP23008 die 
Masterlinien mit INPUT_PULLUP und die Slavelinien mit INPUT definiere 
(Das input floating zwischen Hi/lo war mir jetzt anfangs egal, da ich 
sonst einfach einen PullDown Wiederstand hinzugefügt hätte, der über 
einen DIP Schalter aktivierbar wäre - somit könnte ich bei jeder 
DartMatrix-Linie einen PullDown aktivieren und wäre wieder flexibel). 
Anschliessend würde ich einen Interrupt aktivieren, der bei Änderungen 
aktiviert wird.

Das Problem ist aber, dass wenn ich die Taste/Matrix drücke, der INPUT 
zwar auf HI geht, aber der INPUT_PULLUP nicht auf LO (kenne es nur von 
ATMEGA das hier der PULLUP auf low gezogen wird).

Jetzt meine Frage: Kann ich irgendwie simple das Problem so lösen, dass 
der Pullup auf LOW geht under INPUT auf high? Gibt es sonst alternative 
DIP IC Portexpander die das können? (DIP/THT daher, weil meine Lötkünste 
nicht so gut sind - notfalls versuch ich mich auch bei einem SMD 
Bauteil).

Danke und lg

von Stefan F. (Gast)


Lesenswert?

Die internen Pull-Widerstände sind zu hochohmig. Damit fängst du dir 
Radiowellen ein und die Schaltkontakte werden frühzeitig ausfallen.

Sorge dafür, dass jeder Kontakt mit mindestens 1 mA belastet wird.

von Thomas M. (thomas_m453)


Angehängte Dateien:

Lesenswert?

Das heist, ich kann die internen PullUps also nicht verwenden.

Ich muss also die PullUp und die PullDown flexibel schalten können bzw. 
nach DartMatrix anpassen. Ich hab das mal im Schaltplan aktualisiert. 5K 
PullUp sollten 1mA liefern. Sind 100k PullDown zu viel?

würde das aber auch den einen Eingang von HI auf LO setzen bzw. den von 
LO auf HI? was ja auch das ursprüngliche Problem ist?

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Mach doch einfach 16 Eingänge und 24 Ausgänge mit ganz normalen 
Schieberegistern (74HCT595 und 74HCT165). Oder halt noch mehr, wenn du 
meinst sie zu brauchen. Das ist viel billiger, als diese MCP Chips. Ich 
sehe keinen Bedarf, jeden Pin einzeln wahlweise als Eingang oder Ausgang 
nutzen zu können.

Unabhängig davon kannst du einfach alle Pins fest mit Pull-Up 
Widerständen ausstatten. Du brauchst keine Schalter.

von Thomas M. (thomas_m453)


Lesenswert?

Leider brauch ich die Möglichkeit um alle Ausgänge verschieden schalten 
zu können per Software. Da ich nicht weis wie die Matrix, die angebunden 
werden, beschaltet sind, muss ich rausfinden welcher Verbindung, welches 
Feld ist. Dazu will ich den Anwender einfach der reihe nach die Tasten 
drücken lassen (die ich im vorgebe) und scanne dabei die verschiedenen 
Eingänge und speichere es im EEPROM. Anschließend kann ich den Benutzer 
die DIP Schalterpositionen anzeigen lassen, die er aktivieren muss.

Grundsätzlich funktioniert das schon, allerdings ist es nicht gedacht 
für dauerhaft Anwendung. Für das scannen wechsle ich x-mal in der 
Sekunde die Mode und die LOW/HIGH outputs bzw. inputs jedes Pins. Das 
funktioniert aber nur bei langen Kontaktanschlägen per Finger. Ein Pfeil 
hat eine weit kürze Schaltdauer so dass ein dauerhaftes wechseln den 
Pfeil evtl. nicht erfasst bzw. ich nicht weis wieviel 
Schaltvorgänge/mode switches die MCP23xxx aushalten (nirgends 
dokumentiert).

Das der MCP23xxx das auf Dauer nicht aushält bzw. die Schaltzeiten zu 
lang dauern ist natürlich eine persönliche Vermutung.

von Peter D. (peda)


Lesenswert?

Thomas M. schrieb:
> Die Grundidee war, dass ich über einen MCP23017 und MCP23008 die
> Masterlinien mit INPUT_PULLUP und die Slavelinien mit INPUT definiere

Was soll das bringen?

Um eine Verbindung zu erkennen, wird genau eine Reihe auf Output-Low 
gesetzt und alles andere auf Input-Pullup. Dann liest man die Spalten 
ein. Und das dann nacheinander für alle Reihen.

von Peter D. (peda)


Lesenswert?

Thomas M. schrieb:
> Das der MCP23xxx das auf Dauer nicht aushält bzw. die Schaltzeiten zu
> lang dauern ist natürlich eine persönliche Vermutung.

Quatsch.
Den MCP kannst Du viel schneller auslesen, als Du drücken kannst.
Wichtig ist, daß immer nur ein einziger Pin Output-Low ist und alle 
anderen Input-Pullup. Output-High ist für alle Pins verboten.

von Stefan F. (Gast)


Lesenswert?

Thomas M. schrieb:
> ich nicht weis wieviel
> Schaltvorgänge/mode switches die MCP23xxx aushalten

Hinterfrage lieber, wie schnell die Kommunikation zum Mikrocontroller 
abläuft oder ob die IC's so etwas wie Pin-Change Interrupts 
unterstützen.

"aushalten" müssen sie nichts, die werden von kurzen Impulsen schon 
nicht kaputt gehen.

von Peter D. (peda)


Lesenswert?

Thomas M. schrieb:
> Ein Pfeil
> hat eine weit kürze Schaltdauer so dass ein dauerhaftes wechseln den
> Pfeil evtl. nicht erfasst

Bleiben denn die Pfeile nicht stecken?

von Thomas M. (thomas_m453)


Lesenswert?

Peter D. schrieb:
> Quatsch.
> Den MCP kannst Du viel schneller auslesen, als Du drücken kannst.
> Wichtig ist, daß immer nur ein einziger Pin Output-Low ist und alle
> anderen Input-Pullup. Output-High ist für alle Pins verboten.

Ja das stimmt schon. Ich kann es nicht so schnell drücken, aber ein 
Dartpfeil schon ;). Laut meinen tests bleibt die Matrix mit einem Pfeil 
zw. <1 und 3 millis aktiviert was nicht viel Zeit ist um zu lesen, mode 
ändern und wieder alles lesen. Teilweie hat der atmega auch noch andere 
Aufgaben (piezo auslesen, Ultraschallsensor und LED steuerung). Somit 
bleibt nicht viel Zeit für die Operationen.

Daher war auch meien Grundidee den MCP23XXX zu verwenden mit seinem 
interrupt registern. Wie gesagt, es sollte eigentlich der INPUT_PULLUP 
auf LOW gehen und der INPUT auf HI, dann könnte ich einfach das 
interrupt register (auch verspätet) lesen und hab aber ein sauberes 
ergebniss.

Peter D. schrieb:
> Bleiben denn die Pfeile nicht stecken?

Natürlich bleiben die Stecken. Aber das stecken aktiviert nicht die 
Matrix.

von Stefan F. (Gast)


Lesenswert?

Thomas M. schrieb:
> Laut meinen tests bleibt die Matrix mit einem Pfeil
> zw. <1 und 3 millis aktiviert was nicht viel Zeit ist...
> Somit bleibt nicht viel Zeit für die Operationen.

Manche Port-Expander unterstützen Interrupts. Man könnte das so nutzen:

Die Ausgänge steuern jeweils eine Reihe an. Die Eingänge sind mit den 
Spalten der Matrix verbunden.

Aktiviere alle Ausgänge/Reihen gleichzeitig und warte auf den 
Pfeil/Interrupt. Du bekommst sofort die Info, welche Spalte betroffen 
war.

Nun vertauschst du Eingänge mit Ausgängen. Steuere nur die eine bekannte 
Spalte an und lese die Reihen ein. Dann weißt du, welche Kontakt 
betätigt wurde.

Das geht vielleicht schneller, als alle Reihen oder Spalten 
nacheinander abzuscannen.

von Peter D. (peda)


Lesenswert?

Thomas M. schrieb:
> Laut meinen tests bleibt die Matrix mit einem Pfeil
> zw. <1 und 3 millis aktiviert was nicht viel Zeit ist um zu lesen

Mit IO-Expandern wird das eng. Interrupt geht nur, wenn Du alle Spalten 
auf Output-Low setzt und alle Reihen auf Input-Pullup und Interrupt. 
D.h. die Anordnung der Matrix muß vorher bekannt sein. Und dann schnell 
abtasten, welcher Punkt es ist.

Ich würde daher besser einen eigenen MC reservieren, der nur 
hintereinander abtastet und das Ergebnis z.B. über die UART zum Master 
sendet. Einen Interrupt braucht man dann nicht und es fällt die Zeit für 
Einsprung, Prolog, Epilog und Return weg. Ein ATmega sollte dafür 
reichen. Er muß nur die nötige Anzahl Portpins für die Matrix haben.

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.