Подключаем часы реального времени (RTS DS1307) к микроконтроллеру.
Никаких Ардуин, только хардкор.

Часы реального времени (RTS DS1307).

Захотелось мне собрать часы на лампах. Ну… теплый ламповый свет, винтаж, округлость цифр, романтика и все такое. Уже начал делать и подумал, а почему бы не прикрутить к МК вместо сурового часового кварца модуль RTS. Я понимаю, что для домашних часов такой вариант избыточен, но почему бы не изучить тему и не закрыть гештальт.


Для проекта я заказал себе модуль на DS1307 с дополнительной EEPROM памятью (АТ24С32). Модуль взаимодействует с внешним миром по двухпроводной шине I2C применяемой для соединения низкоскоростных устройств. Согласно даташита на DS1307, максимальная рабочая частота передачи данных 100кГц.

Принципиальная схема модуля проста как автомат Калашникова. Имеет необходимые подтягивающие резисторы R1, R2, R3 и R8, фильтрующие конденсаторы C1 и C2, а также линию заряда R5, VD1. Надо учитывать тот факт, что если вы используете батарею, которая не предназначена для зарядки, то во избежание неприятностей цепь заряда лучше разорвать, удалив один из элементов. Также на плате предусмотрено место для монтажа датчика температуры, DS18B20. Он имеет свой обособленный выход и общается самостоятельно по протоколу 1-Wire.

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

Назначение контактов:
      1. Vcc – питание модуля (+5V);
      2. GND – общая шина питания (земля);
      3. BAT – выход/вход аварийного питания;
      4. SDA – Линия данных (Serial Data);
      5. SCL – Линия тактирования (Serial Clock);
      6. SQ – выход внутреннего тактового сигнала;
      7. DS – линия для общения с датчиком температуры.


Соответственно, для наших нужд, понадобятся только контакты: Vcc, GND, SDA и SCL. С целью проверки работы подпрограмм я подключил модуль RTS к ATiny 26. Для тестов выводить данные будем на дисплей Nokia 5110. но без использования аппаратного SPI.

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

В приложенной библиотеке (Lib_DS1307_v0.2.c) для DS1307 есть подпрограммы:
      1. Передача байта по указанному адресу (send_ds1307). Принимает адрес памяти для записи и байт данных. Возвращает «0» если запись прошла успешна, в противном случае число больше ноля.
      2. Чтение данных по указанному адресу (read_byte_ds1307). Принимает байт адреса памяти для чтения. Возвращает байт данных по указанному адресу.
      3. Подпрограмма инициализации часов (init_ds1307). Принимает флаг очистки «1», настраивает пины МК и в случае поднятого флага очистки устанавливает минимальные значения всех параметров времени, останавливает внутренний генератор импульсов, запускает часы. Возвращает «0» если инициализация прошла успешна или единицу если что-то пошло не так.
      4. Подпрограмма преобразования данных из формата принятого в DS1307 в простое целое число формата unsigned char (convert_time_char_ds1307). Принимает данные формата DS1307, возвращает данные формата целого беззнакового числа (unsigned char).
      5. Подпрограмма преобразования данных из формата беззнакового целого 8-ми битного числа в формат часов DS1307 (convert_char_time_ds1307). Принимает байт беззнакового целого числа, возвращает байт формата DS1307.


Модуль RTS можно подключать к любым выводам на одном порту. Для корректной работы необходимо указать в библиотеке порт и подключаемые выводы, а также параметр паузы для МК, работающих на частоте более 1 МГц. Т.к. максимальная передача данных не должна превышать 100 кГц параметр паузы необходимо подобрать исходя из частоты работы контроллера.

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

Например, 56 минут будут записаны как 0b 0101 0110 (0x56), а не как 0b00111000 (0x38). В этом есть своя логика. При таком формате, для отображения данных на дисплее часов, не требуется дополнительного пересчета. Мы берем данные старшего ниббла (0101) и отображаем их как цифру 5 в десятках минут, а взяв младший ниббл (0110) отобразим его как цифру 6 в единицах минут. Очень удобно.


Обзор будет неполон если ничего не сказать про микросхему дополнительной памяти АТ24С32. Я, честно сказать, не углублялся в эту тему и могу ошибаться, но если верить даташиту, то данная микросхема имеет 8 страниц по 4096 байт в каждой. Если я правильно понял, страницы переключаются аппаратно в зависимости от состояния ног А1…А3, а также обращение к ним дополнительно реализовано на программном уровне при составлении адреса устройства. До конца я в этом так и не разобрался. Согласно схеме на всех указанных выводах у нас нули, а значит мы можем обратиться только к нулевой странице (но это не точно). Исходя из этого я накидал две подпрограммы, которые могут считать и записать байт в эту область памяти.
      1. Подпрограмма записи байта в ЕЕПРОМ (write_at24c32). Подпрограмма принимает адрес записи типа int, а также байт записываемых данных. Возвращает «0» если запись прошла успешно или «1» если что-то пошло не так.
      2. Подпрограмма чтения байта из ЕЕПРОМ (read_byte_at24c32). Подпрограмма принимает адрес записи типа int. Возвращает прочитанный байт.

Еще надо упомянуть о том, что микросхема эта не быстрая и для корректной записи значения в память нужно время. Если будете заливать в память большой объем данных или захотите организовать побайтное стирание, то после каждой записи в ЕЕПРОМ необходимо делать приличную паузу.


Ну вот вроде и все, RTS DS1307 освоен. Будем делать часы на лампах ИН-12.

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

А на сегодня всё. Удачи.

06.12.2024


Если вдруг найдете в статье неточности или заблуждения. Напишите мне об этом. Я подправлю.

Приложения:
Библиотека для RTS DS1307, схемы, тестовая программа в CV_AVR.