CODE IS STILL UNDER CONTRUCTION !

This ist what I have so far.

 

 

/*********************************************

Project : ATM32Universal.
Version : 1.00
Datum    : 08.09.2005
Author : H. Brachschoss              


AVR          : ATmega32 / 16 Mhz


*********************************************/

#include <mega32.h>

#define xtal 16000000L  

#define xdebug


// I2C Bus functions
#asm
   .equ __i2c_port=0x15
   .equ __sda_bit=1
   .equ __scl_bit=0
#endasm
#include <i2c.h>

// PCF8583 Real Time Clock functions
#include <pcf8583.h>

// 1 Wire Bus functions
#asm
   .equ __w1_port=0x15
   .equ __w1_bit=2
#endasm
#include <1wire.h>

// DS1820 Temperature Sensor functions
#include <ds1820.h>
// maximum number of DS1820 devices connected to the 1 Wire bus
#define MAX_DS1820 1
// number of DS1820 devices connected to the 1 Wire bus
unsigned char ds1820_devices;
// DS1820 devices ROM code storage area, 9 bytes are used for each device
unsigned char ds1820_rom_codes[MAX_DS1820,9];

// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x18
#endasm
#include <lcd.h>
                            

#include <delay.h>
#include <ctype.h>
#include <stdlib.h>
#include <math.h>       
#include <string.h>   
#include <stdio.h>


#define menukey PIND.2
#define cursorleft PIND.3
#define cursorright PIND.4

// Definitionen der Töne

#define  A       220   // in Hz
#define  B       233
#define  H       247
#define  C       262
#define  CIS   277
#define  D       294
#define  DIS   311
#define  E       330
#define  F       349
#define  FIS   370
#define  G       392
#define  GIS   415

#define  T12000 // Tonlänge (ms)
#define  T21000
#define  T4 500
#define  T8 250
#define  T16 125
#define  T32 67

#define  T10   0// keine Pause   (ms)
#define  T11   5
#define  T12 10
#define  T13 20
#define  T14 30
#define  T15 40
#define  P1      50                

// Definitionen Serielle Schnittstelle
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7                       

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)


eeprom double etmin  ;    // NOV Speicher für min Temperatur
eeprom double etmax  ;// NOV Speicher für max Temperatur   
eeprom double eschaltdauer ;// NOV Speicher für Einschaltdauer in Minuten


// USART Receiver buffer
#define RX_BUFFER_SIZE 16
char rx_buffer[RX_BUFFER_SIZE];
unsigned char rx_wr_index,rx_rd_index,rx_counter;
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;

// globale Variablen Deklaration
unsigned char keymode=0 ;
unsigned char keycnt=0 ;          
unsigned char lcdlight=0 ;        
char strRecBuff[10] ;
char dis[12] ;
double tcnt, tres, tfloat ;   
int signedtemperature ;// Temperaturvariable +- 32768
unsigned char h,m,s,hs ;// Uhrzeitvariablen
unsigned char dummy[10] ;
unsigned char time[8] ; 
double tmax, tmin ;   
double schaltdauer ;


/***********************************************************************
lcdlightoff()  Displaybeleuchung ausschalten oder abdimmen
************************************************************************/
void lcdlightoff(unsigned char status)
{                                   
if ( status == 1 )
{
lcdlight=0 ;
OCR0=lcdlight ;
}     
else
while (lcdlight > 0 )// Display Beleuchtung aufdimmen
{                                 
lcdlight = lcdlight-5 ;
delay_ms(50);
if (lcdlight != 0 )
OCR0=lcdlight ;
}

}


/***********************************************************************
lcdlighton() Displaybeleuchung einschalten oder aufdimmen
************************************************************************/
void lcdlighton(unsigned char status)
{       
                          
if ( status == 1 )
{
lcdlight=170 ;
OCR0=lcdlight;
}             
else
for (lcdlight=0; lcdlight<170;)// Display Beleuchtung aufdimmen
{                                 
OCR0=lcdlight ;
lcdlight = lcdlight+5 ;
delay_ms(50);
}
}       


/***********************************************************************
lcdline1clear()  2. Zeile am LCD löschen
************************************************************************/
void lcdline1clr(void)
{
lcd_gotoxy(0,1) ;
lcd_putsf("                ");
lcd_gotoxy(0,1);
}
                        

/***********************************************************************
lcdline0clear()  1. Zeile am LCD löschen
************************************************************************/
void lcdline0clr(void)
{
lcd_gotoxy(0,0) ;
lcd_putsf("                ");
lcd_gotoxy(0,0);
}                           

/***********************************************************************
pause()  Pause für die Tonwiedergabe
************************************************************************/
void pause(unsigned int timeout)
{
long n ;                    
double schleifen ;
unsigned int ischleifen ;

schleifen = 1000 * timeout ;
ischleifen = schleifen ;

for (n=0; n<schleifen;n++)
delay_us(1) ;
}
                              

/***********************************************************************
note()spielt eine Note nach Übergabe von Note,Oktave, Dauer und Pause
************************************************************************/
void note(double freq, int octave, double dauer, unsigned int timeout)
{
long n,i ;    
double frequenz ;           
double schleifen ;
unsigned int ifrequenz, ischleifen ;

freq = freq * 10 * octave ;
frequenz = 1 / freq ;
frequenz = frequenz / 2 ;
frequenz = frequenz * 1000000 ;
schleifen = 1/ (frequenz * 2 ) ;    
schleifen = schleifen * 1000 ;
schleifen = (schleifen * dauer) / 10 ;
ifrequenz = frequenz ;          
ischleifen = schleifen ;

for(n=0;n<ischleifen;n++)
{             
PORTD=0x80;   
for(i=0; i< ifrequenz;i++)
delay_us(1);

       PORTD=0x00;            
   for(i=0; i<ifrequenz;i++)
       delay_us(1) ;
}
                                      

       if ( timeout > 0 )                
pause(timeout) ;
}

                            

/***********************************************************************
setclock()hier wird der Uhrenchip beschrieben
************************************************************************/
void setclock(unsigned char zeit[10])          // Uhrzeit über Tastatur setzen
{                             
unsigned int v1,v2,v3,v4,v5 ;                     

       v1 = toascii(zeit[0]) ;  // 00:00:00
       v2 = toascii(zeit[1]) ; 
       v1 = v1 - 48 ;
       v2 = v2 - 48 ;
v3 = v1*10 ;
v3 = v3 + v2 ;

       v1 = toascii(zeit[3]) ; 
       v2 = toascii(zeit[4]) ; 
       v1 = v1 - 48 ;
       v2 = v2 - 48 ;
v4 = v1*10 ;
v4 = v4 + v2 ;

       v1 = toascii(zeit[6]) ; 
       v2 = toascii(zeit[7]) ; 
       v1 = v1 - 48 ;
       v2 = v2 - 48 ;
v5 = v1*10 ;
v5 = v5 + v2 ;    
            
 rtc_set_time(0,v3,v4,v5,0);   // Zeit kann dezimal z.B. 22 oder hex z.B. 0x16 angegeben werden.
lcd_clear() ;
lcd_putsf("Zeit gesetzt.");
delay_ms(1000) ;
}


/***********************************************************************
timeedit()   Eingaberoutine für die Uhrzeit
************************************************************************/
void timeedit(void)
{                     
int curpos=0 ;                                
unsigned char zeichen ;             
unsigned int keyhold=0 ;    
unsigned int exitfunction=0 ;
                      
lcd_clear() ;   
lcd_putsf("Uhrzeit Eingabe:");
rtc_get_time(0,&h,&m,&s,&hs);// Uhrzeit einlesen        
sprintf(time,"%02d:%02d:%02d",h,m,s);  // Uhrzeit im string "time" formatieren  HH:MM:SS
time[6]=48; time[7]=48 ;// sekunden auf 0 setzen
lcd_gotoxy(curpos,1);
lcd_puts(time) ;

_lcd_ready() ;
_lcd_write_data(0x0f) ;  // Cursor on, Cursor blink

while (menukey==1) {} ;// warten bis Menutaste losgelassen wurde

lcd_gotoxy(curpos,1);
while(exitfunction==0)
{
if ( cursorright==1 )                    // Cursor nach rechts
{                   
note(A,5,T32,T10) ;       
delay_ms(50) ;
while ( cursorright==1)
{
delay_ms(100);
keyhold++ ;
if ( keyhold >10 )    
{                       
#ifdef debug
printf("%s",time) ;
#endif                    
note(G,1,T32,T11) ;
note(G,2,T16,T10) ;
setclock(time) ;
exitfunction=1 ;    
lcd_clear() ;
}
}

if ( curpos<7)
{
_lcd_ready() ;
_lcd_write_data(0x14) ;   
curpos++ ;    
if (curpos==2)   // unzulässige Eingabeposition ":"
{
curpos++ ;
_lcd_ready() ;
_lcd_write_data(0x14) ;   
}                                   
if (curpos==5)   // unzulässige Eingabeposition ":"
{
curpos++ ;
_lcd_ready() ;
_lcd_write_data(0x14) ;   
}

}
while ( cursorright==1) {} ;
keyhold=0 ;
}           
// -----------------------------------------------------------------------------
if ( cursorleft==1 )                     // Cursor nach links
{                   
note(A,5,T32,T10) ;
delay_ms(50) ;                      
while ( cursorleft==1)
{
delay_ms(100);
keyhold++ ;
if ( keyhold >10 )

exitfunction=1 ;  
note(G,2,T32,T11) ;
note(G,1,T16,T10) ;
lcd_putsf("Eingabe abbruch");
delay_ms(1000) ;
while(cursorleft==1) {} ;
lcd_clear() ;
}
}

if (curpos>0 )
{
_lcd_ready() ;
_lcd_write_data(0x10) ;   
curpos-- ;
if (curpos==2)   // unzulässige Eingabeposition ":"
{
curpos-- ;
_lcd_ready() ;
_lcd_write_data(0x10) ;   
}                                   

if (curpos==5)   // unzulässige Eingabeposition ":"
{
curpos-- ;
_lcd_ready() ;
_lcd_write_data(0x10) ;   
}                                   

}
while ( cursorleft==1) {} ;
keyhold=0 ;
}           
  
// -----------------------------------------------------------------------------            
if ( menukey == 1 )                  // Zeicheneingabe
{                   
note(A,5,T32,T10) ;
delay_ms(50);
while( menukey == 1 ) {} ;
       zeichen = time[curpos] ;
      
      
       switch(curpos)
       {
       case 0: if ((zeichen>=48 ) && ( zeichen<50))          // nur 0-2 sind erlaubt
       {                                  
       zeichen++ ;                           // zeichen erhöhen
       time[curpos]=zeichen ;
       }
       else
       {                              
       zeichen = 48 ;                       
       time[curpos]=zeichen ;                     
       }
       break ;
      
       case 1: if ( time[0] == 50)
       {
       if ((zeichen>=48 ) && ( zeichen<51))          // nur 0-3 sind erlaubt
       {
       zeichen++ ;                           // zeichen erhöhen
       time[curpos]=zeichen ;
      
       }
       else
       {                              
       zeichen = 48 ;                       
       time[curpos]=zeichen ;
       }
       }
       else
       {
       if ((zeichen>=48 ) && ( zeichen<57))          // nur 0-9 sind erlaubt
       {
       zeichen++ ;                           // zeichen erhöhen
       time[curpos]=zeichen ;
      
       }
       else
       {                              
       zeichen = 48 ;                       
       time[curpos]=zeichen ;
       }
      
       }
       break ;
      
       case 3: if ((zeichen>=48 ) && ( zeichen<53))          // nur 0-5 sind erlaubt
       {                                  
       zeichen++ ;                           // zeichen erhöhen
       time[curpos]=zeichen ;
       }
       else
       {                              
       zeichen = 48 ;                       
       time[curpos]=zeichen ;
       }     
       break ;
      
       case 4: if ((zeichen>=48 ) && ( zeichen<57))          // nur 0-9 sind erlaubt, also (chr(48) - chr(57)   
       {                                  
       zeichen++ ;                           // zeichen erhöhen
       time[curpos]=zeichen ;
       }
       else
       {                              
       zeichen = 48 ;                        // zeichen >57 (9) dann wieder mit zeichen = 48 (0)
       time[curpos]=zeichen ;
       }     
       break ;
       case 6: if ((zeichen>=48 ) && ( zeichen<53))          // nur 0-9 sind erlaubt, also (chr(48) - chr(57)   
       {                                  
       zeichen++ ;                           // zeichen erhöhen
       time[curpos]=zeichen ;
       }
       else
       {                              
       zeichen = 48 ;                        // zeichen >57 (9) dann wieder mit zeichen = 48 (0)
       time[curpos]=zeichen ;
       }     
       break ;
       case 7: if ((zeichen>=48 ) && ( zeichen<57))          // nur 0-9 sind erlaubt, also (chr(48) - chr(57)   
       {                                  
       zeichen++ ;                           // zeichen erhöhen
       time[curpos]=zeichen ;
       }
       else
       {                              
       zeichen = 48 ;                        // zeichen >57 (9) dann wieder mit zeichen = 48 (0)
       time[curpos]=zeichen ;
       }
       break ;
      
      
       }
 
 
#ifdef debug
printf(" %c-%i curpos:%i ",zeichen,zeichen,curpos) ;
#endif
lcd_gotoxy(0,1);
lcd_puts(time) ;
lcd_gotoxy(curpos,1);
}
}          // while exitfunction==0

_lcd_ready() ;
_lcd_write_data(0x0c) ;// Cursor off, blink off
}

                                
/***********************************************************************
tempedit() Eingabe funktion um Tmin oder Tmax (Schaltpunkte) zu editieren
************************************************************************/
double tempedit(unsigned char dispstr[5],double temperature)
{                     
int curpos=0 ;                                
char dummytemp[12] ;// "00.00"
unsigned char zeichen ;             
unsigned int keyhold=0 ;    
unsigned int exitfunction=0 ;
unsigned char anzeige[15] ;
double tnew ;
                      
lcd_clear() ;             
sprintf(anzeige,"%p Eingabe",dispstr);    
lcd_puts(anzeige);
sprintf(dummytemp,"%5.2f \xdfC", temperature);   // Temperatur string
lcd_gotoxy(curpos,1);
lcd_puts(dummytemp) ;

_lcd_ready() ;
_lcd_write_data(0x0f) ;  // Cursor on, Cursor blink

while (menukey==1) {} ;// warten bis Menutaste losgelassen wurde
lcd_gotoxy(curpos,1);
while(exitfunction==0)
{
if ( cursorright==1 )                    // Cursor nach rechts
{                             
note(A,5,T32,T10) ;
delay_ms(50) ;
while ( cursorright==1)
{
delay_ms(100);
keyhold++ ;
if ( keyhold >10 )    
{                       
#ifdef debug
printf("%s",dummytemp) ;
#endif                                              
note(G,1,T32,T11) ;               
note(G,2,T16,T10) ;
lcdline0clr();
lcd_putsf("Temp. gesetzt");
delay_ms(1000) ;    
lcd_clear() ;
tnew = atof(dummytemp) ;
#ifdef debug
printf("%p, %5.2f°C",dispstr,tnew) ;
#endif
return(tnew);
exitfunction=1 ;    
}
}

if ( curpos<4)
{
_lcd_ready() ;
_lcd_write_data(0x14) ;   
curpos++ ;    
if (curpos==2)   // unzulässige Eingabeposition "."
{
curpos++ ;
_lcd_ready() ;
_lcd_write_data(0x14) ;   
}                                   

}
while ( cursorright==1) {} ;
keyhold=0 ;
}           
// -----------------------------------------------------------------------------
if ( cursorleft==1 )                     // Cursor nach links
{     
note(A,5,T32,T10) ;
delay_ms(50) ;                      
while ( cursorleft==1)
{
delay_ms(100);
keyhold++ ;
if ( keyhold >10 )

note(G,2,T32,T11) ;
note(G,1,T16,T10) ;
lcdline0clr();
lcd_putsf("Eingabe abbruch");
delay_ms(1000) ;
exitfunction=1 ;  
return(0) ;
lcd_clear() ;
}
}

if (curpos>0 )
{
_lcd_ready() ;
_lcd_write_data(0x10) ;   
curpos-- ;
if (curpos==2)   // unzulässige Eingabeposition "."
{
curpos-- ;
_lcd_ready() ;
_lcd_write_data(0x10) ;   
}                                   


}
while ( cursorleft==1) {} ;
keyhold=0 ;
}           
  
// -----------------------------------------------------------------------------            
if ( menukey == 1 )                  // Zeicheneingabe
{                   
note(A,5,T32,T10) ;
delay_ms(50);
while( menukey == 1 ) {} ;
       zeichen = dummytemp[curpos] ;
      
      
       switch(curpos)
       {
       case 0: if (zeichen <48 )
       zeichen = 48 ;
       if ((zeichen>=48 ) && ( zeichen<57))          // nur 0-9 sind erlaubt
       {                                  
       zeichen++ ;                           // zeichen erhöhen
       dummytemp[curpos]=zeichen ;
       }
       else
       {                              
       zeichen = 48 ;                       
       dummytemp[curpos]=zeichen ;                      
       }
       break ;
      
       case 1: if(zeichen<48)
       zeichen=48 ;
       if ((zeichen>=48 ) && ( zeichen<57))          // nur 0-9 sind erlaubt
       {
       zeichen++ ;                           // zeichen erhöhen
       dummytemp[curpos]=zeichen ;
      
       }
       else
       {                              
       zeichen = 48 ;                       
       dummytemp[curpos]=zeichen ;
       }
       break ;
      
       case 3: if (zeichen<48)
       zeichen=48 ;
       if ((zeichen>=48 ) && ( zeichen<57))          // nur 0-9 sind erlaubt
       {                                  
       zeichen++ ;                           // zeichen erhöhen
       dummytemp[curpos]=zeichen ;
       }
       else
       {                              
       zeichen = 48 ;                       
       dummytemp[curpos]=zeichen ;
       }     
       break ;
      
       case 4: if (zeichen<48)
       zeichen=48 ;
       if ((zeichen>=48 ) && ( zeichen<57))          // nur 0-9 sind erlaubt, also (chr(48) - chr(57)   
       {                                  
       zeichen++ ;                           // zeichen erhöhen
       dummytemp[curpos]=zeichen ;
       }
       else
       {                              
       zeichen = 48 ;                        // zeichen >57 (9) dann wieder mit zeichen = 48 (0)
       dummytemp[curpos]=zeichen ;
       }     
       break ;
       }
 
 
#ifdef debug
printf(" %c-%i curpos:%i ",zeichen,zeichen,curpos) ;
#endif
lcd_gotoxy(0,1);
lcd_puts(dummytemp) ;
lcd_gotoxy(curpos,1);
}
}          // while exitfunction==0

_lcd_ready() ;
_lcd_write_data(0x0c) ;// Cursor off, blink off
}

 



/***********************************************************************
showinfoline() Infozeile am LCD ausgeben
************************************************************************/
void showinfoline(int info)     
{
lcdline1clr() ;
lcd_gotoxy(0,1);
//         12345678901234567890       

switch (info)
{
case 1: lcd_gotoxy(0,1);
lcd_putsf("1. Uhr stellen. ");
break ;

case 2:lcd_gotoxy(0,1);
lcd_putsf("2. min. Temp.   ");
break ;
      
case 3: lcd_gotoxy(0,1);
lcd_putsf("3. max. Temp.   ");
break ;

case 4: lcd_gotoxy(0,1);
 lcd_putsf("4.Intervall(min)");
 break ;
case 5: lcd_gotoxy(0,1);
 lcd_putsf("5.Eingabe Ende? ");
 break ;

}                                   

if ( keymode == 0 )
{
delay_ms(2000) ;        

lcdline1clr();
}

}



/***********************************************************************
Int 0 Serviceroutine(Menu-Taste)
************************************************************************/
interrupt [EXT_INT0] void ext_int0_isr(void)
{     
int i=0  ;    
int nextline=0 ;      
int keytimeout=0 ;            
double tnew=0 ;// temperaturübergabe
keymode=0 ;                             
keycnt=0 ;
 
delay_ms(100) ;         
if ( menukey == 1 )
{
note(A,5,T32,T10) ;
while ( menukey == 1 ) {}; // warten bis Taste wieder losgelassen wird
keymode=1 ;
}

if ( keymode == 1 )
{
lcdlighton(1) ;
 lcdline0clr() ;
 lcd_gotoxy(0,0);
 lcd_putsf("Eingabemodus:  "); 
 lcd_gotoxy(0,1);
 lcd_putsf("kurz=blaettern");
 while ( menukey == 0 )
 {                              
if ( keytimeout > 1000 )                 // 10 Sek. keine Taste gedrückt - > Eingabemodus verlassen.
{           
keycnt=0 ;
keymode=0 ;
break ;

keytimeout++ ;
delay_ms(10) ;
 } ;              
 
 while ( menukey == 1 )
 {
if ( keytimeout > 1000 )                 // 10 Sek. keine Taste gedrückt - > Eingabemodus verlassen.
{           
keycnt=0 ;
keymode=0 ;
break ;

keytimeout++ ;
delay_ms(10) ;
 } ;        
                  
 note(A,5,T32,T10) ;
 lcd_gotoxy(0,1);
 lcd_putsf("lang=auswaehlen");
 while ( menukey == 0 )
 {
if ( keytimeout > 1000 )                 // 10 Sek. keine Taste gedrückt - > Eingabemodus verlassen.
{           
keycnt=0 ;
keymode=0 ;
break ;

keytimeout++ ;
delay_ms(10) ;
 } ;
 
}
while (keymode == 1 )
{               
if ( menukey == 1 )         
{                       
note(A,5,T32,T10) ;
while ( (i < 25 ) & (menukey == 1 ) )                // ca. 2 Sek.  Taste lang gedrückt (Funktion ausführen)
{
delay_ms(50) ;
i++ ;

}
if ( i <= 10 ) // Taste kurz gedrückt (weiterblättern)
{
keycnt++ ;
nextline = 1 ;
i = 0 ;
keytimeout=0 ;    
if ( keycnt==6)
keycnt=1 ;
}

if ( i >= 20 )       // wenn Taste lang gedrückt dann Funktion ausführen
{             
i = 0 ;
 switch ( keycnt )
 {
     case 1: timeedit(); nextline=1 ;break ;
case 2: tnew=tempedit("Tmin",etmin);
if (tnew!=0)
{     
tmin=tnew ;
etmin=tmin ;// Wert ins EEProm schreiben
}
nextline=1 ;
break ;

case 3: tnew=tempedit("Tmax",etmax);
if (tnew!=0)
{       
tmax=tnew ;
etmax=tmax ;// Wert ins EEProm schreiben
}
nextline=1 ;
break ;                                                                         
case 4: break ;

case 5: lcdline1clr() ;lcd_gotoxy(0,1); lcd_putsf("Eingabe beendet.");
keymode=0 ;keycnt=9 ;
note(A,1,T16,T10);
note(A,3,T8,T10);
break ;
 }
                  
 lcd_gotoxy(0,0);
 lcd_putsf("Eingabemodus:  ");           
 keytimeout=0 ;   
 while ( menukey == 1 ) {} ;// warten bis Taste ganz sicher wieder freigegeben wurde
}

}     
if ( keycnt==9) break ;// Eingabemodus verlassen
        
if ( nextline == 1 ) // Taste wurde kurz gedrückt, weiterblättern
{
switch ( keycnt )
{
 case 1:showinfoline(keycnt) ; break ;
 case 2: showinfoline(keycnt) ; break ;
 case 3: showinfoline(keycnt) ; break ; 
 case 4: showinfoline(keycnt) ; break ; 
 case 5: showinfoline(keycnt) ; break ;
}
nextline=0 ;
keytimeout=0 ;
}
      
       if ( keycnt > 5 )
       keycnt = 0 ;

if ( keytimeout > 500 )                  // 12,5 Sek. keine Taste gedrückt - > Eingabemodus verlassen.
{           
keycnt=0 ;
keymode=0 ;

keytimeout++ ;
delay_ms(25) ;
}

lcd_clear() ;
#asm("cli")
#asm("sei")// Interrupts wieder zulassen
}                                                                           




/***********************************************************************
Serial Interrupt Routine
************************************************************************/
#pragma savereg-
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
#asm
   push r26
   push r27
   push r30
   push r31
   in   r26,sreg
   push r26
#endasm
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {
   rx_buffer[rx_wr_index]=data;
   if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
   if (++rx_counter == RX_BUFFER_SIZE)
     {
     rx_counter=0;
     rx_buffer_overflow=1;
     };
   };
#asm
   pop  r26
   out  sreg,r26
   pop  r31
   pop  r30
   pop  r27
   pop  r26
#endasm
}
#pragma savereg+

#ifndef _DEBUG_TERMINAL_IO_
/***********************************************************************
getchar()  getchar von USART receive Buffer
************************************************************************/
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif


/***********************************************************************
setclockRs232()  Uhrzeit über RS232 vom PC aus stellen
************************************************************************/
void setclockRs232(void)
{                       
unsigned char sdatacnt=0 ;      
unsigned char sdtime[20] ;        
unsigned int v1,v2,v3,v4,v5 ;

delay_ms(500)  ;

      
       while ( rx_counter != 0 )
       {
       sdtime[sdatacnt] = getchar() ;
       sdatacnt++ ;
       }                             
      
       v1 = toascii(sdtime[0]) ; 
       v2 = toascii(sdtime[1]) ; 
       v1 = v1 - 48 ;
       v2 = v2 - 48 ;
v3 = v1*10 ;
v3 = v3 + v2 ;

       v1 = toascii(sdtime[2]) ; 
       v2 = toascii(sdtime[3]) ; 
       v1 = v1 - 48 ;
       v2 = v2 - 48 ;
v4 = v1*10 ;
v4 = v4 + v2 ;

       v1 = toascii(sdtime[4]) ; 
       v2 = toascii(sdtime[5]) ; 
       v1 = v1 - 48 ;
       v2 = v2 - 48 ;
v5 = v1*10 ;
v5 = v5 + v2 ;

rtc_set_time(0,v3,v4,v5,0);  // Zeit kann dezimal z.B. 22 oder hex z.B. 0x16 angegeben werden.
      
lcdline1clr();
lcd_gotoxy(0,1);
//sprintf(dtime,"%02d:%02d:%02d - %s",hh,mm,ss,sdtime) ;
// lcd_puts(dtime) ;
lcd_putsf("Zeit gesetzt.");
delay_ms(1000) ;
lcd_clear() ;
 
}


              
/***********************************************************************
readtemperature()
************************************************************************/
void readtemperature(unsigned int devno)
{
   signedtemperature=ds1820_temperature_10(&ds1820_rom_codes[devno][0]);// Temperatur einlesen.     
   tcnt = __ds1820_scratch_pad.cnt_c ;          
   tres = __ds1820_scratch_pad.cnt_rem ;
   tfloat = signedtemperature - 0.25 + ((tcnt - tres) / tcnt) ;        // hires Umrechnung             
   sprintf(dis,"");                     
   sprintf(dis,"T%-u:  %6.2f\xdfC",devno+1,tfloat/10) ;
#ifdef debug
   printf("<t=%6.2f>\n\r",tfloat/10 ) ;
#endif
}


/***********************************************************************
einschaltmeldung
************************************************************************/
void einschaltmeldung(void)
{                                 
// Determine the number of DS1820 devices connected to the 1 Wire bus
ds1820_devices=w1_search(0xf0,ds1820_rom_codes);

lcd_putsf("    ATMEGA32    ");  
lcd_gotoxy(0,1);
lcd_putsf(" Board Rev. 107 ");
delay_ms(3000) ;            
lcd_clear() ;
lcd_putsf("Temp. Sensors:");
sprintf(dis,"%d",ds1820_devices);
lcd_puts(dis) ;
lcd_gotoxy(0,1) ;
readtemperature(0) ;
lcd_puts(dis);
delay_ms(2000) ;          
}


/***********************************************************************
main()
************************************************************************/
void main(void)
{

sprintf(dummy,"");      

// Input/Output Ports initialization
// Port A initialization
// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In
// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In
// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T
PORTB=0x00;
DDRB=0x08;

// Port C initialization
// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In
// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In
// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T
PORTD=0x00;
DDRD=0x80;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 65,535 kHz
// Mode: Fast PWM top=FFh
// OC0 output: Non-Inverted PWM
TCCR0=0x6C;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Rising Edge
// INT1: Off
// INT2: Off
GICR|=0x40;
MCUCR=0x03;
MCUCSR=0x00;
GIFR=0x40;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 9600
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x67;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
// Analog Comparator Output: Off
ACSR=0x80;
SFIOR=0x00;
 

// Hintergrundbeleuchtung aus
lcdlightoff(1) ;


// I2C Bus initialization
i2c_init();

// PCF8583 Real Time Clock initialization
rtc_init(0,0);    
delay_ms(100) ;

// LCD module initialization    
delay_ms(100) ;
lcd_init(16);       
lcd_clear() ;     




// Tonfolge abspielen
note(A,3,T16,T10) ;
note(H,3,T16,T10) ;
note(D,3,T16,T10) ;
note(A,3,T8,T10) ;

                          
// Hintergrundbeleuchtung einschalten
lcdlighton(0) ; 
delay_ms(200) ;

einschaltmeldung() ;
      
readtemperature(0) ;
//tmin = tfloat/10 ;
//tmax = tfloat/10 ;                

if (etmax!=0 )
tmax = etmax ;
if (etmin!=0 )
tmin = etmin ;
if (eschaltdauer!=0 )
schaltdauer=eschaltdauer ;


// Global enable interrupts
#asm("sei")

lcd_clear() ;
while (1)
{
    
     while ( rx_counter == 0 ) // Ausgabe der Temperatur auf dem LCD, solange bis Kommandos über RS232 kommen.
     {
delay_ms(350) ;   
readtemperature(0) ;  
lcd_gotoxy(0,0);
lcd_puts(dis);
 rtc_get_time(0,&h,&m,&s,&hs);     // Uhrzeit einlesen       
sprintf(time,"Zeit: %02d:%02d:%02d",h,m,s); // Uhrzeit im string "time" formatieren  HH:MM:SS
lcd_gotoxy(0,1);
lcd_puts(time) ;      

  }   

strRecBuff[0] = getchar() ;                                // 1. Zeichen abholen

if ( strRecBuff[0] == 'S' )                               
 {                    
     lcdlighton(1) ;
 strRecBuff[1] = getchar() ;                           // 2. zeichen abholen
 if ( strRecBuff[1] == 'T' )
 setclockRs232() ;
 }
strcpyf(strRecBuff,"               ");



     }; // while(1)
} // main()