Софтвернный таймер отставание

Тема в разделе "Arduino & Shields", создана пользователем GrizliK91, 30 окт 2014.

  1. GrizliK91

    GrizliK91 Нерд

    День добрый. Написал программку секундомер с выводом на экран и после испытаний понял, что привирает. Естественно чем больше ждем, тем больше начинает привирать. К 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 модули показывать сотые секунды?
     
  2. funyfizik

    funyfizik Нерд

    В процессе испытания,а когда ждал до получаса кнопки нажимал? Остановливал и закускал заново?
     
    GrizliK91 нравится это.
  3. funyfizik

    funyfizik Нерд

    Если я не ошибаюсь, то milis выдает количество милисекунд несмотря на delay,хотя бы тут сделай корректировку. Потому что ты сразу получаешь неверное значение.
    К примеру на нажатие


    Код (Text):
    Starttime = millis - 200;
     
  4. GrizliK91

    GrizliK91 Нерд

    Там если останавливать и запускать, будет происходить сброс. Максимальное время что я прождал на одном запуске 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
     
  5. Megakoteyka

    Megakoteyka Оракул Модератор

    Правильно склоняетесь. Не факт, что кварц, от которого тактируется крнтроллер, настроен точно на 16 МГц. Можно подстроить частоту кварца, подбирая емкость, но RTC всяко лучше.
     
  6. Unixon

    Unixon Оракул Модератор

    RTC тоже от кварца пашут, не факт что точность настройки и стабильность часового кварца будет выше.

    А что принималось за эталон часов?
     
    GrizliK91 нравится это.
  7. Megakoteyka

    Megakoteyka Оракул Модератор

    Мне казалось, что часовой кварц потому так и зовется, что их делают достаточно точными. Не? Тогда только GPS остается или вот это :)
     
    GrizliK91 нравится это.
  8. lerik2703

    lerik2703 Гик

    Космический пульсар :)
     
  9. GrizliK91

    GrizliK91 Нерд

    За эталон используется секундомер в часах swatch.

    RTC вроде как не умеет миллисекунды выводить. Наверно буду тогда основное время брать из RTC, а миллисекунды выдергивать из ардуино
     
  10. ANV

    ANV Гуру

    Многие RTC имеют выход SQW на который выводится меандр с программируемой частотой. Его можно завести на прерывание в Ардуино и считать время по нему. Из недостатков - его частота 2^n, а не кратная десяти.
    Но я бы до последнего мучал Ардуино и не связывался с RTC, т.к. это неправильно - имея один кварц и ничего не делающий процессор прибегать к использованию второго кварца
     
    GrizliK91 нравится это.