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
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.
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
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.
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.
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.
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.
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.
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?
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.