DS1302, периодически выводит некорректное время.

Тема в разделе "Arduino & Shields", создана пользователем Volchik, 15 дек 2015.

Метки:
  1. Volchik

    Volchik Нерд

    Здравствуйте. В поиске подобной проблемы не нашел, потому вот...
    В общем, есть arduino uno и пара модулей RTC на чипе DS1302, с обоими такая ситуация, что каждую вторую секунду выводится некорректное время. Например ниже вывод с Serial порта с задержкой на вывод 1 строки в delay(250);
    Код (C++):
    2015 12 15   14:55:1
    2015 12 15   14:55:1
    2015 12 15   14:55:1
    2015 12 15   14:55:1
    2010 89 10   10:30:1
    2010 89 10   10:30:1
    2010 89 10   10:30:1
    2010 89 10   10:30:1
    2015 12 15   14:55:3
    2015 12 15   14:55:3
    2015 12 15   14:55:3
    2015 12 15   14:55:3
    2010 89 10   10:30:2
    2010 89 10   10:30:2
    2010 89 10   10:30:2
    2010 89 10   10:30:2
    2015 12 15   14:55:5
    2015 12 15   14:55:5
    2015 12 15   14:55:5
    2015 12 15   14:55:5
    2010 89 10   10:30:3
    2010 89 10   10:30:3
    2010 89 10   10:30:3
    2010 89 10   10:30:3
     
    Соотв. 2010 89 10 10:30:1 - 89ый месяц, понятно что дата некорректная.
    При этом время идет нормально, если отключать питание uno , часы продолжают работать на батарейке дальше.
    Библиотеку кажется брал отсюда https://github.com/msparks/arduino-ds1302
    Весь код скетча ниже, закомментил то как выставлял время, подскажите пожалуйста куда копать ?

    Код (C++):
    #include <stdio.h>
    #include <DS1302.h>
    namespace {
    const int kCePin   = 5;  // Chip Enable
    const int kIoPin   = 6;  // Input/Output
    const int kSclkPin = 7;  // Serial Clock
    DS1302 rtc(kCePin, kIoPin, kSclkPin);
    }
    void setup(void)
    {
      Serial.begin(9600);
      //rtc.writeProtect(false);
      //  rtc.halt(false);
      //Time t(2015, 12, 15, 14, 11, 50, Time::kTuesday);
      // Set the time and date on the chip.
      //  rtc.time(t);
      pinMode(2, OUTPUT);
     

    }

    void loop(void)
    {
      Time t = rtc.time();
      Serial.print(t.yr);
      Serial.print(" ");
      Serial.print(t.mon);
      Serial.print(" ");
      Serial.print(t.date);
      Serial.print("   ");
      Serial.print(t.hr);
      Serial.print(":");
      Serial.print(t.min);
      Serial.print(":");
      Serial.println(t.sec);
      delay(250);
    }
     
  2. Volchik

    Volchik Нерд

    Вопрос снят =) надо было всего лишь воткнуть резистор на контакте к земле.
     
  3. Karabas

    Karabas Гик

    А на каком контакте должен быть резистор?

    Хотя у меня проблемма другого плана, каждую четную секунду, секунды отображаются в виде двух нулей.
    Код отсюда
    http://lesson.iarduino.ru/page/podk...lnogo-vremeni-ds1302-ds1307-ds3231-k-arduino/

    Попробовал 1307, вроде все работало, а потом хлоп, и перестало считать время
    01-10-2015, 15:20:17, Thu
    01-10-2015, 15:20:18, Thu
    01-10-2015, 15:20:19, Thu
    01-10-2015, 15:20:20, Thu
    01-10-2015, 15:20:21, Thu
    01-10-2015, 15:20:22, Thu
    01-01-2001, 01:01:01, Mon
    01-01-2001, 01:01:01, Mon
    01-01-2001, 01:01:01, Mon
    01-01-2001, 01:01:01, Mon
    01-01-2001, 01:01:01, Mon
    И вот так оно будет до упора гнать одно и то же :confused:
     
    Последнее редактирование: 23 дек 2015
  4. Volchik

    Volchik Нерд

    Сборку оставил на работе, сделал поливалку для цветов на время отпуска, вроде работает как надо)
    Если не изменяет склероз, резистор поставил на gnd пине. Где то в инете просто увидел комментарий, что помогает стабилизировать питание.
    По поводу "01-01-2001, 01:01:01, Mon" - у меня такое было когда отходил какой-либо из пинов CLK\RST\DAT.
     
    Karabas нравится это.
  5. Karabas

    Karabas Гик

    Спасибо! Действительно, с резистором заработало (нужно погонять еще). Не понимаю в чем прикол, но я бы съел б свою шляпу, но не поверил бы в такое. Более того, если резистор во время работы замкнуть, на экран идет всякий бред, вроде меняющегося года каждую секунду, но при этом реальное время не сбивается!