Statt DCF77 ein GPS Zeitempfänger.

fredred

Mitglied
1 Okt 2015
65
2
7
Hallo,

hat jemand praktische Erfahrungen mit preiswerte GPS- Module wie z. B. Neo-6M- 0-001.
Mir geht es nicht um mehr Genauigkeit, da bin ich immer noch mit DCF77 voll zufrieden, wenn Antenne ausgerichtet und der Geradeaus-Empfänger optimal ist.
Nun benötige ich einen zuverlässigen Zeitstempel für ein schnell ortveränderliches Projekt(Datenlogger) Da ist natürlich ein DCF77- Empfänger nicht die beste Wahl.
Die Datenauswertung der GPS- Module Neo-6M scheint ja auch mit Bascom kein Problem zu sein. Kommunikation über serielle RX/TX Verbindung.

Mit freundlichen Grüßen
Fred
 

Janiiix3

Aktives Mitglied
28 Sep 2013
1.321
10
38
Hannover
Sprachen
C, C#

fredred

Mitglied
1 Okt 2015
65
2
7
Hallo Janiiix3,

Genau solche Module habe ich auf Werkbank getestet.3 Stück .
Musste aber feststellen das auch bei diesen GPS-Modulen eine sehr saubere und stabile Betriebsspannung genau wie bei den DCF- Modulen nötig ist. 3,3 – 5,0 Volt sind angegeben aber bei 5 Volt schon 70mA und Module startet nicht suche nach Satelliten.
Bei 3,0 Volt und ist Rip < 0,1mV , dann schon stabil aber auch hier ist die Einschwinkzeit nach einschalten der Betriebsspannung sehr unterschiedlich von 1 bis 20 Minuten. Mach ich da was falsch.
Oder müssen die Dinger immer unter Saft stehen wenn einmal „eingerastet“.

Mit freundlichen Grüßen
Fred
 

Mikro23

Aktives Mitglied
2 Jan 2017
365
33
28
Großraum Hannover
Sprachen
C, Assembler
Nun benötige ich einen zuverlässigen Zeitstempel für ein schnell ortveränderliches Projekt(Datenlogger) Da ist natürlich ein DCF77- Empfänger nicht die beste Wahl.
Ohne großen Aufwand hat eine RTC eine Abweichung von +/-10 bis 15 Sekunden pro Monat.
Per DCF-Empfänger spätestens alle paar Tage (vorzugsweise Nachts, da ist der Empfang meist besser) neu synchronisiert, sollte sich eine Abweichung von höchstens einer Sekunde erreichen lassen…
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3.341
61
48
Marwitz
Sprachen
BascomAVR, Assembler
Hmm...
Aber wenn die RTC driftet, stören die DCF/GPS-Synchronisationen möglicherweise sogar mehr als die Drift. Also zumindest, wenn der
zu Langzeitmessungen genutzt werden soll...
Ohne großen Aufwand hat eine RTC eine Abweichung von +/-10 bis 15 Sekunden pro Monat.
Scheint über den Daumen zu passen - die hier kämen etwa auf 7,5s pro Monat (+/-3ppm), allerdings ist die RV-8263-C7 da sogar mit +/-1ppm angegeben...
 

fredred

Mitglied
1 Okt 2015
65
2
7
Hallo Mikro23,

Danke für Antwort.
Dies ist mir bekannt. Aber habe ich Projekt einmal angewiesen die interne Zeit(RTC) durch DCF77 zu synchronisieren und aus Standortgründen ist kein Signal da oder noch schlimmer ein gestörtes Signal ist die Wahrscheinlichkeit hoch das die Zeit nicht oder falsch gestellt wird. Hoffe GPS- Zeit ist auch noch im weiten Osten zu empfangen.

Mit freundlichen Grüßen
Fred
 

Janiiix3

Aktives Mitglied
28 Sep 2013
1.321
10
38
Hannover
Sprachen
C, C#
Hallo Mikro23,

Danke für Antwort.
Dies ist mir bekannt. Aber habe ich Projekt einmal angewiesen die interne Zeit(RTC) durch DCF77 zu synchronisieren und aus Standortgründen ist kein Signal da oder noch schlimmer ein gestörtes Signal ist die Wahrscheinlichkeit hoch das die Zeit nicht oder falsch gestellt wird. Hoffe GPS- Zeit ist auch noch im weiten Osten zu empfangen.

Mit freundlichen Grüßen
Fred
Das mit dem falschen empfangen Datensätzen habe ich auch gehabt bei meiner Uhr.
Habe das so gelöst das ich mehrere Zyklen empfangen habe und dann alle miteinander verglichen habe (bis auf die Sekunden)! Bis heute keine falschen Daten auf der Uhr gehabt.
 

fredred

Mitglied
1 Okt 2015
65
2
7
Das mit dem falschen empfangen Datensätzen habe ich auch gehabt bei meiner Uhr.
Habe das so gelöst das ich mehrere Zyklen empfangen habe und dann alle miteinander verglichen habe (bis auf die Sekunden)! Bis heute keine falschen Daten auf der Uhr gehabt.
Hallo,
Falsch empfangene Datensätze von Dcf77 auf Plausibilität prüfen ist okay wenn überhaupt ein kompletter Datensatz empfangen wurde. Dass zyklisches Empfangpaket dauert ja eine Minute ab Startsignal, was ist wenn die Übertragung immer wieder gestört wird oder länger ausfällt.
Da liegt mein Problem. Da die ständige Ortsveränderung des DCF77- Moduls nicht funktionieren kann.
Somit Schluss mit RTC und Co also den Zeitstempel direkt und fast in Echtzeit für einen AVR holen, ist die Idee.
Sollte doch mit GPS- Module möglich sein, wenn diese wie versprochen.
Hohe Genauigkeit für Zeitauswertung und gute Regeleigenschaften haben.

Somit sollte meine Anfrage verstanden werden, ob und wo es Probleme geben kann.

Mit freundlichen Grüßen
Fred
 

fredred

Mitglied
1 Okt 2015
65
2
7
Hallo,
nun habe ich diese GPS- Module getestet und muss leider feststellen, dass diese noch nicht meine Erwartungen hinsichtlich Mobilität entsprechen. Natürlich wird die Empfangsqualität bei ungünstigen Standorten besser als mit einem DCF77- Modul.

Erlaube mir mal meine Erfahrungen zu äußern.

Modulabmessungen mit integrierter Antenne okay.
Laut Datenblatt:
VCC: Power supply pin input 3.3-5.5V 45mA

Bei 3,3 Volt 60mA bei 5,0 Volt 130 mA Dauerwert bis „Normalbetrieb“ Start. Alle Module starten nicht in räumlicher Umgebung(Werkstatt) Na klar gelesen, GPS, ist nur mit Außenantennen möglich also höhere Kosten und ein erhöhter Aufwand.
Gute Aktivantenne, wie vom Hersteller empfohlen, angeschlossen.
Specification:
Connector: Male
Frequency Range: 1575.42MHz
Voltage: 3-5V
DC current: 10mA Max
Polarization: Circular (RH)
LNA Gain (Without cable): 28dB typ.
Noise Figure: 1.5dB typ.
Operating Temperature (Deg.C) -45~+85
Storage Temperature (Deg.C) -50~+90
Humidity: 100%
Weatherproof: Yes
Cable length: 3 meters
Size: 45 x39 x13 mm (main unit)


Bei 3,3 Volt 75mA Dauerwert bei 5,0 Volt 350 mA (Testabbruch nach einsetzen der Strombegrenzung)

Ein Zuverlässiger Kaltstart ist nur mit Außenantenne und im Spannungsbereich von 3,3 bis 3, 8 Volt möglich. Bis zum Start bei 3,3 Volt 75 mA dann 60 mA.
Dieser Energieverbrauch ist schon sehr hoch gegenüber DCF und schließt Akku- oder Batterie betrieb für Projekt aus. Es ist zu beachten ein Kaltstart kann bis zu 20 Minuten dauern und ein Warmstart auch schon mal mehr als eine Minute. Ein Warmstart kommt unverzüglich wen Antenne Satelieten nicht mehr „sieht“.Kann ja mal schnell basieren dass Antenne ein Dach bekommt, kann eine Tiefgarage, ein Tunnel oder Regenschirm u.s.w. sein.

Vom Datenumfang/Schnittstelle(liefert alles dekodiert und übersichtlich) und Störsicherheit bin ich begeistert.
Hab mal mit BASCOM eine kleine Auswertung aller gesendete Blöcke erstellt und zum Test eine Uhr mit LCD – Anzeige [ Zeit Datum] dann noch wie viel Satteliten werden gesichtet(4 sollten es ja schon sein) und die Koordinaten wo Projekt steht.
HW ist ja Null Problem. 3,3 Volt für Modul und Mega 644p(hatte ich gerate auf Steckbrett ein M8 reicht auch muss nur Uart haben, wenn wie ich, Modul und AVR direkt mit 2 Strippen(GND und Signal)verbinde.

SCHICK und zuverlässig wen nicht die spezifischen Projektprobleme währen.
Naja diese GPS- Module sind für ein „Kurzzeitstart“noch sensibler als DCF77 dann sage ich erst mal ich bleibe bei der altbewährten Zeitbasis.
Hat ja auch den Vorteil muss mich nicht um Zeitzonen kümmern und für was sich unsere Politiker bei der Abschaffung der Zeitumstellung entscheiten, könnte ja wie gehabt eine sehr lange und kostenaufwendige Aufgabe für viele Jahre werden.
Ich bezweifle dass diese die Normalzeit wieder wollen. Das Wort Normal passt nicht mehr in den heutigen Politentscheidungen.

Bitte Kommentare als privaten Amateuranwenderbericht betrachten Diese Module können bestimmt viel mehr.

Zum Abschluss mein Dank für Antworten.
Mit freundlichen Grüßen
Fred
 

fredred

Mitglied
1 Okt 2015
65
2
7
Entschuldigung Thema war eine Anfrage und sollte nun geschlossen werden, da Frage zu allgemein war, nun versuche ich mit kleinen Schritten selber praktische Erfahrungen zu sammeln.

Muss nur richtig stellen.
Naja diese GPS- Module sind für ein „Kurzzeitstart“noch sensibler als DCF77 dann sage ich erst mal ich bleibe bei der altbewährten Zeitbasis.
War Falsch.
Die billigen Module können zu viel für das was ich diese brauche.
Die Module empfangen Signale von bis zu 11 Satelliten gleichzeitig
Na das ist doch was
Die viel verschiedenen GPS-Sequenzen für standardisierten NMEA- Format benötige ich nicht alle für einen zuverlässigen Zeitstempel. Möchte nur an fast jedem Ort ohne ausrichten der Antenne die aktuelle Zeit.
Mir war bekannt:
Aus den Laufzeiten der verschiedenen Funksignale läßt sich die Entfernung und damit die exakte Position des Empfängers in Längen- und Breitengrad bestimmen. Dies wird auch für Berechnung der Uhrzeit benötigt.
Neben den Positionsdaten stellt der Empfänger auch weitere Daten, wie z.B. Geschwindigkeit,
Bewegungsrichtung, Höhe, in den verschiedenen NMEA Datensätzen zur Verfügung. Zum Teil überlappen sich die Informationen der NMEA- Datensätze, so dass normalerweise nie alle Datensätze gleichzeitig vom Anwender benötigt werden.
Die Übertragung der GPS-Datensätze gemäß NMEA-Version 0183 wie GGA, VTG und wenn vorhanden ZDA, sind ausreichend. Der Rest wird für ZEITSTEMPEL nicht benötigt.
Leider kann ich noch nicht die Sequenz ZDA erfassen. Diese stellt die Time und Date- Nachricht für lokale Zeitzone zur Verfügung.
Naja bin erst mal dabei die Grundfunktionen der Register zu verstehen.
Mit Print erst mal bei Programmstart Modul angewiesen die Sequenzen MSS, RMC, GSV,GSA und GLL abzuschalten.
Dumm an den Modulen finde ich die Default- Moduseinstellung, wenn der Empfänger keine feste Position berechnet ist das Statusfeld ungültig, Infos werden auf Null gesetzt und das kann dauern.
Mal sehen wen ich die Wiederholrate auf Minimum setze und nur den Status q in GGA als „gültige“ Zeitübernahme nutze.

Nun möchte ich euch nicht mehr mit eigenen Antworten belästigen.
Danke und Tschüß
Fred
 

Tschoeatsch

Mitglied
24 Okt 2015
102
11
18
60
Sprachen
BascomAVR
Hi Fred, probiere doch das mal


CodeBox BascomAVR

'Zeit und Datum (UTC) aus GPS-Modul auslesen
'getestet mit Arduino-uno und Neo-6M-GPS-Modul, Modul-TX an Arduino-RX

$regfile = "m328pdef.dat"
$crystal = 16000000
$hwstack = 34
$swstack = 32
$framesize = 40
$baud = 9600



Config Clock = User
Config Date = Dmy , Separator = .
On Urxc Serieller_irq
Enable Urxc
Enable Interrupts

Dim Zeichen As String * 1                                   'empfangenes Zeichen
Dim Zz As Byte                                              'Zeichenzähler
Dim Utc_time As String * 8
Dim Utc_date As String * 8
Dim Einlesen As Bit                                         '=1, dann sind die folgenden empfangenen Zeichen interessant
Dim Zeit_da As Bit                                          '=1 wenn Zeit und Datum empfangen wurden
Dim Zeilencode As String * 5                                'Bezeichnung der Datenzeile
Const Vergleichscode = "GPRMC"                              'diese Zeile wird gebraucht

Wait 2
Print "Übertragungstest"
Do
   If Zeit_da = 1 Then
      Print Utc_time ; "  " ; Utc_date
      Zeit_da = 0
   End If
Loop
End

Serieller_irq:
'Beispiel: $GPRMC,085636.00,A,4934.94722,N,01057.70667,E,0.085,,250719,,,A*78
'Beispiel: $GPRMC,hhmmss.ss,A,llll.lllll,a,xxxxx.xxxxx,a,x.xxx,,ddmmyy,,,a*hh
'                 | | |    | |          | |           | |     ||| | |
'zz Zuordnung     7 9 11   1314         1516          1718    19
'                                                              20
'                                                               212325
   Zeichen = Chr(udr)
   If Zeichen = "$" Then                                    'Start einer Datenzeile erkannt
      Zz = 1                                                'Zeichenzähler setzen
      Einlesen = 1                                             'Zeichen sind interessant
      Zeilencode = ""
   Else
      If Einlesen = 1 Then
         Select Case Zz
            Case 1                                          'Zeichen "G"
               Zeilencode = Zeichen
               Incr Zz
            Case 2                                          'Zeichen "P"
               Zeilencode = Zeilencode + Zeichen
               Incr Zz
            Case 3                                          'Zeichen "R"
               Zeilencode = Zeilencode + Zeichen
               Incr Zz
            Case 4                                          'Zeichen "M"
               Zeilencode = Zeilencode + Zeichen
               Incr Zz
            Case 5                                          'Zeichen "C"
               Zeilencode = Zeilencode + Zeichen
               If Zeilencode = Vergleichscode Then
               Einlesen = 1                                 'erwünschte Zeile wird übertragen
               Else
               Einlesen = 0
               End If
               Incr Zz
            Case 6 : Incr Zz                                'Trennungskomma
            Case 7                                          'Zeit wird übertragen
               Utc_time = Zeichen                           'Stunde
               Incr Zz
            Case 8                                          'Zeit wird übertragen
               Utc_time = Utc_time + Zeichen                'Stunde
               Utc_time = Utc_time + ":"                    'Trennzeichen einbauen
               Incr Zz
            Case 9                                          'Zeit wird übertragen
               Utc_time = Utc_time + Zeichen                'Minute
               Incr Zz
            Case 10                                         'Zeit wird übertragen
               Utc_time = Utc_time + Zeichen                'Minute
               Utc_time = Utc_time + ":"                    'Trennzeichen einbauen
               Incr Zz
            Case 11                                         'Zeit wird übertragen
               Utc_time = Utc_time + Zeichen                'Sekunde
               Incr Zz
            Case 12                                         'Zeit wird übertragen
               Utc_time = Utc_time + Zeichen                'Sekunde
               Incr Zz
            Case 13 : If Zeichen = "," Then Incr Zz         'Sekundenbruchteile ignorieren und auf nächstes Datenfeld warten
            Case 14 : If Zeichen = "," Then Incr Zz         'auf nächstes Datenfeld warten
            Case 15 : If Zeichen = "," Then Incr Zz         'auf nächstes Datenfeld warten
            Case 16 : If Zeichen = "," Then Incr Zz         'auf nächstes Datenfeld warten
            Case 17 : If Zeichen = "," Then Incr Zz         'auf nächstes Datenfeld warten
            Case 18 : If Zeichen = "," Then Incr Zz         'auf nächstes Datenfeld warten
            Case 19 : If Zeichen = "," Then Incr Zz         'auf nächstes Datenfeld warten
            Case 20 : If Zeichen = "," Then Incr Zz         'auf nächstes Datenfeld warten
            Case 21                                         'Datum wird übertragen
               Utc_date = Zeichen                           'Tag
               Incr Zz
            Case 22                                         'Datum wird übertragen
               Utc_date = Utc_date + Zeichen                'Tag
               Utc_date = Utc_date + "."                    'Trennzeichen einbauen
               Incr Zz
            Case 23                                         'Datum wird übertragen
               Utc_date = Utc_date + Zeichen                'Monat
               Incr Zz
            Case 24                                         'Datum wird übertragen
               Utc_date = Utc_date + Zeichen                'Monat
               Utc_date = Utc_date + "."                    'Trennzeichen einbauen
               Incr Zz
            Case 25                                         'Datum wird übertragen
               Utc_date = Utc_date + Zeichen                'Jahr
               Incr Zz
            Case 26                                         'Datum wird übertragen
               Utc_date = Utc_date + Zeichen                'Jahr
               Zeit_da = 1                                  'Einlesen von Zeit und Datum komplett
               Einlesen = 0                                 'weitere Zeichen sind uninteressant
         End Select
      End If
   End If
Return

 

fredred

Mitglied
1 Okt 2015
65
2
7
Hallo Bascomfreak,

Danke für Code.
Wie geschrieben wenn, ich mit GPS ein Zeitstempel hh:mm:ss: mss bekomme möchte ich Config Clock = User Utc_time = Utc_time + Zeichen u.s.w. nicht mehr verwenden. Warum auch, wenn ich wie gewünscht einen formatierten Zeitstempel fast direkt in Echtzeit bekomme und verwenden kann.
Idee war der Controller muss nicht ein internen Timer für Zeitzeichengenerieren nutzen. Die seriellen HW- Pins sind schon bei den meisten µC als Eigenständige Schnittstellen zu betrachten. Wenn Modul alles erledigt hat und Ergebnis in AVR schiebt muss ich nur noch aus dem Ergebnis die Infos abfragen die ich benötige. Dies Scheint dein Code auch zu machen.


Mein Bascomprogramm ist anders Strukturiert und es sind bestimmt noch Verbesserungen nötig, wenn Test abgeschlossen. Eins ist schon erkannt. Die Module liefern erst Zuverlässige Daten, wenn min 4 Satelliten gesichtet werden und solange sollte jegliche Auswertung ignoriert werden.



Mein Projekt ist noch in der Testphase(Testaufbau ist seit Tagen im Wohnmobil unterwegs und schon über 1000 km vom Start entfernt) Ja man hat ja die Zeit und die Position des Testaufbaus zu Verfügung, die Zeit und Position des Testaufbaus wird gespeichert und dies kann ich nach Rückkehr zum Start mit Gogglemaps bestimmt auswerden. Ist noch kein Problem denn es gab erst 2 Mal die Meldung „Dass gesendete String ist Fehlerhaft“
Zurück zum Thema . Ich wollte nicht wissen wie der allgemeine Datenstrom des Moduls ausgewertet werden kann, nein ob dieser auch verlässiger und leichter zu Händel ist wie ein DCF77- Signal.
Den Schlechten Ruf des DCF77- Signals hatte ich mal in einem Forum versucht zu wiederlegen. War ein Fehler. Somit wollte ich anfragen ob wer hier mit der Zeitauswertung und Regeleigenschaften des GPS- Moduls Erfahrungen hat.


Mein Dank an Tschoeatsch für Nachricht.
Mit freundlichen Grüßen
fredred
 

fredred

Mitglied
1 Okt 2015
65
2
7
Hallo,
Nun möchte ich meinen bescheidenen praktischen Langzeittests mit den GPS- Modulen Neo-6M- 0 –unverbindlich veröffentlichen.
Vorab: Module wurden mit einem AVR Mega644p 16 MHz verbunden und dieser wurde mit einem Bascomprogramm für Abfragen wie Fix- Gültigkeit, Zeit , u.s.w. programmiert mini Ausschnitt der Aufzeichnungen.

erstellt am : 16-09-2019 17:13:15
Version Code : GPS-SD-01.BAS

lese Buffer $GPGGA,092125.00,5153.27583,N,01243.30469,E,1,08,1.04,104.4,M,43.6,M,,*59

lese Sequenz $GPGGA,092127.00,5153.27577,N,01243.30472,E,1,08,1.04,104.7,M,43.6,M,,*59
Zeit UTC 092127.00
Zone 2
Ortszeit 11:21:25
Sat- Fix zeigt = 08
Breitengrad 518879168.0
Längengrad 127217328.0
Distanz Neu 0.0 Meter
Wegtotal = 0.0 Meter
Wegtotal-km = 0
lese Sequenz $GPVTG,,T,,M,0.371,N,0.687,K,A*2F
Geschwindigkeit 0
Aktueller Kurs 0

lese Sequenz $GPGGA,092130.00,5153.27653,N,01243.30482,E,1,08,1.04,104.7,M,43.6,M,,*55
Zeit UTC 092130.00
Zone 2
Ortszeit 11:21:25
Sat- Fix zeigt = 08



Der Mege ist Ideal für Test COM1 für Modul und COM2 für Terminal. Somit eine saubere Trennung.

und natürlich eine Vergleichszeitbasis mit Clock/DCF77.

All diese Auswertungen liefen parallel mit einem hochwertigen GPS Geschwindigkeitsmesser der auch alle Rohdaten wie Zeit auf eine SD- Karte gespeichert hat.
Der Abgleich bestätigt meine Vermutung die GPS-Module sind nicht einfacher zu Händeln, wie die DCF- Module in Hinsicht als ortveränderliche Zeitgeber. Die Verwendeten DCF- Module haben eine Anzeige wenn Zeitinformationen „sauber“ empfangen werden, dann kann mit Taster die Synchronisation zu Clock(RTC) aktiviert werden(ob entscheitet RTC) Diese Aktion wollte ich mit den GPS- Modulen vermeiden. Naja die Satteliten sollen an fast jedem Ort der Welt auch die UTC- Zeit zu Verfügung stellen. Nein da lag mein Denkfehler.

Zitat:
Die Satelliten senden kontinuierlich ihre Bahnpositionen sowie die GPS-Weltzeit alle zum selben Zeitpunkt aus. Von einer GPS-Antenne werden die Daten von den Satelliten empfangen, die im Sichtbereich der Antenne liegen. In einem mehr kanaligen GPS-Empfänger werden diese Daten nun ausgewertet. Aus den Werten wird zunächst die Position der Empfangsantenne bestimmt. Ist die Position berechnet, so können danach die Laufzeiten der Sendeinformationen von den einzelnen Satelliten bestimmt werden.
Aus der GPS-Zeitinformation und den Mittelwerten der Laufzeiten wird nun die GPS-Weltzeit (GPS-UTC) mit einer Genauigkeit von ± 1 µsec zusammengesetzt. Die Genauigkeit der Zeitbestimmung ist in erster Linie von der Genauigkeit der Positionsbestimmung abhängig, weil daraus die genaue Laufzeit bestimmt wird.
Zitat Ende:

Also, wie schon erwähnt liegt es an den GPS- Module Neo-6M wie diese eingestellt werden.
Mit kleinem Testprogramm mal diese Module in der Laufzeit über Terminalbefehle Versucht auf meine Anforderungen anzupassen.
Erkannt. Wenn man nur die Universal Time Coordinated, koordinierte Weltzeit, früher GMT
Benötigt. Sollten alle anderen Sequenzen, für die Zeitdarstellung abgeschaltet werden. Die Info’s von GPRMC stehen fast immer für „Zeitstempel„ sekundengenau zu Verfügung.
Noch ein paar Einstellungen der 5 Eingabesätze bei Programmstart auf Projekt Anforderungen anpassen wie
GSA- Satellitenstatus als 2D-Fix oder 3D-Fix, Rate in Sekunden, 0-255, Prüfsumme 0 = nein, 1 = ja u.s.w. Viele Einstellungen sind für jede Sequenz getrennt möglich und wenn auf die persönlichen Anforderungen richtig angepasst, ermöglichen diese Module(<10€) schon viele Anwendungen wie auch nur als Zeitbasis für eine Uhr .
Achtung bei Eingabesätze Print $xxxx100xx.xx.xx. Da kann man sich schnell aussperren.
Die Software ist aber ein völlig anderes Thema.
Noch eins.
Die lange Kaltstartzeit ist bedingt und nicht zu beeinflussen denn um funktionsfähig zu sein, muss ein GPS-Empfänger mindestens einmal den kompletten Almanach für die primäre Initialisierung bekommen. Die Übertragung des gesamten Almanachs dauert 12,5_Minuten sind ja 25 Einheiten je 30 Sekunden. Jede Einheit ist in 5 Pages a 6 Sekunden aufgeteilt.
Wie erkannt kann der Warmstart durch die direkte Abfrage der Pages und einmaligen setzen dessen Parameter beschleunigt werden und somit auch der Dauerbetrieb. Aber eine neue Positionsänderung < 2 Sekunden zu erfassen, scheint mir unmöglich zu sein. Mal sehen was meine Programmierspielereien noch so ergeben.

Bin zwar schon alt wie Methusalem sein Esel, habe aber wieder was gelernt.

Mit freundlichen Grüßen
Fred
 

fredred

Mitglied
1 Okt 2015
65
2
7
Da direkt auf meine Anfrage nicht viele Antworten kamen hatte ich einige Hardwareerfahrungen geschrieben. Da war zu lesen das durch die Vielzahl der Module/ Modulfirmware als erste Vorraussetzung, dass auslesen derer ist.
Nicht die Hardware ist oft an Frust schuld wenn es da funktioniert und da eben nicht.
Um diese Module nicht nur als Zeitempfänger zu nutzen, der ja nun auch sehr gut bei mir funktioniert, sollte als erstes die Modulfirmware lückenlos bekannt sein. Dies habe ich mit einem kleinen Code realisiert der auch viele Infos und Variablen für direkte und eindeutige Übernahme für Auswertungen erstellt.
Ist schon erstaunlich zu sehen warum bei ähnlichen Informationen der Sätze unterschiede geliefert werden(Info bei einem Satz mehrere Sekunden konstant bei der anderen bei jeder Anfrage eine Veränderung) wird wohl für militärische Zwecke so sein wollen, wie auch die bescheidenen Dokumentationen für private Anpassungen der Sätze. Da können einige Einstellungen an eigenes Projekt schon viel bewirken. Z.B. mit $PSRF103 Einstellungen könnten die Softwareauswertung schon erheblich beschleunigt werden.

Sollte Interesse bestehen werde ich den bescheidenen Code mit weiteren Infos im Forumbereich BASCOM einstellen.
PS. Module M7/8 sind noch im Test. Sollen ja im Bereich NAVI noch Anwenderfreundlicher sein.

Mit freundlichen Grüßen
Fred
 

fredred

Mitglied
1 Okt 2015
65
2
7
Guten Tag,

Mal eine einfache GPS-Funkuhr die keinen Timer des AVR benötigt. Somit ist für Langzeitgenauigkeit keine synchronisieren nötig.
Hardwareaufwand und Kosten sind minimal.

8173

Modul Datenleitung - TX wird direkt mit AVR- RX verbunden ( auch die Vcc 3,3 Volt Typen können direkt an AVR 5,0 Volt Typen angeschossen werden) Modul Datenleitung – TX zu RX Controller ist hier noch nicht verbunden. Warum hatte ich schon erwähnt.
Hier mal einen kleinen BASCOM - Code für eine Uhr mit einem 2* 16 LCD- Display.



CodeBox BascomAVR
$regfile = "M328pdef.dat"
$crystal = 16000000
$hwstack = 60
$swstack = 80
$framesize = 60
$baud = 9600

Print "erstellt am  : " ; Version(1)
Print "Version Code : " ; Version(3)
Print

Config Lcdpin = Pin , Db4 = PortC.0 , Db5 = PortC.1 , Db6 = PortC.2 , Db7 = PortC.3 , E = PortB.1 , Rs = PortB.0
Config Lcd = 16 * 2
 Initlcd
 Cls
 Cursor Off


Declare Sub Auswertungen()

Enable Urxc
On Urxc TTL_isr

Const Max_buf_len = 82    ' COM max buffer length
Dim Sig As Bit
Dim State_cnt As Bit                                        'FatusCom1 isr step
Dim Flag_data_ready As Bit                                   'Daten da
Dim Flag_Sequenz As Byte                    'Daten ein Satz zuordnen
Dim Chrx As String * 1                                      '1string

Dim Buff As String * Max_buf_len                            'buffer COM
Dim Gprmc(12) As String * 12         ' Länge eines Satz
Dim Gpgga(16) As String * 12
Dim Gpvtg(11) As String * 12
Dim Gpgsv(12) As String * 12
Dim Gpgsa(12) As String * 12
Dim Gpgll(10) As String * 12
Dim Gpzda(10) As String * 12

Dim Text1 As String * 1                         '
Dim Text2 As String * 2
Dim Text3 As String * 4
Dim Text4 As String * 8
Dim Text5 As String * 16
Dim Text6 As String * 16

Dim Bcout As Byte  'Zähler Trennzeichen
Dim Excount As Integer  'Zähler Exit
Dim Ercount As Integer  'Zähler Ereignisse

Dim Tmpb As Byte
Dim Tmpstr As String * 80
Dim Tmpstr2 As String * 12
Dim Datum As String * 9                                      'gps Datum
Dim Zeit As String * 9                                      'gps uhrzeit
Dim Tzone As Byte
Dim Timezone As Byte
 ' Uhrzeit und Datum von GPS-Modul
Dim tmpString as String * 12 ' temporärer String (Umwandlung String in Byte)
Dim Stunde as Byte
Dim Minute as Byte
Dim Sekunde as Byte
Dim Tag as Byte
Dim Monat as Byte
Dim Jahr as Byte
Dim Sat As String * 10
'Zeitzonen Korrektur -12 - +12



   Enable Interrupts
   Wait 2   ' Init abwarten

   '**** Startbedingungen ****
     State_cnt = 0
     Flag_Sequenz = 0
     Flag_data_ready = 0


 Do
   Enable Interrupts

   '**** COM1 RX Status warte auf gültiges Zeichen ****
     IF State_cnt = 1 AND Flag_Sequenz > 0 Then
        Locate 1 , 1
         Lcd Text1 ; " " ;Datum
        Locate 2 , 3
         Lcd  Zeit
       Wait 1
     End if


 Loop
End

'*******************************
    TTL_isr:
   Toggle Sig

    Chrx = Chr(udr)
   If Chrx <> "" Then   'sind Zeichen im Buffer?

      If Chrx = "$" And State_cnt = 0 Then                 'kommt Blockzeichen und ist Status auf Ok?
         Buff = ""                                          'Buffer leeren
         State_cnt = 1                                      'Status für Buffer füllen setzen.
      End If

      If State_cnt = 1 Then
         If Len(buff) < Max_buf_len Then                    'Buffer noch nich voll?
            Buff = Buff + Chrx                              'weiter füllen
         Else                                               'Buffer voll -> Daten zuordnen
           Gosub Daten_zuordnen
         End If
      End If

      If Chrx = Chr(13) And State_cnt = 1 Then  'prüfe Blockabschluss
         Gosub Daten_zuordnen
      End If

   End If

  Return


'**********************************
Daten_zuordnen:

   Disable Interrupts  'Wichtig! die Aufarbeitung soll nicht gestört werden.

  If State_cnt = 1 Then

    If Mid(buff , 1 , 6) = "$GPGLL" Then
     ' Buff_gll = Buff
      Bcout = Split(buff , Gpgll(1) , ",")
      Flag_data_ready = 1
      Flag_Sequenz = 1
    End if

    If Mid(buff , 1 , 6) = "$GPRMC" Then
     ' Buff_rmc = Buff
      Bcout = Split(buff , Gprmc(1) , ",")
      Flag_data_ready = 1
      Flag_Sequenz = 2
    End if
    Gosub Auswertungen
  Else
    Flag_data_ready = 0                                   'reset data ready flag
    Flag_Sequenz  = 0
  End if
    Buff = ""  'Buffer leeren
    State_cnt = 0
   Enable Interrupts                                'Wichtig! alle interrupts freigeben

 Return

  Auswertungen:

   Disable Interrupts  'Wichtig! die Aufarbeitung soll nicht gestört werden.
  ' Anzeige ob Daten ankommen
   If Sig = 0 Then
    Text1 = "?"
   Else
    Text1 = "!"
   End if

   '##### Uhrzeit je nach Status  holen #####

   IF Flag_Sequenz = 1 Then
    Tmpstr2 = Left(gpgll(6) , 6)                            'UTC Zeit von gll
   End IF

   IF Flag_Sequenz = 2 Then
    Tmpstr2 = Left(gprmc(2) , 6)                            'UTC Zeit von rmc
   End IF

    Tmpstr = Left(tmpstr2 , 2)
    Tmpb = Val(tmpstr)

    Tzone =14

    If Tzone < 12 Then
         Timezone = 12 - Tzone

         Tmpb = Tmpb - Timezone
    Elseif Tzone = 12 Then
         Tmpb = Tmpb - 0
    Else
       Timezone = Tzone - 12
       Tmpb = Tmpb + Timezone
    End If

    If Tmpb >= 10 Then
         Tmpstr = Str(tmpb) + ":" + Mid(tmpstr2 , 3 , 2) + ":" + Mid(tmpstr2 , 5 , 2)
    Elseif Tmpb < 10 And Tmpb > 0 Then
         Tmpstr = "0" + Str(tmpb) + ":" + Mid(tmpstr2 , 3 , 2) + ":" + Mid(tmpstr2 , 5 , 2)
    Else
         Tmpstr = "00:" + Mid(tmpstr2 , 3 , 2) + ":" + Mid(tmpstr2 , 5 , 2)
    End If
       Zeit = Tmpstr

 '##############  Uhrzeit je nach Qualität holen und zerlegen #############

    IF Flag_Sequenz = 1 Then
        Tmpstr2 = Left(gpgll(6) , 6)                            'UTC Zeit von
        tmpString = Mid(Tmpstr2, 1 , 2)  ' Stunde
        Stunde = val(tmpString)
        tmpString = Mid(Tmpstr2, 3 , 2) ' Minute
        Minute = val(tmpString)
        tmpString = Mid(Tmpstr2 , 5 , 2) ' Sekunden
        Sekunde = val(tmpString)
      tmpString = "" 'leeren
    End if


    IF Flag_Sequenz = 2 Then
        Tmpstr2 = Left(gprmc(2) , 6)                            'UTC Zeit von
        tmpString = Mid(Tmpstr2, 1 , 2)  ' Stunde
        Stunde = val(tmpString)
        tmpString = Mid(Tmpstr2, 3 , 2) ' Minute
        Minute = val(tmpString)
        tmpString = Mid(Tmpstr2 , 5 , 2) ' Sekunden
        Sekunde = val(tmpString)
       tmpString = ""
    End if

    IF Flag_Sequenz = 3 Then
      If gpgga(7) = "1" Then  'Info gültig
        Tmpstr2 = Left(gpgga(2) , 6)                 'UTC Zeit von
        tmpString = Mid(Tmpstr2, 1 , 2)  ' Stunde
        Stunde = val(tmpString)
        tmpString = Mid(Tmpstr2, 3 , 2) ' Minute
        Minute = val(tmpString)
        tmpString = Mid(Tmpstr2 , 5 , 2) ' Sekunden
        Sekunde = val(tmpString)
        tmpString = ""
      End if

    End if


    '######## Datum von RMC ############

    Tmpstr2 = Left(gprmc(10) , 6)                            ' Datum UTC
    Tmpstr = Left(tmpstr2 , 2)
    Tmpb = Val(tmpstr)

    If Tmpb >= 10 Then
         Tmpstr = Str(tmpb) + "." + Mid(tmpstr2 , 3 , 2) + "." + Mid(tmpstr2 , 5 , 2)
    Elseif Tmpb < 10 And Tmpb > 0 Then
         Tmpstr = "0" + Str(tmpb) + "." + Mid(tmpstr2 , 3 , 2) + "." + Mid(tmpstr2 , 5 , 2)
    Else
         Tmpstr = "00:" + Mid(tmpstr2 , 3 , 2) + "." + Mid(tmpstr2 , 5 , 2)
    End If
       Datum = Tmpstr

     Tmpstr2 = Left(gprmc(10) , 6)
     tmpString = Mid(tmpstr2, 1, 2)
     Tag = val(tmpString)
     tmpString = Mid(tmpstr2, 3, 2)
     Monat = val(tmpString)
     tmpString = Mid(tmpstr2, 5, 2)
     Jahr = val(tmpString)

    Tmpstr = ""
    Tmpstr2 = ""
    tmpString = ""
    Enable Interrupts                                        'Wichtig! alle interrupts freigeben
Return

Für Inbetriebnahme und Funktionskontrolle ist in Z1/S1 ein Zeichen integriert um zu sehen ob Modul was sendet. Ist wichtig um zu sehen ob der Standort optimal ist (analog DCF77-Empfänger)
Nicht mit Verhalten der internen Modul- LED verwechseln. Diese blink erst wenn alle 3D Signale(>= 4Fix) decodiert wurden. Ist ja Vorraussetzung des NMEA- Protokolls für Navigation aber für die Zeitabfrage reicht die 2D Ortung, die immer als erstes erfolgen muss. Eine zweite abfrage bestätigt nicht nur die Zeitangabe, sie liefert auch das Datum.
Eine Signalstärke von > 20 dB für Ortung(Zeitsignal) ist innerhalb eines Gebäudes ausreichend. Kommt ein Zeichenwechsel (analog Modem) benötigen die meisten Empfänger etwas Zeit um sich die Positionsschätzwerte* zu merken. Diese werden Batteriegepuffert gespeichert und sorgt auch für einen schnellen Warmstart. Ist dieser Vorgang einmal Abgeschlossen sind diese Zeitgeber nicht nur unempfindlicher auf Umgebungsstörungen sonder auch was für die Zukunft. Der Vorteil liegt eindeutig an der direkten Zeitübergabe als String. Es wird keine zusätzliche Decodierung oder noch eine Softclockcode benötigt um eine genaue Uhrzeit zu präsentieren.

Bitte beachten die vielen preiswerten Module die es auf den Markt gibt haben auch unterschiedliche Firmware. Somit sollte das Verhalten derer ausgelesen werden wenn es Probleme mit der Uhr gibt.
Kleine Programme für Test ob die Projekthardware für eine Uhr/Schaltuhr taugt oder gleich mal testen ob auch eine Navigation möglich ist und wie diese im Klartext aussehen können, ist im Anhang (Auch als Hex- File) zu finden.
Alle Auswertungen können mit beliebigem Terminalprogramm angezeigt werden deren Einstellung
Baudrate = 9600
Databits = 8
Parity = none
Stopbits = 1
Handshaking = none ist.

Im Uhr Test Programm GPS-Uhr- Hardwaretest.bas. Wird als erstes die Zuverlässigkeit geprüft und bei Zeitüberlauf ein automatischer Reset durchgeführt. Anzeige der Sateliten im Empfangsbereich und Feldstärke benötigen zwar etwas mehr Zeit da die Sequenz GSV (Detaillierte Satellitendaten)abgefragt werden muss, ist aber im Uhren- Programm nicht mehr relevant.
Natürlich müssen in alle Programmschnipsel auch die Headereinstellungen angepasst werden.
$regfile FlashROM muss schon > 4 KB sein. z.B. ein ATMega 8.
Alles ist sehr einfach aufgebaut und vielleicht auch lächerlich.
Ziel war und ist eine Anregung auf Diskussion, wie die „alte“ DCF77- Funkuhr durch eine moderne GPS- Uhr ersetzt werden kann.
Das diese Module nicht dafür Entwickelt wurden sollte doch kein Hindernis sein. Das diese „Navisensoren „ viele Standortinfos liefern können, macht neugierig (somit auch mein Auswertungsversuch im Anhang)
Na Ja. Alles benötigt seine Zeit für Darstellung. Also, für eine Zeitanzeige muss nicht als erst die Position der Uhr ermittelt werden. Der zuverlässige Empfang des Zeitstring ist nach meiner Meinung entscheidend. Zeitlich genaue Position ist nicht zu verwechseln mit gesendeter „Atomzeit“ die, die Satelieten ständig senden.
Für diese Zeitgenauigkeit als Wecker habe ich im alltäglichen Leben noch keine Anwendung gefunden. Langzeitsekundengenauigkeit reicht immer noch.

Mit freundlichen Grüßen
fredred
 

Anhänge

  • Like
Wertungen: Ditron

fredred

Mitglied
1 Okt 2015
65
2
7
Guten Tag,

Zeitumstellung:

Noch eine kleine Programmerweiterung für die GPS – Funkuhr.
Die Zeitumstellungsinfo gibt es nicht in UTC. Sollte aber auch in diesem Projekt sekundengenau automatisch erfolgen(da Uhr für einen Datenlogger in Einsatz ist). Ist aber auch für eine Stubenuhr nützlich da nun auch noch der Tagesname mit angezeigt werden kann.

Da sich das teure und zeitaufwendige EU-Riesenprojekt “Zeitumstellung JA /NEIN oder Wie “ sich noch lange hinziehen kann, habe ich eine Sub eingefügt die eigenständig genutzt oder eben nicht werden kann. Ist sehr einfach und selbsterklärend.
So nun kommt für die Stubenuhrsoftware noch der Feiertag - Ereigniskalender rein und dann wird DCF77und RTC- Modul in den Ruhestand geschickt.

Mit freundlichen Grüßen



CodeBox BascomAVR
'*********** GPS- Uhr*******************
 '***  fuer Empfänger  NEO 6/7/8M     ***
 '***************************************

$regfile = "M328pdef.dat"
$crystal = 16000000
$hwstack = 60
$swstack = 80
$framesize = 60
$baud = 9600

Print "erstellt am  : " ; Version(1)
Print "Version Code : " ; Version(3)
Print

Config Lcdpin = Pin , Db4 = PortC.0 , Db5 = PortC.1 , Db6 = PortC.2 , Db7 = PortC.3 , E = PortB.1 , Rs = PortB.0
Config Lcd = 16 * 2
 Initlcd
 Cls
 Cursor Off


'Declare Sub Auswertungen()

Enable Urxc
On Urxc TTL_isr

Const Max_buf_len = 82    ' COM max buffer length
Dim Sig As Bit
Dim State_cnt As Bit                                        'FatusCom1 isr step
Dim Flag_data_ready As Bit                                   'Daten da
Dim Flag_Sequenz As Byte                    'Daten ein Satz zuordnen
Dim Chrx As String * 1                                      '1string

Dim Buff As String * Max_buf_len                            'buffer COM
Dim Gprmc(12) As String * 12         ' Länge eines Satz
Dim Gpgga(16) As String * 12
Dim Gpvtg(11) As String * 12
Dim Gpgsv(12) As String * 12
Dim Gpgsa(12) As String * 12
Dim Gpgll(10) As String * 12
Dim Gpzda(10) As String * 12

Dim Text1 As String * 1                         '
Dim Text2 As String * 2
Dim Text3 As String * 4
Dim Text4 As String * 8
Dim Text5 As String * 16
Dim Text6 As String * 16

Dim Bcout As Byte  'Zähler Trennzeichen
Dim Excount As Integer  'Zähler Exit
Dim Ercount As Integer  'Zähler Ereignisse

Dim Tmpb As Byte
Dim Tmpstr As String * 80
Dim Tmpstr2 As String * 12
Dim Datum As String * 9                                      'gps Datum
Dim Zeit As String * 9                                      'gps uhrzeit
Dim Tzone As Byte
Dim Timezone As Byte
 '*** Uhrzeit und Datum von GPS-Modul ***
Dim tmpString as String * 12 ' temporärer String (Umwandlung String in Byte)
Dim Stunde as Byte
Dim Minute as Byte
Dim Sekunde as Byte
Dim Tag as Byte
Dim Monat as Byte
Dim Jahr as Byte
Dim Sat As String * 10
'Zeitzonen Korrektur -12 bis +12

'*** für Zeitumstellung ***
 Dim Tagz as Byte
 Dim Tagzahl As Word
 Dim Monatz As Word
 Dim Jahrz As Word
 Dim Tagnam As String * 2
 Dim Korr As Bit
 Dim Korrz As Byte


   Enable Interrupts
   Wait 2   ' Init abwarten

   '**** Startbedingungen ****
     Tzone =13 'MEZ
     State_cnt = 0
     Flag_Sequenz = 0
     Flag_data_ready = 0


 Do

    Enable Interrupts

   '**** COM1 RX Status warte auf Zeitstring  ****
   'Meldung auch fuer allgemeine Stoerungen wie kurzer Spannungseinbruch
    IF  State_cnt = 0 AND Flag_Sequenz = 0 Then
        Cls
        Locate 1 , 1
        Lcd Text1 ; "   Neustart  "
        Locate 2 , 1
         Lcd  " warte auf Zeit "
       Wait 1
       Cls
    End If


   '**** COM1 RX Status prüft gültige Zeichen ****
    IF State_cnt = 1 AND Flag_Sequenz > 0 Then
        Locate 1 , 1
         Lcd Text1 ; " " ;Datum ; "  " ; Tagnam
        Locate 2 , 3
         Lcd  Zeit
       Wait 1
    End If

 Loop
End

'*******************************
    TTL_isr:
   Toggle Sig

    Chrx = Chr(udr)
   If Chrx <> "" Then   'sind Zeichen im Buffer?

      If Chrx = "$" And State_cnt = 0 Then                 'kommt Blockzeichen und ist Status auf Ok?
         Buff = ""                                          'Buffer leeren
         State_cnt = 1                                      'Status für Buffer füllen setzen.
      End If

      If State_cnt = 1 Then
         If Len(buff) < Max_buf_len Then                    'Buffer noch nich voll?
            Buff = Buff + Chrx                              'weiter füllen
         Else                                               'Buffer voll -> Daten zuordnen
           Gosub Daten_zuordnen
         End If
      End If

      If Chrx = Chr(13) And State_cnt = 1 Then  'prüfe Blockabschluss
         Gosub Daten_zuordnen
      End If

   End If

  Return


'**********************************
Daten_zuordnen:

   Disable Interrupts  'Wichtig! die Aufarbeitung soll nicht gestört werden.

  If State_cnt = 1 Then

    If Mid(buff , 1 , 6) = "$GPGLL" Then
     ' Buff_gll = Buff
      Bcout = Split(buff , Gpgll(1) , ",")
      Flag_data_ready = 1
      Flag_Sequenz = 1
    End if

    If Mid(buff , 1 , 6) = "$GPRMC" Then
     ' Buff_rmc = Buff
      Bcout = Split(buff , Gprmc(1) , ",")
      Flag_data_ready = 1
      Flag_Sequenz = 2
    End if
    Gosub Auswertungen
  Else
    Flag_data_ready = 0                                   'reset data ready flag
    Flag_Sequenz  = 0
  End if
    Buff = ""  'Buffer leeren
    State_cnt = 0
   Enable Interrupts                                'Wichtig! alle interrupts freigeben

 Return

  Auswertungen:

   Disable Interrupts  'Wichtig! die Aufarbeitung soll nicht gestört werden.
  ' Anzeige ob Daten ankommen
   If Sig = 0 Then
    Text1 = "?"
   Else
    Text1 = "!"
   End if

   '##### Uhrzeit je nach Status  holen #####

   IF Flag_Sequenz = 1 Then
    Tmpstr2 = Left(gpgll(6) , 6)                            'UTC Zeit von gll
   End IF

   IF Flag_Sequenz = 2 Then
    Tmpstr2 = Left(gprmc(2) , 6)                            'UTC Zeit von rmc
   End IF

    Tmpstr = Left(tmpstr2 , 2)
    Tmpb = Val(tmpstr)



    If Tzone < 12 Then
         Timezone = 12 - Tzone

         Tmpb = Tmpb - Timezone
    Elseif Tzone = 12 Then
         Tmpb = Tmpb - 0
    Else
       Timezone = Tzone - 12
       Tmpb = Tmpb + Timezone
    End If

    If Tmpb >= 10 Then
         Tmpstr = Str(tmpb) + ":" + Mid(tmpstr2 , 3 , 2) + ":" + Mid(tmpstr2 , 5 , 2)
    Elseif Tmpb < 10 And Tmpb > 0 Then
         Tmpstr = "0" + Str(tmpb) + ":" + Mid(tmpstr2 , 3 , 2) + ":" + Mid(tmpstr2 , 5 , 2)
    Else
         Tmpstr = "00:" + Mid(tmpstr2 , 3 , 2) + ":" + Mid(tmpstr2 , 5 , 2)
    End If
       Zeit = Tmpstr

 '##############  Uhrzeit je nach Qualität holen und zerlegen #############

    IF Flag_Sequenz = 1 Then
        Tmpstr2 = Left(gpgll(6) , 6)                            'UTC Zeit von
        tmpString = Mid(Tmpstr2, 1 , 2)  ' Stunde
        Stunde = val(tmpString)
        tmpString = Mid(Tmpstr2, 3 , 2) ' Minute
        Minute = val(tmpString)
        tmpString = Mid(Tmpstr2 , 5 , 2) ' Sekunden
        Sekunde = val(tmpString)
      tmpString = "" 'leeren
    End if


    IF Flag_Sequenz = 2 Then
        Tmpstr2 = Left(gprmc(2) , 6)                            'UTC Zeit von
        tmpString = Mid(Tmpstr2, 1 , 2)  ' Stunde
        Stunde = val(tmpString)
        tmpString = Mid(Tmpstr2, 3 , 2) ' Minute
        Minute = val(tmpString)
        tmpString = Mid(Tmpstr2 , 5 , 2) ' Sekunden
        Sekunde = val(tmpString)
       tmpString = ""
    End if

    IF Flag_Sequenz = 3 Then
      If gpgga(7) = "1" Then  'Info gültig
        Tmpstr2 = Left(gpgga(2) , 6)                 'UTC Zeit von
        tmpString = Mid(Tmpstr2, 1 , 2)  ' Stunde
        Stunde = val(tmpString)
        tmpString = Mid(Tmpstr2, 3 , 2) ' Minute
        Minute = val(tmpString)
        tmpString = Mid(Tmpstr2 , 5 , 2) ' Sekunden
        Sekunde = val(tmpString)
        tmpString = ""
      End if

    End if


    '######## Datum von RMC ############

    Tmpstr2 = Left(gprmc(10) , 6)                            ' Datum UTC
    Tmpstr = Left(tmpstr2 , 2)
    Tmpb = Val(tmpstr)

    If Tmpb >= 10 Then
         Tmpstr = Str(tmpb) + "." + Mid(tmpstr2 , 3 , 2) + "." + Mid(tmpstr2 , 5 , 2)
    Elseif Tmpb < 10 And Tmpb > 0 Then
         Tmpstr = "0" + Str(tmpb) + "." + Mid(tmpstr2 , 3 , 2) + "." + Mid(tmpstr2 , 5 , 2)
    Else
         Tmpstr = "00:" + Mid(tmpstr2 , 3 , 2) + "." + Mid(tmpstr2 , 5 , 2)
    End If
       Datum = Tmpstr

     Tmpstr2 = Left(gprmc(10) , 6)
     tmpString = Mid(tmpstr2, 1, 2)
     Tag = val(tmpString)
     tmpString = Mid(tmpstr2, 3, 2)
     Monat = val(tmpString)
     tmpString = Mid(tmpstr2, 5, 2)
     Jahr = val(tmpString)

 ' Soll die Tagesnummer bis zum 28.02.2100 liefern
  Monatz =  Monat * 2.6
  Monatz = Monatz - 0.2
  Jahrz = Jahr/4  'Soll ja für ein Jahrhundert gültig sein.
  Tagz = Tag + Monatz
  Tagzahl = Tagz + Jahrz
  Tagzahl = Tagzahl +  2  'ist für diese Zeitspanne nötig da ab 1.03.2000 berechnet wird
  Tagzahl = Tagzahl  mod 7

  'nun geben wir noch die Tageszahl einen Namen
  Select Case Tagzahl
    Case 1 : Tagnam = "Mo"
    Case 2 : Tagnam = "Di"
    Case 3 : Tagnam = "Mi"
    Case 4 : Tagnam = "Do"
    Case 5 : Tagnam = "Fr"
    Case 6 : Tagnam = "Sa"
    Case 7 : Tagnam = "So"
  End Select

    Tmpstr = ""
    Tmpstr2 = ""
    tmpString = ""
  Gosub Zeitum ' geh zur Zeitumstellung
    Enable Interrupts                                        'Wichtig! alle interrupts freigeben
Return

 Zeitum:
 '----  genaue Zeitumstellung   ------------------------------
    'Print "Monat " ; Monat ; "Tag  " ; Tag ; "    " ; Tagzahl 'für Test
   If Monat = 3 And Tag => 25 And Tagzahl= 7 And Zeit = "02:00:01" Then
       Incr Korrz
          Wait 1
      If Korrz = 2 Then Korrz = 0
       If Korrz = 1 Then
          Tzone = 14    'Zeitzone oder bei RTC Zeit auf aktuall setzen
        'Zeit = "03:00:02"
       End If
   End If

   If Monat = 10 And Tag => 25 And Tagzahl = 7 And Zeit = "02:00:01" Then
        Incr Korrz
          Wait 1
      If Korrz = 2 Then Korrz = 0
       If Korrz = 1 Then
          Tzone = 13
        'Zeit = "01:00:02"
       End If
   End If
 Return
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)