Урок 11. Работаем с DS1307 микросхемой часов реального времени

В этом уроке я расскажу про работу с микросхемой реального времени DS1307 в BASCOM-AVR. DS1307 ещё называют RTC (Real Time Clock). Данная микросхема представляет из себя часы реального времени и календарь. Связь с микросхемой осуществляется по интерфейсу IC. Её преимущество в том, что она работает (считает время) при выключенном основном питании от резервного источника питания в 3 вольта (например, от батареики типа CR3022). Но в DS1307 есть один недостаток: в ней нет проверки на правильность введённых данных. Для работы с микросхемой потребуется минимальный обвес: кварц на 32768Hz, батарея на 3 вольта и два резистора на 4,7кОм. Схема подключения DS1307:

Подключение DS1307

Работа с DS1307 в BASCOM-AVR

Для начала работы с микросхемой необходимо сконфигурировать порты, к которым подключена микросхема, для этого воспользуемся командой Config:
Config Sda = (Порт микроконтроллера к которому подключена нога SDA микросхемы DS1307)
Config Scl = (Порт микроконтроллера к которому подключена нога SCL микросхемы DS1307)
Например:
Config Sda = Portb.1
Config Scl = Portb.0

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

 I2cstart                                                    I2cwbyte &HD0                                               I2cwbyte &H00                                               I2cstart                                                     I2cwbyte &HD1                                                I2crbyte (переменная в которую запишем секунды) , Ack                                          I2crbyte (переменная в которую запишем минуты)  , Ack                                          I2crbyte (переменная в которую запишем часы)  , Ack                                       I2crbyte (переменная в которую запишем номер дня недели)  , Ack                                           I2crbyte (переменная в которую запишем дату), Ack                                        I2crbyte (переменная в которую запишем номер месяца)  , Ack                                         I2crbyte (переменная в которую запишем год)  , Nack                                         I2cstop 

После чтения данных необходимо перевести их в десятичный формат, вот так:
(переменная секунд)  = Makedec((переменная секунд))
(переменная минут)   = Makedec((переменная минут))
(переменная часов)   = Makedec((переменная часов))
(переменная дня недели)   = Makedec((переменная дня недели))
(переменная даты)  = Makedec((переменная даты))
(переменная месяца)  = Makedec((переменная месяца))
(переменная года)   = Makedec((переменная года))

Вот пример чтения времени и даты, а также перевод их в десятичный формат:

 I2cstart I2cwbyte &HD0 I2cwbyte &H00 I2cstart I2cwbyte &HD1 I2crbyte Seco , Ack I2crbyte Mine , Ack I2crbyte Hour , Ack I2crbyte Day , Ack I2crbyte Dat , Ack I2crbyte Month , Ack I2crbyte Year , Nack I2cstop Seco = Makedec(seco) Mine = Makedec(mine) Hour = Makedec(hour) Day = Makedec(day) Dat = Makedec(dat) Month = Makedec(month) Year = Makedec(year) 

Данные считывать научились, теперь попробуем записывать данные в DS1307. Вот так:
(Переменная которую запишем) = Makebcd((Переменная которую запишем))
I2cstart
I2cwbyte &HD0
I2cwbyte (Ячейка в которую запишем данные)
I2cwbyte (Переменная которую запишем)
I2cstop

Обратите внимание, что команда Makebcd переводит переменную в двоично-десятичный формат. Номера и обозначения ячеек:

Номер ячейки

Данные

Пример

0

Секунды

I2cwbyte 0

1

Минуты

I2cwbyte 1

2

Часы

I2cwbyte 2

3

Номер дня недели

I2cwbyte 3

4

Дата

I2cwbyte 4

5

Месяц

I2cwbyte 5

6

Год

I2cwbyte 6

Вот пример записи переменной секунд:
Seco = Makebcd(seco)
I2cstart
I2cwbyte &HD0
I2cwbyte 0
I2cwbyte Seco
I2cstop
Кстати, следует учесть, что при первом запуске DS1307 (например, при подключении батареи резервного питания) микросхема будет возвращать в секундах значение 80, это означает, что часы остановлены. Для их запуска запишите в секунды значение 1. Если DS1307 при чтении любых данных возвращает значение 255 или 168 это означает что, микросхема неправильно подключена, либо отсутствует батарея резервного питания.

Практическая работа с микросхемой DS1307

Теперь попробуем поработать с микросхемой DS1307 на практике: соберём простые часы с установкой времени с помощью кнопок. Для этого возьмём саму микросхему DS1307, микроконтроллер Attiny2313, LCD индикатор на контроллере HD44780 и несколько дискретных компонентов. Соберём простую схему:

Схема для работы с DS1307

И напишем простую программу, применяя полученные знания:

 $regfile = "attiny2313.dat" $crystal = 4000000  Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2 Config Lcd = 16 * 2  Config Pind.5 = Input Config Pind.4 = Input  Config Sda = Portb.1 Config Scl = Portb.0  Dim Seco As Byte Dim Mine As Byte Dim Hour As Byte  Initlcd Cls Cursor Off  Do I2cstart I2cwbyte &HD0 I2cwbyte &H00 I2cstart I2cwbyte &HD1 I2crbyte Seco , Ack I2crbyte Mine , Ack I2crbyte Hour , Nack I2cstop Seco = Makedec(seco) Mine = Makedec(mine) Hour = Makedec(hour) Locate 1 , 1 Lcd Hour ; ":" ; Mine ; ":" ; Seco ; "    "  If Pind.5 = 0 Then Incr Mine Mine = Makebcd(mine) I2cstart I2cwbyte &HD0 I2cwbyte 1 I2cwbyte Mine I2cstop Waitms 100 End If  If Pind.4 = 0 Then Incr Hour Hour = Makebcd(hour) I2cstart I2cwbyte &HD0 I2cwbyte 2 I2cwbyte Hour I2cstop Waitms 100 End If  Loop End 

Работа часов в Proteus:

Работа часов в Proteus

Установка фьюз битов:

Установка фьюз битов

Кстати, сейчас я работаю над продвинутыми, часами, на DS1307 и ATtiny2313. Скоро будет про них статья, а пока их фото:

Фото часов

Скачать файлы для урока (проект в Proteus, исходник, прошивка) вы можете ниже

Урок 12. Работа с компьютерной PS/2 клавиатурой в BASCOM-AVR