Статья №12
В продолжении начатой темы о протоколах шин I2C и 1-Wire, я хотел бы вас ознакомить со схемой на Рис.1. Здесь изображены часы DS1307 и датчик температуры, подключённые к микроконтроллеру ATtiny2313. Время и температура отображаются на ЖК – дисплее типа MT-16S2H. Подробнейшее описание подключения ЖКИ, а также микросхемы часов и датчика температуры вы найдёте в предыдущих статьях по Bascom.
Микросхема часов реального времени работает по протоколу I2C (к стати, что такое протокольный уровень или «рожа твоя протокольная» вы без труда найдёте также в предыдущих статьях), а датчик температуры - по 1-Wire. Невольно возникает логичный вопрос: почему датчик и часы работают в разных протоколах, и почему бы не использовать датчик температуры, работающий как и DS1307 по I2C (например, описанный ранее Lm76)?
Увы, господа, к величайшему сожалению программной памяти микроконтроллера ATtiny2313 не хватает и этот логичный вариант (например, с Lm76) превышает объём программной памяти на 38%.
За простоту разработок в Bascom необходимо платить. Ибо сам Bascom занимает от 20 – 30% программной памяти микроконтроллера.
По 7 – 10% памяти занимают такие команды, как “Lcd”, “Print”, “Input” и плюс ещё идущие за ними строковые переменные.
Однако, нам всё же удалось реализовать схему часы – термометр, пусть и на «гибридной основе», а именно – DS1307 по шине I2C, а DS1821 по шине 1-Wire. Но, следует отметить, что данная программа занимает 98% памяти микроконтроллера и, поэтому работает как говорят : «на пределе».
Суть работы данного устройства состоит в том, что происходит последовательный опрос времени с DS1307 по I2C и температуры по 1-Wire c DS1821.
Работа этих устройств по отдельности подробно рассматривалась в предыдущих статьях, поэтому не будем останавливаться на этом . Основное отличие заключается в том, что задание часов и минут происходит с терминала Bascom, т.е. с клавиатуры персонального компьютера (ПК).
При использовании команды Input “Enter…” в программе микроконтроллера в терминале появляется надпись “Enter…”. Это происходит как при эмуляции программы, так и при её симуляции (см.Рис.2).
Дело в том, что Bascom использует функцию «эхо», с которой вы уже встречались по предыдущим статьям (где описывалась работа RS-232 – UART). При желании эту функцию можно отключить, если вы хотите использовать другую программу для работы с контроллером, и она не может отрабатывать символы «эхо»:
Echo off
Прерывание программы и его обработка по установке часов и минут происходит при нажатии любой клавиши на клавиатуре ПК.
На экране терминала появляется надпись:” Enter Minut (0-59)=”. Затем поле ввода значений минут и нажатия кнопки “Enter” на клавиатуре ПК в терминале появляется другая надпись: “Enter Houer (0-59)=”, которая требует ввести значение часов. После ввода значений минут и часов программа записывает их по I2C в микросхему часов DS1307 и переходит в основной цикл, где происходит чтение часов и минут с DS1307 по I2C, а также считывание температуры по 1-Wire с микросхемы DS1821. Текст программы “Clock+Termo” с подробными комментариями приводится ниже :
$regfile = "attiny2313a.dat" 'настройки
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
Config Sda = Portb.5 'конфигурация I2C
Config Scl = Portb.7
Config I2cdelay = 10
Config Pind.1 = Output 'TxD
Config Pind.0 = Input 'RxD
'инициализация часов
Const Adressr = &B11010001 'команда-cчитывание
Const Adressw = &B11010000 'команда-запись
Const Minadress = &H01 'адрес регистра минут
Const Clockadress = &H02 'адрес регистра часов
Const Uprbyte = &B00010000 'знач. регистра управления
Const Upradress = &H07 'адресс регистра управления
Const Clock24 = 0 '24-x часовой режим работы
'определение переменных часов
Dim Minut As Byte
Dim Eminut As Byte
Dim Clock As Byte
Dim Eclock As Byte
Dim Tens As Byte
Dim Ones As Byte
Dim Z As Integer
Declare Sub Ed ’определение подпрограммы
'инициализация термометра
Config 1wire = Portb.6 'конфигурирование вывода под под однопроводный протокол
Const Startt = &HEE 'команда начала преобразования
Const Readt = &HAA 'команда чтения температуры
Const Status = &B11000001 'значение регистра статуса
Const Adresst = &H0C 'команда записи в регистр статуса
Dim T As Byte 'определение переменных термометра
Dim Znak As Byte
1wreset 'cброс шины 1-Wire
1wwrite Adresst , 1 'запись в регистр статуса (режим одиночного ‘измерения)
1wwrite Status , 1
Waitms 10
On Urxc Button 'определение подпрограммы прерываний
I2cstart 'запись байта в регистр упрaвления
I2cwbyte Adressw
I2cwbyte Upradress
I2cwbyte Uprbyte
I2cstop
Enable Interrupts 'разрешение прерываний
Enable Urxc 'разрешение прерываний по приёму
Do 'считывание минут и часов из DS1307
'I2cstart
'I2cwbyte Adressr
'I2cwbyte Minadress
'I2crbyte Minut , Ack 'считывание минут
'I2crbyte Clock , Nack 'считывание часов
'I2cstop
Eminut = Minut And &B00001111 ’преобразование знач. час. и мин в bin cod
Minut = Minut And &B11110000
Shift Minut , Right , 4
Eclock = Clock And &B00001111
Clock = Clock And &B11110000
Shift Clock , Right , 4
Cls
1wreset ’определение температуры
1wwrite Startt , 1 'запуск преобразования
1wwrite Readt , 1 'чтение температуры
T = 1wread(1)
Znak = T And &B10000000 'выделение знака температуры
If Znak = 128 Then 'если знак =1 (-)
Lcd " -" 'то отображение знака на ЖКИ "-"
End If
T = T And &B01111111 'определение температуры
Lcd " " ; T ; " C" ’отображение температуры на ЖКИ
Lowerline ’переход на нижнюю строку ЖКИ
Lcd " " ; Clock ; Eclock ; ":" ; Minut ; Eminut 'индикация на ЖКИ часов и ‘минут
Loop ’ конец основного цикла
Button: 'установка (прерывание по приёму)
Input "Enter Minutes (0-59) =" , Minut 'ввод минут
Input "Enter Houers (0-23) = " , Clock 'ввод часов
I2cstart 'задание 24-х часового режима работы
I2cwbyte Adressw
I2cwbyte Clockadress
I2cwbyte Clock24
I2cstop
Z = Minut
Call Ed 'вызов подпрограммы
Eminut = Ones ' единицы минут
Minut = Tens ' десятки минут
Shift Minut , Left , 4
Z = Clock
Call Ed 'вызов подпрограммы
Eclock = Ones ' единицы часов
Clock = Tens ' десятки часов
Shift Clock , Left , 4
Minut = Eminut + Minut 'двоично-десятичный код минут
Clock = Clock + Eclock ' тоже часов
I2cstart 'запись cекунд, минут и часов в DS1307 в двоично-‘десятичном коде
I2cwbyte Adressw
I2cwbyte &H00 'пуск часов (адрес секунд)
I2cwbyte &H00 ’запись секунд в DS1307
I2cwbyte Minut ’запись минут в DS1307
I2cwbyte Clock ’запись часов в DS1307
I2cstop
Return
Sub Ed 'подпрограмма выделения единиц и десятков
Tens = 0
Ones = 0 'приём числа
Do 'выделение десятков
Z = Z - 10
If Z < 0 Then Exit Do
Tens = Tens + 1
Loop
Z = Z + 10 'выделение единиц
Ones = Z
End Sub
End 'end program
В продолжении темы я хочу вас познакомить с тем, как использовать микросхему DS1821 в качестве термостата.
Допустим у вас есть инкубатор, где температура должна быть поддержена в пределах от +40 до + 50 градусов по Цельсию (я говорю примерно). Тогда в верхний регистр микросхемы TH мы должны записать 50, а в нижний TL 40 (градусов по Цельсию). При этом нагреватель должен включатся при температуре ниже +40 и выключаться при температуре , превысившей +50 градусов.
Программировать микросхему, как термостат, лучше всего с помощью адаптера, схема которого была приведена в предыдущей статье и программного обеспечения, которое вы без труда отыщете в интернете (на сайте фирмы – производителя). На практике все так и делают. Окно для программирования представлено на Рис.3. Вам останется лишь указать температурные пределы TH , TL и нажать кнопку “Thermostat”. Данные значения поступят в энергонезависимую память. При этом активным уровнем термостата будет низкий уровень, т.е. до температуры 50 (+/- 1) градусов уровень на линии данных будет высоким, а при превышении сменится на низкий и будет оставаться таким пока температура не опустится ниже 40 (+/- 1) градусов.
Это позволяет управлять нагревателем таким образом, чтобы он поддерживал температуру в инкубаторе в заданных пределах.
Схема для инкубатора представлена на Рис.4 . Во время включения нагревателя включается светодиод HL1.
Текст программы “Thermostat” приведён ниже:
$regfile = "attiny2313a.dat"
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
Config Pinb.6 = Input 'датчик-термостат
Config Pind.6 = Output 'вывод нагревателя
Config Pind.5 = Output 'вывод светодиода
Do
If Portb.6 = 0 Then 'если сработал термостат
Reset Portd.6 'то-выключение нагревателя и светодиода
Reset Portd.5
Else
Set Portd.6
Set Portd.5
End If
Loop
End 'end program
Все программы, как всегда находятся в папке приложение 1 данной статьи.