48017 (588515), страница 11
Текст из файла (страница 11)
BRA intr
INT1_INMOVFF ALARM_DEL,TMR2
BCF INTCON3,0
BRA intr
TM1_INTMOVLW .25
ADDWF ALARM_DEL
MOVLW .250
CPFSEQ ALARM_DEL
BRA rut
CLRF ALARM_DEL
rutDECF TIME_DEL
BTFSS EVENTS,5
BRA sens
DECFSZ UART_DEL
BRA $+4
BSF EVENTS,4;Set flag "CONNECT ERROR"
;Switch HL1..HL3-------------------------------
rtBTFSC HL_STAT,0;
BSF PORTC,0;Apply changes
BTFSC HL_STAT,1;on flag HL_STAT
BSF PORTC,1;
BTFSC HL_STAT,2;(active)
BSF PORTC,2;
BTFSS HL_STAT,0;
BCF PORTC,0;
BTFSS HL_STAT,1;(desactive)
BCF PORTC,1;
BTFSS HL_STAT,2;
BCF PORTC,2;
BCF PIR1,TMR1IF
intrMOVFF BSR_TEMP2,BSR
MOVF W_TEMP2,W
MOVFF STATUS_TEMP2,STATUS
RETFIE
;-------Coder for digits printing----------------------
CODERRLNCF WREG;WREG=WREG*2
ADDWF PCL,F;Step
RETLW 30;'0'
RETLW 31;'1'
RETLW 32;'2'
RETLW 33;'3'
RETLW 34;'4'
RETLW 35;'5'
RETLW 36;'6'
RETLW 37;'7'
RETLW 38;'8'
RETLW 39;'9'
;-------Interrupt subroutines-------------------------
INTMOVWF W_TEMP
MOVFF STATUS,STATUS_TEMP
MOVFF BSR,BSR_TEMP
MOVFF TMR0L,PERIOD;capture timer value
CLRF TMR0L
;-------
anothBTFSC FLAG,2;If parity bit will be received...
BRA PARITY;
BTFSC FLAG,1;If start bit was received...
BRA BIT_AN;
BTFSC FLAG,0;If "begin bit" set,then
BRA RES_AN;goto to analizing bit.
;
BTFSC INTCON,TMR0IF
LFSR FSR1,IRDA1
MOVLW B'00000001';set "begin receiving",
MOVWF FLAG;Reset flag "timer overflow"
CLRF COM_BUF;clear variables
BCF INTCON,TMR0IF
CLRF BIT;
BRA int_end;
RES_ANBTFSC INTCON,TMR0IF;If TMR0 overflow then error
BRA err
;Verifing...
MOVLW 0x6D;4 ms13 ms
CPFSGT PERIOD;normal 15 ms
BRA err;error if time is short
MOVLW 0xCB;6 ms17 ms
CPFSLT PERIOD;
BRA err;error if time is long
BSF FLAG,1;Set flag "START BIT"
BRA int_end
BIT_ANBTFSC INTCON,TMR0IF
BRA err
MOVLW 0x46;23-2.3 ms
CPFSLT PERIOD;12 ms
BRA err;error if time>H1 (normal 10 ms)
MOVLW 0x1A;old=43
CPFSGT PERIOD;0A-0.7 ms3 ms
BRA err;error if time ;END of verifing RLNCF COM_BUF; MOVLW 0x30;14 CPFSLT PERIOD; BSF COM_BUF,0;if time>H0 then bit is "1" CPFSGT PERIOD; BCF COM_BUF,0;if time INCF BIT,F; MOVLW .8 CPFSLT BIT BSF FLAG,2;Next bit will be parity BRA int_end; PARITYBTFSC INTCON,TMR0IF BRA err MOVLW 0x46;23-2.3 ms CPFSLT PERIOD;12 ms BRA err;error if time>H1 (normal 10 ms) MOVLW 0x1A;0A-0.7 msold=43 CPFSGT PERIOD;3 ms BRA err;error if time MOVLW 0x30 CPFSLT PERIOD; BSF FLAG2,0;if time>H0 then bit is "1" CPFSGT PERIOD; BCF FLAG2,0;if time ;create received byte MOVFF IRDA2,COMMAND MOVFF IRDA3,PASS1 MOVFF IRDA4,PASS2 MOVFF IRDA5,PASS3 MOVFF IRDA6,PASS4 BSF REM_FLAG,3;Set flag "COMMAND" not executed int_endBCF INTCON,INT0IF MOVFF BSR_TEMP,BSR MOVF W_TEMP,W MOVFF STATUS_TEMP,STATUS RETFIE ;-------Start of program---------------------------- STARTCLRF PORTA; CLRF PORTB;Clear CLRF PORTC;I/O ports CLRF PORTD; CLRF PORTE; MOVLW B'00001111'; MOVWF TRISA; SETF TRISB; MOVLW B'11011000'; MOVWF TRISC; CLRF TRISD; CLRF TRISE; MOVLW B'11010101';TMR0 16-bit counter MOVWF T0CON;subdivider 1:64 ;interrupts MOVLW B'11010000'; MOVWF INTCON; MOVLW B'10000000';INT1 fall_pulse MOVWF INTCON2; MOVLW B'00001000';Enable INT1 interrupt MOVWF INTCON3; MOVLW B'00000011'; MOVWF PIE1;interrupt TMR1,TMR2 enable MOVLW B'00000000';All interrupts low priority MOVWF IPR1; MOVLW B'00000000'; MOVWF IPR2; BSF RCON,7;Приоритетная система прерываний вкл. ;TMR1 setup MOVLW B'00000001';TMR1 is active MOVWF T1CON;subdivider 1:1 ;TMR2 setup MOVLW B'00001111';Enable, subdivider 1:16 MOVWF T2CON; ;A/D setup MOVLW B'00000001';A/D enable MOVWF ADCON0;CLK is Fosc/4 MOVLW B'01001110';Left justify;0 analog channels MOVWF ADCON1;VDD and VSS references ;MSSP setup MOVLW 0x0A;100 kHz MOVWF SSPADD;Set speed MOVLW B'00101000';MSSP enabled, MOVWF SSPCON1;I2C Master mode ;Usart setup MOVLW B'00100000';Asynchronic,8bit transfer MOVWF TXSTA;low speed mode MOVLW B'10010000';UART on MOVWF RCSTA MOVLW B'00011001';2400 baud,error +1.67% MOVWF SPBRG CLEARLFSR FSR0,00; clCLRF POSTINC0; MOVLW .100; CPFSEQ FSR0L; BRA cl; ;-------Main program block------------------------------ PROGALFSR FSR1,IRDA1 RCALL I2C_STOP_ MOVLW B'10010000' MOVWF SLAVE_TRM MOVFF SLAVE_TRM,I2C_ADDR MOVLW 0xEE MOVWF I2C_DATA RCALL I2C_COM;Command 'start converting' RCALL LCD_INIT; CLRF TBLPTRU;Set message adress 7000 MOVLW B'01110000'; MOVWF TBLPTRH; CLRF TBLPTRL; RCALL LCD_LD1; RCALL LCD_LD2; RCALL LCD_PR1; RCALL LCD_PR2;Приветствие RCALL DELL;Pause RCALL LCD_CLR1 RCALL LCD_CLR2 BSF EVENTS,4 ;-------Start program--------------------------------------- CONNECTRCALL M_NO_CONN;Show message "Нет подлючения!" MOVLW B'00100000'; MOVWF TBLPTRL;Show message "Температура" RCALL LCD_LD2; RCALL TERM_DISP;Measure and display temperature RCALL ADC_CONV RCALL LCD_PR2 begBTFSC EVENTS,4 RCALL UART_ST RCALL TERM_DISP;Measure and display temperature RCALL ADC_CONV ;1-----Start receiving!----------------- LFSR FSR0,PACK1 PACK_RXRCALL UART_RD BTFSC EVENTS,4;If CONNECT ERROR then restart BRA CONNECT MOVFF UART_DATA,POSTINC0 MOVLW 0x4B CPFSEQ FSR0L BRA PACK_RX MOVFF PACK2,HL_STAT MOVFF PACK3,TERMAL_L MOVFF PACK4,TERMAL_H MOVFF PACK5,AD_VREF MOVFF PACK6,SENSOR_MODE ;-Transmite----------------------------------------- PACK_TXMOVLW .16;Set address of device MOVWF PACK_OUT1; MOVFF SENS1_STAT,PACK_OUT2; MOVFF SENS2_STAT,PACK_OUT3; MOVFF AD,PACK_OUT4; MOVFF TERMAL,PACK_OUT5; MOVFF ADD_BYTE,PACK_OUT6 LFSR FSR0,PACK_OUT1;Write data to terminal txMOVF POSTINC0,W; RCALL UART_WRT; RCALL M_DEL;6 bytes... MOVLW 0x55; CPFSEQ FSR0L; BRA tx; asddRCALL LCD_PR1 RCALL LCD_PR2 ;+++++++++++Place for main subroutine+++++++++++++++ BTFSS HL_STAT,7 BRA m_block BCF SENS1_STAT,5;Reset flag "Change status HL1" BCF SENS1_STAT,6;Reset flag "Change status HL2" BCF SENS1_STAT,7;Reset flag "Change status "HL3" BCF SENS2_STAT,6;Reset flag "Was command from IRDA" BCF SENS2_STAT,7;Reset flag "Change security mode" sens_vrCLRF PASS1 CLRF PASS2 CLRF PASS3 CLRF PASS4 BTFSC SENS1_STAT,0;Set flag "perimetr error" BSF EVENTS,1;if sensors unlock BTFSC SENS1_STAT,1; BSF EVENTS,1; BTFSC SENS1_STAT,2; BSF EVENTS,1 re2MOVF AD_VREF,W CPFSLT AD BSF EVENTS,1 re3MOVF TERMAL_H,W CPFSLT TERMAL BSF EVENTS,2;if TERMAL>TERMAL_H MOVF TERMAL_L,W; CPFSGT TERMAL;if TERMAL BSF EVENTS,3; BTFSS EVENTS,2; BRA re4 RCALL M_FIRE;FIRE CONTROL BSF REM_FLAG,5 BRA gym2 re4BTFSS HL_STAT,3;if mode=off then ok BRA gym RCALL M_ACES_NO; BTFSC EVENTS,1;If sensors unlock, RCALL M_PERIM;Show message "Периметр нарушен" BTFSC EVENTS,1 BSF REM_FLAG,5 BTFSC EVENTS,3 BSF REM_FLAG,5 BTFSC EVENTS,3 RCALL M_COLD;Show message "Переохлаждение!" BRA gym2 ;+++++++++++End of place for main subroutine+++++++++++++++++++ gymRCALL M_ACES_OK gym2BTFSS HL_STAT,4;Verifying reset command from PC BRA main_end BCF EVENTS,1;Reset perimetr BCF EVENTS,2;Reset fire BCF EVENTS,3;Reset cold BCF EVENTS,4;Reset connect error BCF PORTC,5;Reset ALARM_LIGHT BCF PORTA,5;Reset flag for external system BCF ADD_BYTE,0 BCF REM_FLAG,5;Reset flag ALARM_LIGHT CLRF PASS_ERR main_endBRA beg ;++++++++++++++++++++++++++++++++++++++++++++++++++++++ GOTO FINAL ;-------------------------------------------------------- ;Different subroutines ;-------------------------------------------------------- M_DELMOVLW .49 MOVWF CYC2 mdl1DECF CYC2,F MOVLW .255 MOVWF CYC mdlDECF CYC,F TSTFSZ CYC BRA mdl TSTFSZ CYC2 BRA mdl1 RETURN ;-------------------------------------------------------- UART_WRTMOVWF TXREG BTFSS PIR1,4 BRA $-2 BCF PIR1,4 RETURN ;-------------------------------------------------------- UART_STBCF EVENTS,0 BCF EVENTS,1 BCF EVENTS,2 BCF EVENTS,3 BCF EVENTS,5 BCF PIR1,5 BCF EVENTS,4 BCF RCSTA,4 BSF RCSTA,4 ur_stBTFSS PIR1,5 BRA $-2 BCF PIR1,5 MOVFF RCREG,UART_DATA MOVLW .238 CPFSEQ UART_DATA BRA ur_st RETURN ;-------------------------------------------------------- UART_RDRCALL UART_WAIT MOVFF RCREG,UART_DATA RETURN ;-------------------------------------------------------- DELLMOVLW .8;8-Time delay. MOVWF TIME_DEL;Variable LSD is tmdTSTFSZ TIME_DEL BRA tmd RETURN ;--------Sub-zero termo-correction------------------------- TERM_CORRMOVLW 2D;"-" MOVWF MSD;MSD used temporary BCF SENS1_STAT,3 MOVF I2C_BYTE1,W SETF I2C_BYTE1 SUBWF BYTE1 RETURN ;------------------------------------------------------- TERMOSCANMOVFF SLAVE_TRM,I2C_ADDR;Slave-address DS1621 MOVLW 0xAA;Command "Read temperature" MOVWF I2C_DATA RCALL I2C_2RD RETURN ;----------------------------------------------------------- M_NO_CONNMOVLW B'1110000'; MOVWF TBLPTRL;Show message "Нет подключения!" RCALL LCD_LD1; RCALL LCD_PR1 RETURN ;----------------------------------------------------------- M_ACES_OKMOVLW B'00110000'; MOVWF TBLPTRL;Show message "Доступ разрешен" RCALL LCD_LD1; RCALL LCD_PR1 RETURN ;----------------------------------------------------------- M_FIREMOVLW B'01000000'; MOVWF TBLPTRL;Show message "Пожарная тревога!" RCALL LCD_LD1; RCALL LCD_PR1 BSF PORTA,5;Set flag for external system RETURN ;----------------------------------------------------------- M_PERIMMOVLW B'01010000'; MOVWF TBLPTRL;Show message "Периметр нарушен!" RCALL LCD_LD1; RCALL LCD_PR1 BSF PORTA,5;Set flag for external system RETURN ;----------------------------------------------------------- M_COLDMOVLW B'10000000'; MOVWF TBLPTRL;Show message "Переохлаждение!" RCALL LCD_LD1; RCALL LCD_PR1; BSF PORTA,5; RETURN ;----------------------------------------------------------- M_ACES_NOMOVLW B'01100000'; MOVWF TBLPTRL;Show message "Доступ запрещен!" RCALL LCD_LD1; RCALL LCD_PR1 RETURN ;-----------A/D Converting---------------------------------- ADC_CONVMOVLW D'20' MOVWF DEL_ADC DECFSZ DEL_ADC,F BRA $-2 BSF ADCON0,GO;Start A/D conversion WaitBTFSS PIR1,ADIF;Wait for conversion to complete BRA $-2 BCF PIR1,ADIF MOVFF ADRESH,AD RETURN ;-------Looped end of program---------------------------- FINALNOP BRA FINAL END















