PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DCF77-Zeit sekundengenau Geräte ein- und ausschalten / Unterstützung gesucht !



Funkpeter
01.10.2014, 16:41
Hallo,

mit einem DCF-Modul, dem DCF-RS1-Wandler und einem entsprechenden Controller möchte ich sekundengenau 3 Geräte abwechselt / zyklisch für 5 Minuten ein- bzw. ausschalten (dauerhaft).

Eigentlich müßte dies doch ohne großen Aufwand möglich sein? Das Auslesen der Minuten und Sekunden sehe ich als schwierigsten Teil an. Dann auch die Frage, wird an den Ausgängen TTL-Technik angesteuert.... ? Zur ezit bin ich dabei das Programm / Projekt in Worte zu fassen - zu beschreiben um daraus die erforderlichen Befehle zu "generieren".

Über jede Info, wie ich dies mit Hardware- als auch Software realisieren kann, bin ich sehr dankbar, da ich erst in das Thema "Programmieren in Bascom Basic" eingestiegen bin - bitte daher um etwas Geduld bei meinen Anfragen ;)

Grüße aus der Nähe von Bremen
Peter

wkrug
01.10.2014, 17:01
Für das Auslesen der DCF Daten dürfte sich für Bascom eine Library finden lassen.
Dort sollten dann die einzelnen Werte in Variablen abgelegt sein, die Du dann für dein Programm übernehmen kannst.

Ich nehme mal an, das Du 220V Geräte schalten willst. Das diese Spannung Lebensgefährlich ist dürfte Dir klar sein, Du solltest also schon wissen, was Du da tust.
Zur Ansteuerung deiner ( 220V ??? ) Geräte kannst Du ein Solid State Relais verwenden.
Ein Controller wird vermutlich nicht genug Strom für die LED im SSR bringen, deshalb würd ich da nen kleinen FET wie z.B. nen BS170 als Treiber verwenden.

Ein SSR braucht üblicherweise noch eine externe Beschaltung - Welche, das hängt von der zu treibenden Last ab und sollte sich im Datenblatt finden lassen.

fredred
02.10.2014, 11:10
Hallo Peter,

kleiner Schnipsel.

' DCF77 auf PinB.0 gelegt
Config Dcf77 = Pinb.0 , Timer = 1 , Debug = 1 , Check = 1 , Inverted = 1 ', Gosub = Sectic
'Hinweis: [Gosub=Sectic] wird jede Sekunden gestartet wenn aktiv.Natürlich muss du dann diese Sub anlegen.

' Datumsformat festlegen
Config Date = Dmy , Separator = .

'Synchronisiere die Uhrzeit mit dem DCF77 Zeitsignal..."
'Auf die Synchronisierung der Uhrzeit mit dem DCF77 Zeitsignal warten.
'dann muss Dcf_status.7 = 0 sein.
'Hinweis: Für programmier Arbeiten/Test einfach Status auf 1 setzen
'somit musst Du nicht die ca. 3 Minuten warten bis synchron Erfolgreich
'beendet wird und Programm weiterläuft. Ist DCF angeschlossen wird trotztem
'die Zeit übernommen.[DCF läuft ja im Hintergrund]
'ich lasse Status immer auf 1 denn Time ist durch 16 MHz Takt sehr genau
'auch wenn DCF77 mal kein "sauberes Signal empfängt" wird ja trotztem getaktet.
'Bei Datenerfassung mit Zeitstempel natürlich auf 0 setzen.

While Dcf_status.7 = 1
' Dcf_status.7 wird auf 1 gesetzt sobald die Zeit erfolgreich synchronisiert wurde
' aktuelle Zeiten (intern und DCF) sowie den Status zum Terminal ausgeben
Print "Dcf : " ; "Uhr " ; Time(dcf_sec) ; " " ; "Datum " ; Date(dcf_day) ; " Status " ; Dcf_status.7

Locate 1 , 1 'Cursor auf 1 Zeile, 1 Spalte
Lcd "DCF77 Synchron start"
Locate 3 , 1 'Cursor auf 3 Zeile, 1 Spalte
Lcd " Datum " ; Date$
Locate 4 , 1 'Cursor auf 4 Zeile, 1 Spalte
Lcd " Zeit " ; Time$
Wend

Print "Uhrzeit erfolgreich synchronisiert ! " ; Time$ ; " " ; Date$
Locate 2 , 1 'Cursor auf 2 Zeile, 1 Spalte
Lcd " Status OK "
Wait 3
Cls 'Anzeige löschen

Gruß
Fred

Funkpeter
02.10.2014, 16:57
Hallo Fred,

vielen Dank für die Programmzeilen!

Die Aus- und Einschaltzeiten werde ich mit LEDs zum Testen "überwachen".

Werden in Deinen Zeilen z.B. der Zustand... "... wenn der Wert für Minuten 00 und der Wert für Sec. 59 wahr ist, dann schalte den Ausgang xy auf high (einschalten) oder auf low (ausschalten) abgefragt? In meiner Programmbeschreibung gibt es in jeder Stunde 24 Schaltzustände, da ich 3 Geräte jeweils alle 5 Minuten - beginnend in der 00 Minute und 00 Sekunde - ein- bzw. ausschalte (und dies in einer Endlosschleife)!
Zur Auswertung der Zeit benötige ich eigentlich weder Datum noch Wochentag noch Stunde....?? oder liege ich da falsch?
Minuten und Sekunden müsste ich als "WERT" oder Zahl ermitteln und bei zutreffendem Wert eine Schaltaktion veranlassen , z.B. ... if minutenwert=00 und SecWert=59 then Dcf_status.7 = 1 (LED leuchtet bzw. Gerät wird eingeschaltet) und dies für alle anderen Schaltzeitpunkte.

Ich hoffe ich habe Deine Programmzeilen richtig interpretiert.

Nochmals vielen Dank für Deine Infos!

Herzliche Grüße aus der Nähe von Bremen
Peter

fredred
02.10.2014, 17:42
Hallo Peter,

sende einfach mal deine Wertetabelle.
Z.B. sind 5 Minuten um setze Portpin auf L oder H oder Verknüpfe mehrere Portpin wenn
Portpin1 gleich 1 dann setze Portpin2 /3 auch auf 1 oder erst nach 24 Stunden setzen usw.

Gruß
Fred

Funkpeter
03.10.2014, 13:00
Hallo Fred,

im Anhang sende ich Dir die Schaltzeiten-Tabelle. Nach Zuweisung der Ein-Ausgänge und Schleifenüberwachung, welche Minute und Sec. gerade aktuell ist, würde ich auf dem Testboard immer eine von 3 LEDs für 5 Minuten leuchten sehen. Noch bin ich dabei mir diverse Befehle von Bascom in ihrer Funktion klar zu machen.
Für weitere Ideen und Hinweise bin ich immer dankbar. Ich hoffe mein Projekt in den nächsten Monaten Realität werden zu lassen.

In diesem Sinne einen sonnigen 3. Oktober !

Herzliche Grüße aus der Nähe von Bremen
Peter

29154

fredred
03.10.2014, 15:24
Hallo
Hallo Peter,

mit dieser Config bekommst du die Variablen Date$ und Time$ übergeben.
Config Dcf77 = Pinb.0 , Timer = 1 , Debug = 1 , Check = 1 , Inverted = 1 ', Gosub = Sectic
Wichtig ist noch je nach DCF77 die Inverted Einstellung. Viele benötigen [Inverted = 0]

Nun brauchst du nur noch Time$ auswerten.
Kleiner Ansatz:

If Time$ = „00:00:00“ And Time$ < “00:05:00” Then
Set Portpin1
Else
Reset Portpin1
End If

Gruß
Fred

peterfido
03.10.2014, 17:39
Da kann das kleiner als auch weg bleiben. Es sei denn statt des = kommt ein größer gleich. Ich wusste gar nicht, dass man Zeiten mittels größer und kleiner auf Bereiche prüfen kann. Wieder was gelernt. Bisher habe ich immer _hour, _min und _sec ausgewertet.

fredred
04.10.2014, 12:07
Hallo peterfido,

natürlich gibt es verschiedene Lösungswege, wenn BASCOM schon so was anbietet, warum nicht nutzen.
Möchte man aber ein Zeitfenster muss doch auch ein „kleiner“ abgefragt werden, oder?
Nahm an dies möchte Funkpeter so. IF war nur als Ansatz gedacht. Da er 4 Zeitfenster pro Portpin benötigt, können mit Or -Verknüpfungen vor Then, die anderen 3 eingebunden werden.
Auch ein Vorteil ist die Stunden- Dateabfrage um noch mehr Entscheidungen zu treffen.
z.B.

If Date$ = „31.12.2014“ And Time$ = „23:59:59” Then
Set Portpinx ‘ ist Anweisung für Zünder Feuerwerk starten.
End If

Da DCF77 sehr genau ist. Werden die Nachbarn staunen.

Zeitumstellungen gehen ja auch automatisch.
Nun wisst Ihr warum ich DCF gegenüber Quarz Taktgeber bevorzuge.

Noch ein kleiner Hinweis:
Baue DCF77 Module in ein kleines Gehäuse ein, schalten noch ein Transistor nach(für Flankensteilheit noch eine LED für Empfangskontrolle) dann mit ca. 2 Meter 3 adriges Kabel zum Controller(VCC, GND und Signal)
Somit kann ich Modul auf optimalen Empfangsort ausrichten.

Mit freundlichen Grüßen
fredred

Besserwessi
04.10.2014, 13:09
Je nach Ort ist das DCF77 Signal nicht immer zuverlässig zu Empfangen. Bremen sollte noch nicht so kritisch sein. Das kann an der Signalstärke liegen aber auch an externen Störungen durch Schaltnetzteile / alte Röhren-Fernseher (wird weniger). Entsprechend sollte die Steuerung gut auf Fehler und Plausibilität Prüfen, sonst geht die Uhr ggf. auch mal 2 Stunden oder so falsch - so einen dummen Funk-Wecker der manchmal um ein paar Stunden falsch geht hab ich noch rumliegen. Für die Zwischenzeit ist man dann auf den Quarz am µC angewiesen.

Funkpeter
04.10.2014, 15:52
Hallo Fred,
Hallo Peterfido,
Hallo Besserwessi,

der Funkempfang des DCF77-Senders ist nahe (nördlich) von Bremen -bei mir - kein Problem....
Die Bascom-Lib für DCF77 liefert doch aus bei Ausfall des DCF77-Signals eine hochgenaue interne Uhrzeit. Dies sollte vorübergehend auch genau genug sein.

Nun bin ich dabei w.o. geschrieben diverse Befehle in Bascom zu erarbeiten um zu verstehen, was ich da demnächst eigentlich programmiere. ;). Mich interesseieren ja "nur" die Auswerteroutinen für die Minuten und Sekunden. Zu Testzwecken suche ich aktuell einen Hinweis, ob die interne Uhr des PCs über Bascom abgefragt werden kann....???? Kann man das tun? Und wie lautet der Befehl? Ich benötige den Zeitstring um damit zu experimentieren, bevor ich mich an das Programmieren des Schaltzeitenprogramms mache.
Für Hinweise und Ergänzungen schon mal vielen Dank!
Peter

fredred
04.10.2014, 16:33
Hallo Besserwessi,

hatte ja den Hinweis eingefügt.
Nach meinen Erfahrungen ist DCF in ganz Deutschland sehr zuverlässig, wichtig ist die Empfangsqualität. Somit auch abhängig was für ein Modul verwendet wird.
Die Flanken müssen eben sauber für Synchronisierung sein(Bitte beachten DCF sendet nicht nur Datum und Zeit sonder noch viele Infos mehr)
Die erwähnte Config vergleicht nur ob DCF Date(dcf_day) und Time(dcf_sec) keine Abweichungen zu Date$ und Time$ haben. Wenn Ja nur dann kommt Abgleich....
Somit ist dies eine sehr gute Plausibilität Prüfen.
Der MCU , sage ich mal, wird schon mal die Zeit einige Tage sekundengenau halten. Auch ohne DCF Signal. Der interne MCU Timer ist doch aktiv.

Mit freundlichen Grüßen
fredred

- - - Aktualisiert - - -

Hallo Peter,

nun verstehe ich nichts mehr.

Möchtest keine DCF- Zeit für MCU sondern die PC-Zeit als Zeitstempel nutzen.
Ist möglich, aber nur wenn dein PC immer an ist und eine Schnittstelle zum MCU aktiv.
Wie beschrieben kannst du alle DCF Infos mit Print mit Terminalprogramm lesen.

Kann sein ich habe dich falsch verstanden.
Gruß
Fred

Funkpeter
04.10.2014, 16:55
Hallo Fred,

für meine Anwendung nutze ich, wie anfangs geschrieben, die DCF77-Zeit.
NUR zum Experimentieren würde ich die PC-Zeit nutzen wollen. Alles soweit OK.
Spätestens wenn ich die ersten Programmteile geschrieben habe, melde ich mich wieder. Aber Fragen habe ich natürlich ständig .... :)
Die Infos in diesem Blog haben mich schon gut vorangebracht!
DANKE!

Sonnige Grüße aus dem Norden
Peter