// Define baud rate
#define F_CPU 4000000
#define USART_BAUD 9600
#define USART_UBBR_VALUE 25   //((F_CPU/(USART_BAUD<<4))-1)

#include <stdint.h>
#include <avr/io.h>
#include <util/delay.h>
//#include <string.h>

#define leddisable          PORTB |= 8
#define ledenable           PORTB &= ~8

#define sckenable          PORTB |= 1
#define sckdisable         PORTB &= ~1


#define dataenable          PORTB |= 2
#define datadisable         PORTB &= ~2

#define csdisable          PORTB |= 4
#define csenable           PORTB &= ~4

#define senddelay		   _delay_us(208);


void USART_vInit(void)
{

// Set baud rate
UBRRL = USART_UBBR_VALUE;

// Set frame format to 8 data bits, no parity, 1 stop bit
UCSRC = (0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0);

// Enable receiver and transmitter
UCSRB = (1<<RXEN)|(1<<TXEN);

}


void send(unsigned char u8Data)

{

// Wait if a byte is being transmitted
while((UCSRA&(1<<UDRE)) == 0);

// Transmit data
UDR = u8Data;

}


uint8_t receive()
{
// Wait until a byte has been received
while((UCSRA&(1<<RXC)) == 0);

// Return received data
return UDR;
}

void sendstring(char *str)
{
	int i;
	for(i=0;str[i];i++)
	   send(str[i]);
send(0x0D);
}

char* inttostr(int value,char *str)
{

int i;

for(i=0;i<16;i++)
{
if((value&1)) str[15-i]=0x31;
else str[15-i]=0x30;
value>>=1;
}

str[16]='\0';
return str;
}

void fract2str(int value, char* str, int accuracy) {

	int i;
	int temp;
	int integral, fraction;
	int draw = 0;
	char dectabla[10]="0123456789";

	if(accuracy > 2) accuracy = 2; // Tizedesjegyek szama max. 2 legyen

	if(value < 0) {	// Elojel-vizsgalat
		*str = '-';
		str++;
		value *= -1;
	}

	integral = value >> 7;					// Egeszresz
	fraction = (value & 0x007F)*100/128;	// Tortresz (szazadok szama)

	for(i=100;i>=1;i/=10) {				// Egeszresz kiirasa
		if((temp = integral / i) > 0 || i==1) draw = 1; // Nullaval nem kezdunk szamot
		if(draw) {
			*str = dectabla[temp];
			integral -= i*temp;
			str++;
		}
	}

	if(accuracy < 1) {		// Ha nem kell tizedesjegy, akkor kesz
		*str = '\0';
		return;
	}

	*str = '.';				// Tizedespont
	str++;
	for(i=10;i>=1;i/=10) {	// Tortresz kiirasa
		temp = fraction / i;
		*str = dectabla[temp];
		fraction -= i*temp;
		str++;
		accuracy--;
		if(accuracy < 1) break;
	}

	*str = '\0';	// Lezaro nulla
}



unsigned int readTC77()
{
  unsigned char temp1=0x00;
  unsigned char temp2=0x00;
  int i;
  
   sckdisable;
   csenable;
  _delay_ms(1);

  for(i=0;i<8;i++)
  {
   temp1<<=1;
   _delay_ms(1);
   if ((PINB&2)) temp1++;
   sckenable;
   _delay_ms(1);
   sckdisable;
  }

  for(i=0;i<8;i++)
  {

   temp2<<=1;
   _delay_ms(1);
   if ((PINB&2)) temp2++;
   sckenable;
    _delay_ms(1);
   sckdisable;
  }

csdisable;

i=(temp1<<8)+temp2;

return i;
}





int main(void)
{

char str[10];
unsigned int data;
char str1[20];
USART_vInit();

//init portD
DDRB=0b11111101;
PORTB=0x00;

csdisable;

while(1)
  {
	data=readTC77();

		
	sendstring(inttostr(data,str1));
	
	//data<<=3;
	fract2str(data,str,1);
	sendstring(str);	
	
	_delay_ms(1000);
  }
}


