Часы реального времени DS1307

Отзывы об этих часах в интернете самые противоречивые. Кто-то говорит что часы замечательные, а кто-то называет их убогой поделкой Далласа. И вот я, дабы развеять все недостоверные слухи, достал микруху из загашника начала экспериментировать.

DS1307

Особенности:

  • Очень маленькое энергопотребление. Производитель обещает 10 лет работы часов от одной стандартной батарейки CR2032
  • 56 байт памяти для хранения пользовательских данных. Думаю не особо нужная опция, но может кому-то и пригодится.
  • Программируемый вывод для тактирования внешних устройств. Может выдавать 1 Гц, 4.096 кГц, 8.192 кГц и 32.768 кГц.
  • 24-х часовой и 12-ти часовой режим

Распиновка

Выводы часов расположены следующим образом:

DS1307 распиновка

X1, X2 — Выводы для подключения кварцевого резонатора на частоту 32.768 кГц
VBAT — Вывод для подключения 3-х вольтовой батареи резервного питания
GND — Земля
SDA — линия данных шины i2c
SCL — линия тактовых импульсов шины i2c
SQW/OUT – выходной сигнал для тактирования внешних устройств
VCC — питание 5 вольт

Подключение к контроллеру
Обвязка минимальна. Потребуется кварц 32.768 кГц, пара резисторов для работы шины i2c  и батарейка на три вольта.

DS1307 подключение к AVR

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

DS1307 плата

Кстати DS1307 может работать и без кварца. Для этого на ногу X1 подают внешний тактовый сигнал с частотой 32.768 кГц, а X2 остаётся висеть в воздухе.

Организация памяти часов
Данная микруха наделена 64 байтами памяти. Первые восемь байт — рабочие. В них хранится время, дата, день недели.  Остальные выделены под нужды пользователя. В них можно хранить например какие-нибудь настройки или еще что-нибудь. Естественно, когда резервное питание пропадает, вся информация в этой памяти разрушается. Вся работа с часами (чтение и установка времени/даты) сводится к тому, чтобы читать и записывать нужные ячейки памяти.

DS1307 память

Все числа в памяти хранятся в двоично-десятичном формате. Это значит что в одном байте может хранится сразу две цифры. Например число 0x23 — содержит в себе цифру 2 и цифру 3. На каждую цифру выделяется по 4 бита. Зачем так сделано? Для удобства и экономии памяти. Кроме времени и даты в памяти хранятся несколько бит настроек:

  • Clock Halt — управляет часами. Когда бит установлен то часы стоят. Чтобы запустить ход часов необходимо записать в этот бит 0. После подключения батареи резервного питания, этот бит уставлен и часы не считают время! Об этом нужно помнить.
  • 24/12 — этот бит выбора режима часов. Когда этот бит равен единице то используется 12-ти часовой режим. В противном случае 24-х часовой. Если используется 12-ти часовой режим то пятый бит показывает AM или PM сейчас.  Если бит равен 1 то значит PM. В 24-х часовом режиме этот бит используется для хранения десятков часов совместно с битом 4.
  • Output — управляет состоянием ноги SQW/OUT. Бит установлен — на ноге лог 1. Сброшен — на ноге 0. Для управления таким образом, бит SQWE должен быть сброшен.
  • SQWE — когда бит установлен, на ноге SQW/OUT появляются прямоугольные импульсы.
  • RS1, RS0 — этими битами задается частота импульсов. Зависимость частоты от комбинации бит находится в таблице ниже:

DS1307

Софт

Для работы с часами DS1307 была написана нехитрая библиотека содержащая следующие базовые функции:

DS_start — запускает часы. Запустить часы можно так же установив время.
DS_stop — останавливает часы
DS_set_time — Установка времени.  Перед вызовом процедуры нужно  поместить в tmp1 — секунды в tmp2 — минуты и в tmp3-часы. Часы в 24-х часовом формате.
DS_get_time: — считывание времени из часов. секунды будут записаны в tmp1, минуты в tmp2, часы в tmp3
DS_get_date: — считывание даты из часов. День будет записан в tmp1, месяц в tmp2, год в tmp3
DS_set_date:  — установка даты. Перед вызовом процедуры нужно поместить в tmp1 — день в tmp2 — месяц и в tmp3-год (последние 2 цифры)

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

Тестовая программа позволяет управлять часами через UART (скорость 9600, контроллер работает на частоте 8 мГц). При запуске сразу выдаются время, дата и приглашение ввести команду от 1 до 3. При выборе варианта 1 происходит повторное считывание времени/даты. Вариант 2 позволяет установить время, а вариант 3 дату. Если хочется попробовать поиграть с часами в симуляторе Proteus то в архив с исходником включён файл для симуляции.

Точность
Тут очень многое зависит от применяемого кварца и разводки платы. Даташит сообщает что емкость кварца должна быть 12.5 пф. Говорят, что лучше всего применять кварцы от материнских плат. Для коррекции хода можно подпаять к резонатору подстроечный конденсатором и при помощи него в небольших пределах менять частоту. Лично у меня эти часы работают вторые сутки и отстали на 3 секунды. Что-то мне подсказывает, что дело в ёмкости кварца, попробую другой отпишусь.

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

Скачать демонстрационный пример + файл симуляции

Часы реального времени DS1307: 45 комментариев

  1. Точность хода оставляет желать лучшего. Кроме того кварцы при перегреве начинают «убегать» от своей основной частоты… Но для большинства применений подходит. Почти полный аналог данной микросхемы — M41T56. Количество ячеек увеличено и чего-то еще добавлено.

  2. Medved, у тебя в статье написано «Данная микруха наделена 64 килобайтами памяти»? но ведь у ней же вроде как 64 байта, 8 собственно часы и 56 для фаг знает чего.

  3. Пользую эту микросхемку в настольных часах уже несколько лет. Глюков не наблюдалось. Кварцы, пожалуй, всегда делают с немного меньшей частотой от номинала для подстройки кондесатором. Программно добавляю нужное количество секунд ежедневно и еженедельно. Правда, этого мало, и нужно бы ещё ежемесячно и ежегодно.

    1. Программная корректировка времени это конечно прикольно, но хотелось бы добиться хорошей точности без всяких периодических корректировок вообще. Я щас провожу испытания, настроил эти часы и положил на полку. пусть ходят в течении пары недель потом посмотрим на результат. Кстати бывают еще часы со встроенным кварцем. Говорят точные очень но найти их проблематично.

  4. 1) у меня 12 штук работают с 2003 года, зимуют в неотапливаемом железном помещении:
    2)»56 байт памяти для хранения пользовательских данных. Думаю не особо нужная опция, но может кому-то и пригодится» — очень полезная вещь- там храню текущий адрес записи в ЕПРОМ и после зимней спячки регистратор начинает работать с текущего адреса! Я сам от этого балдею!
    3) точность хода удовлетворительная- за 6 мес на 3 мин вперед в нескольких экземплярах но дома.На улице не помню, т.к. раз в 2 недели происводится обновление времени при чтении данных.

  5. Делал подобное, отстают. В даташите кроме емкости кварца также написано что расположен он должен быть как можно ближе к выводам. Забил на отверстия, подпаял к выводам напрямую — отставание уменьшилось и заметно только при питании от батарейки часов (примерно 2-3 минуты за месяц). Кварц брал как раз от мамки.

  6. Борюсь с этими часами. Отказываются выводить меандр. Причем работали работали и перестали.У второго экземпляра микросхемы какой то жесткий брак,она хавает столько, что сажает питание системы 5В до 2.6В, при этом нагреваясь. По моему у них много брака

  7. Вопрос не по теме) в терминале протеуса у тебя русский шрифт, терминал способен поддерживать нашу кирилицу и как это сделать? щас разбираюсь с работой мк и компа по UART, хочется тоже научить мк писать по русски)

  8. Здарвуствуйте столкнулся с такой проблемой: Схему подключил как надо, ка кна рисунке ниже. SCL подключено к МК(ATMEGA64) к ножке PORTD.0, SDA поключил к PORTD.1.
    При посылке данных у меня порд D.0(SCL) посылает биты, а вот SDA постоянно висит 5В. и никак это не изменить, что делать? заранее спасибо!

  9. Интересно, но имееются вопросы:
    А если у микроконтроллера напряжение питания строго и равно 3.3Вольта.
    ТОгда будет ли схема 1307 работать при 3,3 Вольтах правильно?.
    Или ей нужно именно 5 Вольт строго?
    Если нужно именно 5 Вольт, то как тогда согласовать напряжение на линиях twi?

  10. Добрый день! Уже совсем всё перепробывал! уже и новый кварц ставил, и таймер менял, и резисторы какие-только не пробовал….
    Добрый вечер! Пишу в codevision. Вообщем подключил всё как на схеме( подключил к scl и sda резисторы на 4.7 кОм). Создал проект с помощью визарда. скомпилил.
    Импульсы на ножках scl и sda идут, при нажатии на кнопку ( при нажатии на кнопку запускается процеудра rtc_get_time(&hour,&min,&sek);)
    Всё вроде бы хорошо, НО… На кварце(а он 32.768 кГц) нет синусоиды, на одной ножке (X2) примерно +0.5 В, на другой (X1) 0В. Импульсы от SQW/OUT не идут….То есть таймер похоже не запускается….Я уже второй такой таймер подключаю… и ничего…. вообщем уже завозился с ним, помогите, кто сможет! Заранее спасибо!)
    Вот код :
    #include
    // I2C Bus functions
    #asm
    .equ __i2c_port=0x12 ;PORTD
    .equ __sda_bit=0
    .equ __scl_bit=1
    #endasm
    #include
    // DS1307 Real Time Clock functions
    #include

    unsigned char hour,min,sek; //часы, минуты, секунды
    unsigned char day,month,year; //день, месяц, год
    void main(){
    // Port D initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTD=0x00;
    DDRD=0xFF;

    // 2 Wire Bus initialization
    // Generate Acknowledge Pulse: Off
    // 2 Wire Bus Slave Address: 0h
    // General Call Recognition: Off
    // Bit Rate: 400,000 kHz
    TWSR=0x00;
    TWBR=0x02;
    TWAR=0x00;
    TWCR=0x04;

    // I2C Bus initialization
    i2c_init();

    // DS1307 Real Time Clock initialization
    // Square wave output on pin SQW/OUT: Off
    // SQW/OUT pin state: 0
    rtc_init(0,0,0);
    rtc_set_date(01,03,9); //установить дату: день,месяц,год
    rtc_set_time(23,59,59); //установить время: часы, минуты, секунды

    PORTA.7 = 0x01;
    DDRA.7 = 0x00; // Это кнопка
    while(1)
    {
    if(!PINA.7)
    {
    rtc_get_time(&hour,&min,&sek); //считать время
    rtc_get_date(&day,&month,&year); //считать дату
    }
    }
    }

    1. Ты для начала скажи мне на кой чёрт тебе сдалось снимать синсуиду с кварца ?
      Там амплитуда колебаний очень маленькая и генерация постоянно срывается если осциллографом лезть. Но я смог углядеть её включив в щупе осциллографа делитель 1:10

          1. Эти функции работают нормально я проверял.
            импульсы на SQWT не пойдут пока ты сам это не разрешишь в регистре 0x07
            Кстати батарейку надо обязательно подключать или вешать VBAT на землю

            1. Вообщем проверил осциллографом, да синусоида есть, словил её…
              Сделал функцию инициализации такой: rtc_init(3,1,0);
              В визарде это вроде означает, что бы выводился сигнал через SQW/OUT
              Но, импульсы не идут, может стоит резистор припаять на SQW/OUT?

                  1. Блин придётся тебе курить матчасть основательно.
                    У каждого i2c устройства есть адрес по которому к нему можно обратится. Если на шине висит устройство с адресом который мы посылаем, то это устройство отсылает бит подтверждения (откликается на адрес)

                    http://easyelectronics.ru/interface-bus-iic-i2c.html

                    1. Да покурил её уже вроде))
                      но вот вообщем снимок с осциллогафа, в этот момент я нажимал кнопку и запускалась процедура rtc_get_time(hour,min,sec);
                      вот какие биты передаются (вверху SCL, внизу SDA)
                      как я понимаю, устройство вроде отвечает…
                      http://webfile.ru/image?id=5403140

  11. …И синусоиду получаю следующим образом:
    Как только щупом присоединяю к резонатору, так синусоида видна, но она со временем переходит в +0.5В и держится как постоянная. Щуп убираю, и снова дотрагиваюсь им до ножки резонатора, вновь синусоиджа появляется и опять пропадает, плавно переходя в +0.5В. Это нормально?

  12. Вобщем всё сделал, вся загвоздка была в том, что не было батарейки(или не была vBat заземлена) сейчас часики тикают(проверил это путём передачи из МК через RS-232 переменной, которая получает данные с таймера с помощью функции rtc_get_time(&hour,&min,&sek)).
    Спасибо огромное Medved’у, что помог в этой ситуации!)

  13. Будильника нету. Именно поэтому и ушел на аналогичную от NXP (на EE раскурили).
    У меня контроллер просыпается от внешнего прерывания именно от будильника.

Добавить комментарий