Урок 11. Працюємо з мікросхемою годинника реального часу DS1307

У цьому уроці я розповім про роботу з мікросхемою реального часу DS1307 в BASCOM-AVR. DS1307 ще називають RTC (Real Time Clock). Дана мікросхема представляє із себе годинник реального часу та календар. Зв'язок з мікросхемою здійснюється по інтерфейсу I2C. Її перевага в тому, що вона працює (рахує час) при вимкненому основному живленні від резервного джерела живлення в 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, вихідний, прошивка) ви можете нижче

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

Top