У нас: 141825 рефератів
Щойно додані Реферати Тор 100
Скористайтеся пошуком, наприклад Реферат        Грубий пошук Точний пошук
Вхід в абонемент


не вірної контрольної суми)(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


Сторінки: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18