не вірної контрольної суми)(kode=55,number=00h,data=a5h).
Лістинг програми.
list p=16f874
include <p16f874.inc>
cblock 0x70
COUNT ;завжди використовується як лічильник
DATA ;регістр даних для пересилки, для прийняття
CRC_DATA ;регістр контрольної суми
TEMP_REG ;регістри для
TEMP_REG1 ;тимчасового зберігання даних
TEMP_REG2 ;тимчасовий регістр використовується в підпрограмах
ERR_REG ;регістр коду помилки, що виникають при виконанні команд
endc
start:
;ініціалізація
bsf STATUS,RP0
movlw 0x80
movwf ADCON1
bsf TXREG,5
bsf TXREG,2
movlw 0x19
movwf SPBRG
clrf TRISD
clrf TRISB
clrf TRISC
bsf TRISC,7
bcf STATUS,RP0
bsf RCSTA,4
bsf RCSTA,7
bsf ADCON0,0
bsf ADCON0,6
;ОСНОВНА ПРОГРАМА
rx_rep
movlw 0x20 ;початкова адреса байту в пам"яті
movwf FSR ;прийняті значення від ПК завжди мають початкову адресу 0х20
movlw 0x03 ;лічильник кількісті байт без контрольної
movwf COUNT ;суми
clrf CRC_DATA ;обнулення контрольної суми
rx_next
btfss PIR1,RCIF ;цикл приймання 3-ох байт даних RS-232
goto $-1
bcf PIR1,RCIF
movf RCREG,w
movwf INDF
movwf DATA
CALL crc_suma
incf FSR
decfsz COUNT,f
goto rx_next
btfss PIR1,RCIF ;приймання байту контрольної суми
goto $-1
bcf PIR1,RCIF
movf RCREG,w
xorwf CRC_DATA ;перевірка прийнятого байту контрольної
movlw 0x80 ;з обрахованим
btfsc STATUS,Z ;якщо контрольна сума збігається
clrw
iorwf 0x20 ;повертаємо прийнятий пакет даних, а інакше
movlw 0x03 ;старший біт байту команди встановлюємо
movwf COUNT ;в одиницю
movlw 0x20
movwf FSR
clrf CRC_DATA
tx_next
movf INDF,w
movwf TXREG
btfss PIR1,TXIF
goto $-1
bcf PIR1,TXIF
movwf DATA
call crc_suma
incf FSR
decfsz COUNT,f
goto tx_next
movf CRC_DATA,w
movwf TXREG
btfss PIR1,TXIF
goto $-1
bcf PIR1,TXIF
btfss 0x20,7
goto typ_kom
movf 0x20,w
movwf 0x24
movf 0x21,w
movwf 0x25
movf 0x22,w
movwf 0x26
goto rx_rep
typ_kom
;Визначення типу команди
movf 0x20,w
xorlw 0x11 ;визначення команди а-ц перетворення
btfsc STATUS,Z
goto adc_kom
movf 0x20,w
xorlw 0x12 ;визначення команди читанння з DS18B20
btfsc STATUS,Z
goto DS18_kom
movf 0x20,w
xorlw 0x21 ;визначення команди ц-а перетворення
btfsc STATUS,Z
goto dac_kom
movf 0x20,w
xorlw 0x22 ;визначення команди керування реле
btfsc STATUS,Z
goto rele_kom
;---------------------------
movlw 0x03 ;виконання команди повторної передачі даних
movwf COUNT ;з давачів(виконується у випадку неправильної контрольої суми)
movlw 0x24
movwf FSR
clrf CRC_DATA
tx_next
movf INDF,w
movwf TXREG
btfss PIR1,TXIF
goto $-1
bcf PIR1,TXIF
movwf DATA
call crc_suma
incf FSR
decfsz COUNT,f
goto tx_next
movf CRC_DATA,w
movwf TXREG
btfss PIR1,TXIF
goto $-1
bcf PIR1,TXIF
goto rx_rep
;-------------------------------------------------------------------------------
;Виконання команди оцифровування даних з 1,2 та 3-го каналів
adc_kom
movf 0x21,w ;перевірка номеру каналу 1
xorlw 0x01
btfss STATUS,Z
goto per_kan2
movlw 0x49
goto adc_proc
per_kan2
movf 0x21,w ;перевірка номеру каналу 2
xorlw 0x02
btfss STATUS,Z
goto per_kan3
movlw 0x51
goto adc_proc
per_kan3
movf 0x21,w ;перевірка номеру каналу 3
xorlw 0x02
btfss STATUS,Z
goto per_kan4
movlw 0x59
goto adc_proc
movlw 0x20
movwf ERR_REG
goto tx_err ;передавання помилки номеру каналу АЦП
adc_proc
movwf ADCON0
movlw 0x09 ;затримка на 30 мкс, яка необхідна для
movwf COUNT ;зарядження вхідного конденсатора АЦП
decfsz COUNT
goto $-1
bsf ADCON0,2 ;запуск а-ц перетворення
btfsc ADCON0,2
goto $-1
tx_rep clrf CRC_DATA
movf 0x20,w ;передаємо код команди
movwf TXREG
movwf 0x24
movwf DATA
call crc_suma
btfss PIR1,TXIF
goto $-1
bcf PIR1,TXIF
bsf STATUS,RP0 ;передаємо молодший байт даних
movf ADRESL,w
bcf STATUS,RP0
movwf TXREG
movwf 0x25
movwf DATA
call crc_suma
btfss PIR1,TXIF
goto $-1
bcf PIR1,TXIF
movf ADREH,w ;передаємо старший байт даних
movwf 0x26
movwf TXREG
movwf DATA
call crc_suma
btfss PIR1,TXIF
goto $-1
bcf PIR1,TXIF
movf CRC_DATA,w ;передаємо контрольну суму
movwf TXREG
btfss PIR1,TXIF
goto $-1
bcf PIR1,TXIF
goto rx_rep
;------------------------------------------------------------------------
;команда читання даних з давача температури DS18В20
ds18_kom
movf 0x21,w
xorlw 0x01 ;перевірка 1 номеру давача
btfss STATUS,Z
goto per_ds18_1
clrf TEMP_REG ;занесення зміщення адреси пристрою
goto temp_rx
per_ds18_1
movf 0x21,w
xorlw 0x02 ;перевірка 2 номеру давача
btfss STATUS,Z
goto per_ds18_2
movlw 0x10
movwf TEMP_REG
goto ds18_rx_proc
per_ds18_2
movf 0x21,w
xorlw 0x55 ;перевірка команди конфігурації
btfsс STATUS,Z
goto per_ds18_4
movlw 0x32
movwf ERR_REG
goto tx_err
per_ds18_4
clrf ERR_REG
clrf TEMP_REG1 ;виконання команди конфігурування давачів DS18В20
rep_ds18_konf
movf 0x22,w
xorlw 0x01
btfss STATUS,Z
movlw 0x10
movwf EEADR ;формування початкової адреси в пам"яті програм
movlw 0x06
movwf EEADRH
clrf CRC_DATA
movlw 0x06
movwf COUNT
call ds18_reset
btfsc STATUS,Z
goto ds18_konf_1
movlw 0x31
movwf ERR_REG
goto tx_err
ds18_konf_1
movlw 0x33
call ds18_wr
call ds18_rd
movf DATA,w
call crc_suma
per_ds18_3
call ds18_rd
movf DATA,w
movwf EEDATA
call crc_suma
call flash_wr ;запис даних в енергонезалежну пам"ять
incf EEADR
decfsz COUNT
goto per_ds18_3
call ds18_rd
movf DATA,w
xorwf CRC_DATA,w
btfsc STATUS,Z
goto tx_non_err
incf TEMP_REG1
xorlw 0x03
btfss STATUS,Z
goto rep_ds18_konf
movlw 0x31
movwf ERR_REG
goto tx_err
ds18_rx
movf TEMP_REG,w ;формування початкової адреси в пам"яті програм
movwf EEADR
movlw 0x06
movwf EEADRH
call ds18_reset ;формування умови скидання
btfsc STATUS,Z
goto ds18_rx1
movlw 0x31
movwf ERR_REG
goto tx_err
ds18_rx1
movlw 0x28
movwf DATA
call ds18_wr ;запис коду серії
movlw 0x55
movwf DATA
call ds18_wr ;запис команди вибору мікросхеми
movlw 0x06
movwf COUNT
ds18_next_byte ;запис унікального коду пристрою DS18В20
call flash_rd
movf EEDATA,w
movwf DATA
call ds18_wr
incf EEADR
decfsz COUNT
goto ds18_next_byte
movlw 0x44 ;команда на а-ц перетворення
movwf DATA
call ds18_wr
call port_in ;втановлення виxоду portc,1 як входу
bcf PORTC,0 ;дозвіл живлення мікросхеми
call zat_785ms ;час на а-ц перетворення
bsf PORTC,0 ;заборона живлення мікросхеми
clrf TEMP_REG1 ;лічильник кількості хибних читань
ds18_rep_rd
call ds18_reset ;формування умови скидання
btfsc STATUS,Z
goto ds18_rep_rd1
movlw 0x31
movwf ERR_REG
goto tx_err
ds18_rep_rd1
movlw 0x28
movwf DATA
call ds18_wr ;запис коду серії
movlw 0x55
movwf DATA
call ds18_wr ;запис команди вибору мікросхеми
movf TEMP_REG,w ;формування початкової адреси в пам"яті програм
movwf EEADR
movlw 0x06
movwf COUNT
ds18_next_byte1 ;запис унікального коду пристрою DS18В20
call flash_read
movf EEDATA,w
movwf DATA
call ds18_wr
incf EEADR
decfsz COUNT
goto ds18_next_byte1
movlw 0xBE ;запис команди читання SRAM пам"яті DS18В20
movwf DATA
call ds18_wr
clrf CRC_DATA
movlw 0x08
movwf COUNT
movlw 0x30
movwf FSR
ds18_next_byte2 ;читання даних
call ds18_rd
movf DATA,w
call crc_suma
movwf INDF
incf FSR
decfsz COUNT
goto ds18_next_byte2
call ds18_rd
movf DATA,w ;перевірка правильності контрольної суми
xorwf CRC_DATA,w
btfsc STATUS,Z
goto tx_temper
incf TEMP_REG1
movf TEMP_REG1,w
xorlw 0x03 ;якщо контрольна сума не вірна читання здійснюється
btfss STATUS,Z
goto ds18_rep_rd ;не більше 3-ох разів
movlw 0x30
movwf ERR_REG
tx_err
movlw 0x80
tx_non_err
iorwf 0x20
movwf 0x24
movf ERR_REG,w ;в комірку 25 записується код
movwf 0x25 ;помилки
movf 0x22,w
movwf 0x26
clrf CRC_DATA ;передача даних що сигналізують про помилку
movlw 0x03
movwf COUNT
movlw 0x24
movwf FSR
clrf CRC_DATA
tx_next1
movf INDF,w
movwf TXREG
btfss PIR1,TXIF
goto $-1
bcf PIR1,TXIF
movwf DATA
call crc_suma
incf FSR
decfsz COUNT,f
goto tx_next1
movf CRC_DATA,w
movwf TXREG
btfss PIR1,TXIF
goto $-1
bcf PIR1,TXIF
goto rx_rep ;для того, що виконати команду
;необхідно її повторити після перевірки лінії
;якщо не правильна контрольна сума можна ввести команду
;читання даних без вимірювання
;передача даних температури, коли все ок
tx_temper
movf 0x20,w
movwf 0x24
movf 0x30,w
movwf 0x25
movf 0x31,w
movwf 0x26
clrf CRC_DATA
movlw 0x03
movwf COUNT
movlw 0x24
movwf FSR
tx_next2
movf INDF,w
movwf TXREG
btfss PIR1,TXIF
goto $-1
bcf PIR1,TXIF
movwf DATA
call crc_suma
incf FSR
decfsz COUNT,f
goto tx_next2
movf CRC_DATA,w
movwf TXREG
btfss PIR1,TXIF
goto $-1
bcf PIR1,TXIF
goto rx_rep ;якщо не правильна контрольна сума можна ввести команду
;читання даних RAM без вимірювання
;----------------------------------------------------------------------------------------
;команда керування аналоговими виходами
dac_kom
movf 0x22,w
movwf PORTD
movf 0x21,w ;перевірка номеру цап1
xorlw 0x01
btfss STATUS,Z
goto dac_next_dac1
bcf PORTB,0
nop
bsf PORTB,0
movf 0x21,w
movwf ERR_REG
clrw
goto tx_non_err
dac_next_dac1
movf 0x21,w ;перевірка номеру цап2
xorlw 0x02
btfss STATUS,Z
goto dac_next_dac2
bcf PORTB,1
nop
bsf PORTB,1
movf 0x21,w
movwf ERR_REG
clrw
goto tx_non_err
dac_next_dac2
movf 0x21,w ;перевірка номеру цап3
xorlw 0x02
btfss STATUS,Z
goto dac_next_dac3
bcf PORTB,2
nop
bsf PORTB,2
movf 0x21,w
movwf ERR_REG
clrw
goto tx_non_err
dac_next_dac3
movf 0x21,w ;перевірка номеру цап4
xorlw 0x02
btfss STATUS,Z
goto dac_next_dac4
bcf PORTB,3
nop
bsf PORTB,3
movf 0x21,w
movwf ERR_REG
clrw
goto tx_non_err
dac_next_dac4
movf 0x21,w ;перевірка номеру цап5
xorlw 0x02
btfss STATUS,Z
goto dac_next_dac5
bcf PORTB,4
nop
bsf PORTB,4
movf 0x21,w
movwf ERR_REG
clrw
goto tx_non_err
dac_next_dac5
movf 0x21,w ;перевірка номеру цап6
xorlw 0x02
btfss STATUS,Z
goto dac_next_dac6
bcf PORTB,1
nop
bsf PORTB,1
movf 0x21,w
movwf ERR_REG
clrw
goto tx_non_err
dac_next_dac6
movlw 0x40