Die Funktion aus dem Arduino-Framework wartet (grob vereinfacht) z.B. auf einen H-Impuls an einem Pin und gibt nach dessen Ende (Pin geht auf L) die Länge in Mikrosekunden oder - bei Überschreiten des Timeout - eine Null zurück. Was mir unklar ist: Darf der Wechsel von L zu H (Beginn des Impulses) erst passieren, nachdem die Funktion aufgerufen wurde, oder darf sie auch in einen bereits vohandenen H-Pegel "hineinlaufen" (und liefert dann quasi den Restwert)?
:
Bearbeitet durch User
Such doch bitte den Quelltext der Funktion heraus und poste ihn hier. Es hat nicht jeder die Arduino-IDE installiert.
Steht eigentlich unmissverständlich in der Doku: »Reads a pulse (either HIGH or LOW) on a pin. For example, if value is HIGH, pulseIn(): waits for the pin to go from LOW to HIGH, starts timing, then waits for the pin to go LOW and stops timing. Returns the length of the pulse in microseconds or gives up and returns 0 if no complete pulse was received within the timeout.«
Norbert schrieb: > Steht eigentlich unmissverständlich in der Doku Die Doku ist da tatsächlich uneindeutig. Norbert schrieb: > waits for the pin to go from LOW to HIGH, Wartet es auf eine Flanke oder auf den Pegel?
Walter T. schrieb: > Such doch bitte den Quelltext der Funktion heraus und poste ihn > hier. Es hat nicht jeder die Arduino-IDE installiert. Ist dein Internet kaputt? Dann kannst du wohl auch dem Link hier nicht folgen: https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring_pulse.S
Walter T. schrieb: > Norbert schrieb: >> Steht eigentlich unmissverständlich in der Doku > Die Doku ist da tatsächlich uneindeutig. Deshalb einfach den Code anschauen: - https://forum.arduino.cc/t/pulsein-function-source-code/102995
1 | // wait for any previous pulse to end
|
2 | while ((*portInputRegister(port) & bit) == stateMask) |
3 | if (numloops++ == maxloops) |
4 | return 0; |
5 | |
6 | // wait for the pulse to start
|
7 | while ((*portInputRegister(port) & bit) != stateMask) |
8 | if (numloops++ == maxloops) |
9 | return 0; |
10 | |
11 | // wait for the pulse to stop
|
12 | while ((*portInputRegister(port) & bit) == stateMask) { |
13 | if (numloops++ == maxloops) |
14 | return 0; |
15 | width++; |
16 | }
|
Mein Tipp: traue nie einer Funktion, deren Code du nicht hast oder nicht verstehst.
Walter T. schrieb: > Such doch bitte den Quelltext der Funktion heraus und poste ihn hier. Es > hat nicht jeder die Arduino-IDE installiert. Den Quelltext hat man auch mit installierter IDE nicht weil der Core als Archivefile gelinkt wird.
Lothar M. schrieb: > Mein Tipp: traue nie einer Funktion, deren Code du nicht hast oder nicht > verstehst. Genau so. Da war Norberts Interpretation tatsächlich richtig. Norbert schrieb: > beschreibt keinen Pegel sondern eine Flanke. Ich bin da bei "BSE" (basic stupid englisch) mittlerweile sehr vorsichtig geworden. Arduino F. schrieb: > Ist dein Internet kaputt? Ja.
J. S. schrieb: > Den Quelltext hat man auch mit installierter IDE nicht weil der Core als > Archivefile gelinkt wird. Um so wichtiger wäre es, den Quelltext hier zu verlinken, damit nicht jeder selber suchen muss (oder zum nächsten Thread weiter geht, weil er zu solchen Suchspielen keine Lust hat).
J. S. schrieb: > Den Quelltext hat man auch mit installierter IDE nicht weil der Core als > Archivefile gelinkt wird. Falsch! Der AVR Core liegt nach der Arduino IDE Installation komplett auf deinem Rechner. Je nach IDE, muss man den AVR Core nachinstallieren, damit er nutzbar wird. Merke: Das Archiv wird bei der Kompilation gebaut.
:
Bearbeitet durch User
J. S. schrieb: > Den Quelltext hat man auch mit installierter IDE nicht weil der Core als > Archivefile gelinkt wird. Dann muss sich das aber bei neueren Versionen signifikant geändert haben. Damals™ als ich mal hinein schaute – 1.8.13 – wurde das Archiv beim jeweils ersten Erstellungsprozess aus den lokalen Sources automatisch gebaut und sofort hinzu gebunden.
:
Bearbeitet durch User
Lothar M. schrieb: > traue nie einer Funktion, deren Code du nicht hast oder nicht > verstehst. Und der versteckte Tipp: Traue nie einem Sourcecodeschnipsel, den Du nicht selbst herausgesucht hast. Well played.
J. S. schrieb: > Und woher wisst ihr das es um AVR geht? Arduino ist primär eine AVR Welt. Andere sind erst viel später dazu gekommen. Also: Ohne Angabe des µC gehe ich von AVR aus. Klarer, von einem UNO Auch sollte sich pulseIn() auf allen Plattformen ähnlich verhalten.
Walter T. schrieb: > Such doch bitte den Quelltext der Funktion heraus und poste ihn hier. Es > hat nicht jeder die Arduino-IDE installiert. Oder noch besser: Lies die blöde Doku zu dieser Funktion.
Lothar M. schrieb: > Deshalb einfach den Code anschauen: Lothar M. schrieb: > Mein Tipp: traue nie einer Funktion, deren Code du nicht hast oder nicht > verstehst. Traue nie einem Moderator, wenn er historischen Code publiziert. Mittlerweile ist es eine *.S Datei. Zumindest für AVR
Arduino F. schrieb: > Lothar M. schrieb: >> Deshalb einfach den Code anschauen: > Mittlerweile ist es eine *.S Datei. > Zumindest für AVR Nein, das ist eine Unterfunktion die vom C Code benutzt wird. Du kannst scheinbar weder Code noch Kommentar verstehen. Um mal mit deinen eigenen rotzigen Kommentaren zu antworten.
Also in der API Referenz stehen die Zusicherungen für diese Funktion. Niemand muss dafür den Sourcecode studieren oder die Zielplattform kennen. Das wäre ja furchtbar wenn das nötig wäre um eine API Funktion zu nutzen.
J. S. schrieb: > das ist eine Unterfunktion die vom C Code benutzt wird. Genau! Die Asm Datei ist der Ort wo es passiert! Der C Code ist nur ein Wrapper, von daher recht uninteressant Zudem hat er keine Gemeinsamkeit mit dem von Lothar gepostetem.
Beitrag #7751644 wurde von einem Moderator gelöscht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.