The AVR Code for the ATMega 16

/**********************************************************
Datum    : 18.12.2004
Author   : Harald Brachschoss                        
AVR        : ATmega16 / 16 Mhz.

*/
 

// --------------------------------------------------------------------------------
// Achtung! Um Port C im ATMEGA 16 als I/O benutzen zu
// können muss beim Ponyprog. JTAG disabled werden !     
// --------------------------------------------------------------------------------

#include <mega16.h>                         
#include <ctype.h>
// --------------------------------------------------------------------------------
// Definitionen für die LCD Funktionen setzen, Port A
// --------------------------------------------------------------------------------
#asm
   .equ __lcd_port=0x1b
#endasm
#include <lcd.h>
                                                                      

// --------------------------------------------------------------------------------
// Definitionen für 1 wire bus funktionen setzen,  Port B, Bit 0 = Pin 1 am ATMega16
// --------------------------------------------------------------------------------
#asm
   .equ __w1_port=0x18              
   .equ __w1_bit=0                  
#endasm
#include <1wire.h>
#include <ds1820.h>                                 


// --------------------------------------------------------------------------------
// Definitionen für den PCF8583 Uhrenchip setzen.    Port C
// --------------------------------------------------------------------------------
#asm
.equ __i2c_port=0x15
.equ __sda_bit=1
.equ __scl_bit=0                    
#endasm                   
#include <i2c.h>                
#include <pcf8583.h>
      

#include <stdlib.h>
#include <delay.h>            
#include <string.h>               
#include <math.h>               
#include <stdio.h>
    
                                                
// --------------------------------------------------------------------------------
// Definitionen für den DS1820 Tempereturchip setzen
// --------------------------------------------------------------------------------
#define MAX_DS1820 2          
unsigned char ds1820_devices;
unsigned char ds1820_rom_codes[MAX_DS1820, 9];
char strRecBuff[10] ;
char strText[15] [21] ;
unsigned char time[8] ;

#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)    


// #define debug// Debug Ausgabe einschalten


// 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;

// USART Receiver interrupt service 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_
// Get a character from the USART Receiver 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
                      

// Declare your global variables here


eeprom unsigned char EEPORTB=0 ;// NOV Speicher für PortB
      
unsigned char SRamPORTB=0 ;                             
char dchar[15] ;                                                                
char sBin[8];                             
unsigned char lcdlight=0 ;
unsigned char keymode=0 ;
unsigned char keycnt=0 ;
unsigned char h,m,s,hs ;// Uhrzeitvariablen
                                        

      
// --------------------------------------------------------------------------------
// Anzeigetexte in die variablen laden.    (spart speicherplatz)
// --------------------------------------------------------------------------------
void ladetexte(void)
{
strcpyf(strText[1],"Teichpumpe aus     ");
strcpyf(strText[2],"Teichpumpe an      ");

strcpyf(strText[3],"Teichbeleuchtung aus");
strcpyf(strText[4],"Teichbeleuchtung an ");

strcpyf(strText[5],"Gartenbeleucht.1 aus");
strcpyf(strText[6],"Gartenbeleucht.1 an ");

strcpyf(strText[7],"Gartenbeleucht.2 aus");
strcpyf(strText[8],"Gartenbeleucht.2 an ");

strcpyf(strText[9],"Reserve 1 aus      ");
strcpyf(strText[10],"Reserve 1 an        ");

strcpyf(strText[11],"Reserve 2 aus       ");
strcpyf(strText[12],"Reserve 2 an        ");
                                  
strcpyf(strText[13],"Reserve 3 aus       ");
strcpyf(strText[14],"Reserve 3 an        ");
}



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

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


// --------------------------------------------------------------------------------
// Setzen oder Rücksetzen des übergebenen Bits 0=nur einlesen und setzen des Anzeigearrays
// --------------------------------------------------------------------------------
void togglebit(unsigned char BitNo)
{                                       
              
#ifdef debug
sprintf(dchar,"%-u - ",BitNo) ;
lcd_gotoxy(12,1) ;
lcd_puts(dchar) ; 
#endif                                
if ( BitNo > 0 )// nicht für Bit 0 ausführen.
switch (BitNo)                                    
{
case 1:
if ( PINB.1 == 1 )
   PORTB.1 = 0 ;
 else
   PORTB.1 =1 ;
   break ;
case 2:
if ( PINB.2 == 1 )
   PORTB.2 = 0 ;
 else
   PORTB.2 =1 ;
   break ;

case 3:
if ( PINB.3 == 1 )
   PORTB.3 = 0 ;
 else
   PORTB.3 =1 ;
   break ;

case 4:
if ( PINB.4 == 1 )
   PORTB.4 = 0 ;
 else
   PORTB.4 =1 ;
   break ;

case 5:
if ( PINB.5 == 1 )
   PORTB.5 = 0 ;
 else
   PORTB.5 =1 ;
   break ;

case 6:
if ( PINB.6 == 1 )
   PORTB.6 = 0 ;
 else
   PORTB.6 =1 ;
   break ;

case 7:
if ( PINB.7 == 1 )
   PORTB.7 = 0 ;
 else
   PORTB.7 =1 ;    
}

sBin[7] = ' ' ;// Anzeige updaten
if ( PINB.1 == 1 )
sBin[6] = '1' ;
 else
   sBin[6] = '0' ;

if ( PINB.2 == 1 )
sBin[5] = '1' ;
 else
   sBin[5] = '0' ;

if ( PINB.3 == 1 )
sBin[4] = '1' ;
 else
   sBin[4] = '0' ;

if ( PINB.4 == 1 )
sBin[3] = '1' ;
 else
   sBin[3] = '0' ;

if ( PINB.5 == 1 )
sBin[2] = '1' ;
 else
   sBin[2] = '0' ;

if ( PINB.6 == 1 )
sBin[1] = '1' ;
 else
   sBin[1] = '0' ;

if ( PINB.7 == 1 )
sBin[0] = '1' ;
 else
   sBin[0] = '0' ;
                      
SRamPORTB = PINB ;
SRamPORTB = PINB - 1;  // Nochmal einlesen, da bei Bit 7 es bei einmaligem lesen nicht funktioniert !
                          
if ( BitNo > 0 )                               // EEprom nur schreiben wenn sich etwas geändert hat.
EEPORTB=SRamPORTB;                                    
#ifdef debug
sprintf(dchar,"  %u",SRamPORTB) ;
lcd_puts(dchar) ;
#endif
lcd_gotoxy(12,1) ;
lcd_puts(sBin) ;
printf("<ST%s>\n\r",sBin) ;
}

            
// --------------------------------------------------------------------------------
// Portstatus der einzelnen Ausgänge anzeigen. wird ca. alle 65 sek. aufgerufen.
// --------------------------------------------------------------------------------
void showinfo(void)
{
lcd_clear() ;
lcd_gotoxy(0,0);
//         12345678901234567890       
lcd_putsf("AT-Mega WLan Control");
lcd_gotoxy(0,1);
lcd_putsf(" Harald Brachschoss ");
delay_ms(2000) ;
                      

lcdline0clr() ;             
lcd_gotoxy(0,0);
lcd_putsf("I/O Status: ");

lcd_gotoxy(0,1);
if ( PINB.1 == 0 )      
lcd_puts(strText[1]);
else                              
lcd_puts(strText[2]);
if ( rx_counter != 0 )
return ;
delay_ms(2000) ;

lcd_gotoxy(0,1);
if ( PINB.2 == 0 )
lcd_puts(strText[3]);
else                              
lcd_puts(strText[4]);
if ( rx_counter != 0 )
return;
delay_ms(2000) ;

lcd_gotoxy(0,1);
if ( PINB.3 == 0 )
lcd_puts(strText[5]);
else                              
lcd_puts(strText[6]);
if ( rx_counter != 0 )
return ;
delay_ms(2000) ;

lcd_gotoxy(0,1);
if ( PINB.4 == 0 )
lcd_puts(strText[7]);
else                              
lcd_puts(strText[8]);
if ( rx_counter != 0 )
return ;
delay_ms(2000) ;

lcd_gotoxy(0,1);
if ( PINB.5 == 0 )
lcd_puts(strText[9]);
else                              
lcd_puts(strText[10]);
if ( rx_counter != 0 )
return ;
delay_ms(1000) ;

lcd_gotoxy(0,1);
if ( PINB.6 == 0 )
lcd_puts(strText[11]);
else                              
lcd_puts(strText[12]);
if ( rx_counter != 0 )
return ;
delay_ms(1000) ;
                                  
lcd_gotoxy(0,1);
if ( PINB.7 == 0 )
lcd_puts(strText[13]);
else                              
lcd_puts(strText[14]);
if ( rx_counter != 0 )
return ;
delay_ms(1000) ;        
lcd_gotoxy(0,0);
lcd_putsf("AT-Mega WLan Control");
lcdline1clr();
togglebit(0) ;

}                                                         


// --------------------------------------------------------------------------------
// Portstatus des angesprochenen Ports, beim setzen oder rücksetzen anzeigen
// --------------------------------------------------------------------------------
void showinfoline(int info)     
{
lcdline1clr() ;
lcd_gotoxy(0,1);
//         12345678901234567890       

switch (info)
{
case 1: if ( PINB.1 == 0 )
lcd_puts(strText[1]);
else                              
lcd_puts(strText[2]);
break ;

case 2:if ( PINB.2 == 0 )
lcd_puts(strText[3]);
else                              
lcd_puts(strText[4]);
       break ;
      
case 3: if ( PINB.3 == 0 )
lcd_puts(strText[5]);
else                              
lcd_puts(strText[6]);
break ;

case 4: if ( PINB.4 == 0 )
lcd_puts(strText[7]);
else                              
lcd_puts(strText[8]);
           break ;
          
case 5: if ( PINB.5 == 0 )
lcd_puts(strText[9]);
else                              
lcd_puts(strText[10]);
               break ;
              
case 6: if ( PINB.6 == 0 )
lcd_puts(strText[11]);
else                              
lcd_puts(strText[12]);
break ;
                                  
case 7: if ( PINB.7 == 0 )
lcd_puts(strText[13]);
else                              
lcd_puts(strText[14]);
}                                   

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

lcdline1clr();
togglebit(0) ;
}

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

}




// --------------------------------------------------------------------------------
// LcdLightOn Displaybeleuchtung einschalten oder aufdimmen
// --------------------------------------------------------------------------------
void lcdlighton(unsigned char status)
{                                 
if ( status == 1 )
{
lcdlight=245 ;
OCR1A=lcdlight;
}             
else
for (lcdlight=0; lcdlight<245;)// Display Beleuchtung aufdimmen
{                                 
OCR1A=lcdlight ;
lcdlight = lcdlight+5 ;
delay_ms(50);
}
}


                            


// --------------------------------------------------------------------------------
// Uhrzeitanzeige im Eingabemodus
// --------------------------------------------------------------------------------
void UhrzeitAnzeige(void)
{                 
while ( PIND.2==1 ) {} ;
lcdline1clr() ;
while ( PIND.2==0 )
{     
if ( rx_counter !=0 )
break ;                 
lcd_gotoxy(0,1) ;
lcd_putsf("Uhrzeit: ");
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
lcd_gotoxy(12,1) ;
lcd_puts(time);   
if ( PIND.2 == 1 )
break ;
delay_ms(250) ;
if ( PIND.2 == 1 )
break ;   
}             
lcdline1clr() ;
lcd_gotoxy(0,1) ;
lcd_putsf("Zeitanzeige beendet.");
while ( PIND.2==1 ) {} ;

}
                              

 

continuing code:

 


// ----------------------------------------------------------------- ---------------
// External Interrupt 0 service routine
// ----------------------------------------------------------------- ---------------
interrupt [EXT_INT0] void ext_int0_isr(void)
{     
int i=0  ;    
int nextline=0 ;      
int keytimeout=0 ;
keymode=0 ;                             
keycnt=0 ;

delay_ms(100) ;         
if ( PIND.2 == 1 )
{
while ( PIND.2 == 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("Taste kurz=blaettern");
 while ( PIND.2 == 0 )
 {                              
if ( keytimeout > 1000 )                 // 10 Sek. keine Taste gedrückt - > Eingabemodus verlassen.
{           
keycnt=0 ;
keymode=0 ;
break ;

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

keytimeout++ ;
delay_ms(10) ;
 } ;        
 lcd_gotoxy(0,1);
 lcd_putsf("Taste lang=Auswahl ");
 while ( PIND.2 == 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 ( PIND.2 == 1 )          
{
while ( (i < 25 ) & (PIND.2 == 1 ) )                 // ca. 2 Sek.
{
delay_ms(50) ;
i++ ;

}
if ( i <= 10 )
{
keycnt++ ;
nextline = 1 ;
i = 0 ;
keytimeout=0 ;
}

if ( i >= 20 )      
{             
i = 0 ;
 switch ( keycnt )
 {
     case 1: togglebit(1) ; showinfoline(1); break ;
case 2: togglebit(2) ; showinfoline(2); break ;
case 3: togglebit(3) ; showinfoline(3); break ;
case 4: togglebit(4) ; showinfoline(4); break ;
case 5: togglebit(5) ; showinfoline(5); break ;
case 6: togglebit(6) ; showinfoline(6); break ;
case 7: togglebit(7) ; showinfoline(7); break ; 
case 8: lcdline1clr() ;lcd_gotoxy(0,1); lcd_putsf("Zeige Uhrzeit.");UhrzeitAnzeige(); break ;
case 9: lcdline1clr() ;lcd_gotoxy(0,1); lcd_putsf("Eingabe beendet.");
 }
 keycnt = 0 ;
 keymode=0 ;  
 keytimeout=0 ;   
 while ( PIND.2 == 1 ) {} ;// warten bis Taste ganz sicher wieder freigegeben wurde
}

}     
                            
if ( nextline == 1 )
{
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 ;
 case 6: showinfoline(keycnt) ; break ;
 case 7: showinfoline(keycnt) ; break ;         
 case 8:lcdline1clr() ;lcd_gotoxy(0,1); lcd_putsf("Uhrzeit Anzeige ?"); break ;
 case 9: lcdline1clr() ;lcd_gotoxy(0,1); lcd_putsf("Eingabe verlassen ?");
}
nextline=0 ;
keytimeout=0 ;
}
      
       if ( keycnt > 8 )
       keycnt = 0 ;

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

keytimeout++ ;
delay_ms(25) ;
}


lcd_clear() ;
lcd_gotoxy(0,0);
lcd_putsf("AT-Mega WLan Control");

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


// ----------------------------------------------------------------- ---------------
// ShowClock() Uhrzeit ausgeben ( für ca. 5 Sek. )
// ----------------------------------------------------------------- ---------------
void showclock(void)
{                 
int clkcnt=0 ;
while ( clkcnt <= 10 )
{       
if ( rx_counter != 0 )  
break ;
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
lcd_gotoxy(12,1) ;
lcd_puts(time);   
delay_ms(500) ;   
clkcnt++ ;
}

}
        

void rxempty(void)
{
unsigned char serchar ;
while ( rx_counter !=0 )
serchar= getchar();
}


// ----------------------------------------------------------------- ---------------
// SetClock()  Uhrzeit vom PC aus setzen
// ----------------------------------------------------------------- ---------------
void setclock(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(2000) ;
 
}
                                          

// ----------------------------------------------------------------- ---------------
// Main
// ----------------------------------------------------------------- ---------------
void main(void)
{             
int temp ;                      
int result ;
int i ; 
int cnt=0 ;
int infocnt=0, infocnt2=0 ;   

double tcnt, tres, tfloat ;   

// Input/Output Ports initialization
// 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=0xFE;
PORTB=0x00;
DDRB=0xFE;
                  
// 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=0xFF;

// Port D initialization
// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=Out Func6=In Func7=In
// State0=T State1=T State2=T State3=T State4=T State5=0 State6=T State7=T
PORTD=0x04;// Bit 2 = Input
DDRD=0x20;   // Bit 5=PWM output


// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
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=0x81;
TCCR1B=0x0D;
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: Off
// 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;                           
                                
ladetexte() ;                   

// ----------------------------------------------------------------- ---------------
// I2C Bus initialisieren
// ----------------------------------------------------------------- ---------------
i2c_init() ;    
delay_ms(100) ;       
              

// ----------------------------------------------------------------- ---------------
// Uhr initialisieren und Uhrzeit setzen
// ----------------------------------------------------------------- ---------------     
rtc_init(0,0) ;     
delay_ms(100) ;
// rtc_set_time(0,19,16,0,0);  // Zeit kann dezimal z.B. 22 oder hex z.B. 0x16 angegeben werden.
                        
  
// ----------------------------------------------------------------- ---------------
// Uhrzeit einlesen
// ----------------------------------------------------------------- ---------------   
delay_ms(100) ;                     
rtc_get_time(0,&h,&m,&s,&hs);               
 

// ----------------------------------------------------------------- ---------------
// LCD initialisieren
// ----------------------------------------------------------------- ---------------
result = lcd_init(20);                  
delay_ms(100) ; 
lcd_clear() ;
delay_ms(150) ;       


// ----------------------------------------------------------------- ---------------
// Hintergrndbeleuchtung einschalten
// ----------------------------------------------------------------- ---------------
lcdlighton(0) ;                                                                   


// ----------------------------------------------------------------- ---------------
// Einschaltmeldung ausgeben
// ----------------------------------------------------------------- ---------------
lcd_gotoxy(0,0);
//         12345678901234567890       
lcd_putsf("AT-Mega WLan Control");
lcd_gotoxy(0,1);
lcd_putsf(" Harald Brachschoss ");
delay_ms(2000) ;
                  
              
// ----------------------------------------------------------------- ---------------
// Wieviele DS1820 sind am 1Wire Bus angeschlossen ?
// ----------------------------------------------------------------- ---------------
result = w1_init() ;
if (result > 0 )
   printf("Sensoren sind am Bus angeschlossen.\n\r") ;
ds1820_devices=w1_search(0xf0,ds1820_rom_codes);
printf("%-u Sensor(en) gefunden\n\r",ds1820_devices) ;
                                                                                  
                  
// ----------------------------------------------------------------- ---------------
// EEprom auslesen und den Ausgangport wiederherstellen  (retentive)
// ----------------------------------------------------------------- ---------------                   
if ( EEPORTB == 255 )
EEPORTB = 0 ;                                                   
if ( EEPORTB != 0 )
SRamPORTB = EEPORTB ;
else
SRamPORTB = 0 ;         

PORTB = SRamPORTB ;// Port gemäss EEprom setzten

lcdline1clr() ;
togglebit(0) ;

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

  while(1)
  {         
 
     if ( lcdlight < 10 )
     lcdlighton(0) ;
        
     while ( rx_counter == 0 ) // Ausgabe der Temperatur auf dem LCD, solange bis Kommandos über RS232 kommen.
     {
                        
     if ( infocnt >= 50 )
     {
     showinfo() ;
lcd_gotoxy(0,0);
lcd_putsf("AT-Mega WLan Control");
     infocnt = 0 ;
     lcdlightoff(0) ;
     }              

     if ( infocnt2 >= 10 )
     {
     showclock() ;
     infocnt2 = 0 ; 
     togglebit(0);
     }              


                    
     infocnt2++ ;
     infocnt++ ;
for ( i=0; i < ds1820_devices;)// Temperaturanzeige auf dem LCD ausgeben solange kein Kommando über RS232 kommt
{
     temp=ds1820_temperature_10(&ds1820_rom_codes[i][0]);// Temperatur einlesen.
tcnt = __ds1820_scratch_pad.cnt_c ;           
tres = __ds1820_scratch_pad.cnt_rem ;
       tfloat = temp - 0.25 + ((tcnt - tres) / tcnt) ;        // hires Umrechnung  
       sprintf(dchar,"T%-u:%6.2f\xdfC",++i,tfloat/10) ;
       lcd_gotoxy(0,1) ;
       lcd_puts(dchar) ; 
       for (cnt=0; cnt<20; cnt++)                 // ca. 1 Sekunde Anzeigedauer.
       {
delay_ms(50) ;
if ( rx_counter > 0 )// Sobald ein Kommando empfangen wird -> raus.
break ;
}
}
     }    
    
     strRecBuff[0] = getchar() ;                               // 1. Zeichen abholen

     if ( strRecBuff[0] == '1' )// 0x31
     {            
//     rxempty() ;
     temp=ds1820_temperature_10(&ds1820_rom_codes[0][0]);// Temperatur 1 einlesen.
tcnt = __ds1820_scratch_pad.cnt_c ;           
tres = __ds1820_scratch_pad.cnt_rem ;
       tfloat = temp - 0.25 + ((tcnt - tres) / tcnt) ;        // hires Umrechnung  
       printf("<t1=%6.2f>\n\r",tfloat/10 ) ; // Ausgabe: t1=[-]nn.nn
       sprintf(dchar,"t1:%6.2f",tfloat/10) ;     
       infocnt=0 ;
       delay_ms(500) ;
     };                                                         
    
     if ( strRecBuff[0] == '2' )                               // 0x32
     {
//     rxempty() ;
     temp=ds1820_temperature_10(&ds1820_rom_codes[1][0]);// Temperatur 2 einlesen.
tcnt = __ds1820_scratch_pad.cnt_c ;           
tres = __ds1820_scratch_pad.cnt_rem ;
       tfloat = temp - 0.25 + ((tcnt - tres) / tcnt) ;        // hires Umrechnung  
       printf("<t2=%6.2f>\n\r",tfloat/10 ) ; // Ausgabe: t2=[-]nn.nn
       infocnt=0 ;
       delay_ms(500) ;
     };                                                         
 
 
     if ( strRecBuff[0] == '3' )                               // 0x33
     {                      
//     rxempty() ;
 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
       printf("<t3 %s>\n\r",time ) ; // Ausgabe: t3 nn:nn:nn
       infocnt=0 ;   
       delay_ms(500) ;
     };                                                         
 

 
 
     if ( strRecBuff[0] == 'S' )                              
     {                    
     infocnt=0 ;  
     lcdlighton(1) ;
 strRecBuff[1] = getchar() ;                           // 2. zeichen abholen
#ifdef debug
 lcd_gotoxy(0,0); 
 sprintf(dchar,"%-c",strRecBuff) ;
 lcd_puts(dchar) ;    
#endif
     switch ( strRecBuff[1] )
     {      
     case '0': togglebit(0) ; break ;
     case '1': togglebit(1) ; showinfoline(1); break ;
case '2': togglebit(2) ; showinfoline(2); break ;
case '3': togglebit(3) ; showinfoline(3); break ;
case '4': togglebit(4) ; showinfoline(4); break ;
case '5': togglebit(5) ; showinfoline(5); break ;
case '6': togglebit(6) ; showinfoline(6); break ;
case '7': togglebit(7) ; showinfoline(7); break ; 
case 'T': setclock(); break  ;
       };                  
      
strcpyf(strRecBuff,"               ");
     };               


  };

}