From 4f80fe1489bcb3ed3b1ac8c741d2d71583c838ce Mon Sep 17 00:00:00 2001 From: "David A. Mellis" Date: Fri, 24 Mar 2006 14:09:54 +0000 Subject: [PATCH] Added pulseIn function to measure pulse durations. --- targets/arduino/wiring.c | 33 +++++++++++++++++++++++++++++++++ targets/arduino/wiring.h | 1 + 2 files changed, 34 insertions(+) diff --git a/targets/arduino/wiring.c b/targets/arduino/wiring.c index a8faa3752..3b93286d7 100755 --- a/targets/arduino/wiring.c +++ b/targets/arduino/wiring.c @@ -366,6 +366,39 @@ void delayMicroseconds(unsigned int us) sei(); } +/* +unsigned long pulseIn(int pin, int state) +{ + unsigned long width = 0; + + while (digitalRead(pin) == !state) + ; + + while (digitalRead(pin) != !state) + width++; + + return width * 17 / 2; // convert to microseconds +} +*/ + +unsigned long pulseIn(int pin, int state) +{ + unsigned long width = 0; + int r = port_to_input[digitalPinToPort(pin)]; + int bit = digitalPinToBit(pin); + int mask = 1 << bit; + + state = (!!state) << bit; + + while ((_SFR_IO8(r) & mask) != state) + ; + + while ((_SFR_IO8(r) & mask) == state) + width++; + + return width * (16000000UL / F_CPU) * 20 / 23; +} + int main(void) { // this needs to be called before setup() or some functions won't diff --git a/targets/arduino/wiring.h b/targets/arduino/wiring.h index 6cbfd132e..2b55c4d4c 100755 --- a/targets/arduino/wiring.h +++ b/targets/arduino/wiring.h @@ -82,6 +82,7 @@ unsigned long millis(void); void delay(unsigned long); void delay_ms(unsigned short ms); void delayMicroseconds(unsigned int us); +unsigned long pulseIn(int pin, int state); void setup(void); void loop(void);