Вы находитесь на странице: 1из 14

6/2/3.

Вывод показаний ранее разработанного термометра на монитор


компьютера (практический пример задействования модуля USART).

В этом подразделе приведен пример “врезки” функции вывода данных на монитор


компьютера, в программу устройства, собранного на ПИКе.
В качестве “материнской”, используется программа термометра 0_1grad1.asm.
Эту работу сделал Рослик Сергей.
Он продублировал показания ЖКИ модуля на экране монитора компьютера (есть с чем
свериться).
При желании, можно вообще убрать ЖКИ модуль и вывести показания термометра
только на экран монитора компьютера.
Не возбраняется. Желающие могут попробовать.
Сначала нужно разобраться с изменениями, внесенными Сергеем в “материнскую”
программу.
Речь идет о “расширении и углублении” темы предыдущего подраздела (асинхронная
работа модуля USART только на передачу).

Программа под это устройство выглядит так:

;********************************************************************************
; RS232_01.asm ЭЛЕКТРОННЫЙ ТЕРМОМЕТР НА ОСНОВЕ ДАТЧИКА ТЕМПЕРАТУРЫ DS1820
; М/контроллер и DS1820 работают по интерфейсу 1-Wire.
; Разрешение 0,1 градус.
; Работа с одним датчиком.
; ВЫВОД ПОКАЗАНИЙ В ЖКИ МОДУЛЬ НА ОСНОВЕ HD44780 И НА МОНИТОР КОМПЬЮТЕРА
; (задействован передатчик модуля USART, асинхронный режим).
;********************************************************************************
; "Практикум по конструированию устройств на PIC контроллерах".
; Эта программа входит в состав 6-го раздела.
; Авторы: Alberto Rolando Senelyuk (Argentina),
; Корабельников Евгений Александрович (Россия)
; http://ikarab.narod.ru karabea@lipetsk.ru

1
; Рослик Сергей Львович (Россия)
;********************************************************************************
; Используется м/контроллер PIC16F873A. Частота кварца 4 Мгц.
; Сигнальный вывод (DQ) датчика DS1820 подключается к выводу RA4.
; Между выводом RA4 и шиной питания подключается подтягивающий резистор
; номиналом 4,7-5,1 кОм.
; DS1820 включается по схеме с активным питанием, т.е.: вывод 1 - общий,
; вывод 2 - сигнальный,
; вывод 3 - питание (+5в).
; Информация выводится в русифицированный ЖКИ модуль 16х2 на
; основе м/к HD44780 (по 4-разрядному интерфейсу).
; Функции выводов порта А:
; RA0 - RW (ЖКИ),
; RA1 - RS (ЖКИ),
; RA2 - E (ЖКИ),
; RA4 - вывод DQ датчика DS1820.
; Функции выводов порта С:
; RC6 - выход передатчика модуля USART.
; RC7 - вход приемника модуля USART (не задействуется).
; RC0...RC3 - выводы 4-разрядного интерфейса ("связка" ПИК/ЖКИ).
;-------------------------------
; Объем программы: 264 команды.
;================================================================================
LIST p=16f873 ; Используется PIC16F873.
__CONFIG 3731H ; XT-генератор, WDT выключен, защита
; выключена, PWRT включен, сброс BOR запрещен
;================================================================================
; Определение положения регистров специального назначения.
;================================================================================
IndF equ 00h ; Доступ к памяти через FSR.
PC equ 02h ; Счетчик команд.
Status equ 03h ; Регистр Status.
FSR equ 04h ; Регистр косвенной адресации.
PortA equ 05h ; Регистр PortA.
TrisA equ 05h ; Регистр TrisA-банк1.
PortC equ 07h ; Регистр PortC.
TrisC equ 07h ; Регистр TrisC-банк1.
Adcon1 equ 1Fh ; Настройка входов АЦП.
PIR1 equ 0Ch ; Регистр флагов прерываний
; периферийных модулей.
RCSTA equ 18h ; Регистр управления и статуса приёмника.
TXREG equ 19h ; Буфер передатчика.
TXSTA equ 18h ; Регистр управления и статуса передатчика.
SPBRG equ 19h ; Регистр генератора скорости обмена.
;================================================================================
; Определение названия и положения регистров общего назачения.
;================================================================================
N equ 20h ; Счетчик битов.
Temp equ 21h ; Многофункциональный регистр
; временного хранения.
Temp_MSB equ 22h ; Байт знака температуры (старший байт).
Temp_LSB equ 23h ; Байт значения температуры (младший байт).
Flag equ 24h ; Регистр флагов.
Count equ 25h ; Многофункциональный счетчик.
LED0 equ 26h ; Регистры двоично-десятичного
LED1 equ 27h ; преобразования.
Count_REM equ 28h ; Регистр градаций (в диапазоне
; одного градуса).
;================================================================================
; Определение места размещения результатов операций.
;================================================================================
W equ 0 ; Результат направить в аккумулятор.
F equ 1 ; Результат направить в регистр.
;================================================================================
; Присваивание битам названий.
;================================================================================
2
C equ 0 ; Флаг переноса-заема.
Z equ 2 ; Флаг нулевого результата.
RP0 equ 5 ; Биты выбора
RP1 equ 6 ; банков.
DQ equ 4 ; Бит №4 регистра PortA(вывод RA4 - линия DQ)
RW equ 0 ; Бит №0 регистра PortA(вывод RA0 - линия RW)
RS equ 1 ; Бит №1 регистра PortA(вывод RA1 - линия RS)
E equ 2 ; Бит №2 регистра PortA(вывод RA2 - линия E)
BF equ 3 ; Бит №3 регистра PortC (вывод RC3 – проверка
; BF).
SPEN equ 7 ; Разрешение/запрет работы модуля USART.
BRGH equ 2 ; Вкл./выкл. скоростного режима (асинхронно).
TXIF equ 4 ; Флаг прерывания от передатчика USART.
;================================================================================
org 0 ; Начать выполнение программы
goto START ; с подпрограммы START.
;********************************************************************************

;********************************************************************************
; ------------------------- "РАБОЧАЯ" ЧАСТЬ ПРОГРАММЫ ----------------------
;********************************************************************************
; Макросы выбора банков.
;================================================================================
Bank0 macro ; Начало макроса.
bcf Status,RP0 ; Переход в
bcf Status,RP1 ; 0-й банк.
endm ; Конец макроса.

Bank1 macro ; Начало макроса.


bsf Status,RP0 ; Переход в
bcf Status,RP1 ; 1-й банк.
endm ; Конец макроса.
;================================================================================
; ПП передачи байта данных (USART).
;================================================================================
RS232 btfss PIR1,TXIF ; Предыдущий байт данных передан или нет?
goto $-1 ; Если еще не передан, то ожидаем.
movwf TXREG ; Если передан, то загрузка следующего байта
; данных в буфер передатчика.
return ; Возврат.
;================================================================================
; "Рабочая" инициализация ЖКИ модуля.
;================================================================================
LCD_INIT movlw b'00101000' ; Установка: 4-разрядный интерфейс, 2 строки,
; 5х7 точек.
call ENTER_BF ; "Плавающая" задержка со стробом под команду
; 00101000.
;----> Возврат по стеку из ПП ENTER_BF.
movlw b'00101000' ; Установка: 4-разрядный интерфейс, 2 строки,
; 5х7 точек.
call ENTER_BF ; "Плавающая" задержка со стробом под команду
; 00101000.
;----> Возврат по стеку из ПП ENTER_BF.

movlw b'00001100' ; Установка: дисплей включен, видимое


; отображение курсора выключено.
call ENTER_BF ; "Плавающая" задержка со стробом под команду
; 00001100.
;----> Возврат по стеку из ПП ENTER_BF.

movlw b'00000001' ; Установка: очистка дисплея со сбросом


; данных, установка курсора в начало 1-й
; строки.
call ENTER_BF ; "Плавающая" задержка со стробом под команду
; 00000001.
3
;----> Возврат по стеку из ПП ENTER_BF.

return ; Возврат по стеку на начало вывода символов


; в 1-ю строку.
;================================================================================
; ПП "плавающей" задержки на основе анализа состояния флага занятости BF
; (вариант для 4-разрядного интерфейса).
;================================================================================
ENTER_BF movwf Temp ; Байт из W копируется в Temp.
swapf Temp,F ; П/байты меняются местами для обеспечения
; соответствия разрядов (так как к D4...7
; подключены не RC4...7, а RC0...3).
movfw Temp ; Байт из Temp копируется в W.
movwf PortC ; Вывод старшего п/байта на линии RC0...3.
;------------------------------------------
; Запуск в работу старшего п/байта (строб).
;------------------------------------------
nop ; Задержка в 1 м.ц.
bsf PortA,E ; Установка на линии Е "1".
nop ; Задержка в 1 м.ц.
bcf PortA,E ; Установка на линии Е "0".
;------------------------------------------
swapf Temp,W ; Смена п/байтов с сохранением результата
; операции в W.
movwf PortC ; Вывод младшего п/байта на линии RC0...3.
;------------------------------------------
; Запуск в работу младшего п/байта (строб).
;------------------------------------------
nop ; Задержка в 1 м.ц.
bsf PortA,E ; Установка на линии Е "1".
nop ; Задержка в 1 м.ц.
bcf PortA,E ; Установка на линии Е "0".
;-------------------------------------------------
; Проверка состояния флага занятости BF.
;-------------------------------------------------
; Подготовка к проверке.
;------------------------
Bank1 ; Переход в 1-й банк.
movlw b'11001111' ; RC4,5 работают на выход,
movwf TrisC ; остальные - на вход.
Bank0 ; Переход в 0-й банк.

bcf PortA,RS ; Установка на линии RS "0" (режим команд).


bsf PortA,RW ; Линия RW в "1" (режим чтения данных).
nop ; Задержка в 1 м.ц.
bsf PortA,E ; Установка на лини Е "1".
POVTOR nop ; Задержка в 1 м.ц.
;-----------------------
; Сама проверка.
;-----------------------
btfsc PortC,BF ; Проверка состояния флага занятости BF.
goto POVTOR ; Если BF=1, то продолжение задержки до тех
; пор, пока BF не установится в "0"
; (программа исполняется далее).
;-----------------------
; Завершение процедуры.
;-----------------------
clrf PortA ; Сброс в "0" всех защелок порта А
; (RW=0, RS=0, E=0).
Bank1 ; Переход в 1-й банк.
movlw b'11000000' ; Выводы RC6, RC7 подключены к USART,
movwf TrisC ; остальные работают на выход.
Bank0 ; Переход в 0-й банк.

return ; Возврат по стеку.


;********************************************************************************
4
;********************************************************************************
; Подпрограмма вывода на индикацию.
;********************************************************************************
; Выбор 6-го слева знакоместа 2-й строки.
;----------------------------------------------------------
DISPLAY movlw b'11000101' ; Выбор ячейки DD RAM с адресом 45h, что
; соответствует установке курсора в 6-е слева
; знакоместо 2-й строки.
call ENTER_BF ; "Плавающая" задержка со стробом под команду
; 11000101.
;----> Возврат по стеку из ПП ENTER_BF.
;----------------------------------------------------------
; Определение и вывод на индикацию знака температуры (+/-).
;----------------------------------------------------------
btfsc Temp_MSB,0 ; В бите №0 старшего байта температуры 0
; или 1 ?
goto MINUS ; Если 1, то переход в ПП MINUS.
movlw 2Bh ; Если 0,то на индикацию выводится символ"+":
call RS232 ; <-- на монитор компьютера,
;----> Возврат по стеку из ПП RS232.
bsf PortA,RS ; <-- в ЖКИ модуль.
call ENTER_BF ; "Плавающая" задержка со стробом под вывод
; данных на индикацию в ЖКИ модуль.
;----> Возврат по стеку из ПП ENTER_BF.
goto SDVIG ; После вывода на индикацию символа "+",
; переход на обработку младшего байта
; температуры.
;############################################################
; Примечание: символ "-" на монитор не выводится.
;############################################################
MINUS movlw 2Dh ; На индикацию выводится
bsf PortA,RS ; символ "-".
call ENTER_BF ; "Плавающая" задержка со стробом под вывод
; данных на индикацию в ЖКИ модуль.
;----> Возврат по стеку из ПП ENTER_BF.
;----------------------------------------------------------
; Перевод двоичного числа младшего байта температуры
; из отрицательной области температур в положительную.
;----------------------------------------------------------
comf Temp_LSB,F ; После вывода на индикацию символа "-", все
incf Temp_LSB,F ; биты младшего байта температуры
; инвертируются и к результату прибавляется 1
;================================================================================
; Подпрограмма обработки содержимого младшего байта температуры.
;================================================================================
; Деление числа, записанного в младшем байте температуры, на 2.
;--------------------------------------------------------------------------------
SDVIG clrf Flag ; Flag=0 (подготовка к работе).
rrf Temp_LSB,F ; Деление на 2.
;--------------------------------------------------------------------------------
; Установка (или нет) признака добавления (к показаниям) символа "1"
; (признак устанавливается при температуре от 100 градусов и выше).
;--------------------------------------------------------------------------------
movlw .100 ;
subwf Temp_LSB,W ; Temp_LSB - .100 = ? Результат - в W.
btfss Status,C ; Результат положительный или отрицательный?
goto BIN2_10 ; Если отрицательный, то признак добавления
; символа "1" не устанавливается (бит №7
; регистра Flag=0).
bsf Flag,7 ; Если положительный, то устанавливается
; (бит №7 регистра Flag=1).
;********************************************************************************
; Быстрая ПП преобразования однобайтного двоичного числа в
; 2-разрядное десятичное число (автор Рослик Сергей).
;================================================================================
5
BIN2_10 clrf LED0 ; Подготавливаем регистры для загрузки в
clrf LED1 ; них результатов двоично-десятичного
; преобразования.
B10 movlw .246 ; Отнимаем из разряда десятков .10.
addwf Temp_LSB,F ; Temp_LSB-10->Temp_LSB.
incf LED1,F ; Подсчитываем, сколько раз отняли без
; остатка.
btfsc Status,C ; Проверяем, остаток был или нет.
goto B10 ; Если остатка небыло, то продолжаем
; отнимать .10.
decf LED1,F ; Отнимаем избыточную операцию инкремента.
;--------Выделение разряда единиц---------------------------------------------
movlw .10 ; Выделяем из разряда единиц остаток.
addwf Temp_LSB,F ;
movf Temp_LSB,w ; Загружаем остаток в регистр результата
movwf LED0 ; преобразования единиц.
;********************************************************************************
; Процедура преобразования кода.
;================================================================================
ASC movlw 30h ; Запись в регистр W числа 30h.
iorwf LED0,F ; Логическое "ИЛИ" содержимого регистра W и
; регистра LED0 с сохранением результата
; в LED0.
iorwf LED1,F ; То же самое для LED1.
;********************************************************************************
; Вывод на индикацию результата измерения.
;********************************************************************************
; Вывод (или нет) на индикацию символа "1" (выводится при Т=100 градусов и выше).
;================================================================================
btfss Flag,7 ; Бит №7 регистра Flag =0 или =1 ?
goto C_00_99 ; Если =0, то символ "1" на индикацию не
; выводится.
movlw 31h ; Если =1, то символ "1" (31h) на индикацию
; выводится.
call RS232 ; <-- на монитор компьютера,
;----> Возврат по стеку из ПП RS232.
bsf PortA,RS ; <-- в ЖКИ модуль.
call ENTER_BF ; "Плавающая" задержка со стробом под вывод
; данных на индикацию в ЖКИ модуль.
;----> Возврат по стеку из ПП ENTER_BF.
;================================================================================
; Вывод на индикацию двух символов результата измерения
; (в диапазоне от 00 до 99 градусов).
;================================================================================
C_00_99 movf LED1,W ; Вывод на индикацию байта, записанного в
; регистре LED1.
call RS232 ; <-- на монитор компьютера,
;----> Возврат по стеку из ПП RS232.
bsf PortA,RS ; <-- в ЖКИ модуль.
call ENTER_BF ; "Плавающая" задержка со стробом под вывод
; данных на индикацию в ЖКИ модуль.
;----> Возврат по стеку из ПП ENTER_BF.
movf LED0,W ; Вывод на индикацию байта, записанного в
; регистре LED0.
call RS232 ; <-- на монитор компьютера,
;----> Возврат по стеку из ПП RS232.
bsf PortA,RS ; <-- в ЖКИ модуль.
call ENTER_BF ; "Плавающая" задержка со стробом под вывод
; данных на индикацию в ЖКИ модуль.
;----> Возврат по стеку из ПП ENTER_BF.
;================================================================================
; Формирование запятой и символов после запятой.
;================================================================================
; Формирование запятой.
;-------------------------------------
movlw 2Ch ; Вывод на индикацию символа "," (2Ch).
6
call RS232 ; <-- на монитор компьютера,
;----> Возврат по стеку из ПП RS232.
bsf PortA,RS ; <-- в ЖКИ модуль.
call ENTER_BF ; "Плавающая" задержка со стробом под вывод
; данных на индикацию в ЖКИ модуль.
;----> Возврат по стеку из ПП ENTER_BF.
;-------------------------------------
; Формирование символов после запятой.
;-------------------------------------
movf Count_REM,W ; Копирование содержимого Count_REM в W.
sublw .16 ; .16 - Count_REM (от .1 до .16) = от .0 до
; .15 (W).
call TEXT_1 ; Переход в перекодировщик 16/10 и вывод
; символов:
call RS232 ; <-- на монитор компьютера,
;----> Возврат по стеку из ПП RS232.
bsf PortA,RS ; <-- в ЖКИ модуль.
call ENTER_BF ; "Плавающая" задержка со стробом под вывод
; данных на индикацию в ЖКИ модуль.
;----> Возврат по стеку из ПП ENTER_BF.
;-----------------------------------------------------------------------
; Передача команды перевода строки ("Enter"). По этой команде, программа
; компьютера начинает выводить следующий символ с новой строки.
;-----------------------------------------------------------------------
movlw 0Dh ; Команда "Enter".
call RS232 ; <-- в программу компьютера.
;----> Возврат по стеку из ПП RS232.
return ; Возврат по стеку.
;********************************************************************************

;================================================================================
; Подпрограммы табличного вычисляемого перехода.
;================================================================================
; Вычисляемый переход под тестовую надпись.
;----------------------------------------------------------------------
TEXT addwf PC,F ; Приращение PC на величину содержимого W.
retlw 0x20 ; "пусто"
retlw 0x20 ; "пусто"
retlw 0x54 ; "T"
retlw 0x45 ; "E"
retlw 0x4D ; "M"
retlw 0xA8 ; "П"
retlw 0x45 ; "E"
retlw 0x50 ; "P"
retlw 0x41 ; "A"
retlw 0x54 ; "T"
retlw 0xA9 ; "У"
retlw 0x50 ; "P"
retlw 0x41 ; "A"
retlw 0x3A ; ":"
retlw 0x20 ; "пусто"
retlw 0x20 ; "пусто"
;======================================================================
; Перекодировщик 16/10.
;======================================================================
; Вычисляемый переход под табл. 3 п/раздела 5/8 "Практикума...".
;----------------------------------------------------------------------
TEXT_1 addwf PC,F ; Приращение PC на величину содержимого W.
retlw 0x30 ; "0"
retlw 0x30 ; "0"
retlw 0x31 ; "1"
retlw 0x32 ; "2"
retlw 0x32 ; "2"
retlw 0x33 ; "3"
retlw 0x34 ; "4"
retlw 0x34 ; "4"
7
retlw 0x35 ; "5"
retlw 0x35 ; "5"
retlw 0x36 ; "6"
retlw 0x37 ; "7"
retlw 0x37 ; "7"
retlw 0x38 ; "8"
retlw 0x39 ; "9"
retlw 0x39 ; "9"
;----------------------------------------------------------------------
; Вычисляемый переход под табл. 4 п/раздела 5/8 "Практикума...".
;----------------------------------------------------------------------
;;;TEXT_1 addwf PC,F ; Приращение PC на величину содержимого W.
;;; retlw 0x30 ; "0"
;;; retlw 0x31 ; "1"
;;; retlw 0x32 ; "2"
;;; retlw 0x32 ; "2"
;;; retlw 0x33 ; "3"
;;; retlw 0x33 ; "3"
;;; retlw 0x34 ; "4"
;;; retlw 0x34 ; "4"
;;; retlw 0x35 ; "5"
;;; retlw 0x35 ; "5"
;;; retlw 0x36 ; "6"
;;; retlw 0x36 ; "6"
;;; retlw 0x37 ; "7"
;;; retlw 0x37 ; "7"
;;; retlw 0x38 ; "8"
;;; retlw 0x39 ; "9"
;================================================================================

;********************************************************************************
; НАЧАЛО ПРОГРАММЫ
;********************************************************************************
START clrf PortA ; Сброс всех защелок порта А.
clrf PortC ; Сброс всех защелок порта C.

Bank1 ; Переход в 1-й банк.


movlw B'10000110' ; Состояния каналов АЦП: D D D D D D D D
movwf Adcon1 ; (цифровые каналы ввода/вывода).
;================================================================================
; Настройка модуля USART.
;================================================================================
clrf TrisA ; Все выводы порта А работают на выход.
movlw b'11000000' ; RC6, RC7 работают на вход (условие работы
movwf TrisC ; модуля USART), остальные - на выход.
movlw .25 ; Установка скорости порта
movwf SPBRG ; 9600 бод/c.
movlw b'00100100' ; 8-битная передача, передача разрешена,
movwf TXSTA ; асинхронный режим модуля USART, скорость –
; высокая.
Bank0 ; Переход в 0-й банк.
bsf RCSTA,SPEN ; Включение модуля USART.

call LCD_INIT ; Условный переход в процедуру "рабочей"


; инициализации.
;----> Возврат по стеку из ПП LCD_INIT.
;------------------------------
; Вывод символов в 1-ю строку.
;------------------------------
movlw .16 ; Запись числа .16 (количества выводимых в
movwf Count ; строку символов) в регистр Count.
WR_1 movf Count,W ; Копирование содержимого регистра Count в W.
sublw .16 ; .16-Count=... (результат записывается в W).
call TEXT ; Условный переход в ПП TEXT.
;----> Возврат по стеку из ПП TEXT.
bsf PortA,RS ; Вывод на индикацию текущего символа.
8
call ENTER_BF ; "Плавающая" задержка со стробом под вывод
; данных на индикацию.
;----> Возврат по стеку из ПП ENTER_BF.
decfsz Count,F ; Подготовка к выводу на индикацию
; следующего символа таблицы.
goto WR_1 ; Если результат декремента не=0, то переход
; в ПП WR_1.
; Если результат декремента =0, то программа
; исполняется далее.
;################################################################################
; Начало работы с датчиком DS1820.
;################################################################################
; Инициализация DS1820.
;--------------------------------------------------------------------------------
SNOVA call DQ_INIT ; Инициализация DS1820.
;----> Возврат по стеку из ПП DQ_INIT.
;--------------------------------------------------------------------------------
; Команда Skip_ROM (CCh).
; Команда пропуска процедуры сравнения серийного номера. Применяется в случае
; использования одного датчика (как в данном случае).
;--------------------------------------------------------------------------------
movlw 0CCh ; Запись команды CCh
movwf Temp ; в регистр Temp.
call OUT_BYTE ; Переход в ПП передачи байта OUT_BYTE.
;----> Возврат по стеку из ПП OUT_BYTE.
;--------------------------------------------------------------------------------
; Команда Start_Conv (44h).
; Эта команда запускает процесс преобразования температуры. В течение времени ее
; исполнения, DS1820 не реагирует на команды "мастера".
; Это время нужно просто переждать.
;--------------------------------------------------------------------------------
movlw 44h ; Запись команды 44h
movwf Temp ; в регистр Temp.
call OUT_BYTE ; Переход в ПП передачи байта OUT_BYTE.
;----> Возврат по стеку из ПП OUT_BYTE.
;--------------------------------------------------------------------------------
; Ожидание завершения процесса преобразования температуры.
; То что Вы видите ниже, есть один из способов реализации "плавающей" (следящей)
; задержки (можно применить фиксированную задержку).
;--------------------------------------------------------------------------------
WAIT call IN_BYTE ; Переход в ПП приема байта IN_BYTE.
;----> Возврат по стеку из ПП IN_BYTE.
movlw b'11111111' ; Запись в W числа FFh.
subwf Temp,W ; Temp - FFh = ...
btfss Status,Z ; Z=0 или Z=1 (нулевой результат)?
goto WAIT ; Если Z=0, то ждем дальше.
; Если Z=1 (Temp заполнен единицами, то есть,
; на линии появился и надежно зафиксировался
; уровень 1), то программа исполняется далее.
;--------------------------------------------------------------------------------
; Инициализация DS1820.
;--------------------------------------------------------------------------------
call DQ_INIT ; Инициализация DS1820.
;----> Возврат по стеку из ПП DQ_INIT.
;--------------------------------------------------------------------------------
; Еще одна команда Skip_ROM (CCh).
;--------------------------------------------------------------------------------
movlw 0CCh ; Запись команды CCh
movwf Temp ; в регистр Temp.
call OUT_BYTE ; Переход в ПП передачи байта OUT_BYTE.
;----> Возврат по стеку из ПП OUT_BYTE.
;--------------------------------------------------------------------------------
; Команда Read Scratchpad (BEh).
; Чтение содержимого блокнотной памяти в части касающейся байтов температуры.
;--------------------------------------------------------------------------------
movlw 0BEh ; Запись команды BEh
9
movwf Temp ; в регистр Temp.
call OUT_BYTE ; Переход в ПП передачи байта OUT_BYTE.
;----> Возврат по стеку из ПП OUT_BYTE.
;--------------------------------------------------------------------------------
; Чтение содержимого области оперативной памяти DS1820.
;--------------------------------------------------------------------------------
call IN_BYTE ; ПРИЕМ МЛАДШЕГО БАЙТА ТЕМПЕРАТУРЫ.
;----> Возврат по стеку из ПП IN_BYTE.
movwf Temp_LSB ; Запись принятого байта в регистр Temp_LSB.

call IN_BYTE ; ПРИЕМ СТАРШЕГО БАЙТА ТЕМПЕРАТУРЫ.


;----> Возврат по стеку из ПП IN_BYTE.
movwf Temp_MSB ; Запись принятого байта в регистр Temp_MSB.
;----------------------------------------
; Формальное считывание байтов.
;----------------------------------------
call IN_BYTE ; Формальное считывание байта верхнего
; предела температуры.
;----> Возврат по стеку из ПП IN_BYTE.
call IN_BYTE ; Формальное считывание байта нижнего
; предела температуры.
;----> Возврат по стеку из ПП IN_BYTE.
call IN_BYTE ; Формальное считывание 1-го резервного
; байта.
;----> Возврат по стеку из ПП IN_BYTE.
call IN_BYTE ; Формальное считывание 2-го резервного
; байта.
;----> Возврат по стеку из ПП IN_BYTE.
;----------------------------------------
call IN_BYTE ; ПРИЕМ БАЙТА ОСТАТКА ИЗМЕРЕНИЯ.
;----> Возврат по стеку из ПП IN_BYTE.
movwf Count_REM ; Запись принятого байта в регистр Count_REM.
;---------------------------------------------------
; Итог; в Temp_MSB записан старший байт температуры,
; в Temp_LSB записан младший байт температуры,
; в Count_REM записан байт остатка измерения.
;---------------------------------------------------
call DISPLAY ; Переход в ПП вывода результата измерения
; на индикацию.
;----> Возврат по стеку из ПП DISPLAY.
goto SNOVA ; Переход на новый цикл измерения.
;********************************************************************************

;================================================================================
; Подпрограмма нициализации 1-Wire устройства (DS1820).
;================================================================================
DQ_INIT call PIN_HI ; Установка вывода в высокоимпедансное
; состояние: за счет подтягивающего
; резистора, на линии устанавливается 1.
;----> Возврат по стеку из ПП PIN_HI.
call PIN_LO ; Установка на линии нуля.
;----> Возврат по стеку из ПП PIN_LO.
movlw .60 ; Установка количества проходов по 10мкс.
call PAUSE_X ; Переход в ПП задержки
; (задержка=60х10=600мкс.).
;----> Возврат по стеку из ПП PAUSE_X.
call PIN_HI ; Установка вывода в высокоимпедансное
; состояние: за счет подтягивающего
; резистора, на линии устанавливается 1.
;----> Возврат по стеку из ПП PIN_HI.
movlw .60 ; Установка количества проходов по 10мкс.
call PAUSE_X ; Переход в ПП задержки
; (задержка=60х10=600мкс.).
;----> Возврат по стеку из ПП PAUSE_X.
return ; Возврат по стеку.
;********************************************************************************
10
; Подпрограмма задержки.
;================================================================================
; Задание количества проходов по 10 мкс.
;----------------------------------------
PAUSE_X movwf Count ; Копирование количества проходов из W
; в Count.
;----------------------------------------
; Пауза в 10 мкс.
;----------------------------------------
PAUSE_10 nop ;
goto $+1 ; Одноразрядный,
goto $+1 ; вычитающий
goto $+1 ; счетчик
decfsz Count,F ; с "врезкой".
goto PAUSE_10 ;

return ; Возврат по стеку.


;================================================================================

;********************************************************************************
; Базовые процедуры чтения/записи по 1-Wire протоколу.
;********************************************************************************
; Подпрограмма передачи "мастером" байта: цикл передачи бита начинается импульсом
; низкого уровня длительностью 1...15 мкс, далее следует передаваемый бит.
; Цикл завершается импульсом высокого уровня длительностью не менее 1 мкс.
;================================================================================
OUT_BYTE movlw .8 ; Запись количества бит передаваемого
movwf N ; байта в регистр N.

METKA_1 rrf Temp,F ; Сдвиг вправо содержимого передаваемого


; байта.
btfss Status,C ; В бите С "лежит" 0 или 1 ?
goto OUT_0 ; Если С=0, то переход в ПП передачи нуля.
goto OUT_1 ; Если С=1, то переход в ПП передачи единицы.

METKA_2 decfsz N,F ; Уменьшение на 1 содержимого счетчика битов.


goto METKA_1 ; Если результат не =0, то переход на метку
; METKA_1.
return ; Если результат =0, то возврат по стеку.
;================================================================================
; Подпрограмма приема "мастером" байта: цикл приема бита начинается импульсом
; низкого уровня длительностью 1...15 мкс, после чего DS1820 выставляет на линии
; бит. Цикл завершается импульсом высокого уровня длительностью не менее 1 мкс.
;================================================================================
IN_BYTE movlw .8 ; Запись количества бит принимаемого
movwf N ; байта в регистр N.
clrf Temp ; Очистка регистра принимаемого байта.

IN_BYTE_1 call PIN_LO ; Формирование на линии уровня 0.


;----> Возврат по стеку из ПП PIN_LO.

call PIN_HI ; Формирование на линии уровня 1.


;----> Возврат по стеку из ПП PIN_HI.
nop ; Калибровочный NOP.
;-------------------------------------------------------------------
; Запись, в бит С, уровня текущего бита, выдаваемого DS1820 в линию.
;-------------------------------------------------------------------
btfss PortA,DQ ; На линии 0 или 1 ?
bcf Status,C ; Если на линии 0, то в бите С выставляется 0
btfsc PortA,DQ ; Если на линии 1 (а также после исполнения
; предыдущей команды), то еще одна проверка
; состояния линии.
bsf Status,C ; Если на линии 1, то в бите С выставляется 1
; Если на линии 0 (а также после исполнения
; предыдущей команды), то программа
11
; исполняется далее.
;-------------------------------------------------------------------
; Последовательное заполнение битами регистра Temp.
;-------------------------------------------------------------------
rrf Temp,F ; Сдвиг содержимого регистра Temp вправо
; (через C).
movlw .4 ; Установка количества проходов по 10мкс.
call PAUSE_X ; Переход в ПП задержки
; (задержка=4х10=40мкс.).
;----> Возврат по стеку из ПП PAUSE_X.
decfsz N,F ; Уменьшение на 1 содержимого счетчика битов.
goto IN_BYTE_1 ; Если результат не=0, то переход
; на прием следующего бита.
movf Temp,W ; Если =0, то копирование принятого байта в
; регистр W.
return ; Возврат по стеку.
;================================================================================
; Подпрограмма передачи бита с уровнем "0".
;================================================================================
OUT_0 call PIN_LO ; Переход в ПП установки уровня 0.
; Начало передачи.
;----> Возврат по стеку из ПП PIN_LO.
movlw .6 ; Установка количества проходов по 10мкс.
call PAUSE_X ; Переход в ПП задержки
; (задержка=6х10=60мкс.).
;----> Возврат по стеку из ПП PAUSE_X.
call PIN_HI ; Переход в ПП установки уровня 1.
; Конец передачи.
;----> Возврат по стеку из ПП PIN_HI.
goto METKA_2 ; Переход на исполнение процедуры декремента
; и анализа содержимого счетчика битов.
;================================================================================
; Подпрограмма передачи бита с уровнем "1".
;================================================================================
OUT_1 call PIN_LO ; Переход в ПП установки уровня 0.
; Начало передачи.
;----> Возврат по стеку из ПП PIN_LO.
call PIN_HI ; Переход в ПП установки уровня 1
; (передача 1).
;----> Возврат по стеку из ПП PIN_HI.
movlw .6 ; Установка количества проходов по 10мкс.
call PAUSE_X ; Переход в ПП задержки
; (задержка=6х10=60мкс.).
;----> Возврат по стеку из ПП PAUSE_X.
goto METKA_2 ; Переход на новый цикл передачи бита.
;--------------------------------------------------------------------------------
; Формирование на линии уровня "1" за счет подтягивающего резистора
;--------------------------------------------------------------------------------
PIN_HI bsf Status,RP0 ; Переход в банк 1.
bsf TrisA,DQ ; Настройка вывода RA4 на работу "на вход".
bcf Status,RP0 ; Переход в банк 0.
return ; Возврат по стеку.
;--------------------------------------------------------------------------------
; Формирование на линии уровня "0" средствами микроконтроллера
;--------------------------------------------------------------------------------
PIN_LO bcf PortA,DQ ; Установка 0 на выходе защелки вывода RA4.
bsf Status,RP0 ; Переход в банк 1.
bcf TrisA,DQ ; Настройка вывода RA4 на работу "на выход".
bcf Status,RP0 ; Переход в банк 0.
return ; Возврат по стеку.

;********************************************************************************
end ; Конец программы.

Темно-синим цветом выделена работа Сергея.

12
Ниже я буду пояснять работу программы только в части касающейся команд,
выделенных темно-синим цветом (предполагается, что работа “материнской” программы
0_1grad1.asm Вам ясна).
Начну с самого “верха” “рабочей” части программы.
1. Сергей применил макросы, то есть, предварительно “прописанные” “заготовки”
процедур, которые, при их вызове, подставляются в текст программы и упрощают ее
написание.
В данном случае, это процедуры перехода в банки.
“Прописка” макросов должна быть произведена либо сразу же после директивы org 0,
либо сразу же после команды goto START (той, которая следует после директивы
org 0).
Попробуйте “прописать” макросы, например, в начале ПП START или в конце
программы (перед директивой end), и после ассемблирования, Вы получите сообщения
о “банковских” ошибках.
Каждый макрос как-то “обзывается” (см. “Bank0”/”Bank1”) и начинается директивой
macro, а заканчивается директивой endm.
Это что-то типа “обозначения тела” макроса.
Применять макрос имеет смысл в том случае, когда, по ходу исполнения полного
цикла программы, “лежащая” в макросе процедура используется многократно.
2. Далее следует ПП передачи байтов данных.
Ее “конструкция” подробно “расписана” в предыдущем разделе.
Особенность этой ПП: она исполняется не на “линейном” участке программы, а
многократно вызывается командами call RS232.
И это должно быть понятным, так как, за один полный цикл программы, ее “услуги”
требуются не один, а несколько раз, и поэтому выгоднее, по мере необходимости,
многократно в нее “уходить” и “возвращаться”, чем многократно “прописывать” эту
процедуру в тексте программы.
3. По подпрограмме ENTER_BF.
Ее “модернизации” обусловлены тем, что 4-разрядный интерфейс (ПИК/ЖКИ)
организован не с помощью выводов RB4 … RB7 (как в “материнской” программе), а с
помощью выводов RC0 … RC3.
То есть, речь идет и о другом порте, и о другом полубайте.
Поэтому, для того чтобы “вогнать” “дочернюю” подпрограмму в логику “материнской”
подпрограммы, нужно и плубайты поменять местами, и перейти с порта В на порт С.
Соответственно, состояние флага BF опрашивается не по выводу RB7, а по выводу
RC3.
При перестройках направлений работы выводов порта С, работоспособность модуля
USART не нарушается, так как настройки направлений работы выводов RC6 и RC7
подтверждаются (работа на вход).
4. По выводу на индикацию знака температуры (+/-).
На монитор компьютера, Сергей вывел только знак “+”, и поэтому имеется только один
переход в ПП RS232 (при выводе знака “+”).
Знак “-“ игнорируется потому, что предполагается, что термометр будет работать
только в положительной области температур.
Естественно, что “красиво жить не запретишь” и ничто не мешает вывести, в ПП
передачи байта, число, соответствующее символу “-“.
Это, как говорится, дело хозяйское.
5. По ПП преобразования формы числа.
Сергей убрал стандартную, “материнскую” ПП преобразования однобайтного двоичного
числа в 2-разрядное десятичное число и поставил на ее место свою подпрограмму (о
ней шла речь в “Практикуме…”).
И правильно сделал: после этой замены, имеет место быть выигрыш как по скорости,
так и по количеству команд.
Сергей, поздравляю с “боевым крещением” Вашей подпрограммы!
Уважаемые коллеги, “мотайте на ус” и “берите на вооружение”.
6. Далее Вы видите 5 одинаковых обращений к ПП RS232.
Разница только в числовых значениях байтов.
Это есть не что иное, как последовательный вывод, на монитор компьютера, символов
результата измерения.
13
После 6-го обращения, осуществляется переход на новую строку (не в ЖКИ, а в
компьютере).
7. По ПП START.
В ней производится настройка модуля USART.
Она аналогична настройке, описанной в предыдущем разделе, и добавить к этому
нечего.
Так как применяется ПИК, в состав которого входит модуль АЦП, то нужно настроить
каналы АЦП.
Если не осуществить той настройки модуля АЦП, которая произведена Сергеем, то, по
умолчанию, выводы порта А будут находиться в Z состоянии (то есть, данное
устройство работать не будет).
Эта тема требует более детальной проработки, которой я займусь позднее, при
“въезде” в АЦП.
Вот, собственно говоря, и все доработки “материнской” программы.
Естественно, что под эти доработки, нужно “модернизировать” “шапку” программы.
Надеюсь, что Вы самостоятельно с ней разберетесь.
Теперь по поводу программного обеспечения (в Виндах).
К данному устройству прилагаются две программы, написанные в Delphi7 (Terminal.exe
и Terminal1.exe).
Слово автору.
В программе Terminal, необходимо выставить тот COM порт, к которому подключен
термометр, выбрать скорость 9600 бод/c. (она выставлена по умолчанию) и нажать
кнопку “Связь”.
Показания будут выводиться красным цветом ниже надписи ТЕМПЕРАТУРА.
Вторая программа (Terminal1) такая же, но показания можно наблюдать ещё и в
дополнительном окне, после чего их можно пролистать или удалить.
На изображение градусника, данные не влияют.
Он как показывал ноль так и будет показывать (недоделано).
При необходимости, можно произвести доработку частотомера.
Я это пробовал, и всё работало.

Архивный файл с программами Terminal.exe и Terminal1.exe (Terminal.rar, 470 Кб.) Вы


можете скачать на сайте.
Инструкция по поиску скрытой ссылки:
- на сайте открываете раздел №11,
- прокручиваете текст этого раздела до конца вниз,
- затем немного вверх и ищите подчеркнутое слово выровнять,
- скрытая ссылка установлена на букве в этого слова.

Примечание: на букве я этого же слова, установлена скрытая ссылка на программу,


входящую в состав предыдущего подраздела (IIRS232pro.rar, 570 Кб.).

"Практикум по конструированию устройств на PIC контроллерах"      http://ikarab.narod.ru       E-mail: karabea@lipetsk.ru

14