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







Zitieren

Lesezeichen