В первом варианте в порт с частотой 1 секунда выходит:
1 2 3 4 5 6 7 8 9 10
затем задержка на 3 секунды
и после этого:
11 12 13 выскакивают мгновенно на 13-й секунде.
И т. д.
То есть, за 13 секунд строка 23 (и не только она одна) в #160 отработала 13 раз.
P.S. Я к тому, что алгоритм надо описывать полностью,
чтобы была полная картина .
А лучше выложите схему конкретного устройства, и, тогда
можно будет получить исчерпывающий ответ
Я вот никак не пойму, ну миллис врёт на секунды в минуту и требует точной настройки к данному экземпляру конструкции в данный момент времени. Вы как то запутались совсем между количественным и качественным.
Тоже сомневался что так можно. Сам так делать избегал.
Решил всё же проверить код Optrona на переполнение миллис.
Для этого пришлось стать немного хакером))
Спойлер
const int32_t period = 1000;
unsigned long moment;
uint32_t tik = 0;
bool CHECK = false;
uint32_t start;
uint32_t stop;
extern volatile uint32_t timer0_millis;
void setup()
{
Serial.begin(9600);
timer0_millis += 4294957000;// 10сек 296мс до переполнения
moment = 4294957000;//миллис!!! ))))
}
void loop()
{
if(!CHECK)
{
start = millis();
CHECK = true;
}
if (millis() - moment >= period)
{
stop = millis();
moment = moment + period;
tik++;
Serial.print("tik = ");
Serial.print(tik);
Serial.print(" periodtik = ");
Serial.print(stop - start);
Serial.print(" millis = ");
Serial.println(millis());
CHECK = false;
}
}
Если все делать правильно, проблем быть не должно. Главное, чтобы новое значение moment не превышало текущее значение millis(), а при показанном выше применении оно и не должно превысить. Но таки новичкам такого лучше не советовать ))