LIST P = PIC16F84A ;****************************************************************************** ; GSM_ALARM - MODULE M590E V1.0 ; - MODULE SIM800L ; RS-232 Communication With PIC16F84A ; Half Duplex Asynchronous Communication: 9600 Baud ( @ 4 Mhz CLKIN ) ; ; by: 2016 Goran Stankovic dipl.ing.el. ; E-mail: goranstank@gmail.com ;****************************************************************************** #include P16F84A.INC __FUSES (_CP_ON & _WDT_ON & _XT_OSC & _PWRTE_ON ) ;TxD equ 3 ; Transmit Pin ( Bit 3 of Port A ) ;RxD equ 4 ; Reciive Pin ( Bit 4 of Port A ) ;CLKIN = 4 MHz => CLKOUT = 1 MHz BAUD_1 equ .34 ; 3+3X = CLKOUT/Baud BAUD_2 equ .33 ; 6+3X = CLKOUT/Baud BAUD_3 equ .16 ; 3+3X = 0.5*CLKOUT/Baud BAUD_4 equ .47 ; 3+3X = 1.5*CLKOUT/Baud ;BAUD_X equ .31 ; 11+3X = CLKOUT/Baud BAUD_X equ .29 ; 11+3X = CLKOUT/Baud BAUD_Y equ .31 ; 9 +3X = CLKOUT/Baud LSB equ 0 MSB equ 7 ;************************ Data RAM Assignments ********************** ORG 0x10 ; Dummy Origin RcvReg RES 1 ; Data received XmtReg RES 1 ; Data to be transmitted Count RES 1 ; Counter for #of Bits Transmitted DlyCnt RES 1 TEMP RES 1 ; Temporary storage location CHAR RES 1 ; Character storage location TEMP1 RES 1 ; Temporary storage location NR_BR RES 1 ; CIFRA RES 1 ; NR_CIFRA RES 1 ; SEC RES 1 ; MS1 RES 1 ; MS2 RES 1 ; MS3 RES 1 ; T1 RES 1 ; T2 RES 1 ; T3 RES 1 ; FLEGS RES 1 ; FLEGS2 RES 1 ; #define _C STATUS,0 #define _Z STATUS,2 #define F_SEC FLEGS,0 #define FS1 FLEGS,1 #define FS2 FLEGS,2 #define FS3 FLEGS,3 #define FT1 FLEGS,4 #define FT2 FLEGS,5 #define FT3 FLEGS,6 #define F_AL FLEGS,7 #define FI FLEGS2,0 #define FD FLEGS2,1 #define FIX FLEGS2,2 #define FH24 FLEGS2,3 #define FT4 FLEGS2,4 #define FK FLEGS2,5 #define ALARM PORTB,0 #define ALARM2 PORTB,1 #define ON PORTB,2 #define KEY PORTB,3 #define INST PORTB,4 #define DELAY PORTB,5 #define IX PORTB,6 #define H24 PORTB,7 #define LED_S PORTA,0 #define LED1 PORTA,1 #define LED2 PORTA,2 #define TxD PORTA,3 #define RxD PORTA,4 NR_TEL equ .4 ; Imamo telefonskih brojeva (max 8) MAX_CIFRA equ .20 ; Max broj cifara u telefonskom broju (max 14 + 6) NR_ATD equ .31 ; 30 puta biraj isti broj ( 30 * 2sec = 1min ) Vreme_in equ .10 ; 10 sec vreme ulaska Vreme_out equ .20 ; 20 sec vreme izlaska Vreme_alarm equ .240 ; 240 sec = 4 min vreme alarma ;*********************************************************************** ORG 0 goto Start ORG 4 goto Interapt ;------------------------------------------------------------------------- ORG 7 Tabla clrf PCLATH movf NR_BR,W addwf PCL, F ;add to PC low goto Br_0 goto Br_1 goto Br_2 goto Br_3 goto Br_4 goto Br_5 goto Br_6 goto Br_7 Br_0 movf CIFRA,W addwf PCL, F ;add to PC low dt "ATD>SM1;",.13,.10,0 Br_1 movf CIFRA,W addwf PCL, F ;add to PC low dt "ATD>SM2;",.13,.10,0 Br_2 movf CIFRA,W addwf PCL, F ;add to PC low dt "ATD>SM3;",.13,.10,0 Br_3 movf CIFRA,W addwf PCL, F ;add to PC low dt "ATD>SM4;",.13,.10,0 Br_4 movf CIFRA,W addwf PCL, F ;add to PC low dt "ATD>SM5;",.13,.10,0 Br_5 movf CIFRA,W addwf PCL, F ;add to PC low dt "ATD>SM6;",.13,.10,0 Br_6 movf CIFRA,W addwf PCL, F ;add to PC low dt "ATD>SM7;",.13,.10,0 Br_7 movf CIFRA,W addwf PCL, F ;add to PC low dt "ATD>SM8;",.13,.10,0 ;--------------------------------------------------------------------- ; ;--------------------------------------------------------------------- Interapt ;Ponavlja se svakih 0.256ms (3906.25Hz) bcf INTCON,T0IF incfsz MS1,1 goto Int_dalje ; <> 0 ; 65.536ms (15.2588Hz) ; = 0 bsf F_SEC Int_dalje retfie ;--------------------------------------------------------------------- ; Inicijilizacija programa ;--------------------------------------------------------------------- Start btfss STATUS,4 ;TO goto Skok_WDT btfss STATUS,3 ;PD goto Skok_WDT ; Power-On Reset ; nop nop ;--------------------------------------------------------------- Skok_WDT clrf STATUS clrf INTCON bsf STATUS, RP0 ; Bank 1 movlw B'00001111' ; RBPU = enable, WDT = PS 1:128 movwf OPTION_REG movlw 0x10 movwf TRISA ; RA4 inputs RA3-0 outputs movlw B'11111100' movwf TRISB ; RB7-3 inputs,RB1-0 outputs bcf STATUS, RP0 ; Bank 0 clrf PORTA ;clear port A bsf RxD clrf NR_BR clrf CIFRA clrf SEC clrf MS1 clrf MS2 clrf MS3 clrf FLEGS clrf FLEGS2 clrf T1 clrf T2 clrf T3 movlw B'10100000' ; TMR0 enable movwf INTCON ;--------------------------------------------------------------- main clrwdt ; Vreme za WDT je 128*18ms=2.3s btfss F_SEC ; check for a 65.536ms goto dalje_main bcf F_SEC bcf LED_S ; Zmiga LED btfsc MS2,3 ; bsf LED_S ; incf MS2,F movlw .15 subwf MS2,W ; ? W = MS2-15 svake sekunde btfss _C goto dalje_main ; < 0 ; Svake 1 sec clrf MS2 ; >= 0 bsf FS1 bsf FS2 bsf FS3 incf MS3,F movlw .2 subwf MS3,W ; ? W = MS3-2, svake druge sekunde btfss _C goto dalje_main ; < 0 ; Svake 2 sec clrf MS3 ; >= 0 goto RS_232 dalje_main ; - - - - - - - - - - - - - - - - - - - - - - - - - - - btfsc ON ; ? input ON=0 bsf ALARM ; ON=1 > Ukljuci ALARM nop ; - - - - - - - - - - - - - - - - - - - - - - - - - - - btfsc H24 ; ? input H24 goto h24_1 ;h24_0 ; bcf ALARM2 bcf FH24 goto skok_h24_1 h24_1 ; bsf ALARM2 btfsc FH24 ; ? fleg FH24 = 0 goto skok_h24_1 ;fh24_0 clrf T3 bsf FH24 bsf FT4 bsf ALARM ; Ukljuci ALARM bsf ALARM2 ; Ukljuci ALARM MEM skok_h24_1 ; - - - - - - - - - - - - - - - - - - - - - - - - - - - btfsc KEY ; ? input KEY goto key_1 ;key_0 btfsc FK ; ? fleg FK = 0 goto fk_1 ;fk_0 bsf FK clrf T3 bcf FT4 bcf ALARM ; Iskljuci ALARM bcf ALARM2 ; Reset ALARM MEM fk_1 clrf T1 clrf T2 bcf FT1 bcf FT2 bcf FT3 bcf FI bcf FD bcf FIX bcf LED1 bcf LED2 goto skok_3 ; - - - - - - - - - - - - - - - - - - - - - - - - - - - key_1 bcf FK btfsc FT1 ; ? fleg FT1 = 0 goto ft1_1 ;ft1_0 btfss FS1 ; ? fleg FS1 = 1 goto skok_ft1 bcf FS1 incf T1,F movlw Vreme_out subwf T1,W ; ? W = SEC - Vreme_out btfss _C goto skok_ft1_2 ; < 0 clrf T1 ; >= 0 bsf FT1 bcf LED1 goto skok_3 skok_ft1_2 bsf LED1 skok_ft1 goto skok_3 ft1_1 ; - - - - - - - - - - - - - - - - - - - - - - - - - - - btfsc INST ; ? input INST goto inst_1 ;inst_0 bcf FI goto skok_inst_1 inst_1 btfsc FI ; ? fleg FI = 0 goto skok_inst_1 ;fi_0 bsf FI clrf T3 bsf FT3 bsf ALARM ; Ukljuci ALARM bsf ALARM2 ; Ukljuci ALARM MEM nop skok_inst_1 ; - - - - - - - - - - - - - - - - - - - - - - - - - - - btfsc DELAY ; ? input DELAY goto delay_1 ;delay_0 bcf FD goto skok_delay_1 delay_1 btfsc FD ; ? fleg FD = 0 goto skok_delay_1 ;fd_0 bsf FD bsf FT2 skok_delay_1 ; - - - - - - - - - - - - - - - - - - - - - - - - - - - btfsc IX ; ? input IX goto ix_1 ;ix_0 bcf FIX goto skok_ix_1 ix_1 btfsc FIX ; ? fleg FIX = 0 goto skok_ix_1 ;fix_0 bsf FIX btfsc FT2 ; ? fleg FT2 = 0 goto skok_ix_1 ;ft2_0 clrf T3 bsf FT3 bsf ALARM ; Ukljuci ALARM bsf ALARM2 ; Ukljuci ALARM MEM skok_ix_1 ; - - - - - - - - - - - - - - - - - - - - - - - - - - - btfss FT2 ; ? fleg FT2 = 1 goto ft2_0 ;ft2_1 btfss FS2 ; ? fleg FS2 = 1 goto ft2_0 bcf FS2 incf T2,F movlw Vreme_in subwf T2,W ; ? W = SEC - Vreme_in btfss _C goto skok_ft2_2 ; < 0 clrf T2 ; >= 0 clrf T3 bcf FT2 bsf FT3 bcf LED2 bsf ALARM ; Ukljuci ALARM bsf ALARM2 ; Ukljuci ALARM MEM nop goto ft2_0 skok_ft2_2 bsf LED2 ft2_0 ; - - - - - - - - - - - - - - - - - - - - - - - - - - - skok_3 btfss FT3 ; ? fleg FT3 = 1 goto skok_44 ft3_1 btfss FS3 ; ? fleg FS3 = 1 goto skok_ft3_2 ;fs3_1 bcf FS3 incf T3,F movlw Vreme_alarm subwf T3,W ; ? W = SEC - Vreme_alarm btfss _C goto skok_ft3_2 ; < 0 clrf T3 ; >= 0 bcf FT3 bcf FT4 ; - - - - - - - - - - - - - - - - - - - - - - - - - - - skok_4 btfss ON ; ? input ON = 1 bcf ALARM ; ON=0 > Iskljuci ALARM nop goto skok_main skok_ft3_2 bsf ALARM ; Ukljuci ALARM bsf ALARM2 ; Ukljuci ALARM MEM nop skok_main goto main ; - - - - - - - - - - - - - - - - - - - - - - - - - - - skok_44 btfss FT4 ; ? fleg FT4 = 1 goto skok_4 goto ft3_1 ; - - - - - - - - - - - - - - - - - - - - - - - - - - - RS_232 bcf INTCON,GIE ; zabrani sve interapte btfss ALARM ; ? ALARM ON goto Posalji_ATH ; else ATH incf SEC,F movlw NR_ATD subwf SEC,W ; ? W = SEC - NR_ATD btfss _C goto Posalji_broj ; < 0 clrf SEC ; >= 0 movlw 'A' call Transmit movlw 'T' call Transmit movlw 'H' call Transmit movlw .13 call Transmit movlw .10 call Transmit incf NR_BR,F ; Promeni broj movlw NR_TEL subwf NR_BR,W ; ? W = NR_BR - NR_TEL btfss _C goto dalje ; < 0 clrf NR_BR ; >= 0 goto dalje Posalji_broj clrf CIFRA movlw MAX_CIFRA movwf NR_CIFRA next_cifra call Tabla addlw 0 ; ? (CIFRA) = 0 btfsc _Z ; goto Zadnja_cifra call Transmit incf CIFRA,F decfsz NR_CIFRA,F goto next_cifra Zadnja_cifra goto dalje Posalji_ATH movlw 'A' call Transmit movlw 'T' call Transmit movlw 'H' call Transmit movlw .13 call Transmit movlw .10 call Transmit clrf NR_BR ; NR_BR=0 clrf SEC ; SEC = 0 dalje movlw B'10100000' ; TMR0 enable movwf INTCON goto dalje_main ;--------------------------------------------------------------- ;-------------------------------------------------------------------------- ;---------------Transmitter------------------------------------------------ Transmit movwf XmtReg Xmtr movlw 8 movwf Count bcf TxD ; Send Start Bit call Delay1 X_next bcf STATUS,C rrf XmtReg,F ; Conditional Assembly btfsc STATUS,C bsf TxD btfss STATUS,C bcf TxD call DelayX decfsz Count,F goto X_next bsf TxD ; Send Stop Bit call Delay1 return ;--------------------------------------------------------------- DelayY movlw BAUD_Y goto save DelayX movlw BAUD_X goto save Delay4 movlw BAUD_4 goto save Delay3 movlw BAUD_3 goto save Delay1 movlw BAUD_1 ; 104 uS for 9600 baud goto save Delay2 movlw BAUD_2 save movwf DlyCnt redo_1 decfsz DlyCnt,F goto redo_1 return ;--------------------------------------------------------------- ;--------------------------------------------------------------- dt " by: 2016 Goran Stankovic dipl.ing.el." dt " E-mail: goranstank@gmail.com " ;--------------------------------------------------------------------- END