Arduino due - millis

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
djnyci
Příspěvky: 4
Registrován: 11 led 2018, 10:45
Reputation: 0

Arduino due - millis

Příspěvek od djnyci » 14 kvě 2019, 19:04

Ahoj,
neví někdo jak přesné jsou hodiny na desce DUE?
Vím že u ostatních desek se nedá na tuto hodnotu spolehnout v případě že potřebuji přesný čas v řádů ms. Na desce DUE je jiný procesor proto je otázkou zda potřebuji stále externí RTC?

Děkuju

KarelBrno
Příspěvky: 40
Registrován: 05 kvě 2019, 15:12
Reputation: 0

Re: Arduino due - millis

Příspěvek od KarelBrno » 14 kvě 2019, 22:01

Mám pocit, že čas podle millis() je přesný tak, jak je přesný krystal na desce, protože ten řídí takt procesoru a z něj se to pak počítá. Nevím co DUE, ale asi to bude stejně.
Takže pokud potřebuješ měřit krátké intervaly, tak millis() by měl být relativně přesný. Čím delší ale je časový úsek, tím to bude horší.
K čemu přesně to potřebuješ?

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Arduino due - millis

Příspěvek od pavel1tu » 15 kvě 2019, 06:38

Dotaz je špatně napsaný, nebo špatně popisuješ CO potřebuješ.

Zjednodušeně - "milis" využívá vnitřní čítač, kde je čas v ms od zapnutí pod napájení. Stačí si přečíst manuál, ale myslím, že je ovlivňovaný "uspáváním" arduina.
Takže "milis" lze použít na nějaké interní časování - proveď jednou za (řádově sekundy třeba), měření doby v ms/s atd., čas tu lze nastavit a arduino si jej bude pamatovat, ale pouze do prvního restartu.
Pokud chci dlouhodobě přesný čas (řečeno H:M:S a třeba i datum), je výhodnější RTC.

Za mne - ani jedno dlouhodobě (den, týden, měsíc) není schopno mít čas přesný na ms.

Toto lze řešit připojením arduina na internet a pravidelnou synchronizaci některým z protokolů přesného času. Opět jsou protokoly pro přesný a přesnější čas, záleží jak moc přesný ten čas potřebuješ - to najdeš na Wiki (toto používám v práci každý den, tak mohu časem více rozvést)
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Arduino due - millis

Příspěvek od pavel1tu » 15 kvě 2019, 08:56

Já mám synchronizaci času z internetu jednou za 24h
podle tohoto článku jsem vycházel.

Nešlo mi o přesnost na ms, ale aby se centrála alarmu
(která je stejně propojená do domácí sítě - do VLANu - a ven - jen povolené porty NTP, HTTPS pro přenos dat na vzdálený server + VPN pro vzdálené ovládání z mobilu)
nemusel vůbec seřizovat čas.
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

djnyci
Příspěvky: 4
Registrován: 11 led 2018, 10:45
Reputation: 0

Re: Arduino due - millis

Příspěvek od djnyci » 15 kvě 2019, 10:03

Jde mi o přesné měření intervalu do cca 5 minut a potřebuji mít přesnost do 50ms. O tom jak funguje millis v klasickém arduinu vím, ale due má úplně jinou architekturu procesoru proto si nejsem jist jestli to funguje úplně stejně.

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Arduino due - millis

Příspěvek od pavel1tu » 15 kvě 2019, 11:26

Co si přečíst manuál k DUE ?!
Vnitřní čítače jsou VŽDY závislé na frekvenci procesoru !
- DUE má ty vnitřní čítače 3
- přesnost je daná přesností krystalu, kde u "oficiálních" je 2%, když to přepočteš na milisekundy od frekvence procesoru - chyba celkem malá, nejmenší čas co lze změřit je myslím 25ns ?
- DUE má mimo milis() i micros() myslím, ale byl tam (kdysi) nějaký BUG
- nezabýval jsem se s tím ale co lze vyčíst z manuálu (co mám stažený) nejpřesnější by měl být nějaký "master" čítač, který je řízený frekvencí procesoru (MCK / 2) - ale nikdy jsem to netestoval.



PS: u DUE poror - nejde používat třeba proměnná "time" - přenesl jsem program z UNO a pak zjistil že DUE to má jako nějakou vnitřní proměnnou.
PS2: ještě jsem napsal známému - kdysi jsem (jen po drátové a mechanické stránce) s ním řešil počítadlo okruhů a měření času u závodní dráhy na autíčka - porovnával tam UNO a moje DUE - ale už nevím co zjistil - je to skoro 2 roky
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

KarelBrno
Příspěvky: 40
Registrován: 05 kvě 2019, 15:12
Reputation: 0

Re: Arduino due - millis

Příspěvek od KarelBrno » 15 kvě 2019, 12:47

djnyci: pokud potřebuješ na 5min úseku mít přesnost do 50ms, tak na samotné millis() zapomeň, to takhle přesné nebude. Potřebuješ RTC a např. přes interrupt si počítat jeho sekundové (nebo menší) tiky + připočíst millis() mezi tiky.

djnyci
Příspěvky: 4
Registrován: 11 led 2018, 10:45
Reputation: 0

Re: Arduino due - millis

Příspěvek od djnyci » 15 kvě 2019, 13:11

Děkuju za odpověď to je to co jsem potřeboval vědět.
pavel1tu : Škoda že nemáš to měření.
KarelBrno : Přesně takhle jsem to měl doteď dokud jsem používal UNO a MEGA

Aktuálně to zkouším porovnávat proti DS3231 a uvidíme o kolik se časy rozjedou. zatím to na 8 hodinách přes noc sedí na 1s přesně. Teď jsme to zkusil dát do ledničky a uvidíme o kolik se to rozjede při jiné teplotě.

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Arduino due - millis

Příspěvek od jankop » 15 kvě 2019, 15:04

pavel1tu píše:
15 kvě 2019, 11:26
- přesnost je daná přesností krystalu, kde u "oficiálních" je 2%, když to přepočteš na milisekundy od frekvence procesoru - chyba celkem malá,
S tím bych příliš nesouhlasil, ty nejobyčejnější SMD krystaly mají běžně přesnost 0,0050%. Tj. 5minut=300s 300s*0,000050=0,015s=15ms.
Tak takty procesoru se za pět minut nejspíš neodchýlí od správného času o více než 15ms. Samotné časovače chybu nevnášejí. Neznám detaily jádra Arduina, ale jsem přesvědčený, že není zásadní problém dosáhnout požadované přesnosti 0,017% i ve Wiringu. Možná bude potřeba udělat nějakou kompenzaci na odezvy přerušení, ale konstanty by to nejspíš vyřešily.
Použití RTC obvodu, který má k dispozici na výstupu jen sekundy, toho zas tolik neřeší. Ale neznám konečnou aplikaci.
Zkusím dnes něco otestovat, ale nebude to na DUE.

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Arduino due - millis

Příspěvek od pavel1tu » 16 kvě 2019, 10:13

Jsem to špatně napsal.
ty 2% jsou z jednoho fora, kde vypočítaly nějakou max. chybu na čítače když jsou řízeny taktem procesoru, ta chyba je tak velká, protože se tam ještě obsluhují přerušení a další věci jak jsem tak napůl pochopil.
Ten čítač jak jsem pochopil obsluhuje knihovna, která obstarává i přerušení a další věci, proto se uvádí ta chyba 2% nebo někde i 5s za 1h.

U DUE to jde ovlivnit i nějakým nastavením jakou prioritu má čítač a jakou obsluha přerušení.

RTC je k ničemu - co jsem měl moduly - jedou jen na jednotky s ? )nebo to je knihovnou co je obsluhuje)

Ideál je připojit to k netu a synchronizovat to po NTC.

Jsem ochoten pokud mi dotyčný nahodí jakým způsobem chce čas startovat a stopnout to sestrojit a změřit v laboratoři - jsem schopen měřit s přesností na jednotky ms při časech do 10min - teoreticky na to příští týden vyšetřím 2 dny
Asi bych uvítal i pomoc ostatních s kodem jak obsloužit více čítačů - ať je porovnáme který je jak přesný + jak to ovlivňuje nastavení SysTick
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 13 hostů