;------------------------ Subroutines for I2C ------------------------------

;================== COMMON =============================================
.equ	SDA=1			;SDA conn to pin #1
.equ	SCL=0			;SCL conn to pin #0
.equ	PI2C=DDRD		;I2C Bus thrue Port D
;=======================================================================

;                      +++++++++++++++++

;========================= Start for I2C ===============================
STA:		CBI	PI2C,SDA	;1=>SDA
		CBI	PI2C,SCL	;1=>SCL
		rcall	DL3		;Wait 3.5 mkS
		SBI	PI2C,SDA	;0=>SDA
		rcall	DL3		;Wait 3.5 mkS
		SBI	PI2C,SCL	;0=>SCL
		rcall	DL3		;Wait 3.5 mkS
				RET
;=======================================================================

;                      +++++++++++++++++

;========================= Stop for I2C ================================
STO:		SBI	PI2C,SDA	;0=>SDA
		CBI	PI2C,SCL	;1=>SCL
		rcall	DL3		;Wait 3.5 mkS
		CBI	PI2C,SDA	;1=>SDA
		rcall	DL3		;Wait 3.5 mkS
				RET
;=======================================================================

;                      ++++++++++++++++

;============ I2C Out byte (byte in R16, if ACK>0 all OK)===============

I2COUT:		push	r17
		ldi	r17,9		;9=>counter
I2Cou1:		sbi 	PI2C,SCL	;0=>SCL
		sbi 	PI2C,SDA	;0=>SDA
		sbrc	r16,7		;if bit 7=0 then GO OVER
		cbi 	PI2C,SDA	;Elsie 1=>SDA
		rcall	DL3		;Wait 3.5mkS
		lsl	r16		;Shift left r16
		inc	r16		;1=>bit0/r16
		cbi 	PI2C,SCL	;1=>SCL
		rcall	DL3		;Wait 3.5mkS
	
	;---------- Define ACK ------------------------
		CLR	ACK		;0=> ACK
		SBIS	PIND,SDA	;if ack present
		COM	ACK		;1=> ACK
	STS	I2C_YES,ACK	;Set Flag I2C_PRESENT (OPTION)
	;----------------------------------------------	

		sbi 	PI2C,SCL	;0=>SCL
		rcall	DL3		;Wait 3.5mkS
		dec	r17		;Counter=counter-1
		brne	I2Cou1		;Go to continue
		pop	r17
				RET

;=======================================================================

;                      ++++++++++++++++

;=========== I2C IN byte (data => R16, if ACK=1, then CONTINUE)==========

I2CIN:		push	r17

		clr	r16		;Clear I2C Data IN
		ldi	r17,8		;8=>counter
I2Cin1:		sbi 	PI2C,SCL	;0=>SCL
		cbi 	PI2C,SDA	;1=>SDA
		rcall	DL3		;Wait 3.5mkS
		cbi 	PI2C,SCL	;1=>SCL
		rcall	DL3		;Wait 3.5mkS
		LSL	R16		;LSB=>LSB+1 ...
		SBIC	PIND,SDA	;SDA=>LSB R16
		inc	r16		;1=>r16
		sbi 	PI2C,SCL	;0=>SCL
		rcall	DL3		;Wait 3.5mkS
		dec	r17		;Counter=counter-1
		brne	I2Cin1		;Go to continue

	;------------ OUT condition ACK ---------------------

		sbi 	PI2C,SDA	;0=>SDA (ACK - Continued transfer)
		sbrs	ACK,0		;IF Command ACK>0
		cbi 	PI2C,SDA	;1=>SDA (ACK - END of transfer)

		rcall	DL3		;Wait 3.5mkS
		cbi 	PI2C,SCL	;1=>SCL
		rcall	DL3		;Wait 3.5mkS
		sbi 	PI2C,SCL	;0=>SCL
		rcall	DL3		;Wait 3.5mkS
	
		pop	r17
				RET

;=======================================================================


;                    ++++++++++++++++++++++++++


;======================== SUB SUBROUTINES ==============================

;----------------------- Time Delay 3.5 mkS ----------------------------
DL3:		push	r16		
		ldi	r16,1		;Load time constant (5) CHANGED!!!!!
DL31:		dec	r16		;R16=R16-1
		brne	dl31
		pop	R16
		RET
;=======================================================================

