#include "p18f45k20.h"
#include "float.h"

#define PASS	1
#define FAIL	0

//config bits
#pragma config FOSC = HSPLL, FCMEN = OFF, IESO = OFF        //FOSC=HS//Kulso osc             		 // CONFIG1H
#pragma config PWRT = OFF, BOREN = SBORDIS, BORV = 30       //BOREN=OFF      // CONFIG2L
#pragma config WDTEN = OFF, WDTPS = 32768                                    // CONFIG2H
#pragma config MCLRE = OFF, LPT1OSC = OFF, PBADEN = ON, CCP2MX = PORTC       // CONFIG3H
#pragma config STVREN = ON, LVP = OFF, XINST = OFF							 // CONFIG4L
#pragma config CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF                    // CONFIG5L
#pragma config CPB = OFF, CPD = OFF                                          // CONFIG5H
#pragma config WRT0 = OFF, WRT1 = OFF, WRT2 = OFF, WRT3 = OFF                // CONFIG6L
#pragma config WRTB = OFF, WRTC = OFF, WRTD = OFF                            // CONFIG6H
#pragma config EBTR0 = OFF, EBTR1 = OFF, EBTR2 = OFF, EBTR3 = OFF            // CONFIG7L
#pragma config EBTRB = OFF 

#ifdef __DEBUG
#pragma config DEBUG = ON
#else
#pragma config DEBUG = OFF
#endif

//-----------------------------------------------------------
//SMB labak
#define SM_SCK	LATDbits.LATD4
#define SM_SDA	LATDbits.LATD5
#define SM_SDA_re	LATDbits.LATD6
//-----------------------------------------------------------
#define SMB_FREQ	100E3
#define SYSCLK		40E6

//-----------------------------------------------------------
// Prototipusok
//-----------------------------------------------------------
void ReadSMB12bits(int Value12bits);
void Delay (unsigned int tk);
void Test_WriteSMB(char Data, char out);
//-----------------------------------------------------------
char ki,be;

void main (void)
{	ki=0x34;
	Test_WriteSMB(ki,be);
	be;
}
//-----------------------------------------------------------
void ReadSMB (char Value)	//byte read
{	
	Value = 0x00;
	SM_SCK=0;
	Delay(100);
	SM_SCK=1;
	Value = 0x00|SM_SDA;		    //MSB
	Value <<= 1;
	SM_SCK=0;
	Delay(100);
	SM_SCK=1;
	Value = Value|SM_SDA;		//7
	Value <<= 1;
	SM_SCK=0;
	Delay(100);
	SM_SCK=1;
	Value = Value|SM_SDA;		//6
	Value <<= 1;
	SM_SCK=0;
	Delay(100);	
	SM_SCK=1;
	Value = Value|SM_SDA;		//5
	Value <<= 1;
	SM_SCK=0;
	Delay(100);
	SM_SCK=1;
	Value = Value|SM_SDA;		//4
	Value <<= 1;
	SM_SCK=0;
	Delay(100);
	SM_SCK=1;
	Value = Value|SM_SDA;		//3
	Value <<= 1;
	SM_SCK=0;
	Delay(100);
	SM_SCK=1;
	Value = Value|SM_SDA;		//2
	Value <<= 1;
	SM_SCK=0;
	Delay(100);
	SM_SCK=1;
	Value = Value|SM_SDA;		//1
	Value <<= 1;
	SM_SCK=0;
	Delay(100);
	SM_SCK=1;
	Value = Value|SM_SDA;		//LSB
	SM_SCK=0;
	Delay(100);
	SM_SCK=1;
	SM_SDA=0;					//ACK 
	Delay(100);
	SM_SCK=0;
	Delay(100);
	SM_SCK=1;
}
//-----------------------------------------------------------
void WriteSMB(char Data)		//byte write
{
	SM_SCK=0;
	SM_SDA=((Data&0x80)==0x80);	//MSB
	SM_SCK=1;
	Delay(100);
	SM_SCK=0;
	SM_SDA=((Data&0x40)==0x40);
	SM_SCK=1;
	Delay(100);
	SM_SCK=0;
	SM_SDA=((Data&0x20)==0x20);
	SM_SCK=1;
	Delay(100);
	SM_SCK=0;
	SM_SDA=((Data&0x10)==0x10);
	SM_SCK=1;
	Delay(100);
	SM_SCK=0;
	SM_SDA=((Data&0x08)==0x08);
	SM_SCK=1;
	Delay(100);
	SM_SCK=0;
	SM_SDA=((Data&0x04)==0x04);
	SM_SCK=1;
	Delay(100);
	SM_SCK=0;
	SM_SDA=((Data&0x02)==0x02);
	SM_SCK=1;
	Delay(100);
	SM_SCK=0;
	SM_SDA=((Data&0x01)==0x01);	//LSB
	SM_SCK=1;
	Delay(100);
	SM_SCK=0;
	Delay(100);
	SM_SCK=1;
	if (SM_SDA==0)
	{	
		Delay(100);
		SM_SCK=0;
		Delay(100);
		SM_SCK=1;
		return PASS;
	}
	else
	{
		Delay(100);
		SM_SCK=0;
		Delay(100);
		SM_SCK=1;
		return FAIL;
	}
}
//-----------------------------------------------------------
void CloseSMB(char Data)		//byte write
{
	SM_SCK=0;
	SM_SDA=1;	//MSB
	Delay(1000);
	SM_SCK=1;
	Delay(50);
	SM_SDA=0;
	Delay(50);
	SM_SCK=0;
	Delay(100);
	SM_SCK=1;
	Delay(50);
	SM_SDA=1;
	Delay(50);
	SM_SCK=1;
}
//-----------------------------------------------------------
//-----------------------------------------------------------
void Delay (unsigned int tk)
{	unsigned int q;
	for(q=0;q<tk;q++); Nop();
}
//-----------------------------------------------------------
void Test_ReadSMB (char Value, char Data)	//byte read
{	
	Value = 0x00;
	SM_SCK=0;
//	Delay(100);
	SM_SCK=1;
	Value = 0x00|SM_SDA;		    //MSB
	Data=0x00|SM_SDA_re;
	Value <<= 1;
	SM_SCK=0;
//	Delay(100);
	SM_SCK=1;
	Value = Value|SM_SDA;		//7
	Data<<=1;
	Data=Data|SM_SDA_re;
	Value <<= 1;
	SM_SCK=0;
//	Delay(100);
	SM_SCK=1;
	Value = Value|SM_SDA;		//6
	Data<<=1;
	Data=Data|SM_SDA_re;
	Value <<= 1;
	SM_SCK=0;
//	Delay(100);	
	SM_SCK=1;
	Value = Value|SM_SDA;		//5
	Data<<=1;
	Data=Data|SM_SDA_re;
	Value <<= 1;
	SM_SCK=0;
//	Delay(100);
	SM_SCK=1;
	Value = Value|SM_SDA;		//4
	Data<<=1;
	Data=Data|SM_SDA_re;
	Value <<= 1;
	SM_SCK=0;
//	Delay(100);
	SM_SCK=1;
	Value = Value|SM_SDA;		//3
	Data<<=1;
	Data=Data|SM_SDA_re;
	Value <<= 1;
	SM_SCK=0;
//	Delay(100);
	SM_SCK=1;
	Value = Value|SM_SDA;		//2
	Data<<=1;
	Data=Data|SM_SDA_re;
	Value <<= 1;
	SM_SCK=0;
//	Delay(100);
	SM_SCK=1;
	Value = Value|SM_SDA;		//1
	Data<<=1;
	Data=Data|SM_SDA_re;
	Value <<= 1;
	SM_SCK=0;
//	Delay(100);
	SM_SCK=1;
	Value = Value|SM_SDA;		//LSB
	Data<<=1;
	Data=Data|SM_SDA_re;
	SM_SCK=0;
//	Delay(100);
	SM_SCK=1;
	SM_SDA=0;					//ACK 
//	Delay(100);
	SM_SCK=0;
//	Delay(100);
	SM_SCK=1;
}
//-------------------------------------------------
void Test_WriteSMB(char Data, char out)		//byte write
{	short a=0;
	SM_SCK=0;
	a=((Data&0x80)==0x80);	//MSB
	SM_SDA=a;
	SM_SCK=1;
	out=0x00;
	out=out|SM_SDA_re;
//	Delay(100);
	SM_SCK=0;
	SM_SDA=a=((Data&0x40)==0x40);
	out<<=1;
	out=out|SM_SDA_re;
	SM_SCK=1;
//	Delay(100);
	SM_SCK=0;
	SM_SDA=a=((Data&0x20)==0x20);
	out<<=1;
	out=out|SM_SDA_re;
	SM_SCK=1;
//	Delay(100);
	SM_SCK=0;
	SM_SDA=((Data&0x10)==0x10);
	out<<=1;
	out=out|SM_SDA_re;
	SM_SCK=0;
//	Delay(100);
	SM_SCK=1;
	SM_SDA=((Data&0x08)==0x08);
	out<<=1;
	out=out|SM_SDA_re;
	SM_SCK=0;
//	Delay(100);
	SM_SCK=1;
	SM_SDA=((Data&0x04)==0x04);
	out<<=1;
	out=out|SM_SDA_re;
	SM_SCK=0;
//	Delay(100);
	SM_SCK=1;
	SM_SDA=((Data&0x02)==0x02);
	out<<=1;
	out=out|SM_SDA_re;
	SM_SCK=0;
//	Delay(100);
	SM_SCK=1;
	SM_SDA=((Data&0x01)==0x01);	//LSB
	out<<=1;
	out=out|SM_SDA_re;
	SM_SCK=0;
//	Delay(100);
	SM_SCK=1;
//	Delay(100);
	SM_SCK=1;
	if (SM_SDA==0)
	{	
		Delay(100);
		SM_SCK=0;
		Delay(100);
		SM_SCK=1;
		return PASS;
	}
	else
	{
		Delay(100);
		SM_SCK=0;
		Delay(100);
		SM_SCK=1;
		return FAIL;
	}
}