LIST P = PIC16F84A ;****************************************************************************** ; GSM_CALL - MODULE SIM800L EVB V2.0 ; 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 ; FLEGS RES 1 ; #define _C STATUS,0 #define _Z STATUS,2 #define F_SEC FLEGS,0 NR_TEL equ .8 ; 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 ) ;*********************************************************************** 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>",.34,"1",.34,";",.13,.10,0 Br_1 movf CIFRA,W addwf PCL, F ;add to PC low dt "ATD>",.34,"2",.34,";",.13,.10,0 Br_2 movf CIFRA,W addwf PCL, F ;add to PC low dt "ATD>",.34,"3",.34,";",.13,.10,0 Br_3 movf CIFRA,W addwf PCL, F ;add to PC low dt "ATD>",.34,"4",.34,";",.13,.10,0 Br_4 movf CIFRA,W addwf PCL, F ;add to PC low dt "ATD>",.34,"5",.34,";",.13,.10,0 Br_5 movf CIFRA,W addwf PCL, F ;add to PC low dt "ATD>",.34,"6",.34,";",.13,.10,0 Br_6 movf CIFRA,W addwf PCL, F ;add to PC low dt "ATD>",.34,"7",.34,";",.13,.10,0 Br_7 movf CIFRA,W addwf PCL, F ;add to PC low dt "ATD>",.34,"8",.34,";",.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 bcf PORTA,0 ; Zmiga LED btfsc MS2,3 ; bsf PORTA,0 ; incf MS2,F movlw .30 subwf MS2,W ; W = MS2-30 btfss _C goto Int_dalje ; < 0 clrf MS2 ; >= 0 ; 2 sec 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'10001111' ; WDT = PS 1:128 movwf OPTION_REG movlw 0x10 movwf TRISA ; RA4 inputs RA3-0 outputs movlw 0xFF movwf TRISB ; RB7-0 inputs bcf STATUS, RP0 ; Bank 0 clrf PORTA ;clear port_a bsf PORTA,RxD clrf NR_BR clrf CIFRA clrf SEC clrf MS1 clrf MS2 clrf FLEGS movlw B'10100000' ; TMR0 enable movwf INTCON ; goto main ;--------------------------------------------------------------- main clrwdt ; Vreme za WDT je 128*18ms=2.3s btfss F_SEC ; check for a 2 sec goto main bcf INTCON,GIE ; zabrani sve interapte bcf F_SEC btfsc PORTB,0 ; 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 bsf PORTA,1 movlw 'A' call Transmit movlw 'T' call Transmit movlw 'H' call Transmit movlw .13 call Transmit movlw .10 call Transmit bcf PORTA,1 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 bsf PORTA,2 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 bcf PORTA,2 goto dalje Posalji_ATH bsf PORTA,1 movlw 'A' call Transmit movlw 'T' call Transmit movlw 'H' call Transmit movlw .13 call Transmit movlw .10 call Transmit bcf PORTA,1 clrf NR_BR ; NR_BR=0 clrf SEC ; SEC = 0 dalje movlw B'10100000' ; TMR0 enable movwf INTCON goto main ;--------------------------------------------------------------- ;-------------------------------------------------------------------------- ;---------------Transmitter------------------------------------------------ Transmit movwf XmtReg Xmtr movlw 8 movwf Count bcf PORTA,TxD ; Send Start Bit call Delay1 X_next bcf STATUS,C rrf XmtReg,F ; Conditional Assembly btfsc STATUS,C bsf PORTA,TxD btfss STATUS,C bcf PORTA,TxD call DelayX decfsz Count,F goto X_next bsf PORTA,TxD ; Send Stop Bit call Delay1 retlw 0 ;--------------------------------------------------------------- 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 retlw 0 ;--------------------------------------------------------------- ;--------------------------------------------------------------- dt " by: 2008 Stankovic Goran dipl.ing.el." dt " E-mail: goransta@EUnet.yu " ;--------------------------------------------------------------------- END