Pin sowohl als Eingang (für einen Schalter) als auch als Ausgang (für LED) mit ATmega32U4?

Es gibt bereits mehrere Fragen in der Nähe dieses Themas, aber sie beziehen sich entweder auf eine andere µC-Familie oder auf das Lesen analoger Spannungen oder andere Sonderfälle.

Also hier gehts: Ich möchte eine Taste lesen und eine LED vom selben I/O-Pin auf dem ATmega32U4 ansteuern. Stimmt etwas nicht mit:

  • Pin => 22K Widerstand => Taster => GND
  • Pin => LED-Widerstand => LED => GND

Dann würde der Pin natürlich immer wieder in den Eingabemodus (mit internem Pullup) versetzt und die meiste Zeit im Ausgabemodus sein.

Soweit ich das beurteilen kann, beträgt der interne Pullup bei diesem µC 50-100 K, also sollten die 22 K mit der Taste in der Lage sein, das ausreichend zu versenken.

Im Ausgabemodus, wenn die Taste nicht gedrückt wird, ist alles normal; Wenn die Taste gedrückt wird, fügt dies einen Pfad durch 22K zu GND hinzu, wodurch die LED möglicherweise etwas dunkler wird oder nicht. Wie auch immer, in meiner Anwendung wäre es überhaupt egal, wie die LED aussieht, während diese Taste gedrückt wird.

Besteht die Möglichkeit etwas zu beschädigen? Irgendeine Falle, die nicht offensichtlich ist?

Sie können die Spannung am Pin in allen Situationen leicht berechnen und dann sehen, ob diese Spannungen in die Definition von logisch 1 und logisch 0 für MCU passen. Ich glaube nicht, dass Sie etwas beschädigen werden, es kann einfach nicht funktionieren.

Antworten (2)

Mach das nicht so wie du es beschreibst. Wie ich verstehe, würde Ihr cicruit wie folgt aussehen:

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Angenommen, der GPIO befindet sich im Eingabemodus (hohe Impedanz) und die Taste ist nicht gedrückt. Die Spannung am GPIO liegt ungefähr bei der LED-Durchlassspannung. Obwohl es sehr wenig Strom geben wird, gibt es einen Pfad durch Rpullup-R2-D1, und am MCU-Pin werden etwa 1,8 V ~ 2,5 V (je nach verwendetem LED-Typ) anliegen bedeutet , dass der Logikpegel außerhalb der Spezifikationen liegt (dies hängt von der verwendeten Versorgungsspannung ab, aber höchstwahrscheinlich liegen Sie zwischen hohen und niedrigen Spannungsgrenzen). Die MCU verhält sich also nicht konsistent, und Sie können nicht wirklich erkennen, ob die Taste gedrückt ist oder nicht. Die MCU kann in diesem Fall auch übermäßig viel Strom verbrauchen.

Hier ist, was ich herausgefunden habe:

schematisch

Simulieren Sie diese Schaltung

Sie müssen den GPIO entweder auf niedrigem Pegel ansteuern, um die LED einzuschalten, oder auf hohe Impedanz einstellen, um die LED auszuschalten und schließlich den Tastenstatus zu lesen. Der GPIO darf von der Software niemals aktiv hoch getrieben werden, da bei gleichzeitigem Drücken des Tasters der Pin kurzgeschlossen wird.

Der offensichtliche Nachteil der obigen Schaltung besteht darin, dass die LED beim Drücken der Taste vollständig eingeschaltet ist. Aber in Ihrem Fall scheint es kein Problem zu sein, und abgesehen davon ist diese Schaltung einfach, sicher für die MCU (wenn Sie die obige Regel befolgen) und garantiert korrekte Eingangspegel.

Klingt gut, danke. Ich denke, es gibt keine einfache Möglichkeit, diese potenzielle Abkürzung zu vermeiden (im Falle von Programmierfehlern), oder Sie hätten es erwähnt ...
Eigentlich gibt es einen Weg, aber es erfordert zusätzliche externe Komponenten. Schauen Sie sich die vorherigen Überarbeitungen dieses Beitrags an, die mit einem Transistor vorgeschlagene Schaltung ist in allen Aspekten sicher, aber komplexer. Ich habe gewechselt, weil ich dachte, dass es keinen Mehrwert bringt.
Danke schön; Antwort angenommen. Sieht für mich nach lehrbuchwürdigen Informationen aus. Ich fände es nützlich, wenn Sie Ihre Transistorvariante von der älteren Revision zurückbringen würden, falls jemand diesen Schutz benötigt.
@AnoE Du hast recht, mit etwas Umformulierung kann es sich lohnen. Das mache ich gleich.
Dies gibt zwei Optionen, 'Eingangs-Pullup-Modus', bei dem die LED an ist und die Taste erkannt werden kann, und 'Ausgangs-Niedrig'-Modus, bei dem die LED aus ist. Es gibt keine vernünftige Möglichkeit, die LED auszuschalten und die Taste zu erkennen? Auch im Transistormodus scheint dies der Fall zu sein; Ich nehme an, die Taste kann gelegentlich getaktet werden, um sie zu erkennen.
@tedder42 im Eingangs-Pullup-Modus ist die LED AUS, außer wenn die Taste gedrückt wird. Bei niedrigem Ausgang ist die LED eingeschaltet. Wenn Sie also spüren, hängt der Zustand der LED tatsächlich von der Taste ab. Wenn dies nicht Ihren Anforderungen entspricht, schlage ich vor, dass Sie eine weitere Frage stellen, in der Sie genau angeben, was Sie erreichen möchten. Es wird viel angemessener sein.

Die einfache Lösung besteht darin, den LED-Widerstand, die LED und die Taste in einer Reihe zu platzieren und die E / A zwischen LED und Taste zu verbinden.

Der I/O ist auf Open-Drain-Ausgang eingestellt, was bedeutet, dass immer nur der Pull-Transistor aktiviert ist. Jetzt können Sie den Pin lesen, um die Taste abzutasten, während der Ausgangskreis schwebt, und die LED einschalten, indem Sie den Ausgangskreis auf niedrig setzen.