Спешат часы - DS1307

Dima85
Offline
Зарегистрирован: 07.01.2013

Преобрел такой модуль часов. Настроил, запустил, заработали без каких либо проблем. Но в скоре выяснилось - они спешат. За сутки набигает лишних 10-15 минут. Есть ли какая-то возможность убавить их пыл?

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

Может кварц не той частоты ? Частота часового кварца - 32768 Гц.

А может быть вы как то не правильно снимаете показания.

msng
Offline
Зарегистрирован: 07.06.2012

я тоже за кварц...

а на счет снятия показаний, загрузить скетч из примеров ну и ничего не меняя поглдяеть как ходят часы, если убегают, то сменить кварц, я покупал подобный модуль, только на нем кварц был керамический и цифра отличная от 32768....

maksim
Offline
Зарегистрирован: 12.02.2012

После выполнения каждого из действий написанных ниже проверяем помогло или нет.

1. Заменить батареку.
2. Заменить кварц, при пайке не перегревать!
3. Заменить DS1307, впаивать новую микруху только на обесточенной плате и убраной батарейки!

Dima85
Offline
Зарегистрирован: 07.01.2013

Что б знать еще как этот кварц выглядит. :)

Предполагалось услышать какие-то програмные решение. Жаль что таких нет.

msng
Offline
Зарегистрирован: 07.06.2012

Dima85 пишет:

Что б знать еще как этот кварц выглядит. :)

))) на вашем фото это блестящий цилиндр, подключенный к 1 и 2 ноге ds1307

Dima85 пишет:

Предполагалось услышать какие-то програмные решение. Жаль что таких нет.

так вопросо задался в теме Аппаратные вопросы

paf
Offline
Зарегистрирован: 25.01.2013

Вопросик один в один решил заменой кварца на кварц из старинной (чем старей тем точней :) мамки. Это была  ...э-эх! 486... прошлый век...

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

Тот же кварц можно выдрать из любых дешевых кварцевых часов.

Dima85
Offline
Зарегистрирован: 07.01.2013

Выбрал кварт из старых часов. Выбрал батарейку, перепоял. Как и советовали. DS1307 начали тикать. Но они спешат помоему точно так же как и ранее, какбудто ничего не изменилось.

Пришла в голову такая идея, может в loop поместить что-то подобное:

    if ((rtc[1]*60+rtc[2])==(1*60+3)) {
   RTC.stop();
   RTC.set(DS1307_MIN,01); //Установить минуты
   RTC.start();
    }

Тоесть этот код каждые сутки в 1 час ночи и 3 минуты, будит перегонять часики на 2 минеты назад. Какраз где-то на 2 минуты они и спешат в сутки. Что скажете о таком коде?

tsostik
Offline
Зарегистрирован: 28.02.2013

Внимательно проанализируйте, что случится с тим кодом через две минуты после того, как он переведет часы назад на две минуты.

Dima85
Offline
Зарегистрирован: 07.01.2013

Ох. Действительно, вы правы, получится зацикливание. Есть идеи как можно его обойти?

Snubist
Offline
Зарегистрирован: 18.02.2013

Можно сохранить дату, и проверить переводились ли они сегодня или нет.

Dima85
Offline
Зарегистрирован: 07.01.2013

В rtc[4] хранится день. Покажите пожалуйста на примере. Мне вот такая конструкция пришла в голову:



unsigned int colebration=0;

***

if ((rtc[1]*60+rtc[2])==(1*60+3) && colebration == 0) {
RTC.stop();
RTC.set(DS1307_MIN,01); //Установить минуты
RTC.start();

colebration=1;
}

if ((rtc[1]*60+rtc[2])==(1*60+5)) {
colebration=0;
}

 

Может создать тему в другой ветки форума? Хочется придумать какое-то более оптимальное решение в коде.

Snubist
Offline
Зарегистрирован: 18.02.2013

Dima85 пишет:

В rtc[4] хранится день.

 

Имел ввиду что то типа:

  if (rtc[3]==0 && rtc[2]==15  && LastColebration != rtc[4]) { //если rtc[3]=0 часов, а rtc[2] = 15 минут, и последняя колибровка (LastColebration) была не сегодня.


    RTC.stop();
    RTC.set(DS1307_MIN,01); //Установить минуты
    RTC.start();

    LastColebration = rtc[4];   //сохраняем день
  } 
Dima85
Offline
Зарегистрирован: 07.01.2013

Ваше решение мне больше понравилось. Спасибо.

paf
Offline
Зарегистрирован: 25.01.2013

Народ, подскажите где почитать про работу с EEPROM на этой плате?

Snubist
Offline
Зарегистрирован: 18.02.2013
RainMan
Offline
Зарегистрирован: 21.06.2011

это вам повезло, если часы спешат или отстают на фиксированное время.  У меня этот же таймер каждый день спешит по разному. Уже месяц пытаюсь вычислить поправочку - без результатно. А корректировку делаю следующим способом:

1) при подключении к ПК синхронизируется время таймера с ПК и записываетсяя (сохраняется) значение этого времени в свободных регистрах RTC.

2) при необходимости получить "правильное" время, написана функция, которая находит разницу в часах между текущей датой, и записанной в RTC и умножает на поправочный коэффициент. Таким образом вычисляется на сколько секунд убежали часы.

3) к считанному из RTC значению текущего времени добавляю/отнимаю вычисленную поправочку в секундах. 

И как казалось бы все хорошо... но часы спешат неравномерно, что затрудняет правильно расчитать поправочных коэфициент.

Если кому нужен код - могу выложить

Dima85
Offline
Зарегистрирован: 07.01.2013

Ого, Да интересно было бы посмотреть на код.

paf
Offline
Зарегистрирован: 25.01.2013

Температурная нестабильность? Так ведь кварц же? А я ведь тоже заметил странное поведение этих часов. В данный момент имею трое работающих. Двое самопай и одни китай. Сначала подумал, что показалось. Надо повнимательнее присмотреться к ним.

RainMan
Offline
Зарегистрирован: 21.06.2011

по ходу времени подрачена куча на написание кода, а нестабильность хода почти все сводит на нет....

А температурная нестабильность врядли в моем случае. Модуль находится в ртапоиваемом помещении, и температура колеблется не более +-5градусов. Скорее всего надо выковыривать кварц из материнки, много на форумах по этому поводу написано...

А можно купить DS3232. Он сверхточный и с термокомпенсацией. Но зараза все равно в день на 1 секунду бежит вперед, но стабильно:)...

Вот код. Хотя ковыряться в чужом коде терпеть не могу...

const byte LongData=6;//длина даты в байтах
byte Data[LongData]; // массив для временного хранения 6 байтовой даты
    /*0б-Year
      1б-Month
      2б-Day
      3б-Hours
      4б-Min
      5б-Sec
    */


//cчитать поправку в секундах для текущего времени, относительно последнего синхронизированного времени
word  Delta_Time(){
int   g1,g2,m1,m2,d2,i,d,d1,d0,g,dm=0; //переменные для вычисления разности дат в часах
int   h1,h2,h; //переменные для вычисления разности дат в часах
byte  TempData[LongData];
      //считываем дату сохраненную в регистрах СРАМ таймера(это дата последней синхронизации)   
      RTC_Read_SRAM_CurrentData(TempData);
      g1=TempData[0];
      m1=TempData[1];
      d1=TempData[2];
      h1=TempData[3];
      //считываем текущую дату из таймера
      RTC_ReadTime(TempData);
      g2=TempData[0];
      m2=TempData[1];     
      d2=TempData[2];
      h2=TempData[3];
    // предварительные расчеты перед вызовом функции Fun
      g=g2-g1;
      d0=(g/4);
      d=g*365;
      d+=d0;
      dm=fun (m1,dm,d1,g1);
      d-=dm;
      dm=0;
      dm=fun (m2,dm,d2,g2);
      d+=dm;
      h=h2-h1;
      Serial.print("Delta Time from last sync (hours) - " );
      Serial.println((d*24+h),DEC);
      Serial.print("Current time need correct at  - " );
      Serial.print(((d*24+h)*CorrectToHour),DEC);
      Serial.println(" Sec" );
      Serial.println();
}
 
  }  



//вспомагательная функция для расчета разности дат
int fun (int m1,int dm,int d1,int g)
{
switch(m1)
    {
    case 1:
        dm=0+d1;
        break;
    case 2:
        dm=31+d1;
        break;
    case 3:
        if (g-(g/4)*4==0)dm=d1+60;
        else dm=59+d1;
        break;
    case 4:
        if (g-(g/4)*4==0)dm=91+d1;
        else dm=90+d1;
        break;
    case 5:
        if (g-(g/4)*4==0) dm=121+d1;
        else dm=120+d1;
        break;
    case 6:
        if (g-(g/4)*4==0) dm=152+d1;
        else dm=151+d1;
        break;
    case 7:
        if (g-(g/4)*4==0) dm=182+d1;
        else dm=181+d1;
        break;
    case 8:
        if (g-(g/4)*4==0) dm=213+d1;
        else dm=212+d1;
        break;
    case 9:
        if (g-(g/4)*4==0) dm=244+d1;
        else dm=243+d1;
        break;
    case 10:
        if (g-(g/4)*4==0) dm=274+d1;
        else dm=273+d1;
        break;
    case 11:
        if (g-(g/4)*4==0) dm=305+d1;
        else dm=304+d1;
        break;
    case 12:
        if (g-(g/4)*4==0) dm=335+d1;
        else dm=334+d1;
        break;
    }
    return dm;
}


 

RainMan
Offline
Зарегистрирован: 21.06.2011

как работает функция fun - не спрашивайте, пытался понять - не получилось. Ее где то скопировал на одном из форумов. Но факт что работает правильно. Учитывает переход через новый год, и высокостность года. Вот с высокостностью по ходу есть небольшая некорректность, но существенного влияния она не оказывает

RainMan
Offline
Зарегистрирован: 21.06.2011

 вот например (g-(g/4)*4==0) как по мне эквивалентно (0==0). Зачем тогда разработчик написал имнно так?

tsostik
Offline
Зарегистрирован: 28.02.2013

Нет, не эквивалентно.

Так как g имеет тип int - g/4 - тоже int.

В итоге, выражение истино только если g делится на 4 без остатка (невисокосный год).

Судя по всему разработчик не знал о наличии операции остатка от деления -)

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Для памяти - помещу сюда полную версию:

http://www.emartee.com/product/42059/Arduino%20Tiny%20RTC%20DS1307%20Shield%20V2.0#

Если присмотреться, на ней установлен датчик температуры DS18B20, причем зеркально принту на плате, ну и на батарейке явно видно надпись 3.6V.

На схеме подключения видно пунктиром линию 1-wire

Igrok
Offline
Зарегистрирован: 13.05.2013

Приобрел подобный девайс DS1307, только с ebay: http://www.ebay.com/itm/1PCS-I2C-RTC-AT24C32-DS1307-Real-Time-Clock-Modu...

Возможно у него сделана другая разводка, но датчик DS18B20 ставится как раз в соответствии с принтом на плате, т.е. противоположно вышеприведенной картинке.

Я сначала прозвонил контакты тестером, а потом впаял датчик. Все работает как надо.

ales2k
Offline
Зарегистрирован: 25.02.2013

Для набирания статистики

У меня такой же модуль отстает на 20 сек в сутки пришлось сделать программную коррекцию:(

Есть еще один американского производства а не китайского - его еще не проверял.

Igrok
Offline
Зарегистрирован: 13.05.2013

Для статистики - мой модуль убегает вперед секунд на 20 за сутки. Сделал ежедневную корректировку времени через интернет по серверу точного времени.

ales2k
Offline
Зарегистрирован: 25.02.2013

В нете пишут что для небольшой регулировки частоты кварца применяются регулировочные конденсаторы. Но никакой формулы не нашел.   Может кто в курсе? Аппаратное решение всегда лучше и не ест дефицитную память МК.

 

helius_albus
Offline
Зарегистрирован: 24.01.2014

  Eсли За сутки набигает лишних 10-15 минут попровуйте увеличить питание до 5 вольт...мне это помогло

 

msng
Offline
Зарегистрирован: 07.06.2012

helius_albus пишет:

 увеличить питание до 5 вольт...мне это помогло

да, я тоже обратил внимание, качество источника питания влияет на точность хода 1307

Бублик
Бублик аватар
Offline
Зарегистрирован: 05.12.2012

Из необъяснимых глюков китайских модулей DS1307 =)
Попадались экземпляры тикающие в 2-3 раза(!) быстрее. Решилось просто - SQW/OUT на землю через килоомный резистор. Логики не ищите - её нет.

ales2k
Offline
Зарегистрирован: 25.02.2013

Раз такое решение помогает, значит ловит помеху по питанию или по воздуху.

LYNX
Offline
Зарегистрирован: 21.03.2014

Бублик пишет:

Из необъяснимых глюков китайских модулей DS1307 =)
Попадались экземпляры тикающие в 2-3 раза(!) быстрее. Решилось просто - SQW/OUT на землю через килоомный резистор. Логики не ищите - её нет.

у меня тикает так же быстро, думал глюк в библиотеке

inspiritus
Offline
Зарегистрирован: 17.12.2012

У меня прилично отставали. Сделал коррекцию по ntp с сервера точного времени каждые 15 минут. 

LYNX
Offline
Зарегистрирован: 21.03.2014

Добрый день!

Часы все также торопятся...

Кто нибудь сталкивался с эти?

LYNX
Offline
Зарегистрирован: 21.03.2014

Постоянная корректировка тоже не дело. Вроде конденсаторами решается, хз

bwn
Offline
Зарегистрирован: 25.08.2014

Решил все подобные проблемы, забыв про 1307, а вспомнив про 3231. И лишних 10 отверстий сверлить не надо))))).

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Производители рекомендуют экранировать кварц на печатной плате. Например, в даташите 1302 прямо нарисовано:

в большистве модулей (из тех, что я видел) на это плюют. В смысле, панелька обычно есть (и то не всегда), а вот обводка часто отсутствует.

bwn
Offline
Зарегистрирован: 25.08.2014

Как минимум, соединять корпус кварца с землей. На фото в начале темы, площадка сделана, соединения нет. Проволочная скоба - притянуть корпус кварца к площадке и припаять к ней скобу. Видел на как то на плате припаянный сам корпус, но думаю, это излишне. После манипуляций дрейф будет все равно, но в размере единиц секунд в сутки.

LYNX
Offline
Зарегистрирован: 21.03.2014

площадку и корпус на землю? спасибо

a5021
Offline
Зарегистрирован: 07.07.2013

inspiritus пишет:
У меня прилично отставали. Сделал коррекцию по ntp с сервера точного времени каждые 15 минут.

При столь частых коррекциях вообще нет нужды во внешней микросхеме часов. Проще в программу/скетч добавить кусок кода, который будет реализовывать часовой функционал.

PS. При нынешних ценах на ds3231, использовать ds1307 -- ничем не объяснимое, "странное" занятие.

StrangerM
Offline
Зарегистрирован: 02.11.2013

3 пф у меня стоял с 0 ТКЕ. Можно с небольшим отрицательным. А так все на ds3231  давно поменял.

Гриша
Offline
Зарегистрирован: 27.04.2014

StrangerM пишет:

3 пф у меня стоял с 0 ТКЕ. Можно с небольшим отрицательным. А так все на ds3231  давно поменял.

я тоже примерно столько насчитал на 2 шт своих... еслиб раньше прочитал такой пост - не стал бы эти модули брать и даром...

Клапауций 777
Offline
Зарегистрирован: 21.11.2015

лично я рекомендую взять качественный часовой кварц и заменить гавно, которое установлено в вашем модуле.

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

Гриша
Offline
Зарегистрирован: 27.04.2014

Клапауций 777 пишет:

лично я рекомендую взять качественный часовой кварц и заменить гавно, которое установлено в вашем модуле.

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

не помогло, это первое что я сделал, после теста на набегание :(

Клапауций 777
Offline
Зарегистрирован: 21.11.2015

Гриша пишет:

не помогло, это первое что я сделал, после теста на набегание :(

ок. давай разбираться, каким образом кварц с, например материнки, который стабильно работал в составе генератора, внезапно стал выдавать другую частоту.

рассказывай, откуда ты взял кварц?

*к примеру: лично я взял кварц с японского древнего факса и замутил RTC на атмега16, за сутки врёт ровно столько же сколько врал факс +- пары секунд в сутки и то списываю это, что балалайка на макетке.

но, что бы 10-15 минут, как у ТС - не понимаю, КАК?

StrangerM
Offline
Зарегистрирован: 02.11.2013

А все равно будет уход от температуры. В отличии от компенсированных ds3231. Помнится читал, что в ширпотребе специально ставят кварц с большей частотой. А потом подгонка кондером ( по хор частотомеру элементарно) заодно и частичная термокомпенсация за счет выбора ТКЕ. В нач 80-х я сделал для дома часы-частотомер с термостатом. Мда.

Клапауций 777
Offline
Зарегистрирован: 21.11.2015

StrangerM пишет:

А все равно будет уход от температуры.

да на +-15 минут... будет.

StrangerM пишет:

В отличии от компенсированных ds3231. Помнится читал, что в ширпотребе специально ставят кварц с большей частотой.

да - специально... что бы жизнь малиной не казалась. может, не специально, а потому что отсутвовали качественные радикомпоненты в СССР?

StrangerM
Offline
Зарегистрирован: 02.11.2013

В СССР с комплектухой все нормально было, кварцы с кучей цифирек, инваровые подстроечники и тд и тп. А это я про современые потоковые вещи. Там дешевизна и технологичность важна. Первый раз столкнулся в китайских часах. Они там этот кондюк поленились поставить. Из сравнения двух образцов.

А на счет тех часов - там 155 серия была и 500 на входе частотомера. А в магазине я тогда вещи и не смотрел. Делал обычно сам.

Клапауций 777
Offline
Зарегистрирован: 21.11.2015

StrangerM пишет:

В СССР с комплектухой все нормально было, кварцы с кучей цифирек,

ты жыл в СССР?

и чем тебе поможет часовой кварц с кучей цифирек, если тебе нужен кварц с пятью точными цифирками 32768, но с хорошими параметрами стабильности?