Статья №12


     В  продолжении  начатой  темы  о  протоколах  шин  I2C  и  1-Wire, я  хотел  бы  вас  ознакомить  со  схемой  на  Рис.1. Здесь  изображены  часы  DS1307  и  датчик   температуры, подключённые  к  микроконтроллеру  ATtiny2313. Время  и  температура  отображаются  на  ЖК – дисплее  типа  MT-16S2H. Подробнейшее  описание  подключения  ЖКИ, а  также  микросхемы  часов  и  датчика  температуры  вы  найдёте  в  предыдущих  статьях  по  Bascom.
 
    Рис.1 - Схема подключения часов DS1307 и термометра DS1821
 
     Микросхема  часов  реального  времени  работает  по  протоколу  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).
 
 Рис.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)  градусов.
 
 
    Рис.3
 
    Это  позволяет  управлять  нагревателем  таким  образом, чтобы  он  поддерживал  температуру  в  инкубаторе  в  заданных  пределах.
      
    Схема  для  инкубатора  представлена  на  Рис.4 . Во  время  включения  нагревателя  включается светодиод  HL1.
   
 
Рис.4 - Схема для инкубатора
 
 
   Текст  программы  “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  данной  статьи.