Auf dem Weg bin ich gerade. Werde ich Testen wenn ich die Abfragerei zusammen habe.
Auf dem Weg bin ich gerade. Werde ich Testen wenn ich die Abfragerei zusammen habe.
Könnte man auch mit Folgendem etwas anfangen. Denn das habe ich momentan in Gebrauch um das DCF-Signal besser kennenzulernen.
Code:Cls 'LCD-Display löschen und Meldung ausgeben. Locate 3, 1 'Textposition auf LCD-Display festlegen Lcd "Minutenl{245}cke suchen" 'und Text Minutenlücke suchen ausgeben signalgap = 0 'Signalbreite löschen While signalgap < 1700 'Solange empfangen bis Minutenlücke gefun- 'den ist. ' Ende der Sekundenmarke suchen, DCF-Signal wird "0" While dcf77inp = 1 'Ende der Sekundenmarke suchen, DCF-Signal Waitms 1 'wird 0. Im ms-Takt abfragen Wend ' Breite der Lücke messen (Zeit während der das DCF-Signal "0" bleibt) signalgap = 0 'Signalbreite löschen While dcf77inp = 0 'Neue Signalbreite messen in dem der Ein- Incr signalgap 'gang im 1ms-Abstand abgefragt wird. Waitms 1 'Solange Signal Low ist, Zähler erhöhen Wend 'Solange wiederholen bis Signal 1 ist. Locate 3, 1 'Textposition auf LCD-Display festlegen Lcd " " 'und alten Text löschen. Locate 3, 1 'Textposition wieder auf Anfang 3. Zeile Lcd "L{245}cke: "; signalgap; " " 'und Text + Signallänge ausgeben Wend ' ***************************************************************** ' * Minutenlücke gefunden (Signalgap >= 1700ms) * ' ***************************************************************** Cls 'LCD-Display löschen. Locate 3, 1 'Textposition auf LCD-Display festlegen. Lcd "Bits empfangen..." 'Und Text ausgeben. Reset signalerror 'Fehlerflag für Signalempfang löschen bitcount = 1 'Bitzähler auf 1 setzen While BitCount <= 59 If BitCount >= 59 Then BitCount = 0 'Test um die Zeiten auf dem Display zu sehen ' While signalerror = 0 AND bitcount <= 59 ' Breite der Sekundenmarke messen: <70ms = Störpuls, 100ms = "0", 200ms = "1" signalwidth = 0 While dcf77inp = 1 Incr signalwidth Waitms 1 Wend ' Die erste Sekundenmarke (Minutenanfang) wird immer wesentlich kürzer gemessen. ' Grund unbekannt. Daher wird hier die erste Marke künstlich um 20ms verlängert. If bitcount = 1 Then signalwidth = signalwidth + 30 '1. Marke verlängern Locate 2, 1 'Alten Text auf dem LCD-Display 'Lcd " " 'löschen. 'Lowerline Select Case signalwidth Case Is < 65: Set signalerror 'Sekundenmarke ist zu schmal Lcd "error"; signalwidth Case 65 TO 110: dcfbit(bitcount) = 0 'Signalbreite ergibt "0" Lcd "(0) "; signalwidth; " " Case Is > 110: dcfbit(bitcount) = 1 'Signalbreite ergibt "1" Lcd "(1) "; signalwidth; " " End Select Incr bitcount 'read next bit ' Lücke überspringen signalgap = 0 Locate 2, 12 While dcf77inp = 0 Incr signalgap Waitms 1 Wend Lcd SignalGap; " " Locate 3, 1 I = SignalWidth + SignalGap LCD I; " " If signalgap < 700 Then Set signalerror 'Lücke war zu kurz Wend
Hallo,
Der Fehler in diesen Programm ist, dass vergessen wurde, dass die LCD-Befehle auch Zeit für die Ausführung benötigen!
Kommt jetzt aber Ganz auf die Bibliothek, das verwendete Interface des LCD und was ausgegeben wird an, wie lange da jeweils gearbeitet wird.
Die gemessenen Zeiten bestehen also aus dem was mit der 1ms Delay gemessen wurde plus dem was die LCD-Befehle dazwischen benötigt haben.
MfG Peter(TOO)
Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?
Zur Zeit läuft die Uhr, aber ich habe da von der DS1307 eine Abweichung innerhalb von 21 Stunden von -7 Sekunden.
Jetzt gerade wird das DCF-77 Signal durch ein nicht Timergestütztes Polling abgefragt. Es wird alle 1ms nachgeschaut was denn der DCF-77 Eingang so macht.
Zu diesem Zweck wird auch der Interrupt INT0 abgeschaltet, solange das DCF-Signal abgetastet wird. Erst nach einer Minute dann wird der Interrupt INT0 wieder freigegeben.
Jede Sekunde wird der RTC ausgelesen und auf dem LCD-Display angezeigt. Der Takt dazu kommt vom DS1307 und löst das Ganze über den INT0-Interrupt aus.
Und jetzt kommt mein dickes Problem:
Wenn ich das DCF-77 nun erneut zum Abgleich einlese, habe ich in dieser Zeit keine LCD-Anzeige der Uhrzeit, da ja der Interrupt INT0 abgeschaltet wird.
Nun fällt mir leider zur Zeit pardout nicht ein wie ich:
1. Das DCF-77 Signal per Interrupt alle 1ms, oder doch besser alle 10ms, sample und auch dann die Zeiten auswerte
2. Der DCF-77 Empfang und Kodierung im Hintergrund abläuft, so dass die Uhrzeit auf dem LCD-Display immer weiterläuft.
Wäre ganz Toll wenn ich in dieser Richtung Unterstützung bekommen könnte.
Eine Lösung für die etwas hinterherhinkende DS1307 wäre die Zeitabweichung festzustellen und einmal (in der Nacht) die DS1307 entsprechend korrigieren.
Noch besser aber ist wenn man das Ganze in der Nacht nach obigen Punkten wieder syncronisert.
Hier der bisher verwendete Code aus dem Internet:
Wie kann ich hier eine Datei bzw. den gesamten Quellcode anhängen ????
Forume meldet, dass der Text zu lang sei.
Ich würd die Abfrage der Zeit nicht in ein 1ms Raster legen.
Egal ob nun Timer Interrupts oder Delay's.
Probier doch die Flanken deines DCF Empfängers auszuwerten.
Wenn Du die Sensing Umschalterei im Interrupt nicht magst, kannst Du ebenso 2 Interrupt Eingänge parallel schalten ( z.B. INT0 und INT1 ) und den einen auf steigende Flanke und den anderen auf fallende Flanke programmieren.
Ein Timer läuft frei - Günstig wär ein 16 Bit Timer.
Den Prescaler so einstellen, das 2 Sekunden überbrückt werden können. Eventuell einen Overflow Counter im Timer Overflow mitlaufen lassen.
Der Vorteil ist , das die Interrupts mit 2Hz aufgerufen werden.
Bei deiner Polling Methode läuft das Ganze mit 1000Hz.
Das bedeutet, Du hast keine Probleme um dein Display anzusteuern.
1ms Abtastrate ist übertrieben, 10-50ms reichen.
Das obige Programm ist im Prinzip OK, aber es muss in einem Interrupt abgetastet werden.
Das Abtasten der Flanken macht eine Menge Probleme, das reale Signal des Empfängers sieht eben nicht so schön aus, da hat es eine Menge Störimpulse drauf, besonders bei Gewittern. Mit dem Abtasten, fallen da schon eine Menge der Störimpulse raus.
Wie im obigen Programm, macht man ein Blindfenster von etwa 700ms, in welchem gar nicht abgetastet wird, dann sieht man auch die Störungen nicht und muss diese auch nicht extra behandeln. Das Blindfenster endet etwa 50ms vor der Sekunde. Die Abtastung nimmt man nur während der 300ms vor.
Beim Starten muss man aber zuerst synchronisieren. Da wird dann dauernd abgetastet, bis man einen gültigen 100ms oder 200ms Impuls eingefangen hat.
Ich habe das zu DOS-Zeiten erstmalig für den IBM-PC gemacht. Der Treiber sass da im Timertick von DOS (18.7 Hz, wenn ich mich recht erinnere) und hat dann einfach die System-Uhr korrigiert.
MfG Peter(TOO)
Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?
Mit den Störsignalen hast Du natürlich recht.Das Abtasten der Flanken macht eine Menge Probleme, das reale Signal des Empfängers sieht eben nicht so schön aus, da hat es eine Menge Störimpulse drauf, besonders bei Gewittern. Mit dem Abtasten, fallen da schon eine Menge der Störimpulse raus.
Beim AVR ist die Abtasterei in einem Timer Interrupt allerdings auch relativ einfach.
10ms Abtastrate im Prinzip auch kein Problem.
Impulsauswertung müsste man aber trotzdem machen - Liegt die berechnete Impulslänge innerhalb der zulässigen Grenzen?
Wenn nicht handelt es sich um einen Fehlimpuls bzw. Störung.
Bei meiner letzten DCF Steuerung hab ich einfach einen internen Timer als Basis für eine Uhr mitlaufen lassen.
Diese Uhr wird vom DCF Signal beim 30. Impuls einer Minute nachgestellt.
Also in der 30. Sekunde jeder Minute nachgestellt, wenn vorher alle parity Bits des Signals in Ordnung waren.
Die interne Uhr ( Stunden und Minuten ) wurde bei mir erst wieder auf die DCF Zeit nachgestellt, wenn 3 mal eine gültige DCF Zeitinformation ( 3 Minuten ) in Folge empfangen wurde.
Auch Doppelfehler mit gültigem Parity sollten somit keine Chance haben und auch eine automatische Sommer Winterzeit Umstellung ist damit gewährleistet.
Der am Controller verwendete Quarz dürfte so genau sein, das man damit auch mal ne Stunde DCF Ausfall überbrücken kann.
Ein Hardware RTC ist hier natürlich wesentlich genauer.
Gute RTC Chips haben eine Abweichung von 3 Minuten pro Jahr!
DCF hat natürlich den Charme einer Automatischen Sommer / Winterzeit Umstellung, das nicht jeder RTC Chip bietet.
Lesezeichen