Gremo po vrsti.
1. Tvoja funkcija vrne uint16_t, kar pomeni unsigned integer, velikosti 16-bitov. To so HEX vrednosti od 0x0000 do 0xFFFF. Ko vrednost doseže 0xFFFF, bo naslednja povečava te vrednosti naredil "overflow" in bo šla vrednost na 0x0000.
V tvojem primeru tvoja funkcija vrne vrednost registra na mikrokontrolerju. Ta register ima 16 fizičnih D celic, in je 16-biten. Torej, ko pride vrednost do 0xFFFF, bo naslednja vrednost 0x0000.
Downfall CNT pristopa je, da ti CNT ne da vrednosti večje kot 0xFFFF, ki pa jo rabiš, ko delaš z 32-bitnimi spremenljivkami, ki gredo do 0xFFFFFFFF.
2. Pri LwBTN knjižnici je veliko odvisno od časovne enote. V njej so matematična operacije ala
trenutni_čas - prejšnji_čas >= maks_razlika_časa, kar pomeni, da primerjamo trenutni čas (ki ga daš kot parameter) z prejšnjim časom, ki si ga knjižnica shrani (to je vrednost, ki si jo dal kot parameter knjižnici ob prejšnjem klicu funkcije).
Unsigned spremenljivke imajo to lepo lastnost, da če ti primerjaš "trenutni - prejšnji", bo rezultat razlika med njima, in to tudi velja, ko so vrednosti tik pri overflow-u. Primer:
Trenutni - Prejšnji = razlika:
- 0xFFFE - 0xFFFD = 1 (razlika med njima je 1, normalna matematika, obe vrednosti sta veliki)
- 0xFFFF - 0xFFFE = 1 (razlika med njima je 1, prvi števec je na najvišji cifri, drugi je eno manj kot najvišja možna cifra)
- 0x0000 - 0xFFFF = 1 (razlika med njima je še vedno 1). V tem primeru je "trenutni" čas že naredil overflow, drugi pa še ne, ampak razlika je še vedno 1.
Analogija s tem bi bila modulus oz. "ostanek pri deljenju".
Kar se zgodi pri tebi, ko imaš 16-bitni števec, je pa to, da ti že res lahko podaš 16-bitno vrednost funkciji, ampak ker funkcija operira z 32-bitnimi številkami, ona pričakuje, da boš podal več kot samo 16-bitov. V tem primeru se dela matematika na 32-bitnem nivoju. Spodnji primer bo sedaj na 32-bitni logiki, kjer je "trenutni" in "prejšnji" čas od tvojega 16-bitnega vnosa.
Trenutni - prejšnji = razlika. Logika je na 32-bitih, ampak vrednosti, ki jih funkcija sprejme, so pa na 16-bitih:
- 0x0000FFFE - 0x0000FFFD = 1 (razlika med njima je 1 - so far so good)
- 0x0000FFFF - 0x0000FFFE = 1 (razlika med njima je še vedno 1 - so far še vedno good)
- 0x00000000 - 0x0000FFFF = koliko ??? Problem tukaj je, da je tvoj parameter 16-bitni, in ko TIM1 doseže 0xFFFF, bo naslednja 0x0000, in to daš funkciji kot parameter. Sedaj pa smo na 32-bitni vrednosti, torej bo overflow po 0xFFFFFFFF, a v našem primeru se je zgodil že po 0x0000FFFF.
Vrednost "trenutni - prejšnji" čas je tukaj enormen, in funkcija misli, da je med dvemi klici minili OGROMNO milisekund, in naredil kar nekaj stvari. In potem se ti logika sesuje.
Spodaj analogija analogne ure, oz. "ostanek pri deljenju".
Delam repl-it primer.
Knowledge sharing is people' caring., T. MAJERLE