Работаем с датчиками DS18B20/DS18S20. Библиотека на ассемблере для PIC.

2014-06-29

В статье речь пойдет о библиотеке, написанной на ассемблере, для работы с датчиками температуры DS18B20/DS18S20. Библиотека написана для микроконтроллеров PIC16. Отлажена в MPLab 8.8. Работоспособность библиотеки проверена на схеме термометра с датчиками ds18b20/ds18s20. Сейчас организована поддержка тактирования микроконтроллера от 4МГц. Далее предполагается добавить поддержку 10 МГц, 20МГц.

В этой статье опишу возможности библиотеки, а также как подключить ее к своему исходнику и, как настроить библиотеку под себя.

Arduino Uno перестала определяться??? Узнайте один из способов реанимации тут - Arduino Uno не определяется.

Возможности библиотеки версия 1.0:

  1. Пропуск считывания серийного номера;
  2. После преобразования считывается только температура;
  3. Возможен вывод на 3-х разрядный семисегментный индикатор;
  4. Включения/отключения сброса сторожевого таймера;
  5. Вкл/откл прерываний (на время работы с библиотекой), если таковые используются;
  6. Включение/отключение функции определения семейства датчика на линии;
  7. Вкл/откл функции использования прерывания для формирования задержки в 750мс;
  8. Вкл/откл перекодировки для вывода на LED индикатор;
  9. Вкл/откл округления долей градусов.
  10. Продолжение следует…

Подключаем библиотеку к своему исходнику.

Скачиваем библиотеку ds18x20.asm и помещаем в папку со своим проектом. Далее в том месте своей программы, где необходимо вставить функцию работы с датчиками DS18B20/DS18S20 вставляем следующую строку:

#include    "C:\Program Files\Microchip\Program\ds18x20\ds18x20.asm"

Не забываем изменить путь к файлу библиотеки на свой. Переходим к следующему шагу.

Необходимые действия для работоспособности библиотеки.

В шапке своей программы, где определяются все регистры, флаги, константы, макросы необходимо разместить следующие определения.

ON                   equ           .1
OFF                  equ           .0

Регистры общего назначения. Регистры определяйте так, как Вам удобнее.

Reg_1
Reg_2
Reg_3
Delay_800_reg
Flag
TLSB
TMSB       
TEMP
COUNT
FIG1
FIG2
FIG3
Regin1
Regin2
Regin3
Regin3_temp
Ds_fam

Далее определение флагов и прочих дефайнов.

#define             Flag_ds_fam      Flag,6               ;Пропуск повторного чтения семейства датчика.
#define             Flag_P               Flag,5               ;Флаг точки
#define             Flag_otr_rez       Flag,4               ;Флаг отрицательного результата преобразования температуры
#define             Flag_start          Flag,3               ;Флаг первого включения
#define             Flag_800           Flag,2               ;Флаг 750мс
#define             Flag_ds18b20     Flag,1               ;Флаг датчика DS18B20
#define             Flag_gie            Flag,0               ;Флаг общего разрешения прерываний
#define             Datchik             PORTB,1            ;Подключение датчика к порту.

Обратите внимание, что для определения датчика необходимо установить порт, к которому он подключен и адресный пин. В моем случае – это PORTB, адресный пин – 1.

Теперь определим два макроса.

Bank_port  macro
                bcf            STATUS,RP0
                bcf            STATUS,RP1
                endm
Bank_tris   macro
                bsf            STATUS,RP0
                bcf            STATUS,RP1
                endm               

Эти макросы необходимы для переключения банков при работе с датчиком. В моем случае датчик подключен к PORTB, который находится в банке 0, соответственно в макросе Bank_port необходимо выставить переключение на банк 0. В макросе Bank_tris выставляем переключение на банк в котором находится регистр TRIS того порта, к которому подключен датчик. В моем случае – это TRISB, который находится в банке 1.

Следующие определения:

Delay_800_const        equ           .148

Константу Delay_800_const необходимо определять, если планируется работа библиотеки с применением таймеров для формирования временных задержек. В моем случае использовался таймер TMR0 с частотой следования прерываний 182Гц. В обработчике прерывания от таймера TMR0 необходимо разместить следующие операторы:

                bcf                  INTCON,T0IF
                decfsz               Delay_800_reg,F
                goto                 Pop           ;Подпрограмма возврата из прерывания
                bcf                  Flag_800
                goto                 Pop           ;Подпрограмма возврата из прерывания.

Не забываем сконфигурировать и настроить сам таймер!

TRISX_OUT              equ          B'11111101'                      
TRISX_IN               equ          B'00000010'

Константы TRISX_OUT, TRISX_IN необходимы для настройки порта, к которому подключен датчик для работы на вход и выход. Обратите внимание, что в моем случае датчик подключен к PORTB,1 в TRISX_OUT – это единственный 0, а в TRISX_IN - единственная 1. Если подключение датчика отличается от моего, то подправляем самостоятельно.

PORT_DATCHIKA        equ          0x06
TRIS_DATCHIKA        equ          0x86

Константы PORT_DATCHIKA, TRIS_DATCHIKA, как видно из названия, – это всего лишь адреса порта и трис, к которому подключен датчик. Адреса узнаем в даташите.

ZNAK_MINUS                     equ          .11

Константа ZNAK_MINUS необходима для отображения знака минус при работе с отрицательной температурой. Для отображения полученной температуры на семисегментном индикаторе использую табличное чтение, так вот знак минус находится на 11 строке таблицы. Соответственно в константу заношу число 11. Меняем по своему усмотрению.

С определениями закончили, теперь необходимо вкл/откл функций добиться необходимой работы библиотеки. Открываем подключенную библиотеку ds18x20.asm и находим определение функций. Любая из функции включаются ключевым словом ON, отключается – OFF. Регистр важен. После изменений не забываем сохранить файл.

Теперь опишу назначение функций:

1. WDT_SET - сброс сторожевого таймера;

2. GIE_SET - используются ли в основной программе прерывания. Если используются, то для работы с датчиками необходимо на время отключать бит глобального разрешения прерывания GIE. Включение функции GIE_SET сделает это за Вас;

3. MHZ_4_SET - частота тактирования микроконтроллера. Функция нужна для временных задержек при работе с датчикам;

4. OPRED_DS - определение семейства датчика. Если функция не активна, то по умолчанию используется датчик DS18B20. Если функция активна, то происходит проверка семейства датчика, установленного на линии. Семейство датчика сохраняется в регистр Ds_fam;

5. FLAG_800 - функция необходима для реализации задержки 750мс. с помощью прерывания от таймера. Для библиотеки используется таймер TMR0. Частота следования прерываний 182Гц для кварца 4 МГц. Если функция не активна используется обычная п/п задержки 760мс. Совместно с функцией используется константа Delay_800_const(см. описание выше.);

6. PREOBR - функция необходима для преобразования полученной температуры для отображения на семисегментном индикаторе. Если функция активна, то в регистры Regin1, Regin2, Regin3 будет отправлена температура для отображения на семисегментном индикаторе по разрядно. Если температура отрицательная, то устанавливается флаг Flag_otr_rez. И в регистр Regin1 записывается константа, определенная в ZNAK_MINUS. При этом полученная температура сохраняется в регистре TLSB, а доли градусов в Regin3_temp. Если функция не активна, то полученная температура сохраняется регистре TLSB, а доли градусов в Regin3_temp. Если температура отрицательная, то устанавливается флаг Flag_otr_rez;

7. DESATI_OKR - Округление долей градусов, для отображения на семисегментном индикаторе.

Вот, собственно, и все настройки. Спасибо за внимание!

Видео к статье.

Файлы к статье:

Работаем с датчиками DS18B20/DS18S20(статья)

Библиотека для ds18b20/ds18s20

Прочитано 16584 раз

Понравилась статья? Помоги и остальным о ней узнать! Это просто.

Добавлять комментарии могут только зарегистрированные пользователи.

Все права защищены. При указании активной, индексируемой ссылки на сайт MICROPAS.RU, полное или частичное использование материалов разрешается. Уважайте чужие труды! Не забывайте проставлять ссылки! Правообладателям
© Ерёмин Антон Юрьевич 2013-2021гг.