DCF77 Modul von HKW Elektronik

Hallo,

ich hab mir vor kurzen einen Arduino Mega gekauft.

Ich habe daran ein Funkuhrmodul von HKW angeschlossen. Die Daten werden via RS232 (UART) als String (14 ASCII Zeichen + CR) bereit stellt. Das Modul funktioniert recht einfach. Sobald das Modul versorgt wird beginnt das Senden.

Über den PC/COM-Port und Realterm fuktioniert die Sache ohne Probleme (7N1, Space) nur leider nicht mit dem Arduino Mega.

Hier der Code mit dem ich “etwas” Empfang und gleich wieder am Monitor ausgebe. Leider nicht interpretierbar …

void setup() {
  Serial.begin(300);
  Serial1.begin(300, SERIAL_7E2);
}

void loop() 
{
    char inByte = Serial1.read();
    Serial.print(inByte); 
}

Wenn ich den Befehl serial.available einfüge kommt garnichts am Monitor an genauso wie das ändern von 7E2 auf 8N1 usw. .

Was mach ich falsch? Ich hoffe es kann mir jemand helfen ! Danke.

PS:
Das Modul wird mit 3,3V betrieben. Angeschlossen hab ich den Datenausgang des Moduls via Pegelwandler (3,3V auf 5V mitels 74HCT125) an Serial1 → RX des Mega.

Datasheet:

http://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=9&ved=0CFkQFjAI&url=http%3A%2F%2Fwww.progforum.com%2Fattachment.php%3Fattachmentid%3D311%26d&ei=OnCDVKnOCYWtPL7pgIAF&usg=AFQjCNG2aRAu36L1JrBYyMlcAFOFC4o6UA&bvm=bv.80642063,d.ZWU&cad=rja

1) Sind DFC Empfänger sehr Störempfindlich und ein Elektrogerät (zB Monitor) in der Nähe stört den Empfang effizient.

2) das Modul hat einen RS232 Ausgang, nicht 3,3V TTL. Du brauchst einen MAX23 2od er Ähnlichen.

3) Hast Du die Richtige Antenne angeschlossen?

Grüße Uwe

uwefed: 2) das Modul hat einen RS232 Ausgang, nicht 3,3V TTL. Du brauchst einen MAX23 2od er Ähnlichen.

Hatte ich auch erst gedacht, aber unten steht dann dass die maximale Ausgangsspannung an X4 3V ist

Serenifly: Hatte ich auch erst gedacht, aber unten steht dann dass die maximale Ausgangsspannung an X4 3V ist

Stimmt ... hat ein 3,3V Signal. Die Signalaufbereitung erfolgt im Modul. Wenn die Funkuhr bzw. das Modul noch nicht synchronisiert hat gibt dieses eine "Null Zeit" aus und fungiert als RTC.

Mann muss nur noch den Zeitcode als String via Serial entgegen nehmen und wie bereits oben gesagt via PC und COM-Port funktioniert das wunderbar.

Zum PC brauchst du aber einen RS232 Konverter, oder?

Die serielle Übertragung vom Arduino zum PC muss übrigens nicht 300 Baud sein. Das geht auch ruhig schneller.

Wenn ich mal Google nach "Arduino 300 Baud" bemühe gibt es da wohl generell Probleme was die Konfiguration der Register betrifft.

Versuch es mal mit AltSoftSerial: https://www.pjrc.com/teensy/td_libs_AltSoftSerial.html Das emuliert eine serielle Schnittstelle in Software. Ist zwar schlechter, aber bei sowas extrem langsamem ist das kein Problem.

EDIT: Das läuft aber glaube ich dann wieder nur mit 8N1 :s Was anderes kann man da nicht einstellen

Serenifly:
Zum PC brauchst du aber einen RS232 Konverter, oder?

Die serielle Übertragung vom Arduino zum PC muss übrigens nicht 300 Baud sein. Das geht auch ruhig schneller.

Wenn ich mal Google nach “Arduino 300 Baud” bemühe gibt es da wohl generell Probleme was die Konfiguration der Register betrifft.

Versuch es mal mit AltSoftSerial:
AltSoftSerial Library, for an extra serial port
Das emuliert eine serielle Schnittstelle in Software. Ist zwar schlechter, aber bei sowas extrem langsamem ist das kein Problem.

Nee braucht man nicht ich glaubt das heisst RS232-C (Kann man bei machen PC’s unter Geräte Manager einstellen) dann klappt das auch ohne Converter. Ist ja keine echte RS232. Wie gesagt das Modul ist eigendlich total simple …

EDIT:
Habs mal mit der AltSoft probiert … gleiches Ergebniss … ist das jetzt gut oder schlecht :wink:

Bei AltSoftSerial kann das Problem jetzt sein, dass es wie gesagt wohl mit 8N1 läuft, du aber 7E2 brauchst. Daran hatte ich nicht gleich gedacht. :(

Die Sache ist, dass der Takt der seriellen Schnittstelle vom Prozessortakt abgeleitet ist. Dieser wird mit einem Frequenzteiler herunter geteilt. Mit dieser Frequenz und einem anderen Wert wird dann die Baudrate berechnet. Diese liegt dann aber durch die begrenzten Einstellungsmöglichkeiten leicht daneben. Dass man mit 16MHz arbeitet kommt da auch nicht hinzu (für Genauigkeit gibt es extra krumme Baudratenquarze). Mit dem USB Konverter auf dem UNO gibt es wohl das gleiche Problem.

Ich habe es gerade mal auf meinem UNO ausprobiert und was zum PC gesendet. Da laufen auch keine 300 Baud.

Auf meinem Freeduino Mega mit Quarz geht es allerdings! Hier spielt dann wohl eine Rolle, dass die Standard Arduino Boards nur einen Keramik-Resonator haben, der ungenauer ist. Dann bleibt man innerhalb der Toleranz der Schnittstelle, während die Ungenauigkeit mit einem Resonator zu groß ist.

Ich kann aber nicht sagen ob das generell so ist. Ich habe nur die zwei Boards probiert. Der Freeduino hat auch einen FTDI Chip als USB Konverter. Das spielt vielleicht auch eine Rolle.

Da hast Du recht 3 und 0V sind keine RS232 Pegel. Hatte nicht das ganze datenblatt genau nachgelesen.

§V 3V High signal kann zuwenig sein als H erkannt zu werden. Wie hast Du den 74HCT125 angeschlossen?

Grüße Uwe

Auf jeden Fall solltest du mal die Schnittstelle zum PC mit was anderem als 300 Baud laufen lassen.

Dann liegt aber immer noch die Schnittstelle mit dem Modul neben dem korrektem Takt.

uwefed: Da hast Du recht 3 und 0V sind keine RS232 Pegel. Hatte nicht das ganze datenblatt genau nachgelesen.

§V High signal kann zuwenig sein m als H erkannt zu werden. Wie hast Du den 74HCT125 angeschlossen?

Grüße Uwe

Hab den 74HCT125 ganz normal 14 auf Vcc(5V), 7 auf GND. Benutzen tu ich Kanal 1 also 1A und Ausgang 1Y. Kanal1 Enable (1OE) ist auch auf LOW gelegt. Die nicht benutzen Eingänge liegen auf LOW.

Hab aber diesen Bereich schon durchgemessen der passt ... Auch der delay von 11ns sollte nicht ausmachen.

Hans128: Hab den 74HCT125 ganz normal 14 auf Vcc(5V), 7 auf GND. Benutzen tu ich Kanal 1 also 1A und Ausgang 1Y. Kanal1 Enable (1OE) ist auch auf LOW gelegt. Die nicht benutzen Eingänge liegen auf LOW.

Hab aber diesen Bereich schon durchgemessen der passt ... Auch der delay von 11ns sollte nicht ausmachen.

Das stimmt alles. Würde noch einen 0,1µF Kondensator zwischen GND und 5V nahe am IC schalten. Grüße Uwe

uwefed: Das stimmt alles. Würde noch einen 0,1µF Kondensator zwischen GND und 5V nahe am IC schalten. Grüße Uwe

Hab ich auch gemacht ... nur nicht erwäht das ist ja "Standard" ;) ...

Also ich hab die letzte Zeit im Internet geschaut und anscheinend gibt/gab es Probleme mit 300 Baud. Allerdings sind die Bugmeldungen von 2011-2012. Dieses problem sollte eigendlich der Vergangenheit angehören.

Jetzt hab ich zum Testen ein Uno und ein Mega zusammen geschlossen wobei der Uno via SoftSerial auf 300 Baud sendet und der Mega auf Serial1 mit 300 Baud empfängt. Übertragen hab ich einfach das Zeichen A. Und siehe da es geht. Zwar kommt nach einer Weile mist aber das liegt wohl daran das ich permanent sende und lese ohne "serial.available" ... .

Was mir noch aufgefallen ist ich bekomme mit angeschlossener Funkuhr immer das Zeichen "y". Schließ ich die Funkuhr nicht an (also mit offenen Eingang) bekomm ich das selbe Zeichen!

Merkwürdig ...

Das y mit dem Doppelpunkt drüber ist ASCII Code 255: http://www.ascii-code.com/ 255 ist -1 im Zweier-Komplement. Das ist was read() zurück gibt wenn nichts gelesen wurde

Probier mal ob du mit 300 Baud vom UNO an den Serial Monitor senden kannst. Bei mir ging das nicht. Die Ausgabe am PC muss wie gesagt auch keine 300 Baud haben. Da reichen die normalen 9600 Baud.

Serenifly: Das y mit dem Doppelpunkt drüber ist ASCII Code 255: http://www.ascii-code.com/ 255 ist -1 im Zweier-Komplement. Das ist was read() zurück gibt wenn nichts gelesen wurde

Probier mal ob du mit 300 Baud vom UNO an den Serial Monitor senden kannst. Bei mir ging das nicht. Die Ausgabe am PC muss wie gesagt auch keine 300 Baud haben. Da reichen die normalen 9600 Baud.

Geht, kann mit dem Uno ein Zeichen mit 300 Baud an PC übertragen. Aha ok das erklärt es warum mit und ohne das selbe Zeichen kommt.

Ok ich werde als nächstes mir die Signale am Oszi anschauen ich glaube da ist der Hund begraben.

Mhh, wirklich seltsam. Ich dachte das Problem die 300 Baud sind. Aber jetzt sagst du dass das Senden mit 300 Baud bei dir geht...

Vielleicht gibt es da noch einen Unterschied was die Toleranz betrifft was Empfang und Senden betrifft. Dass vielleicht der PC toleranter ist wenn der Takt nicht genau passt. Keine Ahnung...

Bei SoftwareSerial kommt dann wie gesagt noch die Geschichte mit den Paritäts- und Stop-Bits hinzu. Das kann man da nicht einstellen. Daher geht das wohl zum Empfang doch nicht wenn man was anderes als 1N8 hat.

So bin ein Schritt weiter … also am Oszi passen die Signale. Was ich überlesen haben ist das X3 = In der Funkuhr auf Low liegen muss sodass sie sendet. Hab ich jetzt gemacht und siehe da ich empfang was.

Nur was ich Empfange ist nach wie vor seltsam … Interresant an den Empfangenen Daten ist das ein Muster erkennbar ist.

Es sind 16 Zeichen, wie im Datenblatt auch beschrieben. Nur die Zeichen stimmen nicht, dass Zeichen “æ” müsste eigendlich “0” sein. Mann kann auch erkennen das sich im Sek. takt ein Zeichen ändert.

Laut dem Datenblatt sendet die Uhr mit 7E2 (Empfang ist komischerweise mit 8N2).

Serenifly:
Laut dem Datenblatt sendet die Uhr mit 7E2 (Empfang ist komischerweise mit 8N2).

Ja das hab ich auch gelesen aber bei der Einstellung 7E2 bekomm ich nur mist :wink:

Es ist zwar recht unwahrscheinlich, aber könnte es sein dass das Teil am Ausgang mit negativer Logik arbeitet? (wie auch RS232)

Also 0V entspricht einer log. 1 und 3V der log. 0.

Gruß Peter

Ich kram das Thema mal vor :) Da ich genau dieses Teil von einem Freund bekommen habe der es für ein "Normales DCF Modul" hielt

Also gibt es denn irgendwas konkretes wie man diesem Modul die Zeit entlocken kann ? Am liebsten natür auf ein LCD Display am Arduino

Wie hast Du das denn genau an dn den PC angeloschen ? Altes serielles Kabel und da an welche Leitungen ?

Frank

PS: um es zu präzisieren es ist das Modul FUM1 FSKdas Datenblatt liegt zumindest bei wirklich optisch unterscheiden kann ich das von derFUM2 Version nicht