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

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

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

$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:

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

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

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

Прикрепленные файлы:

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

Ваш адрес email не будет опубликован.