DCF77 + Nixieröhren+ PCF8574

P4711

Neues Mitglied
06. Dez. 2011
10
0
0
32
Sprachen
Guten Tag,

Ich baue im moment eine Nixieuhr und habe ein paar probleme bezüglich der Programmierung. Zur information ich bin ein azubi im 2 lehrjahr und habe noch nicht so viel Programmiet und ich habe noch nie was mit der DCF77 gemacht.

Meine Uhr ist folgendermaßen aufgebaut :




---------------------- DEZ. ---------------------- BCD
DCF77----> Atmega 8 ------> 2* PCF8574P (I2C) --------> 4 * 7441-----> Röhren (Nur Stunden und Minuten)


Mein erstes Problem ist: Wie kann ich in Bascom das DCF77 signal so auseinander nehmen das ich nur die Stunden und Minuten habe?
Mein zweites Problem : wie funktioniert der Befehl makebcd genau? Bin aus der Beschreibung in Bascom noch nicht schlau geworden

Ich habe ja meine 8 bits bei einem PCF8574 die ersten vier bit's sind für die Zehner der stunden die zweiten vier bits für die einer der Stunden..

DCBA_DCBA
Also &B 0000_0000 glaube ich

genauso wie mit den Minuten.

Vielleicht kann ja mal jemand ein Programmbeispiel dafür entwickeln.. Ich bin gerade etwas sehr verwirrt..

Brauche dringend Hilfe

Danke

P4711
Foto 1.jpg
 
Hallo P4711!

Sorry, hatte deinen eigenen Thread vor dem Antworten im anderen Thema gar nicht gesehen......

Dann hier noch mal in Kürze:
Mit MAKEBCD kannst du binäre Werte in das BCD-Format konvertieren.
Das ist aber natürlich nur der "halbe Weg". :wink:

Hier mal auf die Schnelle ein Codebeispiel, wie du zum Trennen von Zehner- und Einerstellen vorgehen müsstest:

Code:
Ziffer(1) = Makebcd(_hour) 'Stunden ins BCD-Format
Ziffer(3) = Makebcd(_min) 'Minuten ins BCD-Format

Ziffer(2) = Ziffer(1) And &B0000_1111 'nur die ersten 4 Bits
Ziffer(4) = Ziffer(3) And &B0000_1111 'nur die ersten 4 Bits

Shift Ziffer(1) , Right , 4 'hohe 4 Bits zu low schieben
Shift Ziffer(3) , Right , 4 'hohe 4 Bits zu low schieben

If Ziffer(1) = 0 Then 'auf Null Stunden prüfen
Ziffer(1) = 10 'wenn Stunde = 0 dann Leerzeichen
Else
End If

Die einzelnen Variablen (in dem Beispiel Ziffer(1) bis Ziffer(4) ) sendest du dann via I2C zu den PCF`s.


Grüße,
Cassio
 
Hey Cassio,

ich werde es morgen mal ausprobieren. Sieht für mich schon sehr verständlich aus, danke. Ich berichte Morgen ob es geklappt hat..

Grüße,

P4711
 
Hey,

ich bin Gestern leider nicht dazu gekommen es auszuprobieren...sry dafür. ich habe gerade wieder etwas rumgebastelt und bin zu neuen Erkenntnissen gekommen...und zwar hat mein DCF77 Modul kein sauberes signal (sekundentakt) rausgeschoben...immer nur so ein Schrott(Siehe Bild) . Dann habe ich mir mal einen alten Wecker mit DCF77 Modul genommen und das Signal da beobachtet: jede Sekunde ein Impuls. das ist ja auch soweit richtig. Dann habe ich mir gedacht das ich das Signal mal in meine schaltung einbaue. Soweit so gut ... der Wecker lief mit 3,6V, habe mir gedacht das kann er ja auch weiter, also musste ich nur die Masse von dem Wecker mit der von meiner Schaltung verbinden und das Signal abgreifen.

Jetzt kommt das verblüffende:

Ich habe das Signal beobachtet als ich die Masse der Schaltung mit der vom Wecker verbunden habe und siehe da : der selbe Schrott wie mit meinem DCF77 empfänger... jetzt an die Klugen Menschen da draußen : Warum ist das so und Wie kann man das beheben??

Hmm

Grüße

P4711


Die Schaltung auf den Bildern ist die Schaltung zwischen DCF und Mega8 und zum Beweiß das mein
DCF nur Müll liefet das Bild vom Oszilloskop...(mitte der Anzeige ist die Masse) Das signal zieht nur über die Schaltung bis auf 1,.. V runter..
 

Anhänge

  • Verstärkerschaltung.GIF
    Verstärkerschaltung.GIF
    1,6 KB · Aufrufe: 28
  • Oszilloskop.jpg
    Oszilloskop.jpg
    246,5 KB · Aufrufe: 25
Hallo P4711!

Nur mal nebenbei....
Nimm mal den 10k Widerstand von der Basis des NPN!


Viele Grüße,
Cassio
 
Hallo P4711 !

Ich hänge hier noch mal ein Bild mit an, dass die DCF77-Signale zeigt:
Slow-Signale_DCF-Pause.png

In der oberen Reihe ist das DCF77-Signal zu sehen.... und auch die "Pause" in der 59. Sekunde, die als Sync verwendet wird.
Die Aufnahme habe mit meinem Analyser gemacht.
Dein Eingangssignal sollte also ähnlich "sauber" aussehen!


Ach so.... Eines noch:
Wenn dein Wecker mit 3,6V arbeitet und dein AVR mit 5V dann kann es sein, dass die Signalhöhe von max. 3,6V am AVR nicht ausreicht um als High erkannt zu werden.
Ergo würde dein AVR das DCF-Signal "wieder nicht" sauber bekommen. :wink:


Was auch immer wieder gesagt werden muss:
Die Versorgungsspannung des DCF-Moduls sollte seeeehr gut geglättet sein. Kleinste Riffle-Spannungen (>10mV) können schon fürchterlich störend wirken!


Grüße,
Cassio
 
Hey Leute,

habe mir jetzt mal das Modul von Conrad geholt. Schön und gut habe den internen Pullup des Mega8 genommen und das signal kommt auch wunderbar an Dann habe ich folgendes Prgramm kurz geschrieben um das DCF77 zu testen:


Code:
$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 40
$swstack = 32
$framesize = 60



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




Config Dcf77 = Pinb.1 , Inverted = 0 , Timer = 1 , Debug = 0 , Check = 1 , Gosub = Sectic

Config Date = Dmy , Separator = .

Enable Interrupts


Portb.1 = 1



Dim Neue_sekunde As Bit


Do

If Neue_sekunde = 1 Then
Neue_sekunde = 0

Gosub Anzeige

 End If

Loop

End


Sectic:

Neue_sekunde = 1
Return

Anzeige:

If Dcf_status = 0 Then

Locate 1 , 1 : Lcd "warte... "
Locate 2 , 1 : Lcd Time$

Else

Locate 1 , 1 : Lcd Date$
Locate 2 , 1 : Lcd Time$

End If

Return


jedoch synchronisiert es nicht. Im Lcd wird manchmal das Datumsformat angezeigt sprich 00.00.00 und dann springt er immer wieder auf "warte...".

Habe ich einfach kein Signal oder ist der Code falsch?

Spannung habe ich gut geglättet, das Modul bekommt sehr saubere 5V.

könnt ihr mir helfen?

Viele Grüße

P4711
 
Hallo P4711!

Hm..... also so ganz verstehe ich deinen Test-Code nun nicht. :hmmmm:

Als Erstes solltest du die Werte für "hwstack, swstack & framesize" deutlich erhöhen!
In der BASCOM-Hilfe steht dazu:
Code:
$hwstack = 128
$swstack = 128
$framesize = 128


Dann frage ich mich, was du mit dem Auswerten des Bytes "Dcf_status = 0" bewirken möchtest. :hmmmm:

Dcf_status ist, wie eben schon geschrieben, ein Byte....... und eigentlich eher ein "Bit-Container"!
Die einzelnen Bits bedeuten dies (steht auch in der BASCOM-Hilfe):
Bit Explanation
0 The last reading of the DCF pin.

1 This bit is reserved.

2 This Bit is set, if after a complete time-stamp at second 58 the time-stamp is checked and it is OK. If after a minute mark (2 sec pause) this bit is set, the time from the DCF-Part is copied to the Clock-Part and this bit reset too. Every second mark also resets this bit. So time is only set, if after second 58 a minute mark follows. Normally this bit is only at value 1 from Second 58 to second 60/00.

3 This Bit indicates, that the DCF-Part should be stopped, if time is set. (at the option of updating once per hour or day).

4 This Bit indicated that the DCF-Part is stopped.

5 This bit indicates, that the CLOCK is configured the way, that during DCF-Clock is stopped, there is only one ISR-Call in one second.

6 This Bit determines the level of the DCF input-pin at the pulse (100/200 mSec part).

7 This bit indicates, that the DCF-Part has set the time of the Clock-part.


Du solltest besser einfach mal das DCF-Testprogramm aus der Hilfe verwenden und schauen, ob es dann funktioniert. :wink:

Es müsste dann also so aussehen:
Code:
$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 128
$swstack = 128
$framesize = 128


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


Config Dcf77 = Pinb.1 , Debug = 1 , Inverted = 0 , Check = 2 , Update = 0 , Timer1sec = 1 , Timer = 1 , Gosub = Sectic
Config Date = Dmy , Separator = .

Enable Interrupts


Dim Lcd_flag As Bit


Do

If Lcd_flag = 0 Then
   Locate 1 , 1
   Lcd Time$ ; Date$

   Locate 2 , 1
   Lcd bin(dcf_status) ; Time(dcf_sec)

   Lcd_flag = 1
Else
End If

Loop

End


Sectic:
Lcd_flag = 0
Return


Ich hoffe der Code stimmt soweit, weil ich ihn hier eben mal schnell zusammen getippt habe.....

Grüße,
Cassio
 
Hey habe den Code gerade noch getestet. Er funktioniert nicht. Habe noch einen Fehler gefunden im Code. Der interne Pull up des Mega8 war nicht gesetzt. Und entschuldigt mich für meine dummen Sachen. Hatte den Code aus einem Buch "Einfacher Einstieg in der Elektronik mit AVR-Mikrocontroller und Bascom" von Stefan Hoffmann. Bin noch ziemlich frisch in der Mikrocontrollerwelt. Nehmt es mir nicht übel okay?


Hat wer noch einen Tip was da falsch sein könnte?


Ist es richtig das die Dcf_sec so sprungartig sind also von 19 auf 23 und sie kommen nicht höher als 31 und setzen sich immermalwieder auf 0 zurück...
 
Hallo P4711!

Ich kenne das Buch von Stefan Hoffmann leider immer noch nicht persönlich, aber generell passt das schon was dort drin steht. :wink:


Momentan glaube ich nicht, dass es am Programmcode liegt!
Vielleicht kommt das Signal nicht sauber am Mikrocontroller an, oder die FUSES sind falsch gesetzt, oder...... :hmmmm:

Außerdem..... soweit mir bekannt ist muss der PIN für den DCF-Eingang nicht extra als Eingang difiniert werden, weil BASCOM dies automatisch macht.


Mir fehlen momentan auch ein paar Angaben, um das Problem einzukreisen.
Was machen denn die acht Statusbits in der Anzeige?
Wechselt z.B. Bit_0 den Zustand?
Läuft die Softclock ( Time$ )?
Läuft die DCF-Uhr ( Time(dcf_sec) )?
Wie sieht denn der Gesamtschaltplan jetzt aus?
Welche Messgeräte stehen dir gerade zur Verfügung?

Grüße,
Cassio
 
Welche Messgeräte stehen dir gerade zur Verfügung?
für das DCF77-Signal könnte man nun ein Oszilloskop gebrauchen ...

Mit Digitalmultimeter kommt man da nicht wirklich weiter. Das wär so als wenn man mit ner Waage die Anzahl und Geschwindigkeit von drauffallenden Steinchen bestimmen möchte ;)

Gruß
Dino
 
So nun kommt es...

Was machen denn die acht Statusbits in der Anzeige?

Antwort: Nur Bit_0 ändert sich ab und zu ..meistens jedoch auf 0 (die anderen Bits machen garnichts.. alle auf 0)

Läuft die Softclock ( Time$ )?

Ja sie zählt hoch so wie sie es soll..

Läuft die DCF-Uhr ( Time(dcf_sec) )?

Jain, nicht wirklich. Sie läuft an und resetet sich mehr oder weniger immer 2-3-4-0 3-4-5-6-19-0 (Sekunden)
manchmal läuft sie auch bis 62 sekunden und dann wieder 0...:(

Wie sieht denn der Gesamtschaltplan jetzt aus?

im Moment so (jedoch ist darauf zu achten das ich die LCD Versorgung (Trimmer, etc.) nicht eingezeichnet habe. und bei dem DCF77 Empfänger nutze ich den internen Pullup... Das Modul kommt mit Open Collector Ausgängen.

Schaltplan.jpg

Welche Messgeräte stehen dir gerade zur Verfügung?

Im moment nur ein Vielfachmessgerät allerdings habe ich mir ein Oszilloskop ersteigert und habe eins auf der Arbeit woran ich auch nach der normalen Arbeitszeit meine Projekte machen darf.(Bin Azubi Elektroniker für Geräte und Systeme, aber noch ein Frischling)
:wink:


Grüße

P4711
 
Hallo P4711!

Ich kenne das Conrad-DCF-Modul leider nicht, darum muss ich jetzt mal nachfragen:
Hat das schon eine Transistorstufe am Ausgang des Signals?
Es kann jedenfalls nichts schaden, wenn du trotzdem noch einen Transistor zwischen Modul und Controller schaltest.
Die Ausgänge der DCF-Module sind nicht gerade "belastbar" und daher......
Eine einfache Möglichkeit wäre diese hier:
DCF77-Modul-Schaltplan.JPG

...oder auch mittels FET (BS170):
DCF77-BS170.gif


Damit hättest du diese "Fehlerquelle" schon mal erledigt. :wink:

Das deine Sekunden hin und her springen, oder teilweise weit über 60 hinaus laufen ist generell ein gutes Zeichen. :cool:
Letztlich wissen wir dadurch, dass Signale ankommen...... wenn auch nicht die gewünschten. :wink:

Lass dir doch mal die Impuls- und Pausenzeiten im LCD anzeigen.
Beispiel:
Code:
Locate 2 , 1
Lcd Bdcf_impuls ; "  " ; Bdcf_pause ; "          "

Anhand der Werte kann man das Signal auch recht gut "analysieren".
Die Impulse sollten immer recht kurz sein (3-12) und die Pausen entsprechend lang.


Zusätzlich kannst du dir auch noch die empfangenen Bits ausgeben lassen!
Code:
Locate 1 , 1
Lcd Bin(dcf_bits) ; Time(dcf_sec)


Was die Messgeräte betrifft......
Dann warten wir mal auf das Scope. Mit dem ist dann vieles Einfacher, aber jetzt nicht zwingend notwendig. :wink:

Grüße,
Cassio
 
Hi,

Jain, nicht wirklich. Sie läuft an und resetet sich mehr oder weniger immer 2-3-4-0 3-4-5-6-19-0 (Sekunden)
manchmal läuft sie auch bis 62 sekunden und dann wieder 0...:(
...
und bei dem DCF77 Empfänger nutze ich den internen Pullup... Das Modul kommt mit Open Collector Ausgängen.
also ich würde bei den Symptomen mal sagen das da irgendwas den Empfang stört. Entweder ist da Schmutz auf der Versorgungsspannung des Empfängers oder irgendwas wie ne Neonröhre, Elektronischer Halogentrafo, Mikrowelle, Fernseher, Computer, ... in der Nähe das da einstrahlt.

Das Modul sollte mit den Ausgängen relativ streßfrei sein. Mach mal in die Vcc-Zuleitung zum DDCF-Modul nen 47...100Ohm (irgendsowas) rein und pack mal direkt am Modul noch nen 100nF Kondensator dran. Wenn Schmutz auf der Versorgung liegt sollte das schonmal etwas beruhigen.

Mir ist noch was aufgefallen ... Beim Mega8 ist auf einer Gehäuseseite AVcc/GND und auf der anderen Gehäuseseite Vcc/GND. Auf beiden Gehäuseseiten nen 100nF direkt an die beiden Pins zum abblocken von Störungen und an der Seite mit Vcc/GND pack am besten noch nen 10..22µF dran. Das sollte man gleich als Standardbeschaltung als erstes machen. Der eine 100nF und der Elko sind ja schon besser asl wenn man nix hat aber je nachdem wo die sitzen können die die Welt auch nicht grade retten.

allerdings habe ich mir ein Oszilloskop ersteigert und habe eins auf der Arbeit woran ich auch nach der normalen Arbeitszeit meine Projekte machen darf.(Bin Azubi Elektroniker für Geräte und Systeme, aber noch ein Frischling) :wink:
Na das hört sich doch gut an. Die Welt ist gerettet :cool: Was hast du denn schönes besorgt ? nen analoges, digitales, PC-USB-Oszi ??

Gruß
Dino
 
Hi Leute,

habe es nun hinbekommen das Programm läuft jetzt so wie es soll Datum, Uhrzeit. Und Ab und zu welcher Tag im Jahr ist und sommer und winterzeit.. Wobei da glaube ich noch ein kleiner Fehler ist , da der mir im mom anzeigt das wir tag 92 haben?

aber das interessiert mich ja eh nicht bei meinen Nixies....

hier der Code

Code:
$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 40
$swstack = 32
$framesize = 60

Config Lcdpin = Pin , Db4 = Portd.1 , Db5 = Portd.2 , Db6 = Portd.3 , Db7 = Portd.4 , E = Portd.5 , Rs = Portd.0
Config Lcd = 16 * 2
Deflcdchar 0 , 32 , 14 , 17 , 32 , 14 , 17 , 32 , 4
Cls
Cursor Off

Config Dcf77 = Pinb.1 , Inverted = 0 , Timer = 1 , Debug = 0 , Check = 1 , Gosub = Sectic
'DCF77 benutzt Timer1

Config Date = Dmy , Separator = .

Enable Interrupts

Portb.1 = 0                    ' interner Pullup aus

Config Portb.2 = Output
Signal_kontroll_led Alias Portb.2


Dim Neue_sekunde As Bit                                                'Flag
Dim Synchron As Bit

Dim Tag_im_jahr As Byte
Dim Wochentag As Byte
Dim Differenz_zu_utc As Byte


Lcd "      Dcf77-Uhr"
Wait 2


'-----Hauptprogramm------

Do

Signal_kontroll_led = Dcf_status.0                                   'Signaltest LED blinkt bei Empfang


If Neue_sekunde = 1 Then
Neue_sekunde = 0
Gosub Anzeige

End If



Loop


End

'-------------------------


Sectic:
Neue_sekunde = 1
Return


Anzeige:
If Dcf_status.7 = 0 Then                                       'Wenn Uhr noch nicht gestellt dann Statusbits ausgeben und Sekunden hochzählen

Locate 1 , 1 : Lcd Bin(dcf_status)

Locate 2 , 1 : Lcd Time$

Else                                                                               'wenn gestellt dann ->anzeigen

Gosub Zeit_anzeigen


If _sec = 59 Then                                                              ' Protokoll vollständig? 

Synchron = Dcf_status.2

End If

Return


Zeit_anzeigen:
If _sec = 15 Or _sec = 30 Or _sec = 45 Or _sec = 16 Or _sec = 31 Or _sec = 46 Then   ' hin und her springen zwischen datum/uhrzeit und tag 
                                                                                      'im Jahr sowie Sommer oder Winterzeit

Cls

Tag_im_jahr = Dayofyear()
Incr Tag_im_jahr

Lcd "Tag " ; Tag_im_jahr


Differenz_zu_utc = Dcf77timezone()
Locate 2 , 1

  If Differenz_zu_utc = 1 Then
       Lcd "MESZ"

       Else

       Lcd "MEZ"

       End If
 Else

      Wochentag = Dayofweek()
           Locate 1 , 1 : Lcd Lookupstr(wochentag , Wochentage)

        Lcd Date$

        Locate 2 , 1 : Lcd "     " ; Time$

 Locate 2 , 16
        If Synchron = 1 Then                                                  'Uhr synchron? 
 Lcd Chr(0)
              Else
 Lcd " "
              End If

 End If

 End If



 Return

 Wochentage:

 Data "MO " , "Di " , "Mi " , "Do " , "Fr " , "Sa " , "So "

 Monate:
Data "" , "Jan" , "Feb" , "Mär" , "Apr" , "Mai" , "Jun" , "Jul" , "Aug" , "Sep" , "Okt" , "Nov" , "Dez"



Hoffe ich kann manchen damit Helfen...Ich werde später einen Schaltplan sowie den Kompletten Code zum Nachbau Preisgeben.


Grüße

P4711
 
Hallo P4711!

Na, dann hat es ja nun doch noch geklappt! :cool:

Woran hatte es denn nun gelegen, dass es gestern nicht ging...... aber heute?
Letztlich ist immer nur die Ursache des Problems und dann die Lösung dazu für alle Anderen hilfreich! :wink:

Dann mal weiterhin viel Spaß beim Entwickeln deiner Nixie-Uhr!

Grüße,
Cassio
 
Vielleicht etwas OT, aber da ich selbst ein großer Nixie-Uhren-Fan bin....

Anstelle der zwei 2*PCF8574P kann man gut einen ATmega16 nehmen, der kann dann bis zu sechs 7441 (K155ID1) direkt ansteuern. Die Netzteilvariante kommt mir bekannt vor. Etwas sparsamer vom Platz her ist die Version mit dem MC34063. Auf der Homepage von Stefan Kneller ist ein sehr brauchbarer Schaltplan dazu. Leider hat er diesen Teil seiner Homepage überarbeitet, aber über www.archive.org kann www.stefankneller.de immer noch vollständig eingesehen werden.

Vielleicht für die nächste Uhr...

Viele Grüße,
Sebastian
 

Ü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)