PDA

View Full Version : Off by one in delay() on Teensy 3.0?



banahogg
04-25-2013, 01:42 AM
I had some code with delays that wasn't working quite right, so I modified the blink example to do a shorter delay:


void loop() {
digitalWrite(ledPin, HIGH); // set the LED on
delay(2); // wait for a second
digitalWrite(ledPin, LOW); // set the LED off
delay(2); // wait for a second
}


When I hooked the output pin up to my multimeter, it said the pulse width was 3.002 ms, not ~2ms. Making the following change fixed my test:


void delay(uint32_t ms)
{
uint32_t start = micros();

while (1) {
if ((micros() - start) >= 1000) {
+++ ms--;
if (ms == 0) break;
--- ms--;
start += 1000;


That obviously breaks delay(0), but that's probably best handled by an early-out at the top anyway (the current code waits 1ms for delay(0)).