/* DS 1820 an Atmega 328P mit externem 8Mhz Quarz und LCD Display 
	LCD von Peter Fleury 
*/

#define 	F_CPU 8000000UL
#include 	<io.h>
#include 	<delay.h>
#include 	<stdlib.h>
#include 	<inttypes.h>
#include 	<math.h>
#include 	"lcd.h"
#include 	<pgmspace.h>

#define 	Bus_Port PORTC                   
#define 	Bus_DDR  DDRC
#define 	Bus_Pin  PINC
#define 	Pin_Nr   PC0	

#define 	Bus_Eingang() Bus_DDR &= ~(1<<Pin_Nr)			
#define 	Bus_Ausgang() Bus_DDR |= (1<<Pin_Nr)			
#define 	Bus_Low()     Bus_Port &= ~(1<<Pin_Nr)			
#define 	Bus_High()    Bus_Port |= (1<<Pin_Nr)			

unsigned char Rom_Code[8]; 				
unsigned char Sensordaten[9];

unsigned char Bus_Reset(void) 
{
  unsigned char Status;
  Bus_Ausgang();      
  Bus_Low();
  _delay_us(450);   
  Bus_Eingang();
  Bus_High();
  _delay_us(60);  
  Status = (Bus_Pin & (1<<Pin_Nr)) ? 1 : 0; 
  _delay_us(450); 
  return Status; 				// slave present?
}

void Bit_Schreiben(unsigned char Wert)
{
  if ( Wert == 1 ) {
    Bus_Low();
    Bus_Ausgang();
    _delay_us(1);
    Bus_Eingang();
    Bus_High();
    _delay_us(100);
  }
  if ( Wert == 0 ) {
    Bus_Low();
    Bus_Ausgang();
    _delay_us(60);
    Bus_Eingang();
    Bus_High();
    _delay_us(1);
  }
}

void Byte_Schreiben(unsigned char Daten)
{
  unsigned char i;
  for (i = 0; i < 8; i++) 
  {
  Bit_Schreiben((Daten & (1<<i)) ? 1 : 0);
  }
}

unsigned char Bit_Lesen(void)
{
  unsigned char Bit_Wert;
  Bus_Low();
  Bus_Ausgang();
  _delay_us(1);
  Bus_Eingang();
  Bus_High();
  _delay_us(50);
  Bit_Wert = ( Bus_Pin & (1<<Pin_Nr) ) ? 1 : 0;
  _delay_us(100);
  return Bit_Wert;
}

unsigned char Byte_Lesen(void)
{
  unsigned char i;
  unsigned char Byte_Wert = 0;
  for (i = 0; i < 8; i++)  
    {
    if( Bit_Lesen() == 1 )
    Byte_Wert |= (1 << i);
    }
  return Byte_Wert;
}

void ROM_Code_Einlesen(void)
{ 
  unsigned char i;
  Bus_Reset();
  Byte_Schreiben(0x33); 		// "READ ROM"
  for (i = 0; i < 8; i++) 
  {
  Rom_Code[i] = Byte_Lesen();
  }
}

float Temperatur_Messung(void)
{
  unsigned char i;
  float Temperatur;

 						 // 1.Befehlszyklus: Messung starten
  						// Start mit Master-Reset-Impuls u. Abfrage: Slave presence  
  Bus_Reset(); 
  						// Skip ROM-Befehl, da nur ein DS1820 angeschlossen ist
  //Byte_Schreiben(0xCC); 
  //Byte_Schreiben(0x44); 		// Befehl: Start Conversion an DS1820
  _delay_ms(900);      		// >800 ms warten
    
  						// 2.Befehlszyklus: Messwerte (Scratch Pad) auslesen
  						// Start mit Master-Reset-Impuls u. Abfrage: Slave presence
  Bus_Reset(); 
  	
	Byte_Schreiben(33);
						// Skip ROM-Befehl, da nur ein DS1820 angeschlossen ist
  //Byte_Schreiben(0xCC); 
  //Byte_Schreiben(0xBE);   		// Auslesen des Scratch Pads vom DS1820
  						// 9 Byte großen Scratch Pad-Inhalt einlesen
  for (i = 0; i < 9; i++) {
    Sensordaten[i] = Byte_Lesen();
  }

 						 // Temperatur berechnen, als float-Wert
if (Sensordaten[1] == 0)  
  { 						 // Positive Temp.-Werte
    Temperatur = Sensordaten[0]/2.0;
  } 
	else  
  { 						 // Neg. Temp.-Werte
    Temperatur = (~Sensordaten[0])+1; // 2er-Komplement
    Temperatur = Temperatur/-2.0;
  }
  return Temperatur;
}



int main (void)
{ 
	

  char Buffer[20]; 
  float Temperatur;
  int vorkomma;
  int nachkomma;

 lcd_init(LCD_DISP_ON);

while (1) 
   {
    Temperatur = Temperatur_Messung();
  											//  lcd_setcursor(0,1);
    lcd_puts("Temperatur: \n");			//lcd_string("Temperatur:");
    										//lcd_setcursor( 0,2 ); 
    if ( signbit(Temperatur)) 
	    {
		 Temperatur = fabs(Temperatur);
     	lcd_puts( "- \n" );				// lcd_string( "-" ); 
    	} 
    vorkomma = (int) Temperatur;
    itoa( vorkomma, Buffer, 10 );
    lcd_puts( Buffer );					//lcd_string( Buffer ); 
    lcd_puts(". \n");						//lcd_string( "." ); 
    nachkomma = (int)((Temperatur - vorkomma) * 10);
    itoa( nachkomma, Buffer, 10 );
    lcd_puts( Buffer );			 		//lcd_string( Buffer ); 
    _delay_ms(300);  
	}
}

