Hallo,

offensichtlich benutzt der ursprüngliche Poster einen AVR, der mit 8 MHz betrieben wird, während Deiner mit 4 MHz läuft. Da der interne Takt zum Zählen benutzt wird, läuft Deine Uhr nur halb so schnell. Die Lösung wäre: ersetze im Programm die Zeile

#define preValue 57724

durch

#define preValue 28862

Das sollte dann funktionieren.

Zu Deinem 2. Problem: Vielleicht hilft es, wenn Du den Teil des Programms, der in der Endlosschleife ausgeführt wird, etwas anders schreibst, etwa so:
Code:
  while (1)
  {
    if (seconds != gSeconds)
    {
      seconds = gSeconds;
         
      if (seconds >= 60)
      {
        seconds -= 60;
        gSeconds = seconds;
        minutes++;
      }
      if (minutes >= 60)
      {
        minutes -= 60;
        hours++;
      }
      if (hours >= 24)
        hours -= 24;

      /* Uhrzeit formatieren */
      sprintf (mytime, "%02d:%02d:%02d", hours, minutes, seconds);         

      /* und auf dem Display ausgeben */
      lcd_gotoxy (6,0);
      lcd_puts (mytime);
    }
  }
Sollte das Problem immer noch vorhanden sein, wäre es interessant zu wissen, welchen AVR Du einsetzt.

Gruß, M@nni