«Сайт о микроконтроллерах AVR .RU», версия для печати. Исходный документ: https://avr.ru/beginer/bascom/article11

Статья №11



     В  этой  статье  я  познакомлю  вас  с  работой  шины  1 – Wire  и  программировании  её  параметров  в  Bascom. 
     Cуществует  три  вида  взаимодействия  по  шине  данных:
- электронный – низкий  уровень, высокий  уровень  сигнала; начало записи, например, по  спаду  импульса ;                                                                                                                                                                                      
- логический – например, как  только  байт  прочитан, перейти  к  записи;                                                               
- протокольный -  например, команда  записи, по  адресу, чтение.

     Следует  отметить, что  протокол  1 – Wire  является  уникальным  в  силу  того, что  для  приёма  и  передачи  данных  используется  только  одна  линия  связи. По этой  же  линии  может  осуществляться   и  питание ведомого   устройства. 
     Логика  работы  по  шине  в  общем  случае  может  быть  представлена  следующим  образом:    сброс  шины, ожидание  сигнала  «присутствие»  - команда  записи  адреса  устройства - команда  чтения  из  устройства.
     Сигналами  шины  являются:  «запись  лог.1», «запись  лог.0», «чтение», «сброс», «присутствие»  (см. Рис.1).
 
Рис.1 - Сигналы шины 1-wire
 
     При сигнале   «запись  лог.1»  ведущий  устанавливает  на  шине  низкий  уровень  в  течении  1…15 мкс.  При  «запись  лог.0»  низкий  уровень  устанавливается   на   время  не  менее  60 мкс  и  не  более  120 мкс. При  сигнале  «чтение»  ведущий  устанавливает  низкий  уровень   в  течении  1…15 мкс. После  этого  ведомый  (или  подчинённый)  удерживает  шину  в  низком  состоянии, если  желает  передать  лог.0, а  при  передаче  лог.1  он  просто  освобождает  линию. Сканирование  шины  необходимо  выполнять  по  истечении  15 мкс  после  установки  низкого  уровня.
     Если  смотреть  со  стороны  ведущего  «чтение»  является  в  сущности    сигналом  «запись  лог.1». Собственно  внутреннее  состояние  подчинённого  будет  определять  этот  сигнал  «запись  лог.1»  или  «чтение».
     При  сигнале  «сброс»  ведущий  устанавливает   низкий  уровень  в  течении  480 мкс. Если  на  шине  присутствует  ведомое  устройство, то  оно  после  освобождения  шины  должно  выдать  отклик ,  сигнал  «присутствие» -  низкий  уровень  в  течении  60 мкс.
     На  Рис.2  изображена  принципиальная  схема  измерителя  температуры, которая  содержит  микросхему  термометр  DS1821  и  микроконтроллер  ATtiny2313.  Значения  температуры  отображаются  на  ЖК  индикаторе  типа  MT-16S2H  и  передаются  по  RS-232  на  терминал  персонального  компьютера. 
 
Рис.2 - Схема подключения термометра DS1821 (http://avr.ru/int/Files/Picture/Bascom/Article11/Pic.11_2.PNG)
 
     Микросхема  DS1821  имеет  два  режима  работы: режим  термостата  и  режим  термометра. Нас  будет  интересовать  режим  измерения  температуры. 
     DS1821  обеспечивает  измерение  температуры  в  диапазоне  -55…+125 град.С  с  дискретностью  один  градус. Гарантированная  точность  измерения  температуры  в  диапазоне  0…+85 град.С  составляет   +/- 1 град., а  во  всём  диапазоне  +/-2 град..  
 
     В  DS1821  являются  доступными  на  уровне  протокола    1-Wire  следующие  регистры:                              
- TH – регистр  верхнего  порога  температуры  термостата;                                                                                         
- TL – регистр  нижнего  порога  температуры  термостата;                                                                                           
- Регистр  температуры;                                                                                                                                                           
- Регистр статуса.
     Командами  для  преобразования  температуры  являются:                                                                                    
- ЕЕh – запуск  преобразования;                                                                                                                                            
- 22h – остановка  преобразования;                                                                                                                                 
- ААh – чтение  температуры.
     Командами  для  термостата  являются:                                                                                                                       
- 01h – запись  TH;                                                                                                                                                                      
- 02h – запись  TL;                                                                                                                                                                      
- A1h –чтение  TH;                                                                                                                                                                        
- A2h – чтение  TL;                                                                                                                                                                       
- 0Ch – запись  в  регистр  статуса;                                                                                                                                            
- Ach – чтение  из  регистра  статуса.
 
     Для  проведения  программирования  DS1821  должен  находится  в  режиме  термометра. Само  программирование  происходит  путём  установки  значений  битов  регистра  статуса  (см. Табл.1)
 
        Таблица 1 
                                                                                                                                                                  
     1SHOT  устанавливает  режим  одиночного  измерения  при  =1, т.е.  термометр  производит  одно  преобразование  при   приёме  команды  «запуск  преобразования» - &HEE. При  равенстве  данного  бита  0  преобразование  происходит  непрерывно  до  получения  команды  «остановка  преобразования» - &H22. 
     T/R – определяет   режим  работы  микросхемы  при  включении  питания: 1 – режим  термостата, 0 – однопроводный  режим  термометра.
     NVB – бит  занятости  энергонезависимой  памяти: 1 – идёт  запись, 0 – запись  завершена.
     DONE – бит  преобразования  температуры:  1 – конец   преобразования, 0 – преобразование  идёт.
     Биты  THF, TLF  флаги, определяющие  верхний  и  нижний  пределы  температуры  срабатывания  термостата. 
     POL – бит, определяющий  полярность  выходного  сигнала  термостата: 1 – активный  высокий  уровень, 0 – активный  низкий  уровень.
     Таким  образом, значение  байта  для  программирования  регистра  статуса  будет  равно  &B11000001.
 
     DS1821  может  быть  запрограммирована  и  при  помощи  адаптера, схема  которого  представлена  на  Рис.3. Программное  обеспечение  можно  найти  в  интернете.
 
     Конфигурация  выводов  шины  1-Wire  в  Bascom  происходит  следующим  образом:
     Config  1wire = PORTB.5
     Для  записи  в  подчинённое  устройство  используется  команда  «1wwrite байт, кол-во байтов» , а  для  чтения  «1wread (кол-во байтов)». Общий  сброс  шины  осуществляется – «1wreset». Приведём  пример  считывания  по  однопроводной  шине:
 
Config  1wire = PORTB.0 ‘ конфигурирование  вывода  порта В0                                                                                                                                                           
Dim   Z  As  Byte                ‘  определение  переменной                                                                                                                                                         
Const  Adress = &H33      ‘ адрес  чтения  в  подчинённом  устройстве                                                                                                                                                           
1wreset                              ‘  сброс  шины                                                                                                                                                        
1wwrite Adress, 1    ‘  запись  адреса, величиной  один  байт                                                                                                                                                                 
Z = 1wread (1)           ‘  чтение  одного  байта  в  переменную  Z
     Примером  использования  шины  1- Wire  является  также  программа  для  измерителя  температуры.                                                                                                                                                                        
     Блок – схема  программы  “1w”  приведена  на  Рис.3.
 
 
(http://avr.ru/int/Files/Picture/Bascom/Article11/Pic.11_3.PNG)
Рис.3 - Блок-схема программы "1w"
 
 
Программа  состоит  из  блока  инициализации  порта   1 – WIRE. Далее  следует  запись  в  регистр  статуса, определяющая  режим  работы  микросхемы, как  режим  однократного  измерения. Затем  в  цикле  происходит   считывание  модуля  температуры, выделение  и  определение  знака  и  определение  значения  температуры. Текст  программы  приведён  ниже.
 
      Программа  “1w”:

$regfile = "attiny2313a.dat"       'настройки
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
$sim

Config 1wire = Portb.5             'конфигурирование вывода под  однопроводный протокол

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                        'задержка  10 мс
Do
  Wait 1
  Cls
  1wreset
  1wwrite Startt                   'запуск преобразования
Waitms  10                           'задержка  10 мс
  1wwrite Readt                    'чтение температуры
  T = 1wread(1)

  Znak = T And &B10000000          'выделение знака температуры
  If Znak = 128 Then               'если знак =1 (-)
  Lcd "-"                          'то отображение на ЖКИ "-"
  Print "-"                        'и передача по RS-232 "-"
  Else
  Lcd "+"                          'иначе, отображение на ЖКИ "+"
  Print "+"                        'и передача по RS-232 "+"
  End If
  T = T And &B01111111             'определение температуры
  Lcd ; T                          'отображение на ЖКИ значения температуры
  Print ; T                        'передача знач. температуры по RS-232
Loop

End                                'end program

     Представим  теперь, что  перед  нами  стоит  задача  измерения  температуры  какого – либо  тела  в  восьми  его  точках  с  помощью  DS1821. Данную  задачу  мы  будем  решать  следующим   образом. Подключим  микросхемы  термометров  на  порт В  согласно  принципиальной  схемы  Рис.5. Затем  в  цикле  основной  программы  будем  по  очереди  инициализировать  выводы  РВ0 – РВ7, как  выводы  шины  1-Wire, считывая  значения  температуры  с  помощью  подпрограммы  и  отправляя  их  по  RS-232  в  порт  персонального  компьютера.
 
     Подпрограмма  считывания  температуры  из  DS1821  почти   полностью  повторяет  выше  описанную  программу  “1w”. Блок – схема  программы  для  использования  восьми  датчиков температуры  - “1w8”  приведена  на  Рис.6.
  
 
Рис.6 - Блок-схема программы "1w8"
 
 
Ниже  смотрите  текст  самой  программы:

$regfile = "attiny2313a.dat"       'настройки
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
$sim                                                ’не забудьте  убрать  эту  команду  при  прошивке  контроллера

Declare Sub Tempread(t As Byte , Znak As Byte)       'определение подпрограммы

Const Startt = &HEE                'команда начала преобразования
Const Readt = &HAA                 'команда чтения температуры
Const Status = &B11000001          'значение регистра статуса
Const Adresst = &H0C               'команда записи  в  регистра статуса

Dim T As Byte                      'определение переменных
Dim Znak As Byte
Dim I As Byte

For I = 0 To 7                     'основной цикл программы
Config 1wire = Portb.i             'конфигурирование вывода под под однопроводный протокол
1wreset                            'cброс шины 1-Wire
1wwrite Adresst , 1                'запись в регистр статуса (режим одиночного измерения)
1wwrite Status , 1
Waitms 10
Call Tempread(t , Znak)            'cчитывание температуры
Next I

Sub Tempread(t As Byte , Znak As Byte)       'подпрограмма считывания температуры
  Wait 1
  Cls
  1wreset
  1wwrite Startt , 1               'запуск преобразования
  Waitms 10                        'задержка 10 мс
  1wwrite Readt , 1                'чтение температуры
  T = 1wread(1)

  Znak = T And &B10000000          'выделение знака температуры
  If Znak = 128 Then               'если знак =1 (-)
  Print "-"                        'и передача по RS-232 "-"
  Else
  Print "+"                        'и передача по RS-232 "+"
  End If
  T = T And &B01111111             'определение температуры
  Print " " ; "T" ; I ; "=" ; T    'передача знач. температуры по RS-232
End Sub

End                                'end program

     До  сих  пор,  рассматривая   работу  схем  с  применением   микроконтроллеров, мы  не  учитывали  проблему  энергосбережения. Однако,  данная  проблема  становится  весьма  актуальной  при  автономном  питании  устройства, когда  контроллер  работает  вхолостую, напрасно  пожирая  драгоценную  энергию.
     В  подобных  случаях  в  целях  экономии  энергии  применяется  спящий  режим  (Sleep)  и  остановка  (Powerdown). 
 
     ATtiny2313  может  быть  погружен  в  сон  двумя  способами:                                                                              
- командой  Idle, в  результате  которой  останавливается  тактовый  генератор, но  UART, внешние  прерывания  и  прерывания  по  таймеру – счётчику  продолжают  работать. Все  они  выводят  микроконтроллер  из  спящего  режима;                                                                                                                            
– командой  Powerdown, в  результате  которой  останавливается  тактовый  генератор,  и  продолжают  работать  только  внешние  прерывания. 
     Рассмотрим  пример  применения  команды  Powerdown  на  предыдущей  схеме  (см. Рис. 2), немного  изменив  её, подключив  к  выводу  INT0  подтягивающий  резистор   10 КОм  и  кнопку  замыкающую  вывод  INT0  на  землю. В  основном цикле  DO…LOOP  прграмма  входит  в  спящий  режим  с  помощью  команды  Powerdown. Четыре  измерения  температуры  будут  происходить   с  интервалом  одна  секунда  только  при  нажатой  кнопке. После  этого  программа  снова  входит  в  основной  цикл, где  благополучно  засыпает. Текст  программы  “powerdown”  приведён  ниже:
 
$regfile = "attiny2313a.dat"       'настройки
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32

Config 1wire = Portb.5             'конфигурирование вывода под под однопроводный протокол
Config Int0 = Low Level            'прерывания по низкому уровню

Const Startt = &HEE                'команда начала преобразования
Const Readt = &HAA                 'команда чтения температуры
Const Status = &B11000001          'значение регистра статуса
Const Adresst = &H0C               'команда  записи  в  регистр  статуса


Dim T As Byte                      'определение переменных
Dim Znak As Byte
Dim I As Byte

1wreset                            'cброс шины 1-Wire
1wwrite Adresst ,1          'запись в регистр статуса (режим одиночного измерения)
1wwrite Status,1

On Int0 Button                     'определение подпрограммы прерывания
Enable Interrupts                  'разрешение прерываний
Enable Int0

Do
  Cls
  Lcd "Guten Nacht!"
  Wait 1
  Powerdown                        'переход в спящий режим
Loop

Button:
  For I = 0 To 3
  Wait 1
  Cls
  1wreset
  1wwrite Startt                   'запуск преобразования
  Waitms 10
  1wwrite Readt ,1                   'чтение температуры
  T = 1wread(1)

  Znak = T And &B10000000          'выделение знака температуры
  If Znak = 128 Then               'если знак =1 (-)
  Lcd "-"                          'то отображение на ЖКИ "-"
  Print "-"                        'и передача по RS-232 "-"
  Else
  Lcd "+"                          'иначе, отображение на ЖКИ "+"
  Print "+"                        'и передача по RS-232 "+"
  End If
  T = T And &B01111111             'определение температуры
  Lcd ; T                          'отображение на ЖКИ значения температуры
  Print ; T                        'передача знач. температуры по RS-232
   Next I
Return

End                                'end program 
 
     Bascom  позволяет  реализовать  в  программе также  функцию  Watchdog  (сторожевой  пёс). Watchdog  - это  такая  функция, которая  сбрасывает  контроллер, если  программа  начинает  зависать. По  сути  это  таймер, который  нужно  регулярно  обнулять. Если  программа  зависает, она  не  делает  очередного  сброса  счётчика. Как  только  он  переполняется, происходит  аппаратный  сброс  контроллера. Эта  функция  нужна  в  приложениях, где  стабильность  работы  критична, и  устройство  должно  работать, чтобы  ни  произошло.  
     Программа  контроллера  должна  взаимодействовать  с  таймером  Watchdog, поскольку  его  срабатывание – это  внештатная  ситуация, которая  может  быть  вызвана  как  неисправностью  самой  программы, так  и  оборудования. В  любом  случае  необходимо  позаботиться  о  системе  протоколирования  ошибок, иначе  очень  трудно  будет  узнать  причину  сбоя. И  возможно  данный  сбой  повторится  вновь.
 
     Watchdog  настраивается  следующим  образом: 
Config  Watchdog  16| 32| 64| 128| 256| 512| 1024| 2048
      Диапазоне  настройки  составляет   от  16  до  2048 миллисекунд. Счётчик  нужно  постоянно  сбрасывать  перед  переполнением:
Reset  Watchdog
      Это  необходимо  для  того, чтобы  предотвратить  аппаратный  сброс.
      Watchdog  может  быть  запущен  или  остановлен  в  любой  момент:
Start   Watchdog                                                                                                                                                                         
Stop  Watchdog
 
     Примером  использования  вынужденного  срабатывания  таймера  является  следующая  программа  “watchdog”:

$regfile = "attiny2313a.dat"       'настройки
$Crystal=4000000
$hwstack=40
$swstack=16
$framesize = 32

Config Watchdog = 2048             'определение времени счёта  Watchdog

Do
  Cls
  Wait 1
  Lcd "Wait 2 sec"
  Start Watchdog                   'включение  Watchdog
  Idle                             'вкючение спящего режима
Loop

End                                'end program

     После  команды  Start  Watchdog  командой  Idle  включается  спящий  режим  и  останавливается  тактовый  генератор. Так  как  Watchdog  работает  на  независимом  тактовом  генераторе, через  две  секунды  он  генерирует  принудительный  аппаратный  сброс.
     Все  описанные  выше  программы   находятся  в  папке  приложение 1 (http://avr.ru/int/Files/Dounload/Bascom/Article11/Attachment_11_1.zip)  настоящей  статьи.


  

Все права защищены © AVR.RU, 2021.