 

	LIST P=16F877A
	#INCLUDE "P16F877A.INC"
	__CONFIG H'3F72'
	ERRORLEVEL -302




#DEFINE FOSC	D'4000'
#DEFINE BAUD	D'100'
#DEFINE I2C_SCL	3
#DEFINE	I2C_SDA	4
#DEFINE I2C_FAULT	0 
I2C_ADAT	EQU	0X20
I2C_ADAT_H	EQU	0X21




	GOTO	SETUP_I_O

	ORG	0X00
	
	ORG	0X04





SETUP_I_O:
	BANKSEL	TRISC		; BANK1	
	BSF	TRISC,I2C_SCL	;SCL INPUT_KELL EZ? SSPCONBAN IS ÁLLÍTJUK, DE ADATLAP AJÁNLJA
	BSF	TRISC,I2C_SDA	;SDA INPUT_KELL EZ? SSPCONBAN IS ÁLLÍTJUK, DE ADATLAP AJÁNLJA
	BSF	TRISC,I2C_FAULT	;I2C_FAULT KIMENET: JELENLEG PIN PORTC/0 
	
	MOVLW	B'00000000'	; HOGY LÁSSUK MIT CSINÁLTUNK (KÉSŐBB TÖRLENDŐ)
	MOVWF	TRISB		;KIMENET MINDEN PIN
	BANKSEL	PORTB
	CLRF	PORTB
	CLRF	I2C_ADAT_H
	CLRF	I2C_ADAT	
	

SETUP_I2C:
	BANKSEL	SSPCON		; BANK0
	MOVLW	B'00101000'	;PORTC SCL, SDA I2C LÁBAK, MASTER MODE 
	MOVWF	SSPCON
	BANKSEL	SSPSTAT		; BANK1
	MOVLW	B'10000000'	;100 KHz, 
	MOVWF	SSPSTAT
	MOVLW	FOSC/(4*BAUD)-1	;ELVILEG IDE D'9'=H'9' KERÜL
	MOVWF	SSPADD
	BCF	PIE1,SSPIE	;I2C MODUL:HA MAJD AKARUNK HASZNÁLNI I2C MEGSZAKÍTÁST TEGYÜK H RA
	BCF	INTCON,PEIE	;PERIFERIA:HA MAJD AKARUNK HASZNÁLNI I2C MEGSZAKÍTÁST TEGYÜK H RA
	BCF	INTCON,GIE	;GENERAL:HA MAJD AKARUNK HASZNÁLNI I2C MEGSZAKÍTÁST TEGYÜK H RA
	BCF	PIR1,SSPIF	;INTERUPT JELZŐBIT TÖRLÉSE, HOGY BIZTOS MŰKÖDJÖN: START/STROP/ACK
	BANKSEL	SSPCON		; BANK0
	
	

I2C_MAIN:			;MOST EGY BYTE OT KIIRUNK A MESTERBŐL A SLAVEBE, ÉS AZT OLVASSUK IS  	
	NOP
	BANKSEL	PORTB
	BSF	PORTB,2		;OSZCILLOSZKÓP TRIGGERHEZ
	NOP
	NOP
	BCF	PORTB,2		;OSZCILLOSZKÓP TRIGGERHEZ	
	BSF	PORTB,0	
	NOP
	NOP
	

I2C_KULDES:
	CALL	I2C_STARTT	;
	MOVLW	B'10100000'	;MESTER ÍR SLAVE FELE (SLAVE CÍM: 1010 000)
	MOVWF	I2C_ADAT	;CÍM  + WRITE (0. BIT=0) PARANCS BYTE KIKÜLDVE
	CALL	I2C_WRITE
	CALL	I2C_ACK_CHECK	;ACK CHECK, AMIT A SLAVE KÜLD A PIC FELE
	MOVLW	B'00000000'	;ÍRT REGISZTER CÍM DEKLARÁLÁS HIGH BYTE
	MOVWF	I2C_ADAT
	CALL	I2C_WRITE
	CALL	I2C_ACK_CHECK	;ACK CHECK, AMIT A SLAVE KÜLD A PIC FELE
	MOVLW	B'00000000'	;ÍRT REGISZTER CÍM DEKLARÁLÁS LOW  BYTE
	MOVWF	I2C_ADAT
	CALL	I2C_WRITE
	CALL	I2C_ACK_CHECK	;ACK CHECK, AMIT A SLAVE KÜLD A PIC FELE
 	MOVLW	B'01110101'	;KIJELÖLT CÍMŰ REGISZTER (HIGH ÉS LOW CÍMEN AZONOSÍTOTT) ADATA 
	MOVWF	I2C_ADAT
	CALL	I2C_WRITE
	CALL	I2C_ACK_CHECK	;ACK CHECK, AMIT A SLAVE KÜLD A PIC FELE
	CALL	I2C_STOPP	;A MESTER STOP OT KÜLD, JELEZVE VÉGE A SOROZATNAK


	MOVLW	D'15'			;D'50'	
	MOVWF	0X7C		
RIDO2:	MOVLW	H'FF'			;D'256'	
	MOVWF	0X7D
RIDO1:	DECFSZ	0X7D,1			
	GOTO	RIDO1			;0X7D <> 0
	DECFSZ	0X7C,1
	GOTO	RIDO2			;0X7C <> 0


I2C_FOGADAS:	
	CALL	I2C_STARTT	;
	MOVLW	B'10100000'	;MESTER ÍR SLAVE FELE (SLAVE CÍM 1010 000)
	MOVWF	I2C_ADAT	;CÍM  + READ (0. BIT =0) 	
	CALL	I2C_WRITE	;CONTROL BYTE KIKÜLDVE
	CALL	I2C_ACK_CHECK	;ACK
	MOVLW	B'00000000'	;OLVASOTT REGISZTER CÍM DEKLARÁLÁS HIGH BYTE
	MOVWF	I2C_ADAT
	CALL	I2C_WRITE
	CALL	I2C_ACK_CHECK	;ACK CHECK, AMIT A SLAVE KÜLD A PIC FELE
	MOVLW	B'00000000'	;OLVASOTT REGISZTER CÍM DEKLARÁLÁS LOW  BYTE
	MOVWF	I2C_ADAT
	CALL	I2C_WRITE
	CALL	I2C_ACK_CHECK	;ACK CHECK, AMIT A SLAVE KÜLD A PIC FELE
	
	CALL	I2C_RESTART	;CALL	I2C_RESTART
	MOVLW	B'10100001'	;MESTER OLVAS SLAVE TŐL (SLAVE CÍM: 1010 000)
	MOVWF	I2C_ADAT	;CÍM  + WRITE (0. BIT=1) PARANCS BYTE KIKÜLDVE
	CALL	I2C_WRITE
	CALL	I2C_ACK_CHECK	;ACK CHECK, AMIT A SLAVE KÜLD A PIC FELE
	CALL	I2C_OLVAS	;
	MOVF	I2C_ADAT,W	;ELSŐ KIOLVASOTT ADAT MEGÉRKEZETT
	MOVWF	I2C_ADAT_H	;BEKERÜL AZ I2C_ADAT_H VÁLTOZÓBA
	CALL	I2C_SEND_ACK	;MOST A MESTER KÜLD ACK -T:  RENDBEN MEGJÖTT A SLAVE ADATA 
	CALL	I2C_OLVAS	;MÁSODIK OLVASÁSKOR ÉRKEZIK A LO BYTE. MARAD "I2C_ADAT" BAN	
	CALL	I2C_SEND_NACK	;A MESTER MOST NACK -OT KÜLD, JELEZVE TÖBB OLVASÁSA NEM LESZ
	CALL	I2C_STOPP	;A MESTER STOP OT KÜLD, JELEZVE VÉGE A SOROZATNAK
		
	
	BANKSEL	PORTB		; BANK0 BANKSEL	PORTB
	
	MOVF   	I2C_ADAT_H,W	;ELŐSZÖR KIOLVASOTT ADAT ELLENŐRZÉSE
	SUBLW	B'01110101'	;KIVONAJA W -T KOSTANSBÓL
	BTFSC	STATUS,Z
	BSF	PORTB,1

	
	
	GOTO 	I2C_MAIN	
	RETURN			;





I2C_STARTT:
	BANKSEL	SSPCON2		; BANK1	
	BSF	SSPCON2,SEN
	BTFSC	SSPCON2,SEN	;UGRIK, HA 0
	GOTO	$-1		;HW TÖRLI AUTOMATIKUSAN. LÁSD REGISZTER LEIRASABAN.
	BANKSEL	SSPCON		; BANK0 
	RETURN	

I2C_RESTART:
	BANKSEL	SSPCON2		; BANK1	
	BSF	SSPCON2,RSEN
	BTFSC	SSPCON2,RSEN	;UGRIK, HA 0
	GOTO	$-1		;HW TÖRLI AUTOMATIKUSAN. LÁSD REGISZTER LEIRASABAN.
	BANKSEL	SSPCON		; BANK0 
	RETURN

I2C_STOPP:
	BANKSEL	SSPCON2		; BANK1	
	BSF	SSPCON2,PEN
	BTFSC	SSPCON2,PEN	;UGRIK, HA 0
	GOTO	$-1		;HW TÖRLI AUTOMATIKUSAN. LÁSD REGISZTER LEIRASABAN.
	BANKSEL	SSPCON		; BANK0 
	RETURN	

I2C_SEND_ACK:
	BANKSEL	SSPCON2		; BANK1	
	BCF	SSPCON2,ACKDT	;ACKEN BIT ALACSONYRA ÁLLÍTÁSÁVAL ACK JEL KERÜL KÜLDÉSRE 
	BSF	SSPCON2,ACKEN	;KIKÜLDI AZ ACK JELET 
	BTFSC	SSPCON2,ACKEN	;UGRIK, HA 0
	GOTO	$-1		;HW TÖRLI AUTOMATIKUSAN. LÁSD REGISZTER LEIRASABAN.
	BANKSEL	SSPCON		; BANK0
	RETURN	

I2C_SEND_NACK:
	BANKSEL	SSPCON2		; BANK1
	BSF	SSPCON2,ACKDT	;ACKEN BIT MAGASRA ÁLLÍTÁSÁVAL NACK JEL KERÜL KÜLDÉSRE 
	BSF	SSPCON2,ACKEN	;KIKÜLDI A NACK JELET 
	BTFSC	SSPCON2,ACKEN	;UGRIK, HA 0
	GOTO	$-1		;HW TÖRLI AUTOMATIKUSAN. LÁSD REGISZTER LEIRASABAN.	
	BANKSEL	SSPCON		; BANK0 
	RETURN	

I2C_ACK_CHECK:
	BANKSEL	SSPCON2		; BANK1
	BTFSC	SSPCON2,ACKSTAT	;UGRIK, HA 0
	GOTO	I2C_FAIL
	BANKSEL	SSPCON		; BANK0 
	RETURN	

I2C_FAIL:
	BANKSEL	PORTC
				;BSF	PORTC,I2C_FAULT
	MOVLW   H'ff'
	;MOVWF 	PORTD
	
	GOTO	$-0


I2C_WRITE:
	CALL	I2C_BUSYCONTROL	;ENÉLKÜL IS MŰKÖDik, DE AJÁNLOTTÁK HOZZÁ, ÍGY LEGYEN ITT
	BANKSEL	SSPBUF		; BANK0
	MOVF	I2C_ADAT,W	;I2C_ADAT BAN LÉVŐ ADAT W BE KERÜL
	MOVWF	SSPBUF		;KIKÜLDJÜK A W BEN LÉVŐ ADATOT
	BANKSEL	SSPSTAT		; BANK1
	BTFSC	SSPSTAT, R_W	;ÍRÁS KÉSZ?	
	GOTO	$-1		;  
	BANKSEL	SSPBUF		; BANK0	
	RETURN
	
I2C_OLVAS:	
	CALL	I2C_BUSYCONTROL	;ENÉLKÜL IS MŰKÖDik, DE AJÁNLOTTÁK HOZZÁ, ÍGY LEGYEN ITT
	BANKSEL	SSPCON2		; BANK1
	BSF	SSPCON2,RCEN	;ENGEDÉLY A VÉTELRE
	BTFSC 	SSPCON2,RCEN	;UGRIK, HA 0: OLVASÁS KÉSZ?
	GOTO	$-1	
	BANKSEL	SSPBUF		; BANK0		
	MOVF	SSPBUF,W
	MOVWF	I2C_ADAT	;VETT ADAT I2C_ADAT BAN	
	RETURN
		
I2C_BUSYCONTROL:		;ENÉLKÜL IS MŰKÖDik, DE AJÁNLOTTÁK HOZZÁ, ÍGY LEGYEN ITT
	BANKSEL	SSPSTAT		; BANK1
	BTFSC	SSPSTAT,R_W	;ADÁS VAN/NINCS FOLYAMATBAN?
	GOTO	$-1
	MOVF	SSPCON2,W	;SEN, RSEN, PEN, RCEN, ACKEN 
	ANDLW	H'1F'		;VALAMELYIKE FOLYAMATBEN VAN?
	BTFSS	STATUS,Z
	GOTO	$-5
	BANKSEL	SSPCON		; BANK0
	RETURN



	

	END
