#include "ds18s20.h"
#include <avr/io.h>


unsigned char reset (void) {
    DDRB |= (1<<PB0);            //Ausgang
	PORTB &= ~(1<<PB0);
    _delay_us(96);
	_delay_us(96);
	_delay_us(96);
	_delay_us(96);
	_delay_us(96);
	DDRB &= ~(1<<PB0);
    _delay_us(80);
	if (!(PINB & (1<<PB0))) {     //Prüfe Slave-Antwort
		_delay_us(96);
		_delay_us(96);
		_delay_us(96);
		_delay_us(96);
		_delay_us(66);
        return 1;
	}
    else
        return 0;
}

unsigned char read_bit (void) {
    DDRB |= (1<<PB0);            //Ausgang
	PORTB &= ~(1<<PB0);
    _delay_us (1);
	DDRB &= ~(1<<PB0);
    _delay_us (12);
    if (!(PINB & (1<<PB0)))       //Abtastung innerhalb von 15µs
        return 0;
    else
        return 1;
}

void write_bit (unsigned char bitval) {    //kann 0 oder 1 sein
    DDRB |= (1<<PB0);            //Ausgang
	PORTB &= ~(1<<PB0);
    if (bitval)
        PORTB |= (1<<PB0);      //H-Pegel
    _delay_us(96);
	_delay_us(14);
    DDRB &= ~(1<<PB0);
    PORTB &= ~(1<<PB0);
}

unsigned char read_byte (void) {
    unsigned char byte = 0;
    for (i=0; i<8; i++) {
        if (read_bit ())
            byte |= (1<<i);
        _delay_us(96);
		_delay_us(24);
    }
    return byte;
}

void write_byte (unsigned char byte) {
    for (i=0; i<8; i++) {
        if (byte & (1<<i))
          write_bit (1);
        else
          write_bit (0);
	}
    _delay_us(96);
	_delay_us(24);
}  


unsigned char read_scratchpad (void) {
  //for (i=0; i<9; i++)
  scratchpad [0] = read_byte ();
  scratchpad [1] = read_byte ();
  reset (); //terminate transfer (read 2bytes)
			return 1;

	return 0;
}

void wait_ready (void) {
	while (!(read_bit ()));
}
