Статья №11
В этой статье я познакомлю вас с работой шины 1 – Wire и программировании её параметров в Bascom.
Cуществует три вида взаимодействия по шине данных:
- электронный – низкий уровень, высокий уровень сигнала; начало записи, например, по спаду импульса ;
- логический – например, как только байт прочитан, перейти к записи;
- протокольный - например, команда записи, по адресу, чтение.
Следует отметить, что протокол 1 – Wire является уникальным в силу того, что для приёма и передачи данных используется только одна линия связи. По этой же линии может осуществляться и питание ведомого устройства.
Логика работы по шине в общем случае может быть представлена следующим образом: сброс шины, ожидание сигнала «присутствие» - команда записи адреса устройства - команда чтения из устройства.
Сигналами шины являются: «запись лог.1», «запись лог.0», «чтение», «сброс», «присутствие» (см. Рис.1).
При сигнале «запись лог.1» ведущий устанавливает на шине низкий уровень в течении 1…15 мкс. При «запись лог.0» низкий уровень устанавливается на время не менее 60 мкс и не более 120 мкс. При сигнале «чтение» ведущий устанавливает низкий уровень в течении 1…15 мкс. После этого ведомый (или подчинённый) удерживает шину в низком состоянии, если желает передать лог.0, а при передаче лог.1 он просто освобождает линию. Сканирование шины необходимо выполнять по истечении 15 мкс после установки низкого уровня.
Если смотреть со стороны ведущего «чтение» является в сущности сигналом «запись лог.1». Собственно внутреннее состояние подчинённого будет определять этот сигнал «запись лог.1» или «чтение».
При сигнале «сброс» ведущий устанавливает низкий уровень в течении 480 мкс. Если на шине присутствует ведомое устройство, то оно после освобождения шины должно выдать отклик , сигнал «присутствие» - низкий уровень в течении 60 мкс.
На Рис.2 изображена принципиальная схема измерителя температуры, которая содержит микросхему термометр DS1821 и микроконтроллер ATtiny2313. Значения температуры отображаются на ЖК индикаторе типа MT-16S2H и передаются по RS-232 на терминал персонального компьютера.
Микросхема 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.
Программа состоит из блока инициализации порта 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.
Ниже смотрите текст самой программы:
$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 настоящей статьи.