Arduino - pulseIn Funktion alternative?
Hallo,
ich habe diesen Code.
int trigger=11;
int echo=12;
long dauer=0;
long entfernung=0;
void setup()
{
Serial.begin (9600);
pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);
}
void loop()
{
digitalWrite(trigger, LOW);
delay(5);
digitalWrite(trigger, HIGH);
delay(10);
digitalWrite(trigger, LOW);
dauer = pulseIn(echo, HIGH);
entfernung = (dauer/2) * 0.03432;
if (entfernung >= 500 || entfernung <= 0)
{
Serial.println("Kein Messwert");
}
else // Ansonsten…
{
Serial.print(entfernung);
Serial.println(" cm");
}
delay(1000);
}
Dieser Code misst die Entfernung.
Meine Frage -> Gibt es auch eine alternative zu pulseIn, welche ja die Zeit misst wie lange der eingang noch HIGH ist, da mir es nicht recht gut gefällt wenn man einfach Funktionen nimmt aber nicht sieht was dahinter eigentlich sich für ein Code versteckt.
Also ich suche quasi ein Code der das gleiche macht wie pulseIn nur das man halt einen Code da stehen hat und nicht nur eine Funktion die in einer Zeile geschrieben ist.
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.
"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