


	LIST P=16F628, R=Dec    ; Use the PIC16F628 and decimal system 

        #INCLUDE "P16F628.INC"  ; Include header file 

         __config  _XT_OSC &_LVP_OFF & _WDT_ON & _PWRTE_ON & _BODEN_OFF 


	constant ENTER=0DH

pocet	equ	20H
flags	equ		22H
flags1	equ		23H
obeh	equ		24H
tmp		equ		25H
tmp_1	equ		26H
cas0	equ		27H
cas1	equ		28H
cas2	equ		29H

pamet_1		equ	 	30H	
pamet_2		equ		31H	
pamet_3		equ		32H	
pamet_4		equ		33H	
pamet_5		equ		34H	
pamet_6		equ		35H	
pamet_7		equ		36H	
pamet_8		equ		37H	
pamet_9		equ		38H	
pamet_10	equ		39H	
pamet_11	equ		3AH	
pamet_12	equ		3BH	
TMPW		equ		3CH
TMPS		equ		3DH
spojeni_ok	equ		01H
    

	Org 0
	GoTo init	
	
	Org 4
;int od seriove linky pouze pro test pripojeni mobilu	
	bcf		STATUS,RP0		;prijme znak z mobilu
	btfss	RCSTA,OERR
	GoTo	$+3
	bcf RCSTA,CREN
	bsf RCSTA,CREN
	movf RCREG,W
	movwf	tmp						;uloz znak do tempu
	bcf STATUS,Z
	movlw 'O'			;testuj znak OK - t.zn. pripojeni v poradku
	subwf tmp,w
	btfss STATUS,Z		;shoda = ven
	retfie
	bsf	flags1,spojeni_ok
	retfie 


;---------------casovaci rutina-----150 msec.--------------------------------
cekame	;Variables: TMP1, TMP0			;hívást megszakítása után kis idő
;Delay 149996 cycles
       	clrwdt
        movlw 0x0E5  ;229 DEC
        movwf cas1
        movlw 0x0D9  ;217 DEC
        movwf cas0
        decfsz cas0,F
        GoTo $-1
        decfsz cas1,F
        GoTo $-5
;End of Delay
	Return

;------------------casovaci rutina---------1 sec.
cekame_1	
;Delay 1000000 cycles					;Hívás közötti időért felelős
       	clrwdt
        movlw 0x15  ;21 DEC
        movwf cas2
        movlw 0x59  ;89 DEC
        movwf cas1
        movlw 0x0B1  ;177 DEC
        movwf cas0
        decfsz cas0,F
        GoTo $-1
        decfsz cas1,F
        GoTo $-5
        decfsz cas2,F
        GoTo $-9
	Return

;-------Nacte pocet znaku ze seriaku podle cisla v W, vysledek je ve W-----------------------------------------------------
orizni	movwf tmp_1
opak	Call receive	;nacti znak z MT
	decfsz tmp_1,f			
	GoTo opak
	Return
;------------------------------------------------------------
;precte data z EEPROM
cti_eeprom		
	bsf	STATUS,RP0	; banka 1	!!! nastav EEADR !!!
	movlw 1
	movwf EEADR			;cti data z adresy 1 EEPROM
	bsf	EECON1,RD	; precte EEPROM
	movf	EEDATA,W	; EEDATA -> W
	bcf	STATUS,RP0	; banka 0
	Return
;------------------------------------------------------------

;-----------------------Ulozi data do EEPROM------------------
zapis_eeprom
	movf flags,w				;priprav data do EEPROM
	bsf STATUS,RP0	; switch to bank 1
	movwf EEDATA
	movlw 1						;nacti adresu EEPROM
	movwf EEADR
	bsf	EECON1,WREN	; povolit zapis do EEPROM
;       ------------------------; aktivace zapisu
	movlw	0x55		; povinna povolovaci sekvence
	movwf	EECON2
	movlw	0xAA
	movwf	EECON2
	bsf	EECON1,WR	; spustit zapis
;       ------------------------; konec aktivace
	btfsc	EECON1,WR	; pockat na konec zapisu
	GoTo	$-1		; =1
	bcf	EECON1,WREN	; zakazat zapis do EEPROM
	bcf		STATUS,RP0	; banka 0
	Return

;---------------------------------------------------------------
;-----------posle prikaz AT+ -----------------------
prikaz_AT	
	movlw 'A'
	Call send
	movlw 'T'
	Call send
	movlw '+'
	Call send
	Return
;---------------------------------------------------

;------------posle prikaz ATH a enter to je ZAVESIT--------------

zavesit				;bontja a hívást		
	movlw 'A'
	Call send
	movlw 'T'
	Call send
	movlw 'H'
	Call send
	movlw ENTER
	Call send
	Return
;-----------------------------------------------------------------

;nuluje RAM 
null_ram	
	movlw 0FFH
	movwf pamet_1
	movwf pamet_2
	movwf pamet_3
	movwf pamet_4
	movwf pamet_5
	movwf pamet_6
	movwf pamet_7
	movwf pamet_8
	movwf pamet_9
	movwf pamet_10
	movwf pamet_11
	movwf pamet_12
	Return

cti_znaky	
	Call receive			;cti 12znaku ze seriaku
	movwf pamet_1
	Call receive
	movwf pamet_2
	Call receive
	movwf pamet_3
	Call receive
	movwf pamet_4
	Call receive
	movwf pamet_5
	Call receive
	movwf pamet_6
	Call receive
	movwf pamet_7
	Call receive
	movwf pamet_8
	Call receive
	movwf pamet_9
	Call receive
	movwf pamet_10
	Call receive
	movwf pamet_11
	Call receive
	movwf pamet_12
	Return
	
;-----------------vycteni telef. cisla z MT --------------------
;posli prikaz
vycti_cislo			;memoria eső helyére mentett szám hívása
	Call prikaz_AT
	movlw 'C'
	Call send
	movlw 'P'
	Call send
	movlw 'B'
	Call send
	movlw 'R'
	Call send
	movlw '='
	Call send
	movlw '1'
	Call send
	movlw ENTER
	Call send
;---cti data z MT---------------------
pokr_07
	Call receive			;cti jeden znak
	bcf STATUS,Z
	sublw 	'"'				;testuj dosazeni ASCII znaku uvozovek,pokud nejsou,cti znovu seriak
	btfss STATUS,Z
	GoTo pokr_07
	movlw 1H					;prisly uvozovky,zacina tlf. cislo,zadej do W
	Call orizni					;precte znak + a zahodi ho,bude pridan pri volani cisla
	Call cti_znaky				;precte 12 znaku ze seriaku
	Call cekame					;odcasuje
	Return

;-----------------vytoci telefonni cislo-------------------------
;prikaz				; Tárcsáz: ATD+[teloszám];[enter]
volej_cislo	
	movlw	'A'
	Call send
	movlw 'T'
	Call send
	movlw 'D'
	Call send
	movlw '+'
	Call send
;doplni prikaz tel. cislem z pameti
	movf pamet_+,w
	Call send
	movf pamet_3,w
	Call send
	movf pamet_6,w
	Call send
	movf pamet_3,w
	Call send
	movf pamet_0,w
	Call send
	movf pamet_6,w
	Call send
	movf pamet_3,w
	Call send
	movf pamet_1,w
	Call send
	movf pamet_0,w
	Call send
	movf pamet_9,w
	Call send
	movf pamet_2,w
	Call send
	movf pamet_3,w
	Call send
	movlw ';'
	Call send
	movlw ENTER
	Call send
;============================================================================
;============================================================================
;============================================================================
;============================================================================
;============================================================================
; Itt csönget - Ezt kéne változtatni. ( tőbb vagy kevesebb "Call cekame_1" sor)
	Call cekame_1
	Call cekame_1
	Call cekame_1
	Call cekame_1
	Call cekame_1
	Call cekame_1
	Call cekame_1
	Call cekame_1
	Call cekame_1		;zvoni,zvoni, casovaci rutiny ( késleltető rutinok halmaza)
	Call cekame_1
	Call cekame_1
	Call cekame_1
	Call cekame_1
	Call cekame_1
	Call cekame_1
;============================================================================
;============================================================================
;============================================================================
;============================================================================
;============================================================================
	Call zavesit		;zavesi   ( ATH - hivást megszakít )
	Call cekame		;odcasuje ( A hívás bontáshoz szükséges némi idő)

	Return


	
;
init
	movlw 7
	movwf CMCON		; CMCON=7 set comparators off         

	bcf STATUS,RP0	; switch to bank 0
	bcf STATUS,RP1
	movlw b'00000000' ;kvuli prechodu do nabijeni je nejprve out linka  v L na cca 2 sec
	movwf PORTB
	Call cekame_1		;cekej sekundu	
	Call cekame_1		;cekej sekundu
	movlw b'00000100'
	movwf PORTB
	bsf		PORTA,3	;LED zhasnuta

; 
; ---------------- 
; INITIALIZE PORTS
; ---------------- 
; 
        bsf STATUS,RP0          ; RAM PAGE 1
		bcf OPTION_REG, 7		; enable internal pullups
        movlw b'11110111'		;port RA3 is OUT
        movwf TRISA		; portA

;----------PORT B-----------------------
       movlw b'11101011'	;  input is all, port B pins 2 and 4 is out 
       movwf TRISB
	
; ------------------------------------
; SET BAUD RATE TO COMMUNICATE WITH MT SIEMENS C35
; ------------------------------------
; Boot Baud Rate = 19200, No Parity, 1 Stop Bit
        movlw 0x0C              ; 0x0C=19200 bps
        movwf SPBRG
        movlw b'00100100'       ; brgh = high (2)
        movwf TXSTA             ; enable Async Transmission, set brgh
 
 
 ;nastaveni WATCHDOGU
 		bsf	OPTION_REG,PS0			;preddelicka 1:128
 		bsf	OPTION_REG,PS1
 		bsf	OPTION_REG,PS2
 		bsf	OPTION_REG,PSA			;preddelicka watchdog
 		
 
        bcf STATUS,RP0          ; RAM PAGE 0

    	movlw b'10010000'       ; enable Async Reception
        movwf RCSTA	
		clrf	flags
		clrf	flags1
				
				
	 	
;-----------------HLAVNI SMYCKA---------------------------
;induljon el, amikor vizsgált 10 mp. ha nem gomb megnyomásakor, ha nem hívja MT. Ha igen, lesz elválasztott
;Míg további kikapcsolása a riasztót (becsapódott ajtó). Már működik rendesen újra
zacatek	bcf STATUS,RP0	; switch to bank 0
	Call null_ram		;nuluj RAM
	Call cti_eeprom		;rutina cteni z eeprom
	movwf flags			;testuj data
	btfsc flags,0		;ha sms-telfogadta, akkor eszerint ki-vagy bekapcsolja a relét
	GoTo zapni			;jinak bylo zapnute, zapni a pokracuj
	bcf PORTB,4			;kikapcsolja a relét
	GoTo pokr_01
zapni	bsf PORTB,4			;bekapcsolja a relét
pokr_01	nop
	btfss flags1,7		;ha sms-t elgogadja akkor 1-es lessz(aktív)ezért némi időzítés után 
	GoTo pokr_02		;felhívja az alábbi számokat
	Call cekame_1
	Call cekame_1
	Call cekame_1
	Call vycti_cislo		;Memoria első számjegyét hívja
	Call volej_cislo		;Programban beállított számot is hívja
	Call null_ram		;nullázza a ramot
	bcf flags1,7		;kikapcsolja a "zászló"
;
pokr_02	bsf PORTA,3		;zhasni LED
	Call	test_pripojeni
	Call cekame			;volani casovaci rutiny
	bcf PORTA,3			;rozsvit LED
	movlw 0AH			;nacti hodnotu poctu obehu programu
	movwf obeh			;uloz na adresu
test
	btfsc PORTB,0		;Teszteli van-e riasztás
	GoTo pokr_03		;nincs riasztás akkor nulázza flags1,0-át
	btfsc flags1,0		;Riasztás volt, megnézi aktív-e flags1,0
	GoTo pokr_04		;Igen, flags1,0 aktív gyerünk pokr_04
	bsf flags1,0		;Nem aktív ezért aktívvá teszi
						;Jelenség rutinok a riasztó jelzések az elejére
	movlw	0AH			;számítja recidívák 1 sec. késedelem célok 10x 10 másodperc.
	movwf	pocet			;menteni címen
opak_08
	btfss	PORTB,3		;Megnézi kapcsoló kivan-e kapcsolva RIASZTÓ KI_BE KAPCSOLÓ
	GoTo	pokr_04			;ahol a H, vizsgálat feltétele 10 másodperc, ha belemegy
	Call cekame_1			;10x időzítő rutin 1,1 sec.
	btfss	PORTA,3		;Ebből az alomból csak azért, mert a villogó LED (igen, nincs semmi, mint az x51 utasításokat CPL)
	GoTo	zhasni
	bcf PORTA,3			;rozsvit LED
	GoTo	pokr_1
zhasni	bsf PORTA,3		;zhasni LED
pokr_1	
		decfsz	pocet	;dekrementuj pocet opakovani	
	GoTo	opak_08		;Teszt ismét elválasztott riasztó-és várjon 1 mp.		
poplach
	bcf PORTA,3			;rozsvit LED	;továbbra is világít villogás után egy alkalommal a fenti
	Call vycti_cislo			;vycteni tlf. cisla z mobilu
	Call volej_cislo			;vytoci tlf.cislo
	Call null_ram						;nuluje RAM pro dalsi tlf. cislo
	GoTo pokr_04
pokr_03	bcf flags1,0		;Nem éber, riasztó hívás nuluj zászló
pokr_04	bcf PORTA,3			;rozsvit LED
	Call cekame_1		;pauza
	decfsz obeh,f		;dekrementuj fordulatszám, és ismételjük meg 10-szer, majd minden egyes teszt bemenet riasztás
	GoTo test

;miatt ciklikusan lekérdezi a elfogadásával egy új mobiltelefon SMS-ben
	Call prikaz_AT			;vysli prikaz AT+
	movlw 'C'				;elvileg fogadja a nemolvasot sms-t
	Call send
	movlw 'M'
	Call send
	movlw 'G'
	Call send
	movlw 'L'
	Call send
	movlw '='
	Call send
	movlw '0'
	Call send
	movlw ENTER
	Call send						;által elfogadott dump olvasatlan
pokr_06				;ITT ELLENŐRZI? hogy GSM_ZAP sms jött-e be!
	Call receive					;kap egy karaktert egy mobiltelefon
	movwf	tmp						;menteni karakter ütemének
	bcf STATUS,Z
	movlw 'O'			;Test OK jel - t.zn. SMS nem új
	subwf tmp,w
	btfsc STATUS,Z		;A karakter, hívja fel a jelenlegi rutin Deletition SMS
	GoTo smaz_sms		;pokud je O, volej smazani SMS			;ugrik a törlésre
	movlw ':'			;testuj dosazeni dvojtecky
	subwf tmp,w
	btfss STATUS,Z		;
	GoTo pokr_06		;dvojtecka neni.opakuj		
	movlw 42H	; 					;feltöltötte a W szám tisztelt byte MT
	Call orizni				;csökkent 66 byte seriaku és én vagyok az elején érvényes adatok sms
	Call cti_znaky				;olvasás 12 bájt és szerepe seriaku FIGYELEM, ha meni sms ellenőrzése, meg kell változtatni ezt a számot
	movlw '6'				;kezd összehasonlítása, az adatok be vannak kapcsolva
	bcf STATUS,Z
	subwf pamet_1,w
	btfss STATUS,Z				;ha egyenlő Gyerünk, ha nem egyenlő a második vizsgálat előtt az SMS
	GoTo druha_sms	
	movlw '9'
	bcf STATUS,Z
	subwf pamet_2,w
	btfss STATUS,Z
	GoTo druha_sms
	movlw 'B'
	bcf STATUS,Z
	subwf pamet_3,w
	btfss STATUS,Z
	GoTo druha_sms
	movlw '3'
	bcf STATUS,Z
	subwf pamet_4,w
	btfss STATUS,Z
	GoTo druha_sms
	movlw 'A'
	bcf STATUS,Z
	subwf pamet_5,w
	btfss STATUS,Z
	GoTo druha_sms
	movlw '5'
	bcf STATUS,Z
	subwf pamet_6,w
	btfss STATUS,Z
	GoTo druha_sms
	movlw '0'
	bcf STATUS,Z
	subwf pamet_7,w
	btfss STATUS,Z
	GoTo druha_sms
	movlw 'D'
	bcf STATUS,Z
	subwf pamet_8,w
	btfss STATUS,Z
	GoTo druha_sms
	movlw '4'
	bcf STATUS,Z
	subwf pamet_9,w
	btfss STATUS,Z
	GoTo druha_sms
	movlw '2'
	bcf STATUS,Z
	subwf pamet_10,w
	btfss STATUS,Z
	GoTo druha_sms
	movlw '0'
	bcf STATUS,Z
	subwf pamet_11,w
	btfss STATUS,Z
	GoTo druha_sms
	movlw '1'
	bcf STATUS,Z
	subwf pamet_12,w
	btfss STATUS,Z
	GoTo druha_sms
	bsf flags,0			;ez az érkezik, az eredmény az összehasonlítás OK, meg a zászlót, hogy kapcsolja be a relé
	Call zapis_eeprom			;zapis data do EEPROM
	bsf flags1,7					;Állítsa be a zászlót, hogy az üzenet volt, elfogadta azt az OK
	GoTo smaz_sms					;Menj törlése hírek
druha_sms	movlw 'E'		;ITT ELLENŐRZI? hogy GSM_VYP sms jött-e be!
	bcf STATUS,Z
	subwf pamet_1,w
	btfss STATUS,Z
	GoTo smaz_sms				;ha nem is egyenlő, akkor érvénytelen SMS, törölni, és nem csinál semmit
	movlw '4'
	bcf STATUS,Z
	subwf pamet_2,w
	btfss STATUS,Z
	GoTo smaz_sms				;pokud se nerovna, je to neplatna SMS, smaz ji a nedelej nic
	movlw '3'
	bcf STATUS,Z
	subwf pamet_3,w
	btfss STATUS,Z
	GoTo smaz_sms				;pokud se nerovna, je to neplatna SMS, smaz ji a nedelej nic
	movlw '2'
	bcf STATUS,Z
	subwf pamet_4,w
	btfss STATUS,Z
	GoTo smaz_sms				;pokud se nerovna, je to neplatna SMS, smaz ji a nedelej nic
	movlw '0'
	bcf STATUS,Z
	subwf pamet_5,w
	btfss STATUS,Z
	GoTo smaz_sms
	movlw '8'
	bcf STATUS,Z
	subwf pamet_6,w				;PDU BEKAOCS:	07910447946400F011000A9270042079330000AA07 C2 E232081D4E01
	btfss STATUS,Z
	GoTo smaz_sms				;PDU KIKAPCS:	07910447946400F011000A9270042079330000AA07 CB E432081D4E01
	movlw '1'
	bcf STATUS,Z				;		07910447946400F011000A9270042079330000AA07 C7 69B3A50D4201
	subwf pamet_7,w
	btfss STATUS,Z
	GoTo smaz_sms
	movlw 'D'
	bcf STATUS,Z
	subwf pamet_8,w
	btfss STATUS,Z
	GoTo smaz_sms
	movlw '4'
	bcf STATUS,Z
	subwf pamet_9,w
	btfss STATUS,Z
	GoTo smaz_sms
	movlw 'E'
	bcf STATUS,Z
	subwf pamet_10,w
	btfss STATUS,Z
	GoTo smaz_sms
	movlw '0'
	bcf STATUS,Z
	subwf pamet_11,w
	btfss STATUS,Z
	GoTo smaz_sms
	movlw '1'
	bcf STATUS,Z
	subwf pamet_12,w
	btfss STATUS,Z
	GoTo smaz_sms
	bcf flags,0			;ez az érkezik, az eredmény az összehasonlítás OK, meg a relé Kioldási
	Call zapis_eeprom		;vypal data
	bsf flags1,7			;Meghatározott zászlót prozvonei, az SMS érkezik az OK
					;és tartsa törlése SMS
;--------------töröljék SMS szám a parancs jelzi a helyzetét a jelentés, hogy el kell hagyni
smaz_sms
	Call prikaz_AT				;posli AT+
	movlw 'C'				;Törli az sms-t
	Call send
	movlw 'M'
	Call send
	movlw 'G'
	Call send
	movlw 'D'
	Call send
	movlw '='
	Call send
	movlw '1'
	Call send
	movlw ENTER
	Call send
	GoTo zacatek			;zpet na zacatek 


test_pripojeni	;ciklikusan hát kérésére a telefon, amíg kifelé nem ok
	clrwdt
	bcf	flags1,spojeni_ok
	bsf	STATUS,RP0		;bank 1
	bsf	PIE1,RCIE		;povol INT od seriove linky	
	bsf	INTCON,PEIE
	bsf	INTCON,GIE
	bcf STATUS,RP0
	movlw 'A'
	Call send
	movlw 'T'
	Call send
	movlw ENTER
	Call send
	Call	cekame_1
	btfss	flags1,spojeni_ok		;nastavovan v INT
	GoTo	test_pripojeni
	
	
	bsf	STATUS,RP0		;bank 1
	bsf	INTCON,GIE
	bsf	INTCON,PEIE
	bcf	PIE1,RCIE		;zakaz INT od seriove linky	
	bcf STATUS,RP0
	
	Return

; -------------------------------------------
; RECEIVE CHARACTER FROM RS232 AND STORE IN W
; -------------------------------------------
; This routine does not return until a character is received.
;
receive 
	clrwdt
	bcf		STATUS,RP0
	btfss	RCSTA,OERR
	GoTo	$+3
	bcf RCSTA,CREN
	bsf RCSTA,CREN
	btfss PIR1,RCIF
	GoTo $-1
	movf RCREG,W
	Return

;
; -------------------------------------------------------------
; SEND CHARACTER IN W VIA RS232 AND WAIT UNTIL FINISHED SENDING 
; -------------------------------------------------------------
;
send    clrwdt
		movwf TXREG             ; send data in W 

TransWt bsf STATUS,RP0		; RAM PAGE 1
WtHere  btfss TXSTA,TRMT        ; (1) transmission is complete if hi
        GoTo WtHere

        bcf STATUS,RP0          ; RAM PAGE 0
        Return
;








	End
