День добрый. Написал программку секундомер с выводом на экран и после испытаний понял, что привирает. Естественно чем больше ждем, тем больше начинает привирать. К 30 минутам уже отстает на 1 минуту. Собственно код. Код (Text): #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); int but0 = 2; int h =0; int m=0; int s=0; int ms=0; boolean timerstart = false; unsigned long startTime=0 ; unsigned long t2,t3,tp; void setup() { pinMode(but0, INPUT); lcd.init(); // Инициализация lcd lcd.backlight(); lcd.clear(); } long a; void loop() { if (digitalRead(but0) == HIGH && timerstart ==false) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("START"); delay(200); // костыль для дребезга timerstart = true; startTime = millis(); s=0;m=0;h=0;ms=0; } if (digitalRead(but0) == HIGH && timerstart !=false) { lcd.setCursor(0, 0); lcd.print("STOP "); timerstart = false; delay(200); } if (timerstart !=false) { s=0;m=0;h=0;ms=0; lcd.setCursor(0, 1); t3= millis() - startTime; s = t3 /1000L; ms=(int)(t3 % 1000L); if (s>59) { m= s/60; s=s%60; } if (m>59) { h= m/60; m=m%60; } if (h<10) lcd.print("0"); lcd.print(h); lcd.print(":"); if (m<10) lcd.print("0"); lcd.print(m); lcd.print(":"); if (s<10) lcd.print("0"); lcd.print(s); lcd.print("."); lcd.print(ms); } } Суть вопроса, можно ли это софтверно скорректировать?А если нельзя, то умеют ли RTC модули показывать сотые секунды?
Если я не ошибаюсь, то milis выдает количество милисекунд несмотря на delay,хотя бы тут сделай корректировку. Потому что ты сразу получаешь неверное значение. К примеру на нажатие Код (Text): Starttime = millis - 200;
Там если останавливать и запускать, будет происходить сброс. Максимальное время что я прождал на одном запуске 30 минут. А так среднее время испытания до 5 минут. Да, я проверял, millis считаются во время delay. По этому я воткнул delay для дребезга перед записи стартового значения. Вообще я тестировал еще такой код Код (Text): if (digitalRead(but0) == HIGH && timerstart ==false) { lcd.clear(); delay(200); // костыль для дребезга timerstart = true; startTime = millis(); lcd.setCursor(0, 0); lcd.print(startTime); lcd.setCursor(0, 1); lcd.print(millis()); s=0;m=0;h=0;ms=0; } Разница между ними была в среднем 20. Пытался принудительно эту разницу потом дописывать при выводе, но это не сильно помогает. Склоняюсь к использованию RTC
Правильно склоняетесь. Не факт, что кварц, от которого тактируется крнтроллер, настроен точно на 16 МГц. Можно подстроить частоту кварца, подбирая емкость, но RTC всяко лучше.
RTC тоже от кварца пашут, не факт что точность настройки и стабильность часового кварца будет выше. А что принималось за эталон часов?
Мне казалось, что часовой кварц потому так и зовется, что их делают достаточно точными. Не? Тогда только GPS остается или вот это
За эталон используется секундомер в часах swatch. RTC вроде как не умеет миллисекунды выводить. Наверно буду тогда основное время брать из RTC, а миллисекунды выдергивать из ардуино
Многие RTC имеют выход SQW на который выводится меандр с программируемой частотой. Его можно завести на прерывание в Ардуино и считать время по нему. Из недостатков - его частота 2^n, а не кратная десяти. Но я бы до последнего мучал Ардуино и не связывался с RTC, т.к. это неправильно - имея один кварц и ничего не делающий процессор прибегать к использованию второго кварца