Neulich (ich find's nicht mehr, wo) war hier mal das Problem (bei dem 30-Kanal-DMX-Receiver), dass nur noch ein Pin am µC frei ist, aber eine LED und ein Taster an's Gerät sollten - Idee war dann, beide zusammen an den Pin anzuschließen, damit die LED zu steuern (leuchten, blinken bei Fehler etc.) und immer kurz mal auf Abfrage umzuschalten für den Taster.
Problem war dabei, wie das ganze "entkoppeln" - also im Prinzip hätte das schon funktioniert, nur die LED hätte dann dauernd geleuchtet während man die Taste drückt, hier etwas ungünstig, weil man da zum Einstellen die Taste so lange gedrückt halten muss, bis eben eine Rückmeldung kommt (die SW von jens_n und mir mit "Autoconfig"). Es wurde etwas spekuliert, Ergebnis war, das geht nicht, dass der µC die LED weiter unabhängig steuern kann, während die Taste gedrückt ist.
Jetzt bin ich drauf gekommen - Neni hatte mir vor längerer Zeit schon so Gummi-Tasten geschenkt, ich hatte Bedenken ob die überhaupt direkt am AVR funktionieren, weil der Leitgummi schon so um die 300 Ohm hat. Neni meinte, das geht problemlos, und *natürlich* hat er Recht - die 300 Ohm bilden zusammen mit den 50 k Pullup im AVR einen Spannungsteiler, macht bei gedrückter Taste 0,03 Volt am Eingang, das ist definitiv "low" - bei 1 k auch noch leicht (0,1 Volt).
Das ist mir heute wieder eingefallen - mit einem Widerstand in Serie zum Taster kann man diesen "entkoppeln" - das sieht so aus:
Ganz einfach eigentlich, aber vorher nicht drauf gekommen... Der Port-Pin steht auf Ausgang, um die LED zu steuern - bei "low" ist sie aus, bei "high" an (leuchtet mit den 1 k hell genug für ne Anzeige) - drückt man nun den Taster, geht die LED aber nicht aus, weil die Spannung am Pin auf 5 Volt bleibt, die fallen halt an dem 1 k - Widerstand auch ab - nochmal 5 mA für den µC, das ist aber kein Problem
zum Abfragen stellt man nun den Pin auf Eingang und schaltet den Pullup ein - dann kurz warten (ca. 1 µs) bis stabile Verhältnisse anliegen, Pin abfragen - wie schon gesagt, trotz dem 1k-Widerstand in Serie zieht der Taster den Pin zuverlässig auf "low".
Die LED jedoch nicht (das *wäre* das nächste Problem, dass die ja immer nach GND anliegt), die hat trotz des äußerst geringen Stroms durch den 51-k-"Vorwiderstand" noch genügend hohe Vf (habe ne grüne benutzt), dass der Pin auf "high" bleibt - bei Problemen hier kann man (wie rechts im Bild) noch ein, zwei normale Dioden dazuschalten, dann reicht's auf jeden Fall für "high".
nach der Abfrage den Pin wieder auf Ausgang, und den vorherigen Zustand wieder herstellen* (das Bit für Pullup ist ja das selbe wie für LED an/aus) - während der Taster-Abfrage ist die LED natürlich kurz (ca. 1,2 µs) aus, das geht aber so schnell, dass man es nicht sieht.
Das alles ist nicht nur Theorie, heute abend ausprobiert, funktioniert.
*EDIT: es empfiehlt sich auch, während der Abfrage die Interrupts zu deaktivieren - wenn nun in irgendner ISR die LED an- oder ausgeschaltet wird, wäre es natürlich schlecht, wenn die zufällig genau da zwischen rein kommt, und dann nachher evtl. ein falscher Zustand "wiederhergestellt" wird... dieser Hinweis entfällt natürlich, wenn die Abfrage selbst in ner ISR stattfindet...