diff -ru source.new.1/com.c source.new/com.c
--- source.new.1/com.c	2011-10-08 18:25:25.000000000 +0200
+++ source.new/com.c	2011-10-10 22:04:13.000000000 +0200
@@ -377,6 +377,7 @@
  *  \note   Mxx\n - set mode to 0=manu 1=auto
  *  \note   Ixx\n - activate bus ID 01..1f 0xff=single mode
  *  \note   Oxxxx\n - set messured temperature , >0000 = disable messurement
+ *  \note   C\n - calibrate rco
  *	
  ******************************************************************************/
 static        uint8_t com_hex[3];
@@ -425,6 +426,11 @@
                     case 'V':
                         print_version();
                         break;
+#if HAS_CALIBRATE_RCO
+                    // C\n - calibrate rco
+                    case 'C':
+                        calibrate_rco();
+#endif
                     // D - print status line
                     case 'D':
                         COM_print_debug(-1);
@@ -517,7 +523,6 @@
                         if (com_hex_len!=4) { break; }
                         override_adc_temp=(com_hex[0] >> 4)*1000 + (com_hex[0] & 0x0f) * 100 + (com_hex[1] >> 4)*10 + (com_hex[1] & 0x0f);
                         break;
-                    
                 }
                 COM_flush();
                 COM_putchar('\n');
diff -ru source.new.1/config.h source.new/config.h
--- source.new.1/config.h	2011-10-10 22:12:56.635161001 +0200
+++ source.new/config.h	2011-10-10 21:31:57.000000000 +0200
@@ -81,6 +81,9 @@
 
 #define DEFAULT_TEMPERATURE 2000 
 
+// RC Calibration on UART sending speed
+#define HAS_CALIBRATE_RCO 1
+
 
 // Some default Values
 #define BOOT_DD         1  //!< Boot-Up date: day
Nur in source.new.1: hr20.hex.
diff -ru source.new.1/main.c source.new/main.c
--- source.new.1/main.c	2011-09-26 20:31:01.000000000 +0200
+++ source.new/main.c	2011-10-10 21:23:44.000000000 +0200
@@ -294,6 +294,9 @@
 
     //! Initialize the RTC
     RTC_Init();
+    #if HAS_CALIBRATE_RCO
+    calibrate_rco();
+    #endif
 
     eeprom_config_init((~PINB & (KBI_PROG | KBI_C | KBI_AUTO))==(KBI_PROG | KBI_C | KBI_AUTO));
 
diff -ru source.new.1/rtc.c source.new/rtc.c
--- source.new.1/rtc.c	2011-09-26 20:31:01.000000000 +0200
+++ source.new/rtc.c	2011-10-10 22:30:03.000000000 +0200
@@ -39,6 +39,7 @@
 #include <avr/pgmspace.h>
 #include <avr/sleep.h>
 #include <avr/version.h>
+#include <util/delay.h>
 
 
 // HR20 Project includes
@@ -47,6 +48,7 @@
 #include "task.h"
 #include "eeprom.h"
 #include "menu.h"
+#include "motor.h"
 
 // Vars
 
@@ -358,6 +360,11 @@
 bool RTC_AddOneSecond(void)
 {
     RTC_Ticks++;          // overflow every 136 Years
+#if HAS_CALIBRATE_RCO
+    // Calibrate every 12 hours
+    if (RTC_Ticks % 43200 == 0) calibrate_rco();
+#endif
+
 	if (++RTC_ss >= 60) {
 		RTC_ss = 0;
 		// notify com.c about the changed minute
@@ -578,48 +585,37 @@
  ******************************************************************************/
 void calibrate_rco(void)
 {
-    unsigned char calibrate = FALSE;
-    int temp;
-
-    cli();                               // disable global interrupt
-    CLKPR = (1<<CLKPCE);                 // set Clock Prescaler Change Enable
-    CLKPR = (1<<CLKPS1) | (1<<CLKPS0);   // set prescaler = 8  =>  1Mhz
-    TIMSK2 = 0;                          // disable OCIE2A and TOIE2
-    ASSR = (1<<AS2);                     // timer2 asynchronous 32,768kHz)
-    OCR2A = 200;                         // set timer2 compare value
-    TIMSK0 = 0;                          // delete any interrupt sources
-    TCCR1B = (1<<CS10);                  // start timer1 with no prescaling
-    TCCR2A = (1<<CS20);                  // start timer2 with no prescaling
-
-    while((ASSR & 0x01) | (ASSR & 0x04));// wait for clear TCN2UB and TCR2UB
-    // delay(1000);                      // wait for external crystal stabilise
-
-    while(!calibrate)
+    if (MOTOR_Dir!=stop) return;
+    
+    // Disable interrupts
+    uint8_t tmp_sreg;  // temporaerer Speicher fuer das Statusregister
+    tmp_sreg = SREG;   // Statusregister (also auch das I-Flag darin) sichern
+    cli();             // Interrupts global deaktivieren
+    
+    for (uint8_t i=0;i<20;i++)
     {
-        TIFR1 = 0xFF;   // delete TIFR1 flags
-        TIFR2 = 0xFF;   // delete TIFR2 flags
-        TCNT1H = 0;     // clear timer1 counter
-        TCNT1L = 0;
-        TCNT2 = 0;      // clear timer2 counter
-
-        while ( !(TIFR2 & (1<<OCF2A)) );   // wait for timer2 compareflag
-
-        TCCR1B = 0;     // stop timer1
-
-        if (TIFR1 & (1<<TOV1))  {
-            temp = 0xFFFF;                // timer1 overflow, set temp to 0xFFFF
-        } else {
-            temp = (TCNT1H << 8) | TCNT1L;  // read out the timer1 counter value
+        int8_t diff = 0;
+        while (TCNT2>246) {}; // Wait for low timer counter
+        
+        uint8_t tmp_tcnt2=TCNT2+2;
+        while (TCNT2<tmp_tcnt2) {};
+        
+        _delay_us(19520); // 1000ms/256ticks*5
+        
+        diff=TCNT2-tmp_tcnt2;
+        
+        if (diff == 5) { break; }
+        if (diff > 5)
+        {
+            OSCCAL++;
         }
-
-        if (temp > 6250) {
-            OSCCAL--;   // internRC oscillator to fast, decrease the OSCCAL
-        } else if (temp < 6120) {
-            OSCCAL++;   // internRC oscillator to slow, increase the OSCCAL
-        } else {
-            calibrate = TRUE;   // the interRC is correct
+            else
+        {
+            OSCCAL--;
         }
-        TCCR1B = (1<<CS10); // start timer1
     }
+    
+    // Reconstruct interrupts
+    SREG = tmp_sreg;
 }
 #endif
