Hot answers tagged

104

Short answer: do not try to “handle” the millis rollover, write rollover-safe code instead. Your example code from the tutorial is fine. If you try to detect the rollover in order to implement corrective measures, chances are you are doing something wrong. Most Arduino programs only have to manage events that span relatively short durations, like debouncing ...


21

If you want to know exactly how long something will take, there is only one solution: Look at the disassembly! Starting with the minimal code: void setup(){}; volatile uint16_t x; void loop() { x = millis(); } This code compiled and then fed into avr-objdump -S produces a documented disassembly. Here are the interesting excerpts: void loop() ...


18

TL;DR Short version: An unsigned long is 0 to 4,294,967,295 (2^32 - 1). So lets say previousMillis is 4,294,967,290 (5 ms before rollover), and currentMillis is 10 (10ms after rollover). Then currentMillis - previousMillis is actual 16 (not -4,294,967,280) since the result will be calculated as an unsigned long (which can't be negative, so itself will roll ...


17

The __DATE__ and __TIME__ are set when the code is compiling so they will naturally be behind since the code still needs to finish compiling and then be flashed to the chip. See the Arduino Playground for an example of how to sync it to your computer over serial. TimeSerial.pde shows Arduino as a clock without external hardware. It is synchronized ...


15

Note: although my answer was accepted and has a higher vote score, make sure you read Edgar Bonet's great answer on how to make your Arduino keep time without an RTC. I've been quite successful in using the DS1307 Real Time Clock. Here's a link to its datasheet. Below are some of its features: It uses IC interface for communication with Arduino, making it ...


14

You do not need an RTC to build a clock: the ATmega chip has all the hardware needed to perform the duties of the RTC itself. Here is how: Get a 32768 Hz watch crystal: either buy it or disassemble an old clock. These crystals, specifically designed for time keeping, have an extremely small temperature drift. You would also need one of those if you ...


10

millis() is interrupt driven so delay() won't impact it, at least not on an ATmega based board. That isn't to say that millis() is totally accurate either. Each tick of the timer is not exactly 1ms, but is 1.024ms. This error gradually accumulates until a correction is made. This can be seen in the implementation of the TIMER0_OVF (timer 0 overflow) ...


9

The limitations of accuracy of the library depend on accuracy of the crystal. When they make, or cook, the crystal they can only make it to a certain degree accurate, also the environment of the crystal (temperature, humidity, etc.) play a role in the accuracy of it. Let's say you have a crystal that is off by .5 second every hour, great for short term, but ...


9

A DateTime is a full class with lots of methods to it - a time_t is just an unsigned long. time_t is used to store the number of seconds since the epoch (normally 01/01/1970) The Arduino Time library returns a time_t to the now() function - but RTCLib return s a DateTime object. The DateTime object, though, has a unixtime() method which will return a ...


9

It is hard to give a general answer, as it depends on the specifics of your code and on how the compiler compiles it: How much time does an Arduino Uno or Mega need to only call a function. This can involve a number of things: the caller puts the arguments on some predefined CPU registers, unless they are already there from a previous operation (the ...


8

Write a sketch that millis 1000 times, not by making a loop, but by copy and paste. Measure that and compare it to the actual expected time. Mind you that that the results may vary with different versions of the IDE (and its compiler in particular). Another option is to toggle an IO pin before and after the millis call, then measure the time for a very ...


8

Here is an example that will run for 5 minutes. Note that the loop will begin executing anytime before the time limit is up, including 1 msec before; it can't cut-off something happening at the 5-minute mark, meaning the timing precision will be limited to the duration of the code in the loop. Update: My first suggestion had a bug related to the 50-some-odd ...


7

As explained in the previous answers, your actual problem is not the accuracy of delayMicroseconds(), but rather the resolution of micros(). However, to answer your actual question, there is a more accurate alternative to delayMicroseconds(): the function _delay_us() from the AVR-libc is cycle-accurate and, for example _delay_us(1.125); does exactly what ...


7

I think that the two most used libraries are the Adafruit RTClib and the pjrc.com TimeLib. They both have functions to convert the epoch, and they both are reliable. But both lack the timezone and the DaylightSavingTime. I think you find the pjrc.com TimeLib just slightly more suitable to handle the epoch time (which is a 32-bit unsigned long defined as '...


6

The resonator you specified has a 0.3% stability, where the crystal or crystal oscillator (as mentioned by Ricardo) is 50ppm. Many times more stable. Not to even mention the temperature drift of resonator is horrible. Heating by sunlight will change it. Hence a resonator should not be used for keeping time over long periods. Hence using either a crystal or ...


6

So, the first consideration goes to the radio propagation aspect. Every country does things a little different with their radio clocks. And you might only have good signal a few times a day. For a nice overview, check out a solution for the German DCF77. If you're totally set on using a radio clock, time-nuts has discussed in the past ripping open a $10ish ...


6

The problem is the interaction between the interrupt handler that updates the value for the millis() function and the neopixels show() function. To maintain the counter for the millis() function a interrupt is triggered approximately every 1.024 ms. When the show() function is called all interrupts are disabled to get the precise timing needed to send the ...


6

Method summary (section added on 2018-01-28) There are several methods available for timing code. I am adding this preliminary section to my answer in order to provide comparative data on several methods. The methods covered in the table below are those proposed as answers to both this question and a duplicate question of this. As this question has been ...


6

The compiler has realized that your loop doesn't do anything useful and therefore optimized the whole thing away. Thus you are just timing how long it takes to do nothing. (You didn't get a result of zero, because calling micros will itself take time). BTW, the granularity of micros is 4 µs, so you won't get a reading of 1 or 2. The code actually probably ...


5

There is no more accurate way of getting time on the arduino, but I would suggest you use millis() instead. micros() returns microseconds, or millionths of a second, since the arduino was turned on. The issue is that the 32 bit unsigned integer used to store time on the arduino can only count about 70 minutes worth of micros before overflowing and resetting ...


5

Re-visiting an old question... as I found a very informative blog post that sheds new light into it. But let me first provide some context before giving the link. When assessing the quality of a time base, be it a crystal, a ceramic resonator or a lab-grade frequency standard, there are two notions that should be distinguished: accuracy: how close is the ...


5

the Yún doesn’t have a real time clock IC on board, so it can’t keep time when is powered off. Instead, it synchronizes with time servers automatically when it powers up and connects to a network using NTP. (Arduino Blog) Therefore, the Yun does not have a onboard RTC. If there there is no RTC, can I connect a DS1307 to the Atheros AR9331? Probably not....


5

Save the variables you need to EEPROM.


5

An arduino does not have a real time clock (RTC) built in. Every time it restarts it will reset the millis counter. You will need to add a RTC peripheral that you can poll to find the current date and time.


5

This implementation is perfectly fine. The calculations are done with unsigned numbers, so they are naturally rollover safe. The day NTP time rolls over, secsSince1900 will become a very small number, and subtracting SEVENZYYEARS from it will cause an extra roll over. Owing to the rules of modular arithmetics, these two rollovers compensate and you are ...


4

Use a timer and ISR (interrupt service routine) to make timing more accurate. Take a look at my 1ms timed interrupt Proof of Concept. The idea is to have a reasonably accurate 1ms 'heartbeat' in the system that can be used to trigger other events. In the PoC it is used to blink an LED at ½Hz, but having access to the new variables millisecondCounter and ...


4

If you don't want to use extra hardware like an Real Time Clock (eg. DSDS1307), you can significantly improve timing accuracy by disabling all unused interrupts. By default Arduino sketches come with various interrupt routines enabled and often they are not used for actually your sketch. Quickest way to find out if you can do without it to try and disable ...


4

delayMicroseconds(1000);// maximum delay is 65535 uS or #include <util/delay.h> _delay_ms(1);


4

Expanding on my previous comment... As I said before, I suspect the NeoPixel library to be blocking interrupts for too long when you strip.show(). If a timer interrupt fires while interrupts are blocked... it's not a big deal: the interrupt request is put on hold and serviced as soon as interrupts are enabled again. If two timer interrupts fire while ...


Only top voted, non community-wiki answers of a minimum length are eligible