Arduino - pulseIn Funktion alternative?

2 Antworten

Also das ist der Code, der in der pulseIn-Funktion steht:

unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout)
{
   // cache the port and bit of the pin in order to speed up the
   // pulse width measuring loop and achieve finer resolution. calling
   // digitalRead() instead yields much coarser resolution.
   uint8_t bit = digitalPinToBitMask(pin);
   uint8_t port = digitalPinToPort(pin);
   uint8_t stateMask = (state ? bit : 0);

   // convert the timeout from microseconds to a number of times through
   // the initial loop; it takes approximately 16 clock cycles per iteration
   unsigned long maxloops = microsecondsToClockCycles(timeout)/16;

   unsigned long width = countPulseASM(portInputRegister(port), bit, stateMask, maxloops);

   // prevent clockCyclesToMicroseconds to return bogus values if countPulseASM timed out
   if (width)
      return clockCyclesToMicroseconds(width * 16 + 16);
   else
      return 0;
}

Da sind jetzt natürlich auch wieder diverse Funktionsaufrufe drin. Und in denen auch wieder. Ich weiß nicht, was du dir erhoffst.

Woher ich das weiß:Recherche

"pluseIn" ist schon sehr beschreibender Code. Normalerweise versucht man beim programmieren das Rad nicht neu zu erfinden sondern Dinge zu benutzen, die bereits existieren. Ein größerer Code wird eher unübersichtlich, als das er er wirklich hilft zu verstehen, was da eigentlich passiert. Wenn du die pluseIn Methode trotzdem selbst schreiben willst, solltest du dich mal mit Timern bei Arduino beschäftigen (Einfach googlen, ist ein zu komplexes Thema um das hier in einer Antwort beschreiben zu können). Damit kannst du ziemlich genau Zeit messen. Aber das wird definitiv unübersichtlicher und schwerer zu verstehen als der jetzige Code