;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;Подпрограмма работы с датчиком температуры DS1820
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;Подпрограмма формирует протокол общения с датчиком температуры DS1820 и сохранением
; результата / значений температуры в регистры TLSB, TMSB
DatT:
CALL Reset_DS ;Вызов процедуры инициализации
BTFSS ER, DS1 ;Если произошла ошибка то выходим из п/п для передачи
RETURN ;Байтов с кодом ошибки
MOVLW SKIP_ROM ; Команда "пропуск ПЗУ"
CALL Write ; Вызов процедуры передачи байта в DS1820
MOVLW CONVERT_T ;команда начала преобразования температуры и ; и занесения значения в СПЗУ DS1820
CALL Write ; Вызов процедуры передачи байта в DS1820
CALL Delay500 ; ждем завершения преобразования 500мкс
CALL Reset_DS ;Вызов процедуры инициализации
BTFSS ER, DS1 ;Если произошла ошибка то выходим из п/п для передачи
RETURN ;Байтов с кодом ошибки
MOVLW SKIP_ROM ; Команда "пропуск ПЗУ"
CALL Write ; Вызов процедуры передачи байта в DS1820
MOVLW READ_D ;команда чтения СПЗУ DS1820
CALL Write ; Вызов процедуры передачи байта в DS1820
CALL Read ; Вызов процедуры чтения данных из DS1820
MOVWF TLSB ;сохраним младший байт значения температуры
CALL Read ; Вызов процедуры чтения данных из DS1820
MOVWF TMSB ; сохраним старший байт значения температуры
CALL Reset_DS ;Остановим передачу данных
RETURN ;выходим из подпрограммы.
; Происходит отсылка импульса сброса и получения импульса присутствия от датчика температуры DS1820
;При отсутствии импульса присутствия формируется код " ошибка "
Reset_DS:
BSF STATUS,RP0 ; выбрать банк1
MOVLW B'00000000'
MOVWF TRISA ;Настройка 1-Wire на вывод порта RA0
BCF STATUS, RP0 ; выбрать банк0
BCF PORTML , DS1; Настройка порт RA0 на вывод импульс уровня 0
MOVLW H '64' ; задержка 500мкс
CALL Delay500 ; вызов подпрограммы задержки 500мкс
BSF PORTML , DS1; порт RA0 импульс уровня 1
MOVLW H '64' ; задержка 500мкс
CALL Delay500 ; вызов подпрограммы задержки 500мкс
BSF STATUS,RP0 ; выбрать банк1
MOVLW B'00000001'
MOVWF TRISA ;Настройка RA0 на ввод
BCF STATUS,RP0 ; выбрать банк0
BTFSC PORTML , DS1;Проверить импульс присутствия
GOTO ERROR ;Нет то идти на ERROR
MOVLW H '32' ; задержка 250мкс
CALL Delay500 ; вызов подпрограммы задержки 53мкс
RETURN ;выходим из подпрограммы.
Подпрограмма отправляет на шину 1-wire байт из регистра TEMP
Write:
MOVWF TEMP ; Байт для вывода сохраняем в temp
BSF STATUS,RP0 ; выбрать банк1
MOVLW B'00000000'
MOVWF TRISA ;RA0 - выход
BCF STATUS,RP0 ; выбрать банк 0
MOVLW 8 ; Будем передавать 8 бит данных
MOVWF COUNT ; начиная с младшего
WR0:
BCF STATUS,C ;Очистить флаг переноса С
BCF PORTA,DS1 ; Сбросить линию
CALL DELAY10 ;ждем 15 мкс
RRF TEMP,1 ;читаем бит из передоваемого байта
BTFSC STATUS,C ; Бит - 1? Если нет то ждем 53 мкс
BSF PORTA,DS1 ;если да то на линию выставляем 1 (RA0 – 1)
CALL Delay50 ; ждем 53 мкс
BSF PORTA,DS1 ; линию возвращаем в 1 состояние
DECFSZ COUNT,1 ;повторим для 8 бит
GOTO WR0
BSF STATUS,RP0 ; выбрать банк 1
MOVLW B'00000001'
MOVWF TRISA ;RA0 настройка на вход
BCF STATUS,RP0 ; выбрать банк 0
RETURN ;выходим из подпрограммы.
; Подпрограмма считывает с шины 1-wire один байт и сохраняет в регистр TEMP
READ:
CLRF TEMP ;Очистить TEMP
MOVLW 8 ; Будем принимать 8 бит данных
MOVWF COUNT ; начиная с младшего
BSF PORTA,DS1 ; RA0 выставить в 1
RD0:
BSF STATUS,RP0 ; выбрать банк 1
MOVLW B'00000000'
MOVWF TRISA ; RA0 - выход
BCF STATUS, RP0 ; выбрать банк 0
BCF PORTML,DS1 ;0 Сформировать импульс запроса передачи бита…
NOP ;1 Длительность 6 мкс
NOP ;2
BSF STATUS, RP0 ;3 выбрать банк 1
MOVLW B'00000001' ;4
MOVWF TRISA ;5 RA0 настройка на вход
BCF STATUS, RP0 ;6 выбрать банк 0
BSF PORTML, DS1 ;7
NOP ;8
NOP ;9
NOP ;10
NOP ;11
NOP ;12
BCF STATUS, C ;13
BTFSC PORTML, DS1 ;14 …через 14 мкс после начала импульса запроса
;считать бит
BSF STATUS,C
RRF TEMP,1 ;Сохранить в TEMP
CALL DELAY50
DECFSZ COUNT,1 ;Повторить для 8 бит
GOTO RD0
BSF STATUS,RP0 ; Выбрать банк 1
MOVLW B'00000001'
MOVWF TRISA ;RA0 вход
BCF STATUS,RP0 ; Выбрать банк 0
MOVF TEMP,0 ;Переслать в W
RETURN ;выходим из подпрограммы
Бяка писал(а):но , я думаю, её не сложно перелажить на VB
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 89