;GSM fjernkontroll

	LIST   P=PIC16F870

	#include	<P16f870.INC>

	__CONFIG       _CP_OFF & _LVP_OFF & _PWRTE_ON & _WDT_ON & _HS_OSC

rx2		equ	0x20	;data som mottas
tx2		equ	0x21	;data som sendes
cnt0	equ	0x22		;telle register
st1		equ	0x23
mottat	equ	0x24
cnt1	equ	0x25
cnt2	equ	0x26	
var1	equ	0x27		;variabel for innganger
var2	equ	0x28		;variabel for ny sms?
dec1	equ	0x29		;variabel for dekoder
dec2	equ	0x2a		;variabel for dekoder
dec3	equ	0x2b		;variabel for dekoder
dec4	equ	0x2c		;variabel for dekoder
dec5	equ	0x2d		;variabel for dekoder
dec6	equ	0x2e		;variabel for dekoder
dec7	equ	0x2f		;variabel for dekoder
dec8	equ	0x30		;variabel for dekoder
dec9	equ	0x31		;variabel for dekoder
dec10	equ	0x32		;variabel for dekoder
dec11	equ	0x33		;variabel for dekoder
dec12	equ	0x34		;variabel for dekoder
cnt3	equ	0x35
cnt4	equ	0x36
cnt5   	equ	0x37
smsvar	equ	0x38
smsvar1	equ	0x39
smsvar2	equ	0x3a

	clrf	porta
	clrf	portb
	clrf	portc
;---------------------------------------------------------------------
	bsf	status,5	;bank 1
	bcf	status,6

	movlw	0x6		;setter port a til digital 
	movwf	adcon1
	movlw	b'11111111'	;setter porta til inngang 
	movwf	trisa
	movlw	b'10010111'	;etter  portc3,5,6 til utg og resten ttil inng
	movwf	trisc
	movlw	b'11110000'	;setter portb4,5,6,7 til utg og resten til inng
	movwf	trisb		


	movlw	b'00100100'	;Serial tx mode
	movwf	txsta

	movlw	.64		;Baud rate 9600 Bps
	movwf	spbrg

	bcf	status,5	;bank 0
;---------------------------------------------------------------------
	bcf	adcon0,0	;Setter porta til digital	
	bcf	adcon0,2	;setter porta til digital	

	movlw	b'10010000'	;Serial enable rx mode
	movwf	rcsta

	bcf	status,2	;clear Z flagg
	bsf	option_reg,0	;Aktiverer watch dog timer
	bsf	option_reg,1	;Setter prescaler
	bsf	option_reg,2	;Setter prescaler
	bsf	option_reg,3	;Setter prescaler


;------ Initierer GSM modulen -----------------------------------------------

	
	bsf	portc,5		;Settre DTR lav til gsm modul
	call	wait		;venter 2 sek
	bcf	portc,5		;setter DTR til gsm modul

	call	wait
	call	wait
	call	wait
	call	wait
	call	wait		;venter i 22 sek
	call	wait
	call	wait
	call	wait	
	call	wait
	call	wait	
	call	wait

	movlw	0x61		;A   Sender AT+CMGF=1 for å sette sms modus til tekst
	call	tx
	movlw	0x74		;T
	call	tx
	movlw	0x2b		;+
	call	tx
	movlw	0x63		;C
	call	tx
	movlw	0x6d		;M
	call	tx	
	movlw	0x67		;G
	call	tx
	movlw	0x66		;F
	call	tx
	movlw	0x3d		;=
	call	tx
	movlw	0x31		;1
	call	tx
	movlw	0x0d		;enter
	call	tx
	call	wait

	movlw	0x61		;A   Sender AT+CMGD=1,4 for å slette alle tekstmeldinger
	call	tx
	movlw	0x74		;T
	call	tx
	movlw	0x2b		;+
	call	tx
	movlw	0x63		;C
	call	tx
	movlw	0x6d		;M
	call	tx	
	movlw	0x67		;G
	call	tx
	movlw	0x64		;D
	call	tx
	movlw	0x3d		;=
	call	tx
	movlw	0x31		;1
	call	tx
	movlw	0x2c		;,
	call	tx
	movlw	0x34		;4
	call	tx
	movlw	0x0d		;enter
	call	tx
	call	wait
	call	wait
	call	wait
	call	wait
	call	wait
	call	wait		;venter i 22 sek på at alle meldingene skal slettes fra telefonen
	call	wait
	call	wait
	call	wait
	call	wait
	call	wait
	call	wait
	call	wait
	clrf	var1
	clrf	var2



;-------------------------------------------------------------------------------
start
		
	call	inng1
	call	inng2
	call	inng3
	call	inng4
	call	rx		;leser av com port
	call	sms		;sjekker om det er mottat en ny sms
	call	smsinn		;sender komando for å motta sms tekst 
	call	smsdec		;dekoder sms meldingen
	call	ringinn		;hvis noen ringer inn
	call	smsfeil		;hvis en ukjent melding mottas
	clrwdt
	goto	start


;------ Når en feil sms mottas --------------------------------------------
;Sletter meldinger og registere hvis en sms er mottat og ingen komando er tuført

smsfeil

	btfss	smsvar,0	;sjekker om om sms er mottat og at komando er utført
	return			;returnerer hvis alt er i orden
	
	decfsz	smsvar1
	return

	decfsz	smsvar2
	goto	smf1
	
	call	slreg		;sletter registere for sms og meldingen som ligger i telefonen
	call	slett
	clrf	smsvar
	return

smf1
	
	movlw	0xff
	movwf	smsvar1
	return





;------ Når noen ringer inn ------------------------------------------------

ringinn

	btfss	portc,4
	bcf	portc,3		;nettlampen blinker når det ringer
	btfsc	portc,4
	bsf	portc,3

	btfss	porta,2		;sjekker om bryter 3 står på
	goto	ri1
	btfss	portc,4
	bsf	portb,3		;aktiverer utgang 4 hvis bryter 3 er på og det ringer
	btfsc	portc,4
	bcf	portb,3

ri1
	btfsc	portc,4
	return
	btfss	porta,3		;sjekker om bryter 4 står på og tar va røret når det ringer	
	return
	call	wait
	movlw	0x61		;a
	call	tx
	movlw	0x74		;t	
	call	tx
	movlw	0x61		;a
	call	tx	
	movlw	0x0d		;<CR>
	call	tx
	call	wait
	return



;------ Dekoder sms -------------------------------------------------------

smsdec
	
	movfw	mottat
	sublw	0x31
	btfsc	status,2		;sjekker on mottat tegn er 1
	goto	d1

	movfw	mottat
	sublw	0x4f
	btfsc	status,2		;sjekker on mottat tegn er O
	goto	d2

	movfw	mottat
	sublw	0x6f
	btfsc	status,2		;sjekker on mottat tegn er o
	goto	d2

	movfw	mottat
	sublw	0x6e
	btfsc	status,2		;sjekker on mottat tegn er n
	goto	d3

	movfw	mottat
	sublw	0x66
	btfsc	status,2		;sjekker on mottat tegn er f
	goto	d4

	movfw	mottat
	sublw	0x75
	btfsc	status,2		;sjekker on mottat tegn er u
	goto	d5

	movfw	mottat
	sublw	0x70
	btfsc	status,2		;sjekker on mottat tegn er p
	goto	d6

	movfw	mottat
	sublw	0x50
	btfsc	status,2		;sjekker on mottat tegn er P
	goto	d6

	movfw	mottat
	sublw	0x32
	btfsc	status,2		;sjekker on mottat tegn er 2
	goto	d7

	movfw	mottat
	sublw	0x33
	btfsc	status,2		;sjekker on mottat tegn er 3
	goto	d8

	movfw	mottat
	sublw	0x34
	btfsc	status,2		;sjekker on mottat tegn er 4
	goto	d9

	call	slreg
	return

d1	bsf	dec1,0			;setter bit i register var2 hvis di motatte tegene stemmer
	bsf	dec2,0			;1
	bsf	dec3,0
	goto	ds

d2	bsf	dec1,1			;O
	bsf	dec2,1
	bsf	dec4,1
	bsf	dec5,1
	bsf	dec7,1
	bsf	dec8,1
	bsf	dec10,1	
	bsf	dec11,1
	goto	ds

d3  	bsf	dec1,2			;n
	bsf	dec4,2
	bsf	dec7,2
	bsf	dec10,2
	goto	ds

d4	bsf	dec2,2			;f
	bsf	dec5,2
	bsf	dec8,2
	bsf	dec11,2
	goto	ds

d5	bsf	dec3,2			;u
	bsf	dec6,2
	bsf	dec9,2
	bsf	dec12,2
	goto	ds

d6	bsf	dec3,1			;p
	bsf	dec6,1
	bsf	dec9,1
	bsf	dec12,1
	goto	ds

d7	bsf	dec4,0			;2
	bsf	dec5,0		
	bsf	dec6,0										

d8	bsf	dec7,0			;3
	bsf	dec8,0			
	bsf	dec9,0					

d9	bsf	dec10,0			;4
	bsf	dec11,0			
	bsf	dec12,0						

ds
	movfw	dec1
	sublw	0x07
	btfss	status,2		;sjekker om alle tegnene er mottat	
	goto	ds1			
	bsf	portb,0			;setter utg1
	goto	dslutt

ds1
	movfw	dec2
	sublw	0x07
	btfss	status,2		;sjekker om alle tegnene er mottat	
	goto	ds2		
	bcf	portb,0			;sletter utg1
	goto	dslutt

ds2
	movfw	dec3
	sublw	0x07
	btfss	status,2		;sjekker om  alle tegnene er mottat	
	goto	ds3	
	bsf	portb,0			;setter utg1
	clrf	smsvar
	call	wait
	bcf	portb,0			;sletter utg1
	goto	dslutt
ds3
	movfw	dec4
	sublw	0x07
	btfss	status,2		;sjekker om  alle tegnene er mottat	
	goto	ds4			
	bsf	portb,1			;setter utg2
	goto	dslutt

ds4
	movfw	dec5
	sublw	0x07
	btfss	status,2		;sjekker om alle tegnene er mottat	
	goto	ds5	
	bcf	portb,1			;sletter utg2
	goto	dslutt

ds5
	movfw	dec6
	sublw	0x07
	btfss	status,2		;sjekker om alle tegnene er mottat	
	goto	ds6	
	bsf	portb,1			;setter utg2
	clrf	smsvar
	call	wait
	bcf	portb,1			;sletter utg2
	goto	dslutt
ds6
	movfw	dec7
	sublw	0x07
	btfss	status,2		;sjekker om  alle tegnene er mottat	
	goto	ds7			
	bsf	portb,2			;setter utg3
	goto	dslutt

ds7
	movfw	dec8
	sublw	0x07
	btfss	status,2		;sjekker om alle tegnene er mottat	
	goto	ds8	
	bcf	portb,2			;sletter utg3
	goto	dslutt

ds8
	movfw	dec9
	sublw	0x07
	btfss	status,2		;sjekker om alle tegnene er mottat	
	goto	ds9	
	bsf	portb,2			;setter utg3
	clrf	smsvar
	call	wait
	bcf	portb,2 		;sletter utg3
	goto	dslutt
ds9

	movfw	dec10
	sublw	0x07
	btfss	status,2		;sjekker om  alle tegnene er mottat	
	goto	ds10			
	bsf	portb,3			;setter utg4
	goto	dslutt

ds10
	movfw	dec11
	sublw	0x07
	btfss	status,2		;sjekker om alle tegnene er mottat	
	goto	ds11	
	bcf	portb,3			;sletter utg4
	goto	dslutt

ds11
	movfw	dec12
	sublw	0x07
	btfss	status,2		;sjekker om alle tegnene er mottat	
	goto	ds12	
	bsf	portb,3			;setter utg4
	clrf	smsvar
	call	wait
	bcf	portb,3 		;sletter utg4
	goto	dslutt
ds12

	return

dslutt					;Melding er mottat og komando er utført
	call	slreg
	call	slett
	clrf	smsvar		
	btfss	porta,1			;sjekker om inngang for bekreftelse er aktiv
	return
	call	wait
	call	smstx
	movlw	0x4f			;O
	call	tx
	movlw	0x4b			;K
	call	tx
	movlw	0x1a			;<ctr-z>
	call	tx		
	return

slreg					;sletter alle registerene i dekoder delen
	clrf	dec1
	clrf	dec2
	clrf	dec3
	clrf	dec4
	clrf	dec5
	clrf	dec6
	clrf	dec7
	clrf	dec8
	clrf	dec9
	clrf	dec10
	clrf	dec11
	clrf	dec12
	return


	
;------ Mottar sms --------------------------------------------------------

smsinn
	
	btfss	var2,4		;returnerer hvis var2,4 er 0 dvs. ingen sms og motta
	return
	clrf	var2		;sletter var2	

	call	twait		;venter i 0,5 sek
	movlw	0x61		;A   Sender AT+CMGR=1 for å motta sms tekst
	call	tx
	movlw	0x74		;T
	call	tx
	movlw	0x2b		;+
	call	tx
	movlw	0x63		;C
	call	tx
	movlw	0x6d		;M
	call	tx	
	movlw	0x67		;G
	call	tx
	movlw	0x72		;R
	call	tx
	movlw	0x3d		;=
	call	tx
	movlw	0x31		;1
	call	tx
	movlw	0x0d		;enter
	call	tx
	bsf	smsvar,0	;setter bit når melding mottas
	movlw	0xff
	movwf	smsvar1
	movwf	smsvar2
	return


;-------Ny SMS ?------------------------------------------------------------
;returnerer med var2,4 satt hvis ny sms er mottat

sms
	movfw	mottat
	sublw	0x43
	btfsc	status,2		;sjekker on mottat tegn er C
	goto	sm1

	movfw	mottat
	sublw	0x4d
	btfsc	status,2		;sjekker on mottat tegn er M
	goto	sm2

	movfw	mottat
	sublw	0x54
	btfsc	status,2		;sjekker on mottat tegn er T
	goto	sm3

	movfw	mottat
	sublw	0x49
	btfsc	status,2		;sjekker on mottat tegn er I
	goto	sm4

	clrf	var2			;sletter var2 og returnerer hvis ingen av disse tegnene blir mottat
	return

sm1	bsf	var2,0			;setter bit i register var2 hvis di motatte tegene stemmer
	goto	sm5
sm2	bsf	var2,1
	goto	sm5
sm3 bsf		var2,2
	goto	sm5
sm4	bsf	var2,3

sm5
	movfw	var2
	sublw	0x0f
	btfss	status,2		;sjekker om var2 er 0x0f dvs. alle tegnene er mottat	
	return				;returnerer hvis ikke alle tegene er mottat
	bsf	var2,4			;setter var2,4 hvis alle tegene er mottat og returnerer
	return




;-------Inngang 1----------------------------------------------------------

inng1
	btfsc	portb,7		
	goto	inng11		;går til ing11 hvis inngangen er inakvtiv
	btfss	var1,1
	return
				;sender sms hvis inng blir aktiv og var1,1 er høy
	call	smstx
	movlw	0x49		;I
	call	tx
	movlw	0x6e		;n
	call	tx
	movlw	0x6e		;n
	call	tx	
	movlw	0x67		;g
	call	tx
	movlw	0x2e		;.
	call	tx	
	movlw	0x31		;1
	call	tx		
	movlw	0x1a		;<ctr-z>
	call	tx		
	bcf	var1,1
	call	wait
	btfss	porta,0		;Hvis bryter 1 er aktiv så ringes telefonen også opp
	return
	call	ring
	return

inng11
	bsf	var1,1
	return
	

;-------Inngang 2----------------------------------------------------------

inng2
	btfsc	portb,6		
	goto	inng22		;går til ing22 hvis inngangen er inakvtiv
	btfss	var1,2
	return
				;sender sms hvis inng blir aktiv og var1,2 er høy
	call	smstx
	movlw	0x49		;I
	call	tx
	movlw	0x6e		;n
	call	tx
	movlw	0x6e		;n
	call	tx	
	movlw	0x67		;g
	call	tx
	movlw	0x2e		;.
	call	tx	
	movlw	0x32		;2
	call	tx		
	movlw	0x1a		;<ctr-z>
	call	tx		
	bcf	var1,2
	call	wait
	btfss	porta,0		;Hvis bryter 1 er aktiv så ringes telefonen også opp
	return
	call	ring
	return

inng22
	bsf	var1,2
	return
	

;-------Inngang 3----------------------------------------------------------

inng3
	btfsc	portb,5		
	goto	inng33		;går til ing33 hvis inngangen er inakvtiv
	btfss	var1,3
	return
				;sender sms hvis inng blir aktiv og var1,3 er høy
	call	smstx
	movlw	0x49		;I
	call	tx
	movlw	0x6e		;n
	call	tx
	movlw	0x6e		;n
	call	tx	
	movlw	0x67		;g
	call	tx
	movlw	0x2e		;.
	call	tx	
	movlw	0x33		;3
	call	tx		
	movlw	0x1a		;<ctr-z>
	call	tx		
	bcf	var1,3
	call	wait
	btfss	porta,0		;Hvis bryter 1 er aktiv så ringes telefonen også opp
	return
	call	ring
	return

inng33
	bsf	var1,3
	return
	

;-------Inngang 4----------------------------------------------------------

inng4
	btfsc	portb,4	
	goto	inng44		;går til ing44 hvis inngangen er inakvtiv
	btfss	var1,4
	return
				;sender sms hvis inng blir aktiv og var1,4 er høy
	call	smstx
	movlw	0x49		;I
	call	tx
	movlw	0x6e		;n
	call	tx
	movlw	0x6e		;n
	call	tx	
	movlw	0x67		;g
	call	tx
	movlw	0x2e		;.
	call	tx	
	movlw	0x34		;4
	call	tx		
	movlw	0x1a		;<ctr-z>
	call	tx		
	bcf	var1,4
	call	wait
	btfss	porta,0		;Hvis bryter 1 er aktiv så ringes telefonen også opp
	return
	call	ring
	return

inng44
	bsf	var1,4
	return
	
;-------Ringer opp 97553175-------------------------------------------------
;Dette nummeret er den telefonen som skal ringes opp 

ring
	call	wait
	call	wait
	call	wait
	call	wait
	movlw	0x41		;A   Sender ATD97653175;
	call	tx
	movlw	0x54		;T
	call	tx
	movlw	0x44		;D
	call	tx
	movlw	0x39		;9
	call	tx
	movlw	0x37		;7
	call	tx
	movlw	0x36		;6
	call	tx
	movlw	0x35		;5
	call	tx	
	movlw	0x33		;3
	call	tx
	movlw	0x31		;1
	call	tx
	movlw	0x37		;7
	call	tx
	movlw	0x35		;5
	call	tx
	movlw	0x3b		;;
	call	tx
	movlw	0x0d		;<CR>
	call	tx
	return
	
;-------Sender AT+CMGS="97653175"<cr> til gsm modul -----------------------
;Dette nummeret er den telefonen som skal motta SMS meldingen

smstx
	movlw	0x41		;A   Sender AT+CMGS=" før telefonnummeret
	call	tx
	movlw	0x54		;T
	call	tx
	movlw	0x2b		;+
	call	tx
	movlw	0x43		;C
	call	tx
	movlw	0x4d		;M
	call	tx	
	movlw	0x47		;G
	call	tx
	movlw	0x53		;S
	call	tx
	movlw	0x3d		;=
	call	tx
	movlw	0x22		;"
	call	tx
	movlw	0x39		;9
	call	tx
	movlw	0x37		;7
	call	tx
	movlw	0x36		;6
	call	tx
	movlw	0x35		;5
	call	tx	
	movlw	0x33		;3
	call	tx
	movlw	0x31		;1
	call	tx
	movlw	0x37		;7
	call	tx
	movlw	0x35		;5
	call	tx
	movlw	0x22		;"
	call	tx
	movlw	0x0d		;<CR>
	call	tx
	return


;------ Sletter sms melding nr 1 ----------

slett
	call  	twait		;venter 0,5 sek
	movlw	0x61		;A   Sender AT+CMGD=1 for å slette tekstmelding nr 1
	call	tx
	movlw	0x74		;T
	call	tx
	movlw	0x2b		;+
	call	tx
	movlw	0x63		;C
	call	tx
	movlw	0x6d		;M
	call	tx	
	movlw	0x67		;G
	call	tx
	movlw	0x64		;D
	call	tx
	movlw	0x3d		;=
	call	tx
	movlw	0x31		;1
	call	tx
	movlw	0x0d		;enter
	call	tx
	return


;------ Rutine for mottak fra com port ----

rx	clrwdt
	movfw	mottat		;legger verdien i mottat register over i w
	bcf	st1,0		;sletter mottat bit
	btfss	pir1,5		;Sjekker om det er mottat noe på com porten
	return

	btfsc	rcsta,2		;Sjekker om det feil i stopp bit
	goto	feil
	btfsc	rcsta,1		;Sjekker om rcreg registeret er fullt
	goto	feil
	movfw	rcreg
	movwf	mottat
	bsf	st1,0		;setter mottat bit når en ny verdi er mottat
	return

feil
	bcf	rcsta,4		;Reset ved feil i mottat data	
	nop
	bsf	rcsta,4
	return



;----- Rutine for sending på com port -----------	

tx
	bsf	status,5	;bank 1
comtx
	clrwdt
	btfss	txsta,1		;Venter på at porten er klar for sending	
	goto	comtx
	bcf	status,5	;bank 0

	movwf	txreg		;Legger innholdet i w ut til com port
	
	return


;------ Rutine som venter i 2 sek ---------- 

wait	

	call	twait
	call	twait
	call	twait
	call	twait
	return

;------ Rutine som venter i 0,5 sek --------

twait
	bsf	portc,3
	clrwdt
	movlw	.3
	movwf	cnt2
loop2
	movlw	.255
	movwf	cnt1
loop1
	movlw	.255
	movwf	cnt0
loop0
	decfsz	cnt0
	goto	loop0
	decfsz	cnt1
	goto	loop1
	decfsz	cnt2
	goto	loop2
	
	bcf	portc,3

	bcf	portc,3
	clrwdt
	movlw	.2
	movwf	cnt5
loop5
	movlw	.255
	movwf	cnt4
loop4
	movlw	.255
	movwf	cnt3
loop3
	decfsz	cnt3
	goto	loop3
	decfsz	cnt4
	goto	loop4
	decfsz	cnt5
	goto	loop5

	bsf	portc,3

	return	


	END
