Zajímavé téma ohledně funkce millis() pro vývojové kity Arduino Uno, Nano, prostě desky založené na Atmega328 zveřejnil Michal Dudka.
Zjistil, že po spuštění časovače právě s ATmega328 se nikdy nedočkáte 42 milisekundy a jejich násobků. Zároveň přidal i vysvětlení.
Upřímně, proč časovač v ATMega328 vynechá každou 42 milisekundu mě nikdy nenapadlo a navíc bych ani nečekal, že něco takového bude mikrokontrolér dělat. Ale důvod je ve finále naprosto logický.
Cituji Michala:
Nedávno při nějaké diskuzi mě zaujalo jak je na Aruino (UNO, nano, micro, prostě s Atmega328) řešená funkce millis(). Má zajímavou vlastnost, přibližně každou 42 druhou milisekundu v řadě „vynechává“. Takže když sestavíte primitivní program který bude stále dokola číst hodnotu millis tak se čísla 42 nedočkáte, a nedočkáte se ani 85, 127, 170 … atd. Je to dáno tím, že millis ve skutečnosti počítá s periodou 1.024ms (daň za to že použitý timer nepřijde o jeden PWM kanál) a když celková chyba přesáhne 1ms (nasbírá cca 42 chyb po 0.024ms) tak prostě „poskočí“ o 2ms aby se nerozcházela (zjednodušeně řečeno) – podobně jako když v přestupném roce přidáváme v únoru jeden den abychom ošetřili fakt že rok netrvá přesně 365 dní.
Michal Dudka je velmi zkušený programátor a bastlíř a spravuje svůj vlastní web http://www.elektromys.eu/
Tuto zajímavost sdílel ve facebookové skupině Arduino CZ & SK