digitalWrite-Status checken

Hallo,

wenn ich einer LED per..

digitalWrite(led1,HIGH);

..gesagt habe das sie leuchten soll, wie kann ich zu einem späteren Zeitpunkt an einer anderen Stelle im Code abfragen, ob dieser Pin HIGH oder LOW ist?

Gruß Chris

Mit den Standard-Bibliotheken geht das nicht. Du könntest es über direkte Port-Befehle abfragen, aber dann leidet die Portabilität Deines Codes beachtlich. Am einfachsten: Du speicherst nach jedem digitalWrite den entsprechenden Status auch noch in einer Boolean-Variable ab.

Ok. So werde ich es machen.

Gruß Chris

Hast du schon mal probiert, mit digitalRead(led1) zu lesen? ::slight_smile:

http://arduino.cc/en/pmwiki.php?n=Reference/DigitalRead

Bei Arduino digitalread muß das Bit des DDR auf logisch 0 also als Eingang definiert sein damit ein plausibles Ergebnis rauskommt.

Entweder eine Variable definieren oder auf die Port Register direkt greifen.

ElEspanol:
Hast du schon mal probiert, mit digitalRead(led1) zu lesen? ::slight_smile:

Nein, weil es ein Output und kein Input ist.

Gruß Chris

rudirabbit:
Entweder eine Variable definieren oder auf die Port Register direkt greifen.

Ersteres macht hier für TE am ehesten Sinn. Wenn du mit den direkten Portregistern arbeitest, kommst du in der "Arduino-Sprache" schnell durcheinander, denn beim AVR sind die Pins meist in 8Bit Register gepackt.

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Zugriff_auf_IO-Ports

Bei einigen Modellen von ATmegas funktioniert das digitalRead() eines Ausgangs schon. Aber wie gesagt nicht bei allen. Eine Statusvariable zu definieren ist aber auch keine hexerei.

byte statusLED1 ==0


statusLED1 =  HIGH;
...

digitalWrite(led1,statusLED1);

Grüße Uwe

digitalRead funktioniert selbstverständlich auch bei Ausgängen. Mir ist überhaupt nicht klar wieso das nicht so sein sollte. Ganz genaugenommen liest man aber nicht was für den Pin geschrieben wurde sondern was für ein Pegel tatsächlich anliegt. D.h. falls der Pin sehr überlastet ist könnte das voneinander abweichen. Wie lange der Controller das mitmachen würde steht auf einem anderen Blatt.

digitalRead funktioniert selbstverständlich auch bei Ausgängen. Mir ist überhaupt nicht klar wieso das nicht so sein sollte. Ganz genaugenommen liest man aber nicht was für den Pin geschrieben wurde sondern was für ein Pegel tatsächlich anliegt.

Und ich Verstehe nicht warum das funktioniert.
Die DDR Register bestimmen ob der Pin ein Eingang oder Ausgang ist.
Wenn nun ein Lesen bei gesetztem DDR Bit funktioniert warum gibt es dann die DDR Register.

Es wurde auch schon erwähnt, das dies nicht bei allen Atmels gleich ist.
Bitte um eine Erklärung dieses Sachverhalts.

Hatte auch erst irgendwie gedacht, dass das nicht geht :-![

Hier ist ein Blick auf das Block-Schaltbilds eines Pins sehr hilfreich (siehe Anhang). Das DDR Register ist unter anderem dafür zuständig den Pullup-Widerstand zu deaktivieren wenn der Pin auf Ausgang steht. Und wenn man den Pin auf Eingang schaltet wird das Ausgangs-Latch glaube ich durch einen Tri-State Schalter vom Pin getrennt (das Dreieck mit den drei Anschlüssen in der Mitte des Bildes).

Wenn der Pin Eingang ist bestimmt PORTn ob der Pullup an ist, oder der Eingang Tristate ist. Wenn der Pin Ausgang ist bestimmt PORTn ob er High oder Low ist.

Und wie man sieht wirkt sich eine Änderung der Ausgangs-Latches kurz danach auf die Eingangs-Latches aus, so dass man den Zustand darüber auslesen kann. Man sieht dass es vom Bus Read und Write Signale für alle Register gibt.
Was vielleicht auch auffällt ist das der Trick einen Pin einem Schreiben auf das PINn Register zu toggeln in Wahrheit wohl eigentlich erst mal auf das PORTn Register geht.

Was vielleicht auch auffällt ist das der Trick einen Pin einem Schreiben auf das PINn Register zu toggeln in Wahrheit wohl eigentlich erst mal auf das PORTn Register geht.

Ist dort nachzulesen.

Eine Frage wäre noch offen, Zitat von Uwe

Bei einigen Modellen von ATmegas funktioniert das digitalRead() eines Ausgangs schon

Hat Uwe hier recht ?, und bei welchen funktioniert das und bei welchen nicht

Also ich habe es bisher wenig benutzt, weils "unsauber" ist, hat aber glaub ich auf UNO, MEGA und PRO MINI funktioniert.

rudirabbit:
Und ich Verstehe nicht warum das funktioniert.
Die DDR Register bestimmen ob der Pin ein Eingang oder Ausgang ist.
Wenn nun ein Lesen bei gesetztem DDR Bit funktioniert warum gibt es dann die DDR Register.

Damit das Pin als Augang verwendet werden kann. Das Pin hat 3 Zustände: LOW und HIGH als Ausgang und Hochohmig damit es als Eingang verwendet werden kann. Die elektronik die den Zustand des Pins ausliest it es egal ob der Pegel von extern sprich Eingang oder Intern Sprich Ausgang herkommt. Es ist Sinn der Sache, daß man daran interessiert ist, welchen Pegel eine äußere Schaltung ausgibt, aber man kann auch den Pegel auf welchen der Pin von der Software gesetzt wird auslesen. Man macht das selten da man durch den Sketch ja wissen müßte welchen Pegel der gesetzte Ausgang hat aber lesen kann man ihn trotzdem.

Ich erinnere mich wage an eine Diskussion vor einiger Zeit. Könnte es der DUE sein??

Grüße Uwe