Forum: Mikrocontroller und Digitale Elektronik Arduino: pulseIn(.)


von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

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
von Walter T. (nicolas)


Lesenswert?

Such doch bitte den Quelltext der Funktion heraus und poste ihn hier. Es 
hat nicht jeder die Arduino-IDE installiert.

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Frank E. schrieb:
> (und liefert dann quasi den Restwert)?
Nein.

von Norbert (der_norbert)


Lesenswert?

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.«

von Walter T. (nicolas)


Lesenswert?

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?

von Norbert (der_norbert)


Lesenswert?

Walter T. schrieb:
> to go from LOW to HIGH

beschreibt keinen Pegel sondern eine Flanke.

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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.

von J. S. (jojos)


Lesenswert?

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.

von Walter T. (nicolas)


Lesenswert?

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.

von Rainer W. (rawi)


Lesenswert?

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).

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

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
von Norbert (der_norbert)


Lesenswert?

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
von J. S. (jojos)


Lesenswert?

Und woher wisst ihr das es um AVR geht?

von Walter T. (nicolas)


Lesenswert?

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.

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

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.

von Cyblord -. (cyblord)


Lesenswert?

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.

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

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

von J. S. (jojos)


Lesenswert?

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.

von Walter T. (nicolas)


Lesenswert?

Der genannte Quelltext gehört zu einer anderen (ähnlichen) Funktion.

von Cyblord -. (cyblord)


Lesenswert?

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.

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

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
Noch kein Account? Hier anmelden.