From 950789ab74113e2ae4b1ed937c555b5bc66b9526 Mon Sep 17 00:00:00 2001 From: "David A. Mellis" Date: Wed, 26 Nov 2008 14:14:59 +0000 Subject: [PATCH] Adding micros() function. --- build/shared/lib/keywords.txt | 1 + hardware/cores/arduino/wiring.c | 17 +++++++++++++++++ hardware/cores/arduino/wiring.h | 1 + 3 files changed, 19 insertions(+) diff --git a/build/shared/lib/keywords.txt b/build/shared/lib/keywords.txt index 399e937ae..1634c277c 100644 --- a/build/shared/lib/keywords.txt +++ b/build/shared/lib/keywords.txt @@ -149,6 +149,7 @@ digitalWrite KEYWORD2 DigitalWrite digitalRead KEYWORD2 DigitalRead interrupts KEYWORD2 millis KEYWORD2 Millis +micros KEYWORD2 Micros noInterrupts KEYWORD2 pinMode KEYWORD2 PinMode pulseIn KEYWORD2 PulseIn diff --git a/hardware/cores/arduino/wiring.c b/hardware/cores/arduino/wiring.c index 157d1d2b6..289664759 100755 --- a/hardware/cores/arduino/wiring.c +++ b/hardware/cores/arduino/wiring.c @@ -24,11 +24,13 @@ #include "wiring_private.h" +volatile unsigned long timer0_overflow_count = 0; volatile unsigned long timer0_clock_cycles = 0; volatile unsigned long timer0_millis = 0; SIGNAL(TIMER0_OVF_vect) { + timer0_overflow_count++; // timer 0 prescale factor is 64 and the timer overflows at 256 timer0_clock_cycles += 64UL * 256UL; while (timer0_clock_cycles > clockCyclesPerMicrosecond() * 1000UL) { @@ -51,6 +53,21 @@ unsigned long millis() return m; } +unsigned long micros() { + unsigned long m, t; + uint8_t oldSREG = SREG; + + cli(); + t = TCNT0; + if ((TIFR0 & _BV(TOV0)) && (t == 0)) + t = 256; + + m = timer0_overflow_count; + SREG = oldSREG; + + return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond()); +} + void delay(unsigned long ms) { unsigned long start = millis(); diff --git a/hardware/cores/arduino/wiring.h b/hardware/cores/arduino/wiring.h index 46d5334e4..9600a0f8e 100755 --- a/hardware/cores/arduino/wiring.h +++ b/hardware/cores/arduino/wiring.h @@ -113,6 +113,7 @@ int serialRead(void); void serialFlush(void); unsigned long millis(void); +unsigned long micros(void); void delay(unsigned long); void delayMicroseconds(unsigned int us); unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout);