03-11-2014, 10:48
Trochę zagmatwałem :-)
1. Na początku uznałem, że problem z przepełnieniem faktycznie jest poważny i znalazłem na niego lekarstwo.
2. Następnie postanowiłem edukacyjnie pokazać na czym ten problem polega.
3. Jak już napisałem kawałek kodu demonstracyjnego (celowo z "błędem) i zobaczyłem wyświetlane wartości, to wyszło mi, że w NASZYM KONKRETNYM PRZYPADKU fakt przepełniania się licznika millis() najprawdopodobniej nie ma żadnego praktycznego znaczenia.
Smeter będzie działał i PRAWDOPODOBNIE (ponieważ millis działa na przerwaniach) czas potrzebny na obsługę wyświetlania smetra spowoduje, że tych kilka "dzikich" pomiarów występujących po przepełnieniu licznika millis() - (a w demo po przekroczeniu 255) zniweluje się błyskawicznie.
4. muszę jeszcze sprawdzić, ale wygląda na to, że tych "nieoczekiwanych" pomiarów będzie w realnym działaniu kilkadziesiąt - dopóki się liczniki nie wyrównają.
5. Zadanie domowe Ryśka jest cały czas obowiązujące.
Generalnie chodzi o to, że my sami powodujemy przepełnienie naszej zmiennej:
"s_metr_update_time (unsigned long)"
za pomocą linijki:
s_metr_update_time = millis() + s_metr_update_interval;
w której do "kończącego się" licznika millis() (też unsigned long) dodajemy wartość "s_metr_update_interval"
Czyli - jak millis() będzie na 99 przed końcem a my dodamy 100, to millis() się jeszcze nie przepełni ale nasza wartość " s_metr_update_time" się przepełni (przekroczy zakres przewidziany dla zmiennej typu unsigned long") i zacznie przyjmować kolejne wartości od zera.
Podsumowując - żeby się woda nie przelała nie możemy dodawać nic do millis().
.....
ale możemy odejmować ;-)
MAc
mrn
Ale jazda
1. Na początku uznałem, że problem z przepełnieniem faktycznie jest poważny i znalazłem na niego lekarstwo.
2. Następnie postanowiłem edukacyjnie pokazać na czym ten problem polega.
3. Jak już napisałem kawałek kodu demonstracyjnego (celowo z "błędem) i zobaczyłem wyświetlane wartości, to wyszło mi, że w NASZYM KONKRETNYM PRZYPADKU fakt przepełniania się licznika millis() najprawdopodobniej nie ma żadnego praktycznego znaczenia.
Smeter będzie działał i PRAWDOPODOBNIE (ponieważ millis działa na przerwaniach) czas potrzebny na obsługę wyświetlania smetra spowoduje, że tych kilka "dzikich" pomiarów występujących po przepełnieniu licznika millis() - (a w demo po przekroczeniu 255) zniweluje się błyskawicznie.
4. muszę jeszcze sprawdzić, ale wygląda na to, że tych "nieoczekiwanych" pomiarów będzie w realnym działaniu kilkadziesiąt - dopóki się liczniki nie wyrównają.
5. Zadanie domowe Ryśka jest cały czas obowiązujące.
Generalnie chodzi o to, że my sami powodujemy przepełnienie naszej zmiennej:
"s_metr_update_time (unsigned long)"
za pomocą linijki:
s_metr_update_time = millis() + s_metr_update_interval;
w której do "kończącego się" licznika millis() (też unsigned long) dodajemy wartość "s_metr_update_interval"
Czyli - jak millis() będzie na 99 przed końcem a my dodamy 100, to millis() się jeszcze nie przepełni ale nasza wartość " s_metr_update_time" się przepełni (przekroczy zakres przewidziany dla zmiennej typu unsigned long") i zacznie przyjmować kolejne wartości od zera.
Podsumowując - żeby się woda nie przelała nie możemy dodawać nic do millis().
.....
ale możemy odejmować ;-)
MAc
mrn
Ale jazda

