При нажатии на кнопку схема автоматически включается и показывает текущую температуру в течении 5 секунд а затем отключается. Как показала практика элементов питания хватает на 2 года и более . Для подключения датчика был использован плоский телефонный четырех-жильный провод длинной три метра. Сам датчик и место припайки к кабелю защищено от внешней среды термоусадочной трубкой. Термометр смонтирован в миниатюрной коробочке размером 6x3x1 см и закреплен в удобном месте. Для стабильной работы в холодных помещениях необходимо исключить диод в цепи питания.
Прошивка:
:020000040000FA
:020000001F29B6
:08000800F0000308F1000B11E8
:1000100082308100F20B26280530F200F30A6430AA
:100020007306031D2628F301BA08031DBA03CC0882
:10003000031DCC03F40A3C307406031D2628F4018A
:10004000F60A18307606031D2628F601710883008B
:10005000F00E700E09000A30A2000313790883160F
:100060009A0083127A0883169B008B131C15553057
:100070009D00AA309D009C1464009C183C281C1113
:100080008B178312790883161C1400001A0283123E
:1000900003190034A20BA00A2D2801340313831680
:1000A00000309B001C141A088312A1000800A40051
:1000B000A301A30B5928A40B59280800A300A30BE4
:1000C0005F2808000512C8305E2005166400C8309D
:1000D0005E2064000800A80162203330B420FF30A5
:1000E000B420AA00C920FF30B420AB00C920FF30E3
:1000F000B420AC00C920FF30B420AD00C920FF30CF
:10010000B420AE00C920FF30B420AF00C920FF30BA
:10011000B420B000C920FF30B420B100A80208000C
:10012000A801BE30B420FF30B420AA00C920FF309F
:10013000B420AB00C920FF30B420AC00C920FF3090
:10014000B420AD00C920FF30B420AE00C920FF307C
:10015000B420AF00C920FF30B420B000C920FF3068
:10016000B420B100A8020800A7000830A5000512BD
:100170006400000027180516A70C04305E20A713A2
:10018000051AA71714305E200516A50BB7282708F7
:100190000800A9000830A50029082806A700270C98
:1001A00028080318183AA700270CA8000310A90C68
:1001B0002908A50BCD2808001F398207F5342434FF
:1001C000B934BC346C34DC34DD34A434FD34FC3458
:1001D000ED345D34D1343D34D934C934F734263468
:1001E000BB34BE346E34DE34DF34A634FF34FE3428
:1001F0000834513475346D345934E934C201C301C3
:100200004608031D07294708031D0729080046085B
:10021000C402031CC503C51B17294708C502031CDC
:1002200017290130C2070318C30A640007294608CA
:10023000C407C50A4708C50708008601080007303B
:100240009F00031383168330810000308600E03066
:100250008500031383120516FF308100A0308B0048
:10026000BA01F401F501F601BB01BC01BD01BE01FB
:100270001030CC001D21D130BE003D30BD005130CA
:10028000BC004C080319CC290230BA006220CC30E3
:10029000B4204430B420FF3085003B0803196129A5
:1002A000A100A10303195C29A103031957293C08E4
:1002B0008600FE30850065293D088600FD308500FA
:1002C00065293E088600FB308500BB0A03303B06EB
:1002D0000319BB013A0803196E294B29BF0F4B299B
:1002E0000130BF006220CC30B4208B1390208B17DC
:1002F000BC012B0E0F3903198029BC15AA09AB09C3
:100300002A080F39CD00AA0CAA0CAA0CAA0CAA0C18
:10031000C10CAA0CC10CAA0CC10CAA0CC10CAB0CD0
:10032000C10CAB0CC10CAB0CC10CAB0CC10CC201B1
:10033000C301C501C7014108C4000A30C600FE2040
:100340004208CB004408CA00C201C301C501C7016D
:100350004D08C400C40DC40D440D4D074D07C40025
:100360001030C600FE204208CD004B080319C129F9
:100370004A080F39DC20BE004B080F39DC20BD00D5
:1003800041294D080F39DC20BE004A080F391038CA
:0C039000DC20BD00412941298501CC2959
:02400E00423F2F
:00000001FF
:020000001F29B6
:08000800F0000308F1000B11E8
:1000100082308100F20B26280530F200F30A6430AA
:100020007306031D2628F301BA08031DBA03CC0882
:10003000031DCC03F40A3C307406031D2628F4018A
:10004000F60A18307606031D2628F601710883008B
:10005000F00E700E09000A30A2000313790883160F
:100060009A0083127A0883169B008B131C15553057
:100070009D00AA309D009C1464009C183C281C1113
:100080008B178312790883161C1400001A0283123E
:1000900003190034A20BA00A2D2801340313831680
:1000A00000309B001C141A088312A1000800A40051
:1000B000A301A30B5928A40B59280800A300A30BE4
:1000C0005F2808000512C8305E2005166400C8309D
:1000D0005E2064000800A80162203330B420FF30A5
:1000E000B420AA00C920FF30B420AB00C920FF30E3
:1000F000B420AC00C920FF30B420AD00C920FF30CF
:10010000B420AE00C920FF30B420AF00C920FF30BA
:10011000B420B000C920FF30B420B100A80208000C
:10012000A801BE30B420FF30B420AA00C920FF309F
:10013000B420AB00C920FF30B420AC00C920FF3090
:10014000B420AD00C920FF30B420AE00C920FF307C
:10015000B420AF00C920FF30B420B000C920FF3068
:10016000B420B100A8020800A7000830A5000512BD
:100170006400000027180516A70C04305E20A713A2
:10018000051AA71714305E200516A50BB7282708F7
:100190000800A9000830A50029082806A700270C98
:1001A00028080318183AA700270CA8000310A90C68
:1001B0002908A50BCD2808001F398207F5342434FF
:1001C000B934BC346C34DC34DD34A434FD34FC3458
:1001D000ED345D34D1343D34D934C934F734263468
:1001E000BB34BE346E34DE34DF34A634FF34FE3428
:1001F0000834513475346D345934E934C201C301C3
:100200004608031D07294708031D0729080046085B
:10021000C402031CC503C51B17294708C502031CDC
:1002200017290130C2070318C30A640007294608CA
:10023000C407C50A4708C50708008601080007303B
:100240009F00031383168330810000308600E03066
:100250008500031383120516FF308100A0308B0048
:10026000BA01F401F501F601BB01BC01BD01BE01FB
:100270001030CC001D21D130BE003D30BD005130CA
:10028000BC004C080319CC290230BA006220CC30E3
:10029000B4204430B420FF3085003B0803196129A5
:1002A000A100A10303195C29A103031957293C08E4
:1002B0008600FE30850065293D088600FD308500FA
:1002C00065293E088600FB308500BB0A03303B06EB
:1002D0000319BB013A0803196E294B29BF0F4B299B
:1002E0000130BF006220CC30B4208B1390208B17DC
:1002F000BC012B0E0F3903198029BC15AA09AB09C3
:100300002A080F39CD00AA0CAA0CAA0CAA0CAA0C18
:10031000C10CAA0CC10CAA0CC10CAA0CC10CAB0CD0
:10032000C10CAB0CC10CAB0CC10CAB0CC10CC201B1
:10033000C301C501C7014108C4000A30C600FE2040
:100340004208CB004408CA00C201C301C501C7016D
:100350004D08C400C40DC40D440D4D074D07C40025
:100360001030C600FE204208CD004B080319C129F9
:100370004A080F39DC20BE004B080F39DC20BD00D5
:1003800041294D080F39DC20BE004A080F391038CA
:0C039000DC20BD00412941298501CC2959
:02400E00423F2F
:00000001FF
Фрагмент исходного кода:
;**********************************************************************
; Filename: term.asm *
; Date: 18.09.2003 *
; File Version: термометор 18b20 *
;**********************************************************************
; Files required: *
;**********************************************************************
; Notes: BY Garmash G.V. *
;**********************************************************************
Константы задержек и протокол 1-Wire для кварца 4 мгц
Пример кода для работы с DS18B20
;**********************************************************************
; ПОДПРОГРАММЫ *
;**********************************************************************
;******************** 1-Wire *****************************
#define _1WIRE PORTA,4; Выход на MicroLAN.
;-----------------------------------------------------------------------------
Big_delay:
movwf fCOUNTER2
clrf fCOUNTER
BD_Loop94:
decfsz fCOUNTER,1
goto BD_Loop94
decfsz fCOUNTER2,1
goto BD_Loop94
return
;-----------------------------------------------------------------------------
; W=1 - 1.4 мкс.
; W=2 - 2.0 мкс.
; W=3 - 2.6 мкс.
; W=0 - 154 мкс.
delay:
movwf fCOUNTER
D_Loop36:
decfsz fCOUNTER,1
goto D_Loop36
return
;-----------------------------------------------------------------------------
Reset_1Wire: ; Сбрасываем линию на около 500 мкс.
bcf _1WIRE
movlw .200
call delay; 154 мкс.
; call delay; 154 мкс.
; call delay; 154 мкс.
; call delay; 154 мкс.
bsf _1WIRE
CLRWDT ; СБРОС СТОРОЖЕВОГО ТАЙМЕРА
; Пропускаем импульс присутствия.
movlw .200
call delay; 154 мкс.
; call delay; 154 мкс.
; call delay; 154 мкс.
; call delay; 154 мкс.
CLRWDT ; СБРОС СТОРОЖЕВОГО ТАЙМЕРА
return
;-----------------------------------------------------------------------------
; Возвращает:
; Если ОК, то содержимое в регистрах fROM_ID0:fROM_ID7.
; Если ошибка CRC - флаг C (CARRY) в регистре STATUS установлен.
Get_TEMP:
clrf CRC
; Выдаем команду "Чтение ".
movlw 0xBE
call RW_Byte
; Читаем ПЗУ.
movlw 0xFF
call RW_Byte; byte 0.
movwf fROM_ID0
call DO_CRC
movlw 0xFF
call RW_Byte; byte 1.
movwf fROM_ID1
call DO_CRC
movlw 0xFF
call RW_Byte; byte 2.
movwf fROM_ID2
call DO_CRC
movlw 0xFF
call RW_Byte; byte 3.
movwf fROM_ID3
call DO_CRC
movlw 0xFF
call RW_Byte; byte 4.
movwf fROM_ID4
call DO_CRC
movlw 0xFF
call RW_Byte; byte 5.
movwf fROM_ID5
call DO_CRC
movlw 0xFF
call RW_Byte; byte 6.
movwf fROM_ID6
call DO_CRC
; Читаем CRC.
movlw 0xFF
call RW_Byte; byte 7 (CRC).
movwf fROM_ID7
subwf CRC,1
return
;-----------------------------------------------------------------------------
; Ф-ция ввода/вывода на линию 1-Wire.
; Выводим из W и читаем в W.
RW_Byte:
movwf fTEMP
movlw d'8'; 8 бит.
movwf fBIT_CNT
RBLoop:
bcf _1WIRE; Обнуляем выход.
; Ждем 2 мкс.
CLRWDT ; СБРОС СТОРОЖЕВОГО ТАЙМЕРА
nop
btfsc fTEMP,0
bsf _1WIRE; Устанавливаем выход.
rrf fTEMP,1
; Ждем ~12 мкс.
movlw 4
call delay
bcf fTEMP,7; Принимаем в тот же TEMP, из которого передаем.
btfsc _1WIRE
bsf fTEMP,7
; Далее даем время на освобождение линии ведомым.
movlw d'20'
call delay
; Отпускаем линию.
bsf _1WIRE
; Чуть-чуть даем отдохнуть (для медленных эмуляторов). Для Dallas не нужно.
; movlw d'1' ; Впоследствии можно удалить при нормальной работе.
; call delay
; Если 8 бит, то выходим.
decfsz fBIT_CNT,1
goto RBLoop
; Принятый байт в W.
movf fTEMP,0
return
;-----------------------------------------------------------------------------
; Процедура обновления CRC (циклическая контрольная сумма). Параметр в W.
DO_CRC:; Размер CRC - 8 бит.
movwf SAVE_W
movlw 0x08
movwf fBIT_CNT
movf SAVE_W,0
DoCRC_Loop:
xorwf CRC,0
movwf fTEMP
rrf fTEMP,0
movf CRC,0
btfsc STATUS,0
xorlw 0x18
movwf fTEMP
rrf fTEMP,0
movwf CRC
bcf STATUS,0
rrf SAVE_W,1
movf SAVE_W,0
decfsz fBIT_CNT,1
goto DoCRC_Loop
return
;-----------------------------------------------------------------------------
Пример получения значения температуры
; -------------------------------
call Reset_1Wire
; Запись байта:
movlw 0xCC ; пропуск пзу
call RW_Byte
movlw 0x44 ; преобразование температуры
call RW_Byte
call Wait_1s
call Reset_1Wire
movlw 0xCC ; пропуск пзу
call RW_Byte
CALL Get_TEM
;-----------------------------------------------------------------------------
Пример для DS1990
;----------------------------------------------------------------------
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;@ Процедуры для работы с сетью MicroLAN со стороны ведущего. @
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
; Рассчитано на работу с генератором тактовой частоты 20 МГц.
; Сеть MicroLAN подключается к RB5.
; Для уменьшения размера кода функции чтения и записи обьединены.
; ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ ПРОЦЕДУР:
; -------------------------------
; Сброс всех устройств на линии:
; call Reset_1Wire
; -------------------------------
; Чтение байта:
; movlw 0FFh
; call RW_Byte
; В W байт.
; -------------------------------
; Запись байта:
; movlw "байт"
; call RW_Byte
; -------------------------------
; Чтение сетевого номера устройства (чтение содержимого ПЗУ).
; Используется, если на линии только одно устройство!
; call Get_ROM_ID
; В fROM_ID0:fROM_ID7 сетевой номер.
; Если STATUS,C установлен, значит принятая контрольная сумма
; не совпала с вычисленной.
; -------------------------------
; ПРИМЕР РАБОТЫ С MicroLAN:
; 1) Сброс.
;
;Устройства на сетевом уровне.
;
; 2) Выдача на линию команды сетевого уровня.
; 3) Чтение или сравнение содержимого ПЗУ (соответственно команде).
; По команде "Пропуск ПЗУ" устройство пропускает 3 пункт.
;
;Выбранное устройство переходит на транспортный уровень. Все остальные
;становятся неактивными до сброса.
;
; 4) Выдача на линию команды транспортного уровня.
; 5) Далее, в зависимости от команды.
; 6) Работа с устройством заканчивается сбросом.
; -------------------------------
;******************** 1-Wire *****************************
#define _1WIRE PORTA,4; Выход на MicroLAN.
;******************** MicroLAN ***************************
; Команды сетевого уровня.
READ_ROM_CMD equ 033h; Команда "Чтение ПЗУ"
READ_R1990_CMD equ 00Fh; Для DS1990A этот код используется вместо 33h.
MATCH_ROM_CMD equ 055h; Команда "Совпадение ПЗУ".
SKIP_ROM_CMD equ 0CCh; Команда "Пропуск ПЗУ".
; После передачи сетевой команды и приема или передачи данных, ведомый
; переходит на транспортный уровень (ждет команду транспортного уровня).
;-----------------------------------------------------------------------------
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; RA4 должен быть направлен на выход и установлен в 1.
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;-----------------------------------------------------------------------------
Big_delay:
movwf fCOUNTER2
clrf fCOUNTER
BD_Loop94:
decfsz fCOUNTER,1
goto BD_Loop94
decfsz fCOUNTER2,1
goto BD_Loop94
return
;-----------------------------------------------------------------------------
; W=1 - 1.4 мкс.
; W=2 - 2.0 мкс.
; W=3 - 2.6 мкс.
; W=0 - 154 мкс.
delay:
movwf fCOUNTER
D_Loop36:
decfsz fCOUNTER,1
goto D_Loop36
return
;-----------------------------------------------------------------------------
Reset_1Wire: ; Сбрасываем линию на около 500 мкс.
bcf _1WIRE
movlw 0
call delay; 154 мкс.
call delay; 154 мкс.
call delay; 154 мкс.
call delay; 154 мкс.
bsf _1WIRE
CLRWDT ; СБРОС СТОРОЖЕВОГО ТАЙМЕРА
; Пропускаем импульс присутствия.
movlw 0
call delay; 154 мкс.
call delay; 154 мкс.
call delay; 154 мкс.
call delay; 154 мкс.
CLRWDT ; СБРОС СТОРОЖЕВОГО ТАЙМЕРА
return
;-----------------------------------------------------------------------------
; Возвращает:
; Если ОК, то содержимое ПЗУ в регистрах fROM_ID0:fROM_ID7.
; Если ошибка CRC - флаг C (CARRY) в регистре STATUS установлен.
Get_ROM_ID:
clrf CRC
; Сбрасываем все приборы на линии.
call Reset_1Wire
; Выдаем команду "Чтение ПЗУ".
movlw READ_ROM_CMD
call RW_Byte
; Читаем ПЗУ.
movlw 0xFF
call RW_Byte; byte 0.
movwf fROM_ID0
call DO_CRC
movlw 0xFF
call RW_Byte; byte 1.
movwf fROM_ID1
call DO_CRC
movlw 0xFF
call RW_Byte; byte 2.
movwf fROM_ID2
call DO_CRC
movlw 0xFF
call RW_Byte; byte 3.
movwf fROM_ID3
call DO_CRC
movlw 0xFF
call RW_Byte; byte 4.
movwf fROM_ID4
call DO_CRC
movlw 0xFF
call RW_Byte; byte 5.
movwf fROM_ID5
call DO_CRC
movlw 0xFF
call RW_Byte; byte 6.
movwf fROM_ID6
call DO_CRC
; Читаем CRC.
movlw 0xFF
call RW_Byte; byte 7 (CRC).
movwf fROM_ID7
subwf CRC,1
return
;-----------------------------------------------------------------------------
; Ф-ция ввода/вывода на линию 1-Wire.
; Выводим из W и читаем в W.
RW_Byte:
movwf fTEMP
movlw d'8'; 8 бит.
movwf fBIT_CNT
RBLoop:
bcf _1WIRE; Обнуляем выход.
; Ждем 2 мкс.
CLRWDT ; СБРОС СТОРОЖЕВОГО ТАЙМЕРА
nop
nop
nop
nop
nop
nop
nop
nop
nop
btfsc fTEMP,0
bsf _1WIRE; Устанавливаем выход.
rrf fTEMP,1
; Ждем ~12 мкс.
movlw 18
call delay
bcf fTEMP,7; Принимаем в тот же TEMP, из которого передаем.
btfsc _1WIRE
bsf fTEMP,7
; Далее даем время на освобождение линии ведомым.
movlw d'100'
call delay
; Отпускаем линию.
bsf _1WIRE
; Чуть-чуть даем отдохнуть (для медленных эмуляторов). Для Dallas не нужно.
movlw d'1' ; Впоследствии можно удалить при нормальной работе.
call delay
; Если 8 бит, то выходим.
decfsz fBIT_CNT,1
goto RBLoop
; Принятый байт в W.
movf fTEMP,0
return
;-----------------------------------------------------------------------------
; Процедура обновления CRC (циклическая контрольная сумма). Параметр в W.
DO_CRC:; Размер CRC - 8 бит.
movwf SAVE_W
movlw 0x08
movwf fBIT_CNT
movf SAVE_W,0
DoCRC_Loop:
xorwf CRC,0
movwf fTEMP
rrf fTEMP,0
movf CRC,0
btfsc STATUS,0
xorlw 0x18
movwf fTEMP
rrf fTEMP,0
movwf CRC
bcf STATUS,0
rrf SAVE_W,1
movf SAVE_W,0
decfsz fBIT_CNT,1
goto DoCRC_Loop
return
;-----------------------------------------------------------------------------
Вызов в тексте программы
bcf INTCON, GIE ; Запретить прерывания
CALL Get_ROM_ID
bsf INTCON, GIE ; Разрешить прерывания
BTFSS STATUS,Z
goto BAD_CRC ; НЕ СОВПАЛА КОНТРОЛЬНАЯ СУММА
MOVF fROM_ID7,0
BTFSC STATUS,Z
goto BAD_CRC
; Filename: term.asm *
; Date: 18.09.2003 *
; File Version: термометор 18b20 *
;**********************************************************************
; Files required: *
;**********************************************************************
; Notes: BY Garmash G.V. *
;**********************************************************************
Константы задержек и протокол 1-Wire для кварца 4 мгц
Пример кода для работы с DS18B20
;**********************************************************************
; ПОДПРОГРАММЫ *
;**********************************************************************
;******************** 1-Wire *****************************
#define _1WIRE PORTA,4; Выход на MicroLAN.
;-----------------------------------------------------------------------------
Big_delay:
movwf fCOUNTER2
clrf fCOUNTER
BD_Loop94:
decfsz fCOUNTER,1
goto BD_Loop94
decfsz fCOUNTER2,1
goto BD_Loop94
return
;-----------------------------------------------------------------------------
; W=1 - 1.4 мкс.
; W=2 - 2.0 мкс.
; W=3 - 2.6 мкс.
; W=0 - 154 мкс.
delay:
movwf fCOUNTER
D_Loop36:
decfsz fCOUNTER,1
goto D_Loop36
return
;-----------------------------------------------------------------------------
Reset_1Wire: ; Сбрасываем линию на около 500 мкс.
bcf _1WIRE
movlw .200
call delay; 154 мкс.
; call delay; 154 мкс.
; call delay; 154 мкс.
; call delay; 154 мкс.
bsf _1WIRE
CLRWDT ; СБРОС СТОРОЖЕВОГО ТАЙМЕРА
; Пропускаем импульс присутствия.
movlw .200
call delay; 154 мкс.
; call delay; 154 мкс.
; call delay; 154 мкс.
; call delay; 154 мкс.
CLRWDT ; СБРОС СТОРОЖЕВОГО ТАЙМЕРА
return
;-----------------------------------------------------------------------------
; Возвращает:
; Если ОК, то содержимое в регистрах fROM_ID0:fROM_ID7.
; Если ошибка CRC - флаг C (CARRY) в регистре STATUS установлен.
Get_TEMP:
clrf CRC
; Выдаем команду "Чтение ".
movlw 0xBE
call RW_Byte
; Читаем ПЗУ.
movlw 0xFF
call RW_Byte; byte 0.
movwf fROM_ID0
call DO_CRC
movlw 0xFF
call RW_Byte; byte 1.
movwf fROM_ID1
call DO_CRC
movlw 0xFF
call RW_Byte; byte 2.
movwf fROM_ID2
call DO_CRC
movlw 0xFF
call RW_Byte; byte 3.
movwf fROM_ID3
call DO_CRC
movlw 0xFF
call RW_Byte; byte 4.
movwf fROM_ID4
call DO_CRC
movlw 0xFF
call RW_Byte; byte 5.
movwf fROM_ID5
call DO_CRC
movlw 0xFF
call RW_Byte; byte 6.
movwf fROM_ID6
call DO_CRC
; Читаем CRC.
movlw 0xFF
call RW_Byte; byte 7 (CRC).
movwf fROM_ID7
subwf CRC,1
return
;-----------------------------------------------------------------------------
; Ф-ция ввода/вывода на линию 1-Wire.
; Выводим из W и читаем в W.
RW_Byte:
movwf fTEMP
movlw d'8'; 8 бит.
movwf fBIT_CNT
RBLoop:
bcf _1WIRE; Обнуляем выход.
; Ждем 2 мкс.
CLRWDT ; СБРОС СТОРОЖЕВОГО ТАЙМЕРА
nop
btfsc fTEMP,0
bsf _1WIRE; Устанавливаем выход.
rrf fTEMP,1
; Ждем ~12 мкс.
movlw 4
call delay
bcf fTEMP,7; Принимаем в тот же TEMP, из которого передаем.
btfsc _1WIRE
bsf fTEMP,7
; Далее даем время на освобождение линии ведомым.
movlw d'20'
call delay
; Отпускаем линию.
bsf _1WIRE
; Чуть-чуть даем отдохнуть (для медленных эмуляторов). Для Dallas не нужно.
; movlw d'1' ; Впоследствии можно удалить при нормальной работе.
; call delay
; Если 8 бит, то выходим.
decfsz fBIT_CNT,1
goto RBLoop
; Принятый байт в W.
movf fTEMP,0
return
;-----------------------------------------------------------------------------
; Процедура обновления CRC (циклическая контрольная сумма). Параметр в W.
DO_CRC:; Размер CRC - 8 бит.
movwf SAVE_W
movlw 0x08
movwf fBIT_CNT
movf SAVE_W,0
DoCRC_Loop:
xorwf CRC,0
movwf fTEMP
rrf fTEMP,0
movf CRC,0
btfsc STATUS,0
xorlw 0x18
movwf fTEMP
rrf fTEMP,0
movwf CRC
bcf STATUS,0
rrf SAVE_W,1
movf SAVE_W,0
decfsz fBIT_CNT,1
goto DoCRC_Loop
return
;-----------------------------------------------------------------------------
Пример получения значения температуры
; -------------------------------
call Reset_1Wire
; Запись байта:
movlw 0xCC ; пропуск пзу
call RW_Byte
movlw 0x44 ; преобразование температуры
call RW_Byte
call Wait_1s
call Reset_1Wire
movlw 0xCC ; пропуск пзу
call RW_Byte
CALL Get_TEM
;-----------------------------------------------------------------------------
Пример для DS1990
;----------------------------------------------------------------------
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;@ Процедуры для работы с сетью MicroLAN со стороны ведущего. @
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
; Рассчитано на работу с генератором тактовой частоты 20 МГц.
; Сеть MicroLAN подключается к RB5.
; Для уменьшения размера кода функции чтения и записи обьединены.
; ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ ПРОЦЕДУР:
; -------------------------------
; Сброс всех устройств на линии:
; call Reset_1Wire
; -------------------------------
; Чтение байта:
; movlw 0FFh
; call RW_Byte
; В W байт.
; -------------------------------
; Запись байта:
; movlw "байт"
; call RW_Byte
; -------------------------------
; Чтение сетевого номера устройства (чтение содержимого ПЗУ).
; Используется, если на линии только одно устройство!
; call Get_ROM_ID
; В fROM_ID0:fROM_ID7 сетевой номер.
; Если STATUS,C установлен, значит принятая контрольная сумма
; не совпала с вычисленной.
; -------------------------------
; ПРИМЕР РАБОТЫ С MicroLAN:
; 1) Сброс.
;
;Устройства на сетевом уровне.
;
; 2) Выдача на линию команды сетевого уровня.
; 3) Чтение или сравнение содержимого ПЗУ (соответственно команде).
; По команде "Пропуск ПЗУ" устройство пропускает 3 пункт.
;
;Выбранное устройство переходит на транспортный уровень. Все остальные
;становятся неактивными до сброса.
;
; 4) Выдача на линию команды транспортного уровня.
; 5) Далее, в зависимости от команды.
; 6) Работа с устройством заканчивается сбросом.
; -------------------------------
;******************** 1-Wire *****************************
#define _1WIRE PORTA,4; Выход на MicroLAN.
;******************** MicroLAN ***************************
; Команды сетевого уровня.
READ_ROM_CMD equ 033h; Команда "Чтение ПЗУ"
READ_R1990_CMD equ 00Fh; Для DS1990A этот код используется вместо 33h.
MATCH_ROM_CMD equ 055h; Команда "Совпадение ПЗУ".
SKIP_ROM_CMD equ 0CCh; Команда "Пропуск ПЗУ".
; После передачи сетевой команды и приема или передачи данных, ведомый
; переходит на транспортный уровень (ждет команду транспортного уровня).
;-----------------------------------------------------------------------------
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; RA4 должен быть направлен на выход и установлен в 1.
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;-----------------------------------------------------------------------------
Big_delay:
movwf fCOUNTER2
clrf fCOUNTER
BD_Loop94:
decfsz fCOUNTER,1
goto BD_Loop94
decfsz fCOUNTER2,1
goto BD_Loop94
return
;-----------------------------------------------------------------------------
; W=1 - 1.4 мкс.
; W=2 - 2.0 мкс.
; W=3 - 2.6 мкс.
; W=0 - 154 мкс.
delay:
movwf fCOUNTER
D_Loop36:
decfsz fCOUNTER,1
goto D_Loop36
return
;-----------------------------------------------------------------------------
Reset_1Wire: ; Сбрасываем линию на около 500 мкс.
bcf _1WIRE
movlw 0
call delay; 154 мкс.
call delay; 154 мкс.
call delay; 154 мкс.
call delay; 154 мкс.
bsf _1WIRE
CLRWDT ; СБРОС СТОРОЖЕВОГО ТАЙМЕРА
; Пропускаем импульс присутствия.
movlw 0
call delay; 154 мкс.
call delay; 154 мкс.
call delay; 154 мкс.
call delay; 154 мкс.
CLRWDT ; СБРОС СТОРОЖЕВОГО ТАЙМЕРА
return
;-----------------------------------------------------------------------------
; Возвращает:
; Если ОК, то содержимое ПЗУ в регистрах fROM_ID0:fROM_ID7.
; Если ошибка CRC - флаг C (CARRY) в регистре STATUS установлен.
Get_ROM_ID:
clrf CRC
; Сбрасываем все приборы на линии.
call Reset_1Wire
; Выдаем команду "Чтение ПЗУ".
movlw READ_ROM_CMD
call RW_Byte
; Читаем ПЗУ.
movlw 0xFF
call RW_Byte; byte 0.
movwf fROM_ID0
call DO_CRC
movlw 0xFF
call RW_Byte; byte 1.
movwf fROM_ID1
call DO_CRC
movlw 0xFF
call RW_Byte; byte 2.
movwf fROM_ID2
call DO_CRC
movlw 0xFF
call RW_Byte; byte 3.
movwf fROM_ID3
call DO_CRC
movlw 0xFF
call RW_Byte; byte 4.
movwf fROM_ID4
call DO_CRC
movlw 0xFF
call RW_Byte; byte 5.
movwf fROM_ID5
call DO_CRC
movlw 0xFF
call RW_Byte; byte 6.
movwf fROM_ID6
call DO_CRC
; Читаем CRC.
movlw 0xFF
call RW_Byte; byte 7 (CRC).
movwf fROM_ID7
subwf CRC,1
return
;-----------------------------------------------------------------------------
; Ф-ция ввода/вывода на линию 1-Wire.
; Выводим из W и читаем в W.
RW_Byte:
movwf fTEMP
movlw d'8'; 8 бит.
movwf fBIT_CNT
RBLoop:
bcf _1WIRE; Обнуляем выход.
; Ждем 2 мкс.
CLRWDT ; СБРОС СТОРОЖЕВОГО ТАЙМЕРА
nop
nop
nop
nop
nop
nop
nop
nop
nop
btfsc fTEMP,0
bsf _1WIRE; Устанавливаем выход.
rrf fTEMP,1
; Ждем ~12 мкс.
movlw 18
call delay
bcf fTEMP,7; Принимаем в тот же TEMP, из которого передаем.
btfsc _1WIRE
bsf fTEMP,7
; Далее даем время на освобождение линии ведомым.
movlw d'100'
call delay
; Отпускаем линию.
bsf _1WIRE
; Чуть-чуть даем отдохнуть (для медленных эмуляторов). Для Dallas не нужно.
movlw d'1' ; Впоследствии можно удалить при нормальной работе.
call delay
; Если 8 бит, то выходим.
decfsz fBIT_CNT,1
goto RBLoop
; Принятый байт в W.
movf fTEMP,0
return
;-----------------------------------------------------------------------------
; Процедура обновления CRC (циклическая контрольная сумма). Параметр в W.
DO_CRC:; Размер CRC - 8 бит.
movwf SAVE_W
movlw 0x08
movwf fBIT_CNT
movf SAVE_W,0
DoCRC_Loop:
xorwf CRC,0
movwf fTEMP
rrf fTEMP,0
movf CRC,0
btfsc STATUS,0
xorlw 0x18
movwf fTEMP
rrf fTEMP,0
movwf CRC
bcf STATUS,0
rrf SAVE_W,1
movf SAVE_W,0
decfsz fBIT_CNT,1
goto DoCRC_Loop
return
;-----------------------------------------------------------------------------
Вызов в тексте программы
bcf INTCON, GIE ; Запретить прерывания
CALL Get_ROM_ID
bsf INTCON, GIE ; Разрешить прерывания
BTFSS STATUS,Z
goto BAD_CRC ; НЕ СОВПАЛА КОНТРОЛЬНАЯ СУММА
MOVF fROM_ID7,0
BTFSC STATUS,Z
goto BAD_CRC
Источник:
http://www.picping.narod.ru/
http://www.picping.narod.ru/
0 комментариев