INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
[Anfänger] Verständnisfrage Codeschnipsel
29.12.2018, 14:46
Beitrag #1
Question [Anfänger] Verständnisfrage Codeschnipsel
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
unsigned long lastmillis; // glob. Variable: lastmillis

void setup() {

pinMode(led1, OUTPUT);  // led1 (Pin 13) ist ein Output
lastmillis = millis();  // lastmillis wird mit dem Wert millis() befüllt
}

void loop() {

if ((millis() - lastmillis) >= 1000) {  // wenn mehr als 1000ms vergangen sind, werden weden Zeilen 14 und 15 abgearbeitet,
                                        // falls nicht, geht es in Zeile 17 weiter
  digitalWrite(led1,!digitalRead(led1));// <- ????? das verstehe ich nicht ???
  lastmillis = millis();
}
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
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)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
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)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
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

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Anfänger: Fehlermeldung expected primary-expression before Reiseeck 5 505 31.05.2019 12:09
Letzter Beitrag: amithlon
  Kann auf A.Uno nichts hochladen - Anfänger sucht Hilfe ardeche 25 2.049 21.01.2019 22:06
Letzter Beitrag: ardeche
  [Anfänger] Char Array Problem fp.blues2013 1 443 07.01.2019 13:06
Letzter Beitrag: Tommy56
  Verständnisfrage schleife Rasa 12 830 06.01.2019 17:00
Letzter Beitrag: Tommy56
  Anfänger mit Problem/Gärtenbewässerungsprojekt Bommes 13 1.591 13.11.2018 20:17
Letzter Beitrag: fraju
  Anfänger bekommt den Sketch nicht zum Laufen Maschinenbauer 6 1.465 06.10.2018 21:01
Letzter Beitrag: Tommy56
  Speichern von Messwerten *Anfänger* wutschler 5 1.872 24.09.2018 20:56
Letzter Beitrag: MicroBahner
  Anfänger hängt in der Schleife mt14516 2 656 24.09.2018 20:54
Letzter Beitrag: MicroBahner
  Verständnisfrage zu RTClib und speziell: rtc.ajust Karli 13 2.261 15.02.2018 18:50
Letzter Beitrag: hotsystems
  Anfänger sucht erfahrene Hilfe Customizer 21 3.522 11.07.2017 21:37
Letzter Beitrag: Customizer

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste