Hallo

Das Prinzip ist einfach: Eine LED wirkt in Sperrrichtung wie ein lichtabhängiger Kondensator. Man kann sie "Aufladen" und dann die Entladezeit messen. Dazu verbindet man die Anode der LED mit GND und die Kathode mit einem Ausgang des Kontrollers. Angsthasen verwenden zusätzlich noch einen Vorwiderstand, denn wenn man die LED versehentlich in Durchlassrichtung anschließt, wird der Kontrollerpin gekillt! Mit einem High am Ausgang wird die LED kurz geladen, dann schaltet man den Kontrollerpin auf Eingang ohne(!) internen PullUp und misst die Zeit bis der Eingang Low wird. Je heller die LED dabei beleuchtet wird, umso kürzer ist die gemessene Zeit. Zur Zeitmessung reicht eine einfache Zählschleife:

while(Pin == low) zähler++;

Der Effekt wird durch den Leckstrom in der LED verursacht. Dieser steigt, wenn die LED beleuchtet wird. Dadurch sinkt dann die Kapazität der LED.

Blöderweise dauert es so relativ lange, bis der Low-Pegel erreicht wird. Deshalb lege ich bei meinen Anwendungen die Kathode der LED auf Vcc und lade die LED dann mit einem Low an der Anode am µC-Ausgang. Nach dem Umschalten des Pins auf Eingang messe ich dann die Zeit bis wieder ein High anliegt. Hier kann man dann noch in engen Grenzen die Zeit beeinflussen, indem man kurz (ein paar Takte!) den internen PullUp aktiviert. Genau so funktioniert das auch mit dem Pong:

Bild hier  
(Aus https://www.roboternetz.de/phpBB2/vi...=533327#533327)

Gruß

mic

Edit: PS entfernt ;)