#include <avr/io.h>
//#define F_CPU 8000000UL
#include <util/delay.h>
#include <stdbool.h>
#include "LCD.h"
/*********************************
			ONE-WIRE
*********************************/


//Deklaration der Funktionen 

void PB2_HIGH(void);
void PB2_LOW(void);
unsigned char PB2_Read(void);
void _delay(unsigned char delay);


//Basisfunktionen (muß jeder 1-Wire-Slave beherrschen)

unsigned char MasterReset_SlavePresence(void);
void WriteBit(unsigned char zustand);
void WriteByte(unsigned char data);
unsigned char ReadBit(void);
unsigned char ReadByte(void);

//----------------------------------------------------------------------------------------------------------
int main(void)
{	
	unsigned char antwort[9];
	float temp = 0;
	unsigned char slave;
	unsigned slaveInfo;
	LCD_Init();	
	

	
	while(1)
	{
	    slaveInfo = MasterReset_SlavePresence();
		
		
		if(slaveInfo)
		{
			slave = 0x31;
		}
		else
		{
			slave = 0x30;
		}

		WriteByte(0xCC);												// Skip-ROM (Überspringe ROM Addresse)
		WriteByte(0x44);												// Start der Temperaturmessung
				
        _delay_ms(750);													// Conversion Time 750ms
		

		// 2. Zyklus
		slaveInfo = MasterReset_SlavePresence();
		WriteByte(0xCC);												// Skip-ROM (Überspringe ROM Addresse)
		WriteByte(0xBE);												// Lesen der gemessenen Temperatur
			
		// 9-Byte einlesen
		int n;
		for (n=0; n<9; n++)
		{
			antwort[n] = ReadByte();
		}
		
		temp = antwort[0];
		


		// LCD Ausgabe...
		Send_Data(slave);
		CurserShift(false);
//		Send_float(temp);	
		
		_delay_ms(3000);	
				
	}
	

}
//----------------------------------------------------------------------------------------------------------

unsigned char PB2_Read(void)
{
	unsigned char pegel;
	DDRB = 0x00;
	
	pegel = PINB & 0x04;

	if(pegel == 0x04)
	{
		pegel = 0x01; //0x31; '1'
	}
	else
	{
		pegel = 0x00; //0x30;  // '0'
	}
	
	return pegel;

}
void PB2_HIGH(void)
{
	DDRB = 0x04;
	PORTB = 0x04;
}

void PB2_LOW(void)
{
	DDRB = 0x04;
	PORTB = 0x00;
}

void _delay(unsigned char delay)
{
	unsigned char i;
	for(i=0; i<delay; i++);
}

unsigned char MasterReset_SlavePresence(void)
{
	unsigned char slaveInfo;

	PB2_LOW();
	_delay(73);
	PB2_HIGH();
	_delay(7);

	slaveInfo = PB2_Read();
	_delay(62);
	
	if(slaveInfo)  slaveInfo = 0;
	else		   slaveInfo = 1;

	return slaveInfo;       // slaveInfo = 1 --> min 1 Slave ist am Bus
							// slaveInfo = 0 --> kein Slave am Bus

}

//Sendet 1Bit (0 oder 1)

void WriteBit(unsigned char zustand)
{
	PB2_LOW();
	if(zustand)  PB2_HIGH();
	

	_delay(13);
	PB2_HIGH();
}

void WriteByte(unsigned char data)
{
	unsigned char i;
	unsigned char bitmaske = 1;
	
	// 8 Bits nacheinander
	for (i=0; i<8; i++)
	{
		if (data & bitmaske)  WriteBit(1); 	   	// ´1´ senden
		else 			      WriteBit(0); 	   	// ´0´ senden
		
		bitmaske *= 2; 						
	}
}



// Lesen Bit
unsigned char ReadBit(void)
{
	unsigned char pegel;
	unsigned char i;
	PB2_LOW(); 
	PB2_HIGH(); 

	for(i=0; i<6; i++); 						// 15us

	pegel = PB2_Read(); 

	_delay(13); 								// 105us 

	
	return pegel; 
}


unsigned char ReadByte(void)
{
	unsigned char i;
	unsigned char wert = 0;
	// 8 Bits lesen
	for(i=0; i<8; i++)
	{
		if (ReadBit()) wert |=0x01 << i;
	}
	return wert;  
}
