Главная » Микроконтроллеры
Призовой фонд
на октябрь 2020 г.
1. 1500 руб
Сайт Паяльник
2. Тестер компонентов MG328
Сайт Паяльник
3. 150 руб.
От пользователей

Похожие статьи:



Блок питания 5В, ток 2-60А

Урок 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, исходник, прошивка) вы можете ниже

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

Теги:

Яковлев Александр Вячеславович Опубликована: 2012 г. 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (11) | Я собрал (0) | Подписаться

+2
Вячеслав #
Часы работают, но программа не дописана, требуется добавить индикацию "0" перед hour и mine, if < 10
И проверку правильности ввода времени нужно добавить
if Hour =>24 then
Hour = 0
...
Ответить
0
Леня #
Вячеслав, правда ваша, но есть еще другая беда. Минуты порой показывают ерунду. Вообще загадка. Так и не понял в чем дело. А часы у меня нормально отображаются. Только делаю так.
I2cstart 'читаем время из ds1307
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 , 16 'выводим время из ds1307 на дисплей
Lcd Hour ; ":"

If Mine < 10 Then
Lcd "0" ; Mine
Else
Lcd Mine
End If
Ответить
0
Ансаган #
У меня не получалось изначально запустить часы на экране выскакивает: 00:00:80 прочитав описание понял, что часы остановлены, нужно выставить бит в секундах, вроде выставил, но часы показывают то же самое. Я сделал условие с инкрементированием на секунды и после этого часы запустились. В чем может быть проблема?
Ответить
0
Ансаган #
Разобрался с секундами, для запуска часов нужно сбросить бит в часах реального времени Бит 0 в секундах. И будет вам счастье
Ответить
0
Egor #
Можно по подробнее как работает? Алгоритм какой? Как связаны м/к и rtc. Ну вообще не очень понятен общий принцип.
Ответить
0
Attiny2313 #
Собрал на меге 16. Всё работает, но что бы я не делал DS1307 В дате и дне возвращает 0. В прошивке нет настройки, часы настроены другой программой, тоже скинул.
Прикрепленный файл: Clock.bas
Прикрепленный файл: Init.bas
Ответить
0
torneb #
Ваш код не всегда будет работать.Так, если вы поставите чрв с вынутой и вставленной батарейкой-они будут стоять,потому что запуск(запись той самой секунды) у вас не предусмотрен.Логично было бы записывать секунду при изменении минут.Тогда бы работал всегда.
Ну и после инициализации чтения неплохо было бы добавить I2cstop, а потом опять старт. Смотрите апноут по работе с ds1307на сайте баскома
Отредактирован 23.07.2016 10:11
Ответить
0
Андрей #
Какое напряжение должно быть на ножках 5 и 5 микросхемы DS1307
Ответить
0
Слава #
Для начальной установки даты-времени существуют операторы Time$ = "08:51:00" и Date$ = "01-19-17" в текстовом формате. Можно установить по-отдельности,например: Time$ = "08"+":"+"51"+":"+"00". Вместо символов в кавычках можно оператором - CHR(51) Time$="08"+":"+CHR(51)+":"+"00" или вместо цифр -переменные CHR(val). И т.п.
Ответить
0
Александр #
А проверьте какое значение отдаем 1307 в дне неделе после перехода с 7-го на 1-й день недели
Ответить
0
Евгений Алексеевич Мишин #
Это бесценная информация, спасибо за ваши труды!
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическая мощность?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Pickit 2 - USB-программатор PIC-микроконтроллеров
Pickit 2 - USB-программатор PIC-микроконтроллеров
Макетная плата для пайки (10 шт) Конструктор регулируемого преобразователя напряжения LM317
вверх