Начинающие, как я, после первого удачного мигания светодиодом при помощи функции delay() пробуют добавить функциональность в алгоритм и тут же сталкиваются с сущностью функции delay() - задержка и этим все сказано. Алгоритм в МК (микроконтроллер) просто останавливает свое выполнение, а мог бы продолжить выполняться и только в определенные моменты времени переходить к тем или иным действиям.
Решается эта проблема конечно же с помощью функции millis(). Собственно правильное решение приведено здесь - Мигаем светодиодом без delay().
Причина правильной работы для меня не была очевидной, поскольку я не знал как срабатывает "-" в МК, поэтому писал дополнительные проверки на переполнение счетчика millis(), но это оказалось абсолютно не нужным.
Другими словами переполнение не влияет на увеличении дельты - это и есть ключ к понимаю!
Пример №1 для uint32_t:
показывается счет выражения "а-b" при переполнении счетчика "а",
"а" условно соответствует millis():
Именно поэтому "if
(currentMillis - previousMillis > interval)"
- отлично работает без контроля переполнения!
Пример №2 для int
:
05 | int a = (digitalRead(3) + 1) * 32760, b = 32760; |
06 | for ( int i = 0; i < 20; i++, a++) { |
07 | printf( "a=%d b=%d (a-b)=%d\r\n" , a, b, a - b); |
Результат:
01 | a=32760 b=32760 (a-b)=0 |
02 | a=32761 b=32760 (a-b)=1 |
03 | a=32762 b=32760 (a-b)=2 |
04 | a=32763 b=32760 (a-b)=3 |
05 | a=32764 b=32760 (a-b)=4 |
06 | a=32765 b=32760 (a-b)=5 |
07 | a=32766 b=32760 (a-b)=6 |
08 | a=32767 b=32760 (a-b)=7 |
09 | a=-32768 b=32760 (a-b)=8 |
10 | a=-32767 b=32760 (a-b)=9 |
11 | a=-32766 b=32760 (a-b)=10 |
12 | a=-32765 b=32760 (a-b)=11 |
13 | a=-32764 b=32760 (a-b)=12 |
14 | a=-32763 b=32760 (a-b)=13 |
15 | a=-32762 b=32760 (a-b)=14 |
16 | a=-32761 b=32760 (a-b)=15 |
17 | a=-32760 b=32760 (a-b)=16 |
18 | a=-32759 b=32760 (a-b)=17 |
19 | a=-32758 b=32760 (a-b)=18 |
20 | a=-32757 b=32760 (a-b)=19 |
И опять "if
(currentMillis - previousMillis > interval)"
работает без контроля переполнения.
ЗЫ: Спасибо профи, за то что они есть!
*МК - микроконтроллер
Комментарии
Отправить комментарий