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
Lesezeichen