[Anfänger] Verständnisfrage Codeschnipsel
|
29.12.2018, 14:46
Beitrag #1
|
|||
|
|||
![]()
Hallo Leute!
Ich habe vor Kurzem ein großes Arduino Mega 2560-Starterset gekauft und schon einige kleine Versuche gemacht. Momentan beschäftige ich mich damit "delay()" durch "millis()"-Code zu ersetzen. Den folgenden Codeschnipsel habe ich aus dem Netz geklaut. Er lässt eine LED im Sekundentakt blinken. Das funktionier auch - aber ich verstehe Zeile 14 "digitalWrite(led1,!digitalRead(led1))", speziell "!digitalRead()", in diesem Zusammenhang nicht. Kann man einen als Output deklarierten Pin lesen? Während ich hier schreibe "klingelt" es, glaub ich, so langsam... Der Code schreibt [digitalWrite(led1)] das GEGENTEIL des aktuellen Zustandes in "led1" welcher mit [digitalRead(led1) ausgelesen wird!! Heureka! Wenn ich richtig liege, bitte kurze Bestätigung, andernfalls eine Erklärung. Danke! Matthias Code: int led1 = 13; // glob. Variable: led1 hat den Wert 13 |
|||
29.12.2018, 14:49
Beitrag #2
|
|||
|
|||
RE: [Anfänger] Verständnisfrage Codeschnipsel
Du liegst richtig. Manches Mal hilft es schon, das Problem richtig zu erklären, um auf die Lösung zu stoßen.
Gruß Tommy "Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt) |
|||
29.12.2018, 19:27
Beitrag #3
|
|||
|
|||
RE: [Anfänger] Verständnisfrage Codeschnipsel
Hallo,
ich habe eben mal den Code auf meinem UNO laufen lassen, geht auch. Ich hatte Zweifel, weil die I/Os des ATMEGA328 nicht rücklesbar sind, während die des ATMEGA2560 auf dem Mega rücklesbar sind. Offensichlich greift DigitalRead auf die internen Spiegelbilder zurück, das ist leider in der Arduino Reference nirgends beschrieben. Gruß GuaAck |
|||
29.12.2018, 19:31
Beitrag #4
|
|||
|
|||
RE: [Anfänger] Verständnisfrage Codeschnipsel
Das wird aber schon seit Urzeiten so gehandhabt. Ich vermute auch ein Lesen den Ausgaberegistern (entweder aus den Ausgaberegistern oder beim Write wird das Eingaberegister mit gesetzt).
Das müsste man in den Sourcen finden können, ich habe aber keine Lust zum Suchen. Gruß Tommy "Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt) |
|||
29.12.2018, 23:02
(Dieser Beitrag wurde zuletzt bearbeitet: 29.12.2018 23:04 von MicroBahner.)
Beitrag #5
|
|||
|
|||
RE: [Anfänger] Verständnisfrage Codeschnipsel
(29.12.2018 19:27)GuaAck schrieb: Ich hatte Zweifel, weil die I/Os des ATMEGA328 nicht rücklesbar sind, während die des ATMEGA2560 auf dem Mega rücklesbar sind.Wie kommst Du da drauf? Wenn man im Datenblatt nachschaut sind die IO-Pins von 328P und 2560 vollkommen identisch aufgebaut. Den Zustand direkt am Pin kann man mit dem Read Port Register immer lesen, egal ob der Output aktiv ist oder nicht ( Das Read Port Register ist nicht schreibbar ). Gruß, Franz-Peter |
|||
30.12.2018, 00:18
Beitrag #6
|
|||
|
|||
RE: [Anfänger] Verständnisfrage Codeschnipsel
Entschuldigung, ja stimmt.
Merkwürdig: Ich hatte in einer zeitkritschen Anwendung mit direkten Port-Zugriffen das Rücklesen nutzen wollen, ging aber nicht. Also habe ich die Port-Outputs selbst gespiegelt, da ging es. Muss ich wohl was anderes falsch gemacht haben. Jedenfalls steht der Kommentar "Rücklesen geht nicht" noch im Quell-Code. Danke für den Hinweis, Gruß GuaAck |
|||
30.12.2018, 00:41
(Dieser Beitrag wurde zuletzt bearbeitet: 30.12.2018 00:44 von Bitklopfer.)
Beitrag #7
|
|||
|
|||
RE: [Anfänger] Verständnisfrage Codeschnipsel
Hallo,
also wer mal ins Datenblatt eines Atmel Prozessors schaut wird für jeden Port der in der Hardware bis zu 8 Bit breit ist gleich 3 Register vorfinden. Und zwar für jeden Port ein DDR-Register = Data Direction Register, ein PORT-Register = bestimmt welcher Pegel ausgegeben wird bzw. ob ein Pull-Up Wderstand eingeschaltet wird. Ein PIN-Register = hier wird der Pegel am IC Pin abgefragt. Und das dann jeweils für jeden der bis zu 8 Port-Pins separat einzustellen. Und man bedenke das das was die Arduino Welt uns anbietet sind einzelne Portpins die mit digitalWrite() etc. angesteuert werden ganz im Unterschied zu der Hardware Realität auf dem Chip. Somit kann über das PIN Register jederzeit der Status am Pin abgefragt werden. Hoffe mal mich verständlich ausgedrückt zu haben. lgbk An alle Neuankömmlinge hier, wenn ihr Code(Sketch) hier posten wollte dann liest euch bitte diese Anleitung durch. 1+1 = 10 ![]() ![]() |
|||
30.12.2018, 09:10
(Dieser Beitrag wurde zuletzt bearbeitet: 30.12.2018 09:35 von MicroBahner.)
Beitrag #8
|
|||
|
|||
RE: [Anfänger] Verständnisfrage Codeschnipsel
Wobei das DDR (Data Direction Register) letztendlich nur den Ausgangstreiber des Pins aktiviert. Es hat keinerlei Einfluß auf die Lese-Hardware des Pins. Es ist also eher ein 'Output Enable' als wirklich ein 'Data Direction', denn der Inputpfad wird davon überhaupt nicht beeinflusst.
(30.12.2018 00:41)Bitklopfer schrieb: Und man bedenke das das was die Arduino Welt uns anbietet sind einzelne Portpins die mit digitalWrite() etc. angesteuert werden ganz im Unterschied zu der Hardware Realität auf dem Chip.Die IDE macht dem Programmierer da halt - wie an vielen anderen Stellen - das Leben leicht, und erspart ihm die Bit-Popelei. Ausserdem verdeckt sie damit die Unterschiede des Pin-Zugriffs bei unterschiedlichen Prozessor-Architekturen. Die Arduino-IDE kann ja nicht nur mit den ATMegas umgehen. Und bei anderen Prozessoren geht der Zugriff auf die Pins durchaus deutlich anders. Das vereinheitlicht die IDE. P.S. wenn man direkt auf die Ports zugreift, muss man ja um einzelne Bits zu beeinflussen mit Read-Modify-Write arbeiten. Gerade wenn bei so einem 8-Bit Port gemischt Eingänge und Ausgänge konfiguriert sind, muss man sehr gut unterscheiden zwischen dem PIN- und dem PORT-Register. Will man einen Ausgang umschalten, muss das PORT-Register gelesen, das entsprechende Bit manipuliert, und dann das PORT-Register wieder beschrieben werden. Will ich wirklich den Status am Pin wissen, muss ich das PIN-Register lesen. Wenn man also mit Direktzugriff auf die Ports ein Ausgangsbit invertieren will, braucht man PIN nicht, sondern muss das direkt mit dem PORT-Register machen. Die IDE-Methode ist zwar bequem, an der Stelle aber letztendlich umständlich, denn sowohl digitalRead, als auch digitalWrite sind nicht besonders schnell. In den meisten Fällen spielt das aber keine Rolle. Gruß, Franz-Peter |
|||
|
|
Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste