/*
 * Thermometer.c
 *
 * Created: 15.02.2014 19:38:36
 *  Author: Christian
 */ 


#include <avr/io.h>
//#define F_CPU 3686400
#define F_CPU 16000000UL // 16 MHz clock speed

#include <util/delay.h>
#include "uart.h"


void I2CInit();
void I2CStart();
void I2CRestart();
void I2CStop();
void I2CAck();
void I2CNak();
void delay();
void wait(unsigned int ms);
unsigned char I2CSend(unsigned char Data);
unsigned char I2CRead();


void main(void){
	
	DDRA=0xff;
	DDRB=0xff;
	DDRC=0xff;
	DDRD |= (1<<PD1); //SDA auf Ausgang
	DDRD |= (1<<PD0); //SCL auf Ausgang
	//Anlaufshow!!
	PORTA = 0;
	PORTB = 0;
	PORTC = 0;
	unsigned char a[7];
	unsigned char b[7];
	unsigned char Punkt;
	Punkt = 64;
	
	I2CInit();

	/* Writing on i2c */
	I2CStart();
	I2CSend(0x90);
	I2CSend(0xAC);
	I2CSend(0x02);
	I2CStop();
	
	I2CStart();
	I2CSend(0x90);
	I2CSend(0xEE);
	I2CStop();
	
	while(1){
		/* reading on I2c */
		/* Dummy Write */
		I2CStart();
		I2CSend(0x90);
		I2CSend(0xAA);
		
		/* Actual read */
		I2CRestart();
		_delay_ms(1);
		I2CSend(0x91);
		_delay_ms(1);
		a[0]=I2CRead();
		_delay_ms(1);
		I2CAck();
		_delay_ms(1);
		b[0]=I2CRead(); //Für 1/2°-Schritte
		_delay_ms(1);
		I2CNak();
		_delay_ms(1);
		I2CStop();
		_delay_ms(1);
		a[0]=a[0]-1;			//Offset 

		
		
		// Ausgabe der Zehnerzahl in 7-Segment-Code
		if (a[0]>=50)
		{
			a[0]=a[0]-50;
			PORTB=157;
		}
		else if (a[0]>=40)
		{
			a[0]=a[0]-40;
			PORTB=172;
		}
		else if (a[0]>=30)
		{
			a[0]=a[0]-30;
			PORTB=185;
		}
		else if (a[0]>=20)
		{
			a[0]=a[0]-20;
			PORTB=59;
		}
		else if (a[0]>=10)
		{
			a[0]=a[0]-10;
			PORTB=160;
		}
		else if (a[0]<=0)
		{
			PORTB=183;
		}
		//Ausgabe Einerstelle in 7-Segment-Code
		if (a[0] == 0)
		{
			PORTA=183+Punkt;
		}
		else if (a[0] == 1)
		{
			PORTA=160+Punkt;
		}
		else if (a[0] == 2)
		{
			PORTA=59+Punkt;
		}
		else if (a[0] == 3)
		{
			PORTA=185+Punkt;
		}
		else if (a[0] == 4)
		{
			PORTA=172+Punkt;
		}
		else if (a[0] == 5)
		{
			PORTA=157+Punkt;
		}
		else if (a[0] == 6)
		{
			PORTA=143+Punkt;
		}
		else if (a[0] == 7)
		{
			PORTA=176+Punkt;
		}
		else if (a[0] == 8)
		{
			PORTA=191+Punkt;
		}
		else if (a[0] == 9)
		{
			PORTA=189+Punkt;
		}
		//Kommastelle Ausgabe -> nur 0,5er Schritte
		if (b[0] >= 1 )
		{
			PORTC = 185; //Wertausgabe 5
		}
		else
		{
			PORTC = 237; //Wertausgabe 0
		}
		_delay_ms(100);

		//	Für mehrere Bytes lesen:
		//			for(i=0;i=7;i++){
		//						a[i]=I2CRead();
		//						if(i==6)
		//							I2CNak();
		//						else
		//							I2CAck();
		//					}
		//						I2CStop();

	}
}


void I2CInit(){
	PORTD|=(1<<PD1); //SDA auf TRUE
	_delay_us(100);
	PORTD|=(1<<PD0); //SCL auf TRUE
	_delay_us(100);
}

void I2CStart(){
	PORTD|=(1<<PD0); //SCL auf TRUE
	_delay_us(100);
	PORTD&=~(1<<PD1); //SDA auf FALSE
	_delay_us(100);
	PORTD&=~(1<<PD0); //SCL auf FALSE
	_delay_us(100);
}

void I2CRestart(){
	PORTD|=(1<<PD1); //SDA auf TRUE
	_delay_us(100);
	PORTD|=(1<<PD0); //SCL auf TRUE
	_delay_us(100);
	PORTD&=~(1<<PD1); //SDA auf FALSE
	_delay_us(100);
}

void I2CStop(){
	PORTD&=~(1<<PD1); //SDA auf FALSE
	_delay_us(100);
	PORTD|=(1<<PD0); //SCL auf TRUE
	_delay_us(100);
	PORTD|=(1<<PD1); //SDA auf TRUE
	_delay_us(100);
}

void I2CAck(){
	PORTD&=~(1<<PD1); //SDA auf FALSE
	_delay_us(100);
	PORTD|=(1<<PD0); //SCL auf TRUE
	_delay_us(100);
	PORTD&=~(1<<PD0); //SCL auf FALSE
	_delay_us(100);
}

void I2CNak(){
	PORTD|=(1<<PD1); //SDA auf TRUE
	_delay_us(100);
	PORTD|=(1<<PD0); //SCL auf TRUE
	_delay_us(100);
	PORTD&=~(1<<PD0); //SCL auf FALSE
	_delay_us(100);
}

unsigned char I2CSend(unsigned char Data){
	unsigned char i, ack_bit;

	for(i=0;i<8;i++){
		PORTD&=~(1<<PD0); //SCL auf FALSE
		_delay_us(100);
		if ((Data & 0x80) == 0)
		{
		PORTD&=~(1<<PD1); //SDA auf FALSE
		_delay_us(100);
		}
		else
		PORTD|=(1<<PD1); //SDA auf TRUE
		_delay_us(100);
		PORTD|=(1<<PD0); //SCL auf TRUE
		_delay_us(100);
		Data<<=1;
		_delay_ms(1);
	}
	DDRD&=~(1<<DDD1); //SDA auf Eingang
	_delay_us(100);
	PORTD&=~(1<<PD0); //SCL auf FALSE
	_delay_us(100);
	if (PIND&(1<<PIND1))
	{
	ack_bit = 1;	
	}

	else
	{
	ack_bit = 0;
	}
	PORTD|=(1<<PD0); //SCL auf TRUE
	_delay_us(100);
	PORTD&=~(1<<PD0); //SCL auf FALSE
	_delay_us(100);
	DDRD|=(1<<DDD1); //SDA auf Ausgang
	_delay_us(100);
	return !ack_bit;
}

unsigned char I2CRead(){
	unsigned char i, Data=0;
	for(i=0;i<8;i++){
		_delay_ms(1);
		DDRD&=~(1<<DDD1); //SDA auf Eingang		
		_delay_ms(1);
		PORTD&=~(1<<PD0); //SCL auf FALSE
		_delay_ms(1);
		PORTD|=(1<<PD0); //SCL auf TRUE
		_delay_ms(1);
		if(PIND & (1<<PIND1) )
		Data |=1;
		if(i<7)
		Data<<=1;
	}
	DDRD|=(1<<DDD1); //SDA auf Ausgang
				_delay_ms(1);
	PORTD&=~(1<<PD0); //SCL auf FALSE
				_delay_ms(1);
	PORTD|=(1<<PD1); //SDA auf TRUE
			_delay_ms(1);
	return Data;
}



