Bis jetzt hat die erste Routine (misst den kürzesten DCF-Impuls aus) immer funktioniert. Nach ein paar Änderungen im Programm hat diese plötzlich nicht mehr funktioniert!! Und tut es auch nicht nachdem ich die Änderungen wieder herausgenommen habe.
Auf dem Display erscheint "Sign.Zeit: Messung" und dann nach der Wartezeit gleich "ms 0". Die Schleife wird schlicht ausgelassen
Wenn ich jetzt den Timer1 abschalte dann funktioniert dieser Programmteil. Aber seither hat es immer in Verbindung mit dem Timer1 funktioniert.
Ich kann da kein System erkennen und weis nicht weiter:

Hier mal der betreffende Codeausschnitt:

Code:
 $regfile =   "m32def.dat"                                                   'Atmel Prozessor: AVR AT Mega32
$crystal =   7372800                                                        'Quarz-Frequenz = 7.3728 MHz
$hwstack =   68
$swstack =   68
$framesize = 54
'baud     = 19200                                                           'Option für Serielle Schnittstelle
$lib "i2c_twi.lib"                                                          'Hardwaresteuerung für I2C-Bus

------------------------------------------------------------------------------------------------------------------------

Config Lcd     = 20x4                                                       'LCD-Display mit 20 Zeichen und 4 Zeilen
Config Lcdbus  = 4                                                          '4Bit-Modus für LCD-Daten
Config Lcdmode = PORT                                                       'Betriebsart für LCD-Daten
Config LcdPin  = Pin, Db7 =PORTA.7, Db6 =PORTA.6, Db5 =PORTA.5, Db4 =PORTA.4, _
                       Rs =PORTA.3, E =PORTA.2                              'Anschlußbelegung des LCD-Displays

------------------------------------------------------------------------------------------------------------------------

DDRA = DDRA OR &B00000001                                                   'PortA Bit0 ist Ausgang für Beleuchtung
DDRD = &B10110011                                                           'Datenrichtungsregister setzen  1=Ausg.

Config PIND.2 = Input                                                       'INT0-Eingang (Sign. von DS1307 RTC)
Config PIND.6 = Input                                                       'PC0 ist Eingang für DCF-77 Signal

Config TWI = 100000                                                         'I2C-Schnittstelle auf 100 kHz einstellen
TWCR = &B00000100                                                           'I2C-Schnittstelle einschalten

PORTD.7 = 1                                                                 'PullUp an Port D7 ein (DCF Ein/Aus)
PORTD.6 = 0                                                                 'PullUp an Port D6 aus (DCF-77)
PORTD.5 = 1                                                                 'PullUp an Port D5 ein (LED4)
PORTD.4 = 1                                                                 'PullUp an Port D4 ein (LED3)
PORTD.3 = 1                                                                 'PullUp an Port D3 ein (frei)
PORTD.2 = 0                                                                 'PullUp an Port D2 aus (DS1307 int)
PORTD.1 = 1                                                                 'PullUp an Port D1 ein (LED2)
PORTD.0 = 1                                                                 'PullUp an Port D0 ein (LED1)

DCF77Inp Alias PIND.6                                                       'DCF-77 Eingang Alias

-----------------------------------------------------------------------------------------------------------------------

Config Timer0 = Timer, Prescale = 1024                                      'Timer für DCF-77 Signalabtastung
Config Timer1 = Timer, Prescale = 1024                                      'Timer für die Erzeugung eines Sek. Taktes

------------------------------------------------------------------------------------------------------------------------

Const DS1307W = &HD0                                                        'DS1307 RTC schreiben
Const DS1307R = &HD1                                                        'DS1307 RTC lesen

Const Preload0 = 183                                                        'Timer0 Wert für 10ms Impulse
Const Preload1 = 58335                                                      'Timer1 Wert für 1s   Impulse

Const DS1307_Sekunden = &H00                                                'Korrektur bei Zeitübernahme in DS1307
Const Jahrh           = &H20                                                'Start Jahrhundert bei &H20 (2000)

Dim   Taste         As Byte
Dim   RTC_Regs(11)  As Byte                                                 'Byte-Array für DS1307 RTC Inhalte
Dim   DcfBit(60)    As Byte                                                 'Variable für DCF-77 Behandlung
Dim   Status        As Byte                                                 'Statusregister der Programmteile

Dim   Zähler        As Word                                                 'Impulslängenmessungen
Dim   Fehler        As Byte                                                 'Fehlerspeicher für DCF-Routinen
Dim   SigZ(10)      As Word                                                 'Feldvariable für Unterprogramm

Dim   Sek_Hex       As Byte                                                 'Sekunden in Hexadezimal
Dim   Min_Hex       As Byte                                                 'Minuten in Hexadezimal
Dim   Std_Hex       As Byte                                                 'Stunden in Hexadezimal
Dim   Tag_Hex       As Byte                                                 'Tage in Hexadezimal
Dim   Tag_Str       As String * 2                                           'Tage in Stringform
Dim   Mon_Str       As String * 2                                           'Monat in Stringform
Dim   Std_Str       As String * 2                                           'Stunden in Stringform
Dim   WTag_Hex      As Byte                                                 'Wochentag in Hexadezimal 1=Montag
Dim   TagNam        As String * 10                                          'Wochentagsname

Dim   ZeitZone      As String * 4                                           'Sommer/Winterzeit
Dim   ZeitZ_Hex     As Byte                                                 'Zeitzone MEZ/MESZ
Dim   Mon_Hex       As Byte                                                 'Monate in Hexadezimal
Dim   Jahr_Hex      As Byte                                                 'Jahre in Hexadezimal
Dim   JahrH_Hex     As Byte                                                 'Jahrhunderte in Hexadezimal
Dim   JahrhW        As Byte                                                 'Zähler Jahrhundertwechsel seit 2000
Dim   JahrhW_EEp    As Eram Byte                                            'Anzahl der Jahrhundertwechsel seit 2000

Dim   Dcf_Parity    As Single                                               'Parität bei DCF-77 Auswertung
Dim   PBit          As Byte                                                 'Variable für Paritätsprüfung

Dim   V             As Word                                                 'Vergleichswert für Signalzeiten
Dim   Z             As Byte                                                 'Allgemeine Zählvariable

------------------------------------------------------------------------------------------------------------------------

Declare Function  SigDauer() As Word                                        'DCF-Signallänge ermitteln
Declare Function  Syncro() As Byte                                          'Minutenmarke abwarten
Declare Sub       DCFReceive()                                              'DCF-77 Signalverarbeitung
Declare Sub       PTest()                                                   'Paritätstest
Declare Function  DelNull(ByVal Var As Byte) As String * 2                  'Führende Null unterdrücken
Declare Sub       Rtc_Init()                                                'DS1307 RTC initialisieren
Declare Sub       DS1307Set()                                               'DCF-77 Informationen in RTC schreiben
Declare Function  DS1307R_Sekunde() As Byte                                 'DS1307 Sekundenregister auslesen
Declare Sub       DS1307W_Sekunde(ByVal Value As Byte)                      'DS1307 Sekundenregister schreiben
Declare Sub       DS1307Read()                                              'DS1307 $00 - $09 auslesen
Declare Sub       DS1307Write()                                             'DS1307 $00 - $09 schreiben

------------------------------------------------------------------------------------------------------------------------

On Timer0 Kurzzeit_isr                                                      'Erzeugung 10ms Takt
On Timer1 Sekundentakt_isr                                                  'Erzeugung 1s   Takt

------------------------------------------------------------------------------------------------------------------------

Cls                                                                         'LCD-Display löschen
Cursor Off Noblink                                                          'Cursor auf LCD-Display ausblenden
PORTA.0 = 0                                                                 'LCD-Hintergrundbeleuchtung einschalten


Timer1 = Preload1                                                           'Timer1 mit Startwert für 1s Takt laden

Call DS1307Read()                                                           'Daten für Lcd-Anzeige aus RTC auslesen

Enable Timer1                                                               'Timer1 für 1s   Takt einschalten
Enable Timer0                                                               'Timer0 für 10ms Takt einschalten
Enable Interrupts                                                           'Interrupts global freigeben


PORTD.0 = 0                                                                 'Led1 für DCF-Empfang einschalten
PORTD.7 = 0                                                                 'DCF77-Empfänger einschalten
Wait 4                                                                      '4s warten bis DCF-Empfänger bereit ist

V = SigDauer()                                                              'Durchschnittliche Signaldauer ermitteln

Locate 4, 1                                                                 'Textposition auf LCD festlegen.
If V = 0 Then                                                               'Wenn kein Vergleich ermittelt, dann
  Lcd "Kein Vergleich gef."                                                 'Fehlermeldung auf LCD ausgeben.
Else                                                                        'sonst Vergleichswert auf LCD anzeigen
  Lcd "Zeitkonst.: "; V ;"      "
End If

------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------

Function SigDauer() As Word

  Local Z        As Byte                                                    'Allgemeine Zählvariable
  Local V        As Word                                                    'Variable für Signallängenberechnung

  Locate 4, 1                                                               'Text positionieren und ausgeben.
  Lcd "Sign.Zeit: Messung"
  Wait 2                                                                    'Meldung 2s lang anzeigen, dann weiter

  While V < 1                                                               'Vergleichswert kleiner 1 ?
    For Z = 1 To 10                                                         '10mal Signallänge messen
      Do                                                                    'Solange warten bis das DCF-Signal 0
      Loop Until DCF77Inp = 1                                               'wird.

      Timer0 = Preload0                                                     'Dann Timer für Abtastung vorladen und
      Zähler = 0                                                            'Zähler für Signallänge löschen.

      Do                                                                    'Solange das DCF-Signal 0 ist Signallängen-
      Loop Until DCF77Inp = 0                                               'zähler hochzählen.
      SigZ(Z) = Zähler                                                      'Messschritte auf dem Lcd-Display anzeigen
      Locate 4, 12
      Lcd "("; Z; ")  "; SigZ(Z)
    Next Z

    For Z = 1 To 10                                                         'Nach den 10 Messungen kürzesten Wert fest-
      If SigZ(Z) < SigZ(1) Then                                             'stellen.
        Swap SigZ(1), SigZ(Z)
      End If
    Next Z

    If SigZ(1) < 10 Then SigZ(1) = 10                                       'Sicherheitskorrektur, sonst Fehler mögl.
                                                                            'Lcd-Ausgabe speichern.
    V = SigZ(1) / 2                                                         'Diesen Wert mit Faktor 1.5 multiplizieren
    V = V + SigZ(1)                                                         'und als Vergleichswert in Variable able-
  Wend                                                                      'gen.

  SigZ(2) = SigZ(1) * 10                                                    'Wert aufbereiten zur LCD-Anzeige

  Locate 4, 12                                                              'Text auf Lcd-Display positionieren und
  Lcd SigZ(2); "ms   "                                                      'ermittelten Wert anzeigen.
  Wait 3                                                                    'Text 3s lang anzeigen.

  SigDauer = V                                                              'Ermittelten Wert zurückgeben

  Return

End Function