#define debug
#define F_CPU 20000000UL  // 20 MHz

#define BAUD 9600
#include <util/setbaud.h>

#include <avr/io.h> // ввод-вывод
#ifdef debug
#include <stdio.h>
#endif
#include <util/delay.h>

#define OWI_Send_byte(x) OWI_Send_command(x)

#ifdef debug
// USART
void UART_Init(void)
{
    UBRRH = UBRRH_VALUE;
    UBRRL = UBRRL_VALUE;
    UCSRB = (1 << TXEN) | (1 << RXEN); // Разрешить прием и передачу
    UCSRC = (1 << USBS) | (3 << UCSZ0);
}
// END USART
#endif

// 1-Wire
char OWI_Reset(void) // Функция сброса
{
	DDRB |= _BV(PB1); // Порт как выход
	_delay_us(480);
	DDRB &= ~_BV(PB1); // Порт как вход
	_delay_us(70);
	if ( PINB & _BV(PB1) ){ // если на линии 0, значит SLAVE на линии, дадим ему 410мкс форы
		return 0;
	} else {
		_delay_us(410);
		return 1;
	}
}

char OWI_Init(void) // Функция инициализации
{
	if(OWI_Reset()) { // Даем сброс
		DDRB |= _BV(PB0); // Порт как выход
		PORTB &= ~_BV(PB0); // Уст. 0 (Зажечь светодиод)
		return 1;
	} else return 0;
}

void OWI_Send_0(void) // Отправить бит "0"
{
	DDRB |= _BV(PB1); // Порт как выход
	_delay_us(60);
	DDRB &= ~_BV(PB1); // Порт как вход
	_delay_us(5);
}

void OWI_Send_1(void) // Отправить бит "1"
{
	DDRB |= _BV(PB1); // Порт как выход
	_delay_us(10);
	DDRB &= ~_BV(PB1); // Порт как вход
	_delay_us(50);
	_delay_us(5);
}

char OWI_Read_bit(void) // Читаем бит
{
	char ret;
	DDRB |= _BV(PB1); // Порт как выход
	_delay_us(1);
	DDRB &= ~_BV(PB1); // Порт как вход
	_delay_us(14);
	if ( PINB & _BV(PB1) ) {
		ret=1;
	} else {
		ret=0;
	}
	_delay_us(50);
	return ret;
}

char OWI_Read_byte(void) // Функция сброса
{
	char tmp;
	char i;
	for(i=0;i<8;i++)
	{
		if(OWI_Read_bit()) tmp |= 1<<(7-i); // Уст. 0
		else tmp &= ~(1<<(7-i)); // Уст. 0
	}
	return tmp;
}

void OWI_Send_command(char command)
{
	char mask;
	for(mask = 0x80; mask; mask >>= 1) {
		if(command & mask) OWI_Send_1();   //Передача лог.1
		else  OWI_Send_0();                //Передача лог.0
	}
}
// END 1-Wire

int main(void)
{
	DDRA = 0x00; // Весь порт как вход
	DDRB = 0x00; // Весь порт как вход
	PORTB &= ~_BV(PB1); // Уст. 0 на порту

	#ifdef debug
	UART_Init();
	#endif
	if( OWI_Init() ){
		char i;

		OWI_Send_command(0xEE); // Старт темп. преобразования
		_delay_us(5); // не уверин что нужно, подглядел в чужих исходниках

		for(i=0;i<8;i++) _delay_ms(100); //delay 800ms

		OWI_Reset();
		OWI_Send_command(0xAA); // Чтение температуры
		_delay_us(5); // не уверин что нужно, подглядел в чужих исходниках
		char tmp = OWI_Read_byte();
		#ifdef debug
		printf("Temp: %d",tmp);
		#endif
	}
	return 0;
}
