;070409.  kocici
;		
;		IIC slave verzio	safe könyvelve

	list	p=16f88		
	#include <p16f88.inc>
  errorlevel  -302              

	__CONFIG    _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_OFF & _WDT_OFF & _HS_OSC
	__CONFIG    _CONFIG2, _IESO_OFF & _FCMEN_OFF
;**************************************************************
#DEFINE		INT	PORTB,6
#DEFINE		SDA	PORTB,1
#DEFINE		SCL	PORTB,4
#DEFINE		KAP	PORTB,3			;a125-ös irányának  /in-out/kapcsoloja
#DEFINE		led1	PORTA,1
#DEFINE     gomb   	PORTA,2
#DEFINE		valid	PORTA,3
;*************************************************************
temp		equ	0x40		;gomb index
hopdob		equ	0x7D		;hoppper és doboz adat változó		
szamlal		equ	0x7E		;adat lépés számlálo
pont		equ	0x7F		;adat pozicio reg.
veker		equ	0x44		;idö index1
ora			equ	0x45		;idö index2
_N			equ	0x71		;index változó
_K            equ    0x72          ;sztept
_J            equ    0x73
_D            equ    0x74
_D_1          equ    0x75
Timer0        equ    0x4B
Timer1        equ    0x4C
_e_h			equ		0x76
_e_l			equ		0x77
_e_ms			equ		0x78
_L			equ		0x79
_F			equ		0x7A
_R			equ		0x7B
_O			equ		0x7C
;**************************************************************
		org	0x000		;hidegstart
		clrf	STATUS
		clrf	PCLATH
Start:	
		movlw	0x20
		movwf	FSR
Clr_Bank:
		clrf	SSPBUF
		clrf	temp
		clrf	_N
        clrf    _D
        clrf    _D_1
        clrf	_e_h
        clrf	_e_l
        clrf	_e_ms
		clrf	szamlal
		clrf	pont
		clrf	INDF
		incf	FSR,1
		movf	FSR,w
		xorlw	0x70
		btfss	STATUS,Z
		goto	Clr_Bank
start:
			
       	clrf    PORTA
		bsf		STATUS,RP0	;definiálja a portot
		clrf	TRISA
       	movlw   0x00
       	movwf   ANSEL
       	movlw   0x0C
       	movwf   TRISA
		movlw	B'00010010'
		movwf	TRISB
       	movlw	0x80
		movwf	SSPSTAT			;slev kontrol kikapcs
		bcf		STATUS,RP0
       	movlw   0x00
       	movwf   INTCON       
       	bsf		led1		;led kikapcs
       ;	call	ido3
   	  	btfss	valid		;törlés vizsgállat		
		goto	kijel
viszin:
		call	reerom 			;érvényesség vizsgállata
		btfsc	gomb			;hopper-doboz pozicio vizsg.				
		goto	dob
		movlw	H'E0'
		movwf	hopdob			;ezt kell automatára irni
		goto	teszt
dob:
		movlw	H'D0'
		movwf	hopdob
		goto	teszt
teszt:
		bcf		led1		;amig ég addig szabad a pálya
		call	ido6			;start várakozási ideje
		bsf 	led1		;inditás kész a testhez
		call	ido6
		movlw	.1
	 	movwf	_O
		bsf 	INT			;inditja az interrapt kérést			   
     	bsf		KAP			;74HC125 kapcsolójel kimenete magasra /vétel
	   	call	test	;1 teszt credit beirás		
		bcf		led1		;kész a test indul
		goto	G_omb
;********************************************************************************   		

nyom:	
       	bsf		INT			;interrupt kimenete magasra
		bsf		KAP			;74HC125 kapcsolójel kimenete magasra /vétel       
megy:
		bsf		led1
con_alap:	
		clrf	SSPBUF
		bsf		STATUS,RP0		;bank1
		movlw	B'01000001'		;u3-cime
		movwf	SSPADD
		bcf		STATUS,RP0		;bank0
		bcf		SSPCON,7		;wcol törlés
		bcf		SSPCON,6		;pow törlése
		movlw	B'00110110'		;sspen-ckp-enged
		movwf	SSPCON
		bcf		PIR1,3			;sspif törlés
		bcf		INT			;inter be
		call	ckp_olv			;vár ckp 0-ra
		nop
		call	pif_olv			;vát ack ki-re , sspif	egyre
		bcf		led1
adat_olvas:
		call	idö_h
		bcf		SSPCON,7
		bcf		SSPCON,6
		btfss	_N,1
		goto	adat_ok
		goto	uto
ao:
		call	bf_olv			;bf ellenörzés az adat betöltés után
		bcf		KAP			;busz illesztö bekapcsolása adásra
adat_ki:
		bcf		SSPCON,7
		bcf		SSPCON,6
		bsf		SSPCON,4		;orajel indul
		bsf		SSPCON,5		;i2c engedély >>>>>adat ki indul
		bcf		PIR1,3			;fleg törlés
		call	bf_ki_olv		;bf ellenörzése, /vár az adás végére/
		bsf		KAP			;busz illesztö vissza vételre
		call	pif_olv			;vár a flegre
		call	stop_j			;a tovább elött a stop jel ellenörzése
		bsf		INT			;interrupt ki
		bcf		SSPCON,7
		bcf		SSPCON,6
		bsf		SSPCON,4
		bsf		SSPCON,5
		call	idö_h
		call	idö_h
		btfsc	_N,1
		goto	con_alap
		bsf		led1
		call	idö_h
		call	idö_h
con_ketö:
		call	idö_l
		call	idö_h
cc_kk:		
        movlw	B'00000110'
		movwf	SSPCON
		clrf	SSPBUF
		bsf		STATUS,RP0		;bank1
		movlw	B'01001101'		;u13-cime
		movwf	SSPADD
		bcf		STATUS,RP0		;bank0
		bcf		SSPCON,7
		bcf		SSPCON,6
		movlw	B'00110110'		;sspen-ckp-enged
		movwf	SSPCON
		bcf		PIR1,3			;sspif törlés
		call	ckp_olv			;vár ckp 0-ra
		call	pif_olv			;vát ack ki-re , sspif	egyre
	
data_olvas:	
		call	idö_h
		bcf		SSPCON,7
		bcf		SSPCON,6	
		movf	hopdob,0		; a hopdob változóban van az adat
		movwf	SSPBUF			;doboz adat
data_ao:
		call	bf_olv			;bf ellenörzés az adat betöltés után
		bcf		KAP			;busz illesztö bekapcsolása
data_ki:
		bcf		SSPCON,7		;wcol törlése
		bcf		SSPCON,6		;sspov törlése
		bsf		SSPCON,4		;orajel indul
		bsf		SSPCON,5		;i2c engedély >>>>>adat ki indul
		bcf		PIR1,3			;fleg törlés
		call	bf_ki_olv		;bf ellenörzése, /vár az adás végére/
		bsf		KAP			;busz illesztö vissza vételre
		call	pif_olv			;vár a flegre
		bcf		SSPCON,7
		bcf		SSPCON,6
		bsf		SSPCON,4
		bsf		SSPCON,5
tova:
		movlw	B'00000110'		;i2c- engedélyezése
		movwf	SSPCON
		clrf	SSPBUF			;sspbuf törlés
		bcf		_N,1
		clrf	szamlal
		call	idö_l
		call 	idö_h
       	incf	_e_ms,1				;1 el emeli a segédet
		decfsz	_O,1
		goto	kont				;gomb ellenörzése menet közben
		call	weerom
		call	vizsga
		goto	G_omb
;*************************************************************
adat_ok:
       	bsf		_N,1
		movlw	.6
		movwf	szamlal
		clrf	pont
uto:	
       	movf	pont,0
		call	table0
		movwf	SSPBUF
utod:	
       	incf	pont,1
		decfsz	szamlal,1
		goto	ao
;----------------------------------------------------
		bcf		_N,1				;a tig és opto1-2 irás adatai
		goto	ao
table0:				; adatok olvasása
		addwf	PCL,1
		retlw	0xC7		;vizsgálló	/3bit
		retlw	0xCF		;alap u3
		retlw	0xEF		;elsö optó	/5bit
		retlw	0xFF		;másodi opto	/4bit
		retlw	0xDF		;elsöböl kifut
		retlw	0xCF		;alap u3
;****************************************
;     Subrutin
;****************************************
kont:
		call	kiir
		call	weerom
		call	vizsga
		btfsc	gomb
		goto	megy			;itt megy tovább
stip:		
		btfss	gomb
		goto	$-1
		goto	G_omb

kiir:
		movf	_e_ms,0
		xorlw	0x64			;H96=150	;H'32'		nri			H'64'	normal
		btfss	STATUS,Z
		return						;segéd vizsgállat van e 100/ még nincs meg
		movf	_e_l,0
		xorlw	H'FF'
		btfss	STATUS,Z
		goto	kicsi				;also bit vizsgál
		movlw	H'00'
		movwf	_e_ms
		movwf	_e_l				;0-ra az alit mert emelni kell a felsön
		incf	_e_h,1				;emeli a felsöt
		return				
kicsi:
		movlw	H'00'
		movwf	_e_ms
		incf	_e_l,1				;emel 1-et az alson
		return
;*****************************************
reerom:							;eerom data read ruti
		BANKSEL	EEDATA	
		goto	otabla
eolv:
		BANKSEL	EECON1				;adat olvasás
		bcf		EECON1,EEPGD
		bsf		EECON1,RD
		BANKSEL	EEDATA
		return
otabla:
		clrf	EEDATA
		BANKSEL	EEADR
		movlw	H'01'
		movwf	EEADR				;CIM BENVAN
		call	eolv				;elsö adat
		movf	EEDATA,0
		movwf	_e_l			
		clrf	EEDATA				;kiirta az elsö adatot
		BANKSEL EEADR
		movlw	H'00'
		movwf	EEADR				;második cim
		call	eolv				;megy olvasni
		movf	EEDATA,0
		movwf	_e_h
		clrf	EEDATA				;kiirta a másodikat
		BANKSEL	EEADR
		movlw	H'06'
		movwf	EEADR				;bennvan a cim
		call	eolv				;megy olvasni
		movf	EEDATA,0
		movwf	_e_ms
		clrf	EEDATA
		BANKSEL	SSPBUF
		bcf		STATUS,RP0
vizsga:								;data comparate rutin
		movf	_e_h,0				;old felső a bankban
		xorlw	H'01'					;H'03'	nri
		btfss	STATUS,Z
		return
len:
		movf	_e_l,0
		xorlw	H'F4'					;H'EB"	nri
		btfss	STATUS,Z
		return
		call	weerom
		goto	kilep
;***************************************
;		clear
;****************************************
ceerom:
		bsf		led1
		movlw	H'00'
		movwf	_e_l
		movwf	_e_h
		movwf	_e_ms
		call	weerom
		call	ido3
		bcf		led1
		goto	kilep
;*******************************************
e_ir:								;data write rutin
		BANKSEL	EECON1
		bcf		EECON1,EEPGD
		bsf		EECON1,WREN
		bcf		INTCON,GIE
		movlw	H'55'
		movwf	EECON2
		movlw	H'AA'
		movwf	EECON2
		bsf		EECON1,WR
		bsf		INTCON,GIE
		bcf		EECON1,WREN
		return
weerom:
		BANKSEL	EECON1
		btfsc	EECON1,WR
		goto	$-1
		BANKSEL	EEADR
		movlw	H'01'				;aktuális eeram cime  ---- lo adress
		movwf	EEADR
		movf	_e_l,0				;lo data
		movwf	EEDATA
		call	e_ir
		BANKSEL	EECON1
		btfsc	EECON1,WR
		goto	$-1
		BANKSEL	EEADR
		movlw	H'00'				;hi adress
		movwf	EEADR
		movf	_e_h,0				;hi data
		movwf	EEDATA
		call	e_ir
		BANKSEL	EECON1
		btfsc	EECON1,WR
		goto	$-1
		BANKSEL	EEADR
		movlw	H'06'				;hi adress
		movwf	EEADR
		movf	_e_ms,0				;hi data
		movwf	EEDATA
		call	e_ir
		BANKSEL	SSPBUF
		bcf	STATUS,RP0
		return
;*********************************************************************
;		KIEGÉSZÍTŐ RUTINOK
;*********************************************************************
bf_olv:
		bsf		STATUS,RP0
bo:
		btfss	SSPSTAT,0
		goto	$-1
		bcf		STATUS,RP0
		return
bf_ki_olv:
		bsf		STATUS,RP0
bk:
		btfsc	SSPSTAT,0
		goto	$-1
		bcf		STATUS,RP0
		return
;**************************************************
pow_olv:
		btfss	SSPCON,6
		goto	$-1
		return
;******************************************************
ckp_olv:
		btfss	SSPCON,4
		goto	$-1
		return
stop_j:
		bsf		STATUS,RP0
s_j:
		btfss	SSPSTAT,4
		goto	$-1
		bcf		STATUS,RP0
		return
;*******************************************************
pif_olv:
		btfss	PIR1,3		;vár a flegre
		goto	$-1
		return
;******************************************************
ckp_figy:
		btfsc	SSPCON,4
		goto	$-1
		return
;******************************************************
Delay   
        movlw	.2
		movwf	Timer0
	    movlw   .2		; kb. 10ms késleltetés
       	movwf   Timer1		
Delay1        
		decfsz  Timer0,1
       	goto    Delay1
        decfsz  Timer1,1
        goto    Delay1
       	return
;******************************************************
idö_l:			
		movlw	.100
		movwf	ora
összes:
		movlw	.100
		movwf	veker
		nop
		nop
		nop
		decfsz	veker,1
		goto	$-4
		decfsz	ora,1
		goto	összes
		return
;-----------------------------------------------------
idö_h:
		movlw	.100
		movwf	veker
       	nop
		decfsz	veker,1
		goto	$-1
		return
;******************************************
ido3:
		movlw	.200
		movwf	ora
idd:
		nop
		movlw	.200
		movwf	veker
		movlw	.100
		movwf	_R
		nop
		decfsz	_R,1
		goto	$-2
		decfsz	veker,1
		goto	$-6
		decfsz	ora,1
		goto	idd
		return
ido6:
		movlw	.200								;.50	"
		movwf	ora
idd6:
		nop
		movlw	.200							;.100	"
		movwf	veker
		movlw	.30							;.200	"
		movwf	_R
		nop
		decfsz	_R,1
		goto	$-2
		decfsz	veker,1
		goto	$-6
		decfsz	ora,1
		goto	idd6
		return
;******************************************************
ido_vil:
		movlw	.80
		movwf	ora
idd_vil:
		nop
		movlw	.10
		movwf	veker
		movlw	.100
		movwf	_R
		nop
		decfsz	_R,1
		goto	$-2
		decfsz	veker,1
		goto	$-6
		decfsz	ora,1
		goto	idd_vil
		return
ido_jel:
		movlw	.100
		movwf	ora
idd_jel
		nop
		movlw	.100
		movwf	veker
		movlw	.100
		movwf	_R
		nop
		decfsz	_R,1
		goto	$-2
		decfsz	veker,1
		goto	$-6
		decfsz	ora,1
		goto	idd_jel
		return
;******************************************************
G_omb:	
		movlw  .150
        movwf  _O
var1:		
		btfsc	PORTA,2
        goto   $-1
        btfss  PORTA,2
        goto   $-1
		goto	nyom
;******************************************************
tmegy:
		bsf		led1
test:	
		clrf	SSPBUF
		bsf		STATUS,RP0		;bank1
		movlw	B'01000001'		;u3-cime
		movwf	SSPADD
		bcf		STATUS,RP0		;bank0
		bcf		SSPCON,7		;wcol törlés
		bcf		SSPCON,6		;pow törlése
		movlw	B'00110110'		;sspen-ckp-enged
		movwf	SSPCON
		bcf		PIR1,3			;sspif törlés
		bcf		INT			;inter be
		call	ckp_olv			;vár ckp 0-ra
		nop
		call	pif_olv			;vát ack ki-re , sspif	egyre
		bcf		led1
tadat_olvas:
		call	idö_h
		bcf		SSPCON,7
		bcf		SSPCON,6
		btfss	_N,1
		goto	tadat_ok
		goto	tuto
tao:
		call	bf_olv			;bf ellenörzés az adat betöltés után
		bcf		KAP			;busz illesztö bekapcsolása adásra
tadat_ki:
		bcf		SSPCON,7
		bcf		SSPCON,6
		bsf		SSPCON,4		;orajel indul
		bsf		SSPCON,5		;i2c engedély >>>>>adat ki indul
		bcf		PIR1,3			;fleg törlés
		call	bf_ki_olv		;bf ellenörzése, /vár az adás végére/
		bsf		KAP			;busz illesztö vissza vételre
		call	pif_olv			;vár a flegre
		call	stop_j			;a tovább elött a stop jel ellenörzése
		bsf		INT			;interrupt ki
		bcf		SSPCON,7
		bcf		SSPCON,6
		bsf		SSPCON,4
		bsf		SSPCON,5
		call	idö_h
		call	idö_h
		btfsc	_N,1
		goto	test
		bsf		led1
		call	idö_h
		call	idö_h
tcon_ketö:
		call	idö_l
		call	idö_h
tcc_kk:		
        movlw	B'00000110'
		movwf	SSPCON
		clrf	SSPBUF
		bsf		STATUS,RP0		;bank1
		movlw	B'01001101'		;u13-cime
		movwf	SSPADD
		bcf		STATUS,RP0		;bank0
		bcf		SSPCON,7
		bcf		SSPCON,6
		movlw	B'00110110'		;sspen-ckp-enged
		movwf	SSPCON
		bcf		PIR1,3			;sspif törlés
		call	ckp_olv			;vár ckp 0-ra
		call	pif_olv			;vát ack ki-re , sspif	egyre
	
tdata_olvas:	
		call	idö_h
		bcf		SSPCON,7
		bcf		SSPCON,6	
		movf	hopdob,0		; a hopdob változóban van az adat
		movwf	SSPBUF			;doboz adat
tdata_ao:
		call	bf_olv			;bf ellenörzés az adat betöltés után
		bcf		KAP			;busz illesztö bekapcsolása
tdata_ki:
		bcf		SSPCON,7		;wcol törlése
		bcf		SSPCON,6		;sspov törlése
		bsf		SSPCON,4		;orajel indul
		bsf		SSPCON,5		;i2c engedély >>>>>adat ki indul
		bcf		PIR1,3			;fleg törlés
		call	bf_ki_olv		;bf ellenörzése, /vár az adás végére/
		bsf		KAP			;busz illesztö vissza vételre
		call	pif_olv			;vár a flegre
		bcf		SSPCON,7
		bcf		SSPCON,6
		bsf		SSPCON,4
		bsf		SSPCON,5
ttova:
		movlw	B'00000110'		;i2c- engedélyezése
		movwf	SSPCON
		clrf	SSPBUF			;sspbuf törlés
		bcf		_N,1
		clrf	szamlal
		call	idö_l
		call 	idö_h
   		decfsz	_O,1
		goto	tmegy
		return
;*************************************************************
tadat_ok:
       	bsf		_N,1
		movlw	.6
		movwf	szamlal
		clrf	pont
tuto:	
       	movf	pont,0
		call	table0
		movwf	SSPBUF
tutod:	
       	incf	pont,1
		decfsz	szamlal,1
		goto	tao
;----------------------------------------------------
		bcf		_N,1				;a tig és opto1-2 irás adatai
		goto	tao
ttable0:				; adatok olvasása
		addwf	PCL,1
		retlw	0xC7		;vizsgálló	/3bit
		retlw	0xCF		;alap u3
		retlw	0xEF		;elsö optó	/5bit
		retlw	0xFF		;másodi opto	/4bit
		retlw	0xDF		;elsöböl kifut
		retlw	0xCF		;alap u3
;******************************************
idgomb:
		btfsc	PORTA,2
        goto   $-1
        btfss  PORTA,2
        goto   $-1
		return
;******************************************
vill:
		bcf	led1
		call	ido_vil
		bsf		led1
		call	ido_jel
		decfsz	_K,1
		goto	$-5
		return
;******************************************
kijel:
		btfss	gomb
		goto	$+2			;ha nyomva akkor jelzés
		goto	ceerom			;ha nincs nyomva akkor töröl
		bcf		led1			;led bekapcs	
		call	ido6
		call	reerom
		bsf		led1			;led kikapcs
		call	ido6
		movlw	.3
		movwf	_K
		call	vill
		call	idgomb			;itt vár a gombnyomásra ami lépteti
		movf	_e_l,0			;beolvassa az alsót
		andlw	B'00001111'		;kiveszi csak L-re
		movwf	_K				;beirja a ciklus számláloba
		xorlw	H'00'			;megnézi hogy nem e 0
		btfss	STATUS,Z
		call	vill
		call	ido6			;vár a váltásra
		call	idgomb
		movf	_e_l,0			;visszaolvasa L-t
		andlw	B'11110000'		;a felsö négy jön
		movwf	_K				;beirja k-ba
		swapf	_K,1			;megforditja az also és a felsöt
		movf	_K,0			;vissza a W-be
		xorlw	H'00'
		btfss	STATUS,Z
		call	vill			;ha nem 0 akkor villog
		call	ido6
		call	idgomb			;vár a váltásra
		movf	_e_h,0
		movwf	_K				;beirja a felsöt
		xorlw	H'00'
		btfss	STATUS,Z
		call	vill		
;******************************************
kilep:
		nop
		goto	allo
allo:
		nop
		goto	kilep
;*******************************************
	END
