В статье речь пойдет о библиотеке, написанной на ассемблере, для работы с датчиками температуры DS18B20/DS18S20. Библиотека написана для микроконтроллеров PIC16. Отлажена в MPLab 8.8. Работоспособность библиотеки проверена на схеме термометра с датчиками ds18b20/ds18s20. Сейчас организована поддержка тактирования микроконтроллера от 4МГц. Далее предполагается добавить поддержку 10 МГц, 20МГц.
В этой статье опишу возможности библиотеки, а также как подключить ее к своему исходнику и, как настроить библиотеку под себя.
Arduino Uno перестала определяться??? Узнайте один из способов реанимации тут - Arduino Uno не определяется.
Возможности библиотеки версия 1.0:
- Пропуск считывания серийного номера;
- После преобразования считывается только температура;
- Возможен вывод на 3-х разрядный семисегментный индикатор;
- Включения/отключения сброса сторожевого таймера;
- Вкл/откл прерываний (на время работы с библиотекой), если таковые используются;
- Включение/отключение функции определения семейства датчика на линии;
- Вкл/откл функции использования прерывания для формирования задержки в 750мс;
- Вкл/откл перекодировки для вывода на LED индикатор;
- Вкл/откл округления долей градусов.
- Продолжение следует…
Подключаем библиотеку к своему исходнику.
Скачиваем библиотеку 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 - Округление долей градусов, для отображения на семисегментном индикаторе.
Вот, собственно, и все настройки. Спасибо за внимание!
Видео к статье.