Урок 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, вихідний, прошивка) ви можете нижче
Урок 12. Робота з комп'ютерною PS/2 клавіатурою в BASCOM-AVR
Прикріплені файли:
- mc168.rar (17 Кб)