Forum: Projekte & Code DCF-Uhr mit LCD in C


von Johannes M. (johannesm)


Angehängte Dateien:

Lesenswert?

Hallo,
ich bin gerade dabei in die C-Programmierung für Mikrocontroller 
einzusteigen und habe mir als erstes Projekt eine DCF77-Uhr ausgewählt.
Sicherlich ist mein Programmcode noch nicht so ausgefeilt wie von 
erfahrenen Programmierern, ich könnte mir aber vorstellen das andere 
Einsteiger/Anfänger durch meinen primitiven Code durchsteigen :-)
Meine bisherigen Programmierkenntnisse beschränken sich auf etwas 
PIC-Assembler (vor ~3 Jahren in der Ausbildung) und einem Semester Java, 
also bitte nicht gleich steinigen wenn da ein paar grobe Schnitzer drin 
sind.

Also jetzt ein paar Infos zu dem was ich fabriziert habe:
Programmiert im AVR Studio (mit AVR-GCC)
Hardware:
STK500
ATmega16
16MHz Quarz
20x4 Zeichen LCD (HD44780 kompatibel)
DCF77-Empfangsmodul von Conrad (641138) (PullUp-Widerstand 10k zwischen 
Anschluß 2 und 4)

Die LCD-Ansteuerung habe ich aus dem Tutorial übernommen, vielen Dank an 
den Autor an dieser Stelle
Ansteuerung Hardware/Software entsprechend dem AVR-GCC-Tutorial:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung

Nun zu meinem Programm

Abtastung erfolgt mit einem 1ms Trigger.

Die Synchronisation zum DCF-Signal erfolgt durch einen High-Pegel 
zwischen 1750-1950ms, das ist das 59Bit einer Minute, welches nicht 
abgesenkt wird.

Danach beginnt die Auswertung der Datenbits, dabei habe ich folgende 
Werte angenommen
Pegel-Absenkung von 60-140ms entspricht einer logischen 0
Pegel-Absenkung von 160-240ms entspricht einer logischen 1
keine Absenkung für 1750-1950ms entspricht dem Beginn einer neuen Minute

Abbruchkriterien (bzw. Start einer neuen Synchronisation)
...wenn mehr oder weniger als 59Bits pro Minute erkannt werden.
...Pegel-Zeiten die außerhalb der oben genannten Toleranzen (für 
0/1/neue Minute) liegen
...Überprüfung der Minuten-, Stunden- und Datums-Parität

Über einen externen Quarz wird ein 1ms Takt erzeugt, damit läuft die 
Uhrzeit/das Datum auch weiter, wenn keine korrekten DCF-Daten empfangen 
werden.

Abgleich zwischen der internen Uhr und den DCF-Daten bei korrektem 
Empfang (hier plane ich noch eine Plausibilitätsüberprüfung einzubauen)

Auf das LCD werden folgende Daten ausgegeben:
Wochentag (Mo/Di/Mi/Do/Fr/Sa/So)
Datum (dd.mm.yyyy) (Meine Lösung für die Jahreszahl ist noch etwas 
rudimentär, ob in 90 Jahren noch jemand DCF77-Uhren benutzt? ;-) )
Zeitzone (MEZ/MESZ)
Zeit (hh:mm:ss)
Status der Synchronisation (?/!)

ToDo's:
Behandlung der Schaltsekunde (DCF-Auswertung "case 19")
Behandlung der angekündigten Zeitumstellung (DCF-Auswertung "case 16")
Anpassung für die zweistelligen Jahreszahlen

Geplante Erweiterungen:
Grafik-LCD (320x240) damit ich später noch andere Dinge anzeigen kann

Zum Einstieg war das bisher eine tolle Sache und ich habe viel über die 
Eigenheiten/das Eigenleben der Hardware und Software gelernt, mal 
schauen wie es weitergeht.

vg
Johannes

Edit: Eigentlich sollte der Anhang nur einmal dran, ist aber beides das 
Gleiche.

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Johannes M. schrieb:
>...
> Edit: Eigentlich sollte der Anhang nur einmal dran, ist aber beides das
> Gleiche.
Habe einen der Anhänge gelöscht.

von Marius S. (lupin) Benutzerseite


Lesenswert?

Ich zähle mal die Sekunden bis der Herr Dannegger seinen Code hier 
verlinkt.

von Johannes M. (johannesm)


Angehängte Dateien:

Lesenswert?

Martin Thomas schrieb:
> Habe einen der Anhänge gelöscht.

Danke


Andere Beispielprogramme die man hier im Forum bzw. im Netz finden kann 
sind mir natürlich auch bekannt. Aber es macht doch viel mehr Spaß etwas 
selbst zu machen und dabei dazuzulernen.

Im Anhang noch ein Foto mit der Darstellung auf dem LCD.

von Simon K. (simon) Benutzerseite


Lesenswert?

Marius S. schrieb:
> Ich zähle mal die Sekunden bis der Herr Dannegger seinen Code hier
> verlinkt.

Immerhin hat er die Abtastung in einem Timer-Interrupt (1ms Trigger) 
gemacht und nicht per Interrupt.
Das ist schon löblich!

von Johannes M. (johannesm)


Angehängte Dateien:

Lesenswert?

Mir sind gerade eben beim Datumswechsel ein paar Fehler aufgefallen. 
Fälschlicherweise hatte ich beim Datumsübergang schon beim 28.02. direkt 
auf den nächsten Monat umgeschaltet und der Monat begann bei Tag 0. 
Sollte nun behoben sein, noch nicht schön aber es funktioniert :)

von Bernd (Gast)


Lesenswert?

Hallo,
verstehe deine Routine "void dcf_sync(void)" nicht ganz.
Habe sie versucht im Simulator zu testen aber selbst bei dem Versuch
If(counter_high>=2) laüft der Simulator nicht weiter.(counter_high wurde 
auf 2 hochgezaehlt).
Liegt das am Simulator oder wie kann das sein?
Gruss Bernd

von Johannes M. (johannesm)


Lesenswert?

Hi,
im Simulator habe ich das noch nicht getestet, aber ich kann ja mal 
versuchen die Anweisungen in der "void dcf_sync(void)" etwas genauer zu 
beschreiben.
Als Randbedingung noch zu beachten: die Variable counter_high wird in 
der ISR erhöht, also alle 1ms um +1.
1
if(!(dataPC & (1<<PINC1))) //ist am Eingangspin ein Low-Pegel wird dieser Zweig ausgeführt
2
  {
3
    if(counter_high>=1750 && counter_high<=1950) //ist der Wert der Variable counter_high zwischen 1750 und 1950 so kennzeichnet dies den Anfang einer neuen Minute (alle Counter, das DCF-Datum/Uhrzeit werden zurückgesetzt und es geht zurück in den normalen Programmablauf)
4
    {
5
      //LCD-Ausgabe: Synchronisation erfolgreich
6
      set_cursor(19,1);
7
      lcd_data('!');
8
9
      counter_reset(); //setzt sowohl counter_high, counter_low und die bit_number auf 0
10
      dcf_date_reset(); //setzt nach erfolgreicher Synchronisation den Datumswert auf 0
11
      dcf_time_reset(); //setzt nach erfolgreicher Synchronisation den Uhrezeitwert auf 0
12
    }
13
    else //ist der Wert counter_high kleiner als 1750 oder größer als 1950, liegt entweder ein Übertragungsfehler des DCF-Moduls vor oder es ist der ganz normale High-Pegel zwischen den Sekunden-Absenkungen.
14
    {
15
      counter_high=0; //hier wird wieder der counter_high zurückgesetzt, sonst ist bei mehrmaligem durchlauf der Wert immer >1950.
16
      dcf_sync();
17
    }
18
  }
19
  else //ist am Eingangspin ein High-Pegel wird wieder dcf_sync() aufgerufen. Es werden keine Counter zurückgesetzt.
20
  {
21
    dcf_sync();
22
  }

Ich hoffe das hat mehr geholfen als verwirrt, bin ja selbst noch am 
lernen. :)

von Bernd B. (behbeh)


Lesenswert?

Hallo,
ja, so hatte ich das auch verstanden.
Problem schein zu sein, das ich A) einen anderen PIN nehmen, und B) den 
gesamten Port im Interupt einlesen. Die und Verknüpfung klappt dann wohl 
nicht mit dem (1<<PINC5).
Also muss ich auch beim einlesen nur das eine BIT einlesen.
Mal sehen ob das klappt.
Danke
Bernd

von Mnemonic82 (Gast)


Angehängte Dateien:

Lesenswert?

Guten morgen...

Habe den Code übernommen und versucht ihn für nen Atmega 2560 
anzupassen.
Bekomme auch keine Fehlermeldungen mehr raus. Die Anzeige auf dem 
Display passt auch, nur leider krieg ich das DCF-Signal nich rein.
Hab schon alles mögliche ausprobiert...

Vielleicht ist ja doch noch nen Fehler im Code?

Danke im Vorraus...

von Bernd B. (behbeh)


Lesenswert?

Hallo,
habe mein Problem erkannt. Da ich den Code in ein extra File (clock.c) 
gespeichert habe und auch  die Variablen in clock.h muss ich wohl die 
counter_xx und die millisecond mit "volatile" versehen, dann geht es 
auch im Simulator. Vorher wurde der Befehl if(counter_high<=xxx && 
counter_high>=xxx) nicht im Simulator ausgeführt..

Mein Datenlogger läuft jetzt (anscheinnend?!).

Bernd

von Mnemnoni82 (Gast)


Lesenswert?

Kann es vielleicht sein das ich bei der Timer init nen fehler gemacht 
habe?

von Johannes M. (johannesm)


Lesenswert?

Hi,
habe mal über die Timer Einstellungen geschaut (mit dem 2560 habe ich 
noch nicht gearbeitet), die sehen auf den ersten Blick aber richtig aus.
Ansonsten würden mir spontan folgende Fehlerquellen einfallen:
Läuft der mega2560 mit 16 MHz? (Fuses)
Welches DCF-Modul verwendest du? An PinC1 Angeschlossen?
Beim Conrad Modul habe ich den invertierten DCF-Ausgang mit einem 
Pull-Up Widerstand verwendet.
Hast du schon mal direkt die Signale am DCF-Modul angeschaut? Ist der 
Empfang i.O.?

von Mnemonic82 (Gast)


Lesenswert?

Hi...

Erstmal danke das du mir helfen möchtest.
Also die Taktfrequenz des mega2560 ist auch 16MHz, wie beim mega 16.
Kann es sein das ich doch was an den fuses machen muss?

Benutze auch das DCF-Modul von Conrad, hab aber die Pullups wie im 
Datenblatt gezeigt angeschlossen. (d.h. an den Klemmen 3 und 4 jeweils 
einen 10k, die Enden kurzgeschlossen und dann von da ne Brücke auf 
Klemme 2)
Du hast nur am negierten Ausgang nen Pullup benutzt?

Den Empfang hab ich mit nem Multimeter überprüft. (5V angelegt und die 
Ausgänge gemessen. Da hab ich ne Spannung gemessen die zwischen 0 und 5V
geschwankt hat)
Kann man das überhaupt so machen?

Gruss Fabian

von Mnemonic82 (Gast)


Lesenswert?

Hast du vielleicht nen Bild vom DCF mit angeschlossenem Pullup?

von Johannes M. (johannesm)


Angehängte Dateien:

Lesenswert?

Habe mal ein Foto gemacht und beschriftet.

Die Pegel mit einem Multimeter zu messen ist natürlich etwas "ungenau", 
beim DCF-Signal kommt es ja hauptsächlich auf die Zeiten zwischen den 
Pegeländerungen an. Dazu habe ich zwei Bilder (im pdf) vom Oszi 
angehängt, so müsste es in etwa aussehen.

Auf der 1ten Seite die Abbildung einer kompletten Minute, auf der 2ten 
Seite noch mal als Detail die "fehlende" Absenkung für die Kennzeichnung 
einer neuen Minute und die Unterscheidung zwischen der logischen 0 und 1 
ist auch gut zu erkennen.

von Mnemonic82 (Gast)


Lesenswert?

Hi...

Vielen Dank erstmal für die Bilder. Das die Sache mit dem Multimeter 
ziemlich ungenau ist war mir ja klar, hab aber leider kein oszi zur 
Verfügung. So konnte ich wenigstens sehn ob überhaupt was rauskommt.

Also ich hab jetzt das DCF so beschaltet wie du es auch gemacht hast.
Hab den Ausgang des DCF`s auch an PC1 gehängt. In der "main" von
"dcf-clock.c" definierst du PB0 als Ausgang. Mir ist leider nich ganz 
klar wofür genau. Bitte nich auslachen, steh noch ziemlich am Anfang.

Zu meiner Hardware:
Benutze das MK3 von myAVR, da sollte doch eigentlich alles notwendige 
drauf sein. (Quartz für den Takt des Timers, usw.)

Gruss Fabian

von Johannes M. (johannesm)


Lesenswert?

PB0 ist noch eine "Leiche" von meinem Testaufbau, hat keine Funktion.

Die Zeilen können beide gelöscht werden:
1
DDRB |= (1<<PB0);  //PB0 Ausgang (1)
2
PORTB &= ~(1<<PB0);  //PB0 auf low gesetzt (0)

Ich bin auch gerade dabei den Programm-Code zu überarbeiten, das wird 
sich aber aus Zeitgründen noch ein paar Tage/Wochen hinziehen.
Der aktuelle Stand hier im Forum sollte aber ohne Probleme laufen.

von Mnemonic82 (Gast)


Lesenswert?

Vielen dank für deine Hilfe...
Wünsch dir weiterhin viel Erfolg und Spass bei deinem Projekt.
Werds mal beobachten

Gruss Fabian

von HansDampf (Gast)


Lesenswert?

hallo johannes,
gute entwicklung die du gemacht hast.

zu meiner frage:
ich will dieses projekt auch umsetzen. allerdings ohne dem 
empfangsmodul. Anstatt dem empfangsmodul, kommt mein dcf signal direkt 
von einer rs232 schnittstelle. sollte kein unterschied sein, oder?

mfg HansDampf

von Hanna (Gast)


Lesenswert?

Simon K. schrieb:
> Immerhin hat er die Abtastung in einem Timer-Interrupt (1ms Trigger)
> gemacht und nicht per Interrupt.
> Das ist schon löblich!

Da man ja immer gerne was dazulernen will:
Ich dachte eigentlich, das die Abtastung per Interrupt der Normalfall 
wäre. Was bringt die Abtastung im Timer-Interrupt denn für Vorteile?

von HansDampf (Gast)


Lesenswert?

so jetzt hab ich hier ein
Atmega8 +
2x16 LCD
und was muss ich am code ändern (von 16bit auf 8bit).

cya

von Niko Robna (Gast)


Lesenswert?

HansDampf schrieb:
> (von 16bit auf 8bit)

Der Mega16 ist auch nur ein 8Bit-Controller.

von Sauger (Gast)


Lesenswert?

Nabend,

HansDampf schrieb:
> zu meiner frage:
> ich will dieses projekt auch umsetzen. allerdings ohne dem
> empfangsmodul. Anstatt dem empfangsmodul, kommt mein dcf signal direkt
> von einer rs232 schnittstelle. sollte kein unterschied sein, oder?

doch, du brauchst einen Pegelwandler. Die nächste Frage ist ob das 
Empfangsmodul die Uhrzeit als String übergibt, oder an einer 
Handshakeleitung rumzappelt.

Hanna schrieb:
> Da man ja immer gerne was dazulernen will:
> Ich dachte eigentlich, das die Abtastung per Interrupt der Normalfall
> wäre. Was bringt die Abtastung im Timer-Interrupt denn für Vorteile?

Du kannst jeden x-beliebigen Pin nehmen. Voraussetzung ist natürlich das 
dein Programm diesen rechtzeitig prüfen (Pollen) kann. Ein delay_ms(500) 
irgendwo in der Hauptschleife geht dann nicht mehr.

MfG

von Sauger (Gast)


Lesenswert?

Sauger schrieb:
> Voraussetzung ist natürlich das
> dein Programm diesen rechtzeitig prüfen (Pollen) kann. Ein delay_ms(500)
> irgendwo in der Hauptschleife geht dann nicht mehr.

ist natürlich mist, habe Timer-Interrupt überlesen

MfG

von Julian (Gast)


Lesenswert?

Hi,

ich habe hier ebenfalls (wie ein paar Beiträge zuvor) einen ATMega 8. 
Ich verwende einen externen Quarz mit 8MHz. Die Frequenz habe ich 
umgestellt sowie ein paar weiter Änderungen vorgenommen, allerdings 
wirft der Timing-Absatz der Hauptmethode 4 Errors. Ist das irgendwie 
ATMega16 spezifisch? Kann ich mir kaum vorstellen:
1
../dcf-clock.c:566: error: 'TCCR0A' undeclared (first use in this function)
2
../dcf-clock.c:566: error: (Each undeclared identifier is reported only once
3
../dcf-clock.c:566: error: for each function it appears in.)
4
../dcf-clock.c:566: error: 'WGM01' undeclared (first use in this function)
5
../dcf-clock.c:567: error: 'OCR0A' undeclared (first use in this function)
6
../dcf-clock.c:568: error: 'TIMSK0' undeclared (first use in this function)
7
../dcf-clock.c:568: error: 'OCIE0A' undeclared (first use in this function)

Gruß,
Julian

von Gerd (Gast)


Lesenswert?

Die Register für den Timer0 heissen beim Atmega16 anders als beim 
Atmega8. Da musst du in die beiden Datenblätter schauen und deinen Code 
anpassen.

von Julian (Gast)


Lesenswert?

Läuft! Danke!

von Alexander K. (bandit1200)


Lesenswert?

Hallo!!
Wer kann mir den Schritt für Schritt erklären wie man dieses Projekt
mit Avr Studio umsetzt.
Bin Anfänger, habe das Tutorial durch, bekommer aber beim Build ständig 
Fehler, habe bisher nur leds zum blinken und an-aus gebracht..
Ich weiss nicht genau was in AVR Studio geaddet werden soll.
Habe dcg-clock.c drin, lcd-routines.c und lcd routines.h.
Habe das Evaluationsboard von pollin mit LCD, benutze zum Übertragen 
Ponyprog.

Suche nach Problemlösung hier in den Foren seit über 6 std ohne Erfolg.

/*Fehler*/

lcd-routines.o:D:\Dokumente und Einstellungen\Bandit_1200\Eigene 
Dateien\Downloads\DCF-Clock_2010-02-28\DCF-Clock\default/../lcd-routines 
.c:134:  first defined here
make: *** [dcf-clock.elf] Error 1
Build failed with 1 errors and 4 warnings...

Bitte keine Links zu anderen Freds, habe sie alle durch.
Wer hilft mir?
BITTE!!!

von Johannes M. (johannesm)


Lesenswert?

Hi,
habe gerade mal getestet mit den 3 genannten Dateien das Projekt 
aufzusetzen, hat bei mir funktioniert. Ich schreibe mal mein Vorgehen 
auf, vielleicht hilft dir das:
Im AVR Studio:
- New Project -> AVR GCC -> Project name: dcf-clock
- AVR Simulator -> Device ATmega16
- Bei den Source Files die angelegte Datei dcf-clock.c aus dem Projekt 
entfernen
- Nun die 3 Dateien (dcf-clock.c, lcd-routines.c und lcd-routines.h) im 
Explorer in das Projektverzeichnis kopieren (hier liegt schon 
"dcf-clock.aps")
- Wieder im AVR Studio die beiden c-Dateien bei den Source Files adden 
und die h-Datei bei den Header Files
- Menü Projekt -> Configuration Options -> Frequency: 16000000 Hz -> OK
- F7 drücken -> fertig

von Alexander K. (bandit1200)


Lesenswert?

Herzlichen Dank.
Hat wunderbar funktioniert!!

von Maulwurf (Gast)


Lesenswert?

Hallo Julian

Kannst du mal den Code für der Mega8 posten ?

Gruss und Danke Bernd

von Dieter H. (hans691)


Lesenswert?

Hallo Johannes,

erst mal vielendank für des Code.
Ich versuche gerade ihn zu verstehen und hätte eine Frage.
Wie springst du aus der Routine dcf_sync()heraus dcf_sync() wird ja 
wieder von sich selbst aufgerufen?

Danke
Dieter

von Johannes M. (johannesm)


Lesenswert?

Dieter Hagl schrieb:
> Hallo Johannes,
>
> erst mal vielendank für des Code.
> Ich versuche gerade ihn zu verstehen und hätte eine Frage.
> Wie springst du aus der Routine dcf_sync()heraus dcf_sync() wird ja
> wieder von sich selbst aufgerufen?
>
> Danke
> Dieter

Hallo,

im Falle das die Bedingung der if-Anweisung in der dcf_sync() zutrifft, 
also "Synchronisation erfolgreich", ist das Ende der Funktion erreicht 
und es geht zurück zur Adresse, die auf dem Stack liegt. Also zur 
while-Schleife in main.

Gruß
Johannes

von Kilo (Gast)


Lesenswert?

Ist zwar schon was älter aber egal...

bekomme den Code auf einem Atmega1284p nicht zum laufen. LCD Anzeige ist 
da, aber es kommen keine Werte.
Für den Timer habe ich folgnedes eingetragen:
1
  TCCR0A = (1<<WGM01) | (1<<CS00) | (1<<CS01);  //CTC Modus (1), Prescaler 64 (1) (1)
2
  OCR0A = 250-1; //((16000000/64)/1000) = 250
3
  TIMSK0 |= (1<<OCIE0A);  //Compare Interrupt erlauben (1)

Woran kann das liegen???

von Simon K. (do1sku)


Lesenswert?

Hallo,

bin grad beim nachbau und entweder bin ich blind oder blöd (oder beides 
:D )

An welchen PIN wird das Signal des DCF77 Empfänger eingegeben ?

von Simon K. (do1sku)


Lesenswert?

Simon Kupfer schrieb:
> Hallo,
>
> bin grad beim nachbau und entweder bin ich blind oder blöd (oder beides
> :D )
>
> An welchen PIN wird das Signal des DCF77 Empfänger eingegeben ?

Kommando zurück. Bin beides. Bilder sollte man sich anschauen :D

von Oliver G. (suchoi31)


Lesenswert?

Guten Tag,

ich habe eine Frage zum Programmcode.

Ich habe ein DCF77 Empfangsmodul von Pollin. Dieses Modul liefert kein 
invertiertes Signal, wie beispielsweise das vom Themenstarter verwendete 
Modul.

Reicht es die folgenden Zeilen auszutauschen, bzw zu verändern und einen 
DCF77 Empfänger mit uninvertiertem Signal zu verwenden?:

In dcf_sync: if(!(dataPC & (1<<PINC1)))

und in level_analysis: if(dataPC & (1<<PINC1))

Würde das gehen oder muss ich noch mehr ändern.

Wäre über jeden Tipp oder Rat dankbar.

MFG suchoi31

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Wenn das Signal bis auf die fehlende Invertierung exakt identisch ist, 
sollte das so funktionieren.

Hast Du es denn schon ausprobiert und geht es wider Erwarten nicht?

von Oliver G. (suchoi31)


Lesenswert?

Guten Morgen,

habe es probiert und die Synchronisation funktioniert nicht richtig.

Bei mir zählt das Programm immer auf 4 Sekunden hoch und geht wieder auf 
0 zurück. Wenn dann die lange Pause kommt zwischen Sekunde 58 und 00 
synchronisiert er sich anscheinend, da das Fragezeichen auf das 
Ausrufezeichen wechselt...Nach ein paar Sekunden wird alles wieder 
resetet und das Spiel beginnt von vorn.

Übrigens arbeite ich mit einem ATmega32 mit einer Taktfrequenz von 
11,059 MHz.

Vllt kennt jemand dieses Problem und kann mir weiter helfen.

Vielen Dank schonmal im vorraus.

MFG suchoi31

von Johannes M. (johannesm)


Lesenswert?

Prinzipiell scheint das Programm also den Minutenwechsel zu erkennen 
(vermutlich wegen des großen Wertefensters an der Stelle) nur danach 
verliert er die Synchronisation.
Hast du das OCR0 Register (Zeile 568) entsprechend deiner Taktfrequenz 
angepasst? Damit wird die ISR mit einem 1 ms Zyklus aufgerufen, wenn 
hier der falsche Wert im OCR0 steht passen die kompletten Zeiten nicht 
mehr.

Bzgl. deiner Benutzernachricht: Fragen kannst du einfach hier stellen, 
z.T. können die hier schneller beantwortet werden, da ich nicht ständig 
am PC bin bzw. meine Mails lese.

von Joachim B. (jar)


Lesenswert?

Oliver Go schrieb:
> Vllt kennt jemand dieses Problem und kann mir weiter helfen.

das Problem kenne ich nicht aber was ich hier so lesen konnte ist das 
Pollin Modul schlecht, ich habe damit aufgegeben und mir noch 3 ELV 
Module bestellt, aber auch die haben ein Problem mit der ungestörten 
Empfängnis, vor allem nahe am µC Controller, die besten Erfahrungen 
hatte ich mit abgesetztem Modul an langer Strippe, am Fenster plaziert 
und gut die Versorgungsspannung gefiltert, ohne Oszi ist das schwer zu 
beurteilen. Solange die Impulse nicht sauber im Sekundentakt kommen und 
lang <= 200ms und kurz <=100ms zu erkennen sind ist es aussichtslos.

: Bearbeitet durch User
von Oliver G. (suchoi31)


Angehängte Dateien:

Lesenswert?

Hallo an alle,

das Register OCR0 habe ich angepasst, die Zeile schaut jetzt so aus:

OCR0 = 173-1; //Für interne Uhr an 11,059 MHz angepasst

Fahre morgen mal zu Conrad und hole mir dieses Modul.
Vielleicht habe ich damit mehr Erfolg.

Eine Zeile verstehe ich jedoch nicht zu hundert Prozent:

dataPC = PINC;  //Der aktuelle Pegel vom DCF-Modul wird eingelesen und
in dataPC den anderen Funktionen zur Verfügung gestellt

Warum wird hier die komplette Reihe von PortC eingelesen und in dataPC
gespeichert, und nicht nur der PinC1?

Ich habe mal meinen modifizierten Code angehängt.
Vllt seht ihr dort warum das nicht funktioniert.

Das Signal sieht sauber aus, habe es mit einer LED visualisiert.
Aber klar, Unregelmäßigkeiten sind da natürlich nicht immer zu sehen.

Vielen Dank das Ihr mir so helft.

MFG suchoi31

von Joachim B. (jar)


Lesenswert?

Oliver Go schrieb:
> Das Signal sieht sauber aus, habe es mit einer LED visualisiert.
> Aber klar, Unregelmäßigkeiten sind da natürlich nicht immer zu sehen.

da siehst du nix wenn der erwartete 100ms Impuls 20x darin für 1-10µs 
ausgeht, die LED juckt das nicht nur dein Programm zählt anders, es 
verwirft den Impuls natürlich weil der weder zu erwarteten 100ms noch zu 
erwarteten 200ms passt.

von Oliver G. (suchoi31)


Lesenswert?

Hallo, ja das stimmt, habe mir am Wochenende den DCF77 von Conrad 
geholt, und damit synchronisiert er schon mal, wobei die 
Synchronisationssekunde nicht jedes mal erkannt wird. Nach 2 bis 3 
Minuten, nach der Erkennung von Uhrzeit und Datum, geht wirder alles auf 
0 zurück und er beginnt wieder die Synchronisationssekunde zu finden.

Werde heute mal ein Oszilloskop anschließen und die DCF77 Signale 
kontrollieren.

Wie kann man diese Signale, im Falle von Unregelmäßigkeiten, glätten?
Hochpassfilter oder Ähnliches? Habt ihr eine Idee?

MFG suchoi31

von Joachim B. (jar)


Lesenswert?

Oliver Go schrieb:
> Wie kann man diese Signale, im Falle von Unregelmäßigkeiten, glätten?
> Hochpassfilter oder Ähnliches? Habt ihr eine Idee?

wenn die
Lücken stabil bei 800-900-2000 ms sind und "nur" Lücken von wenigen µs 
im Impuls sind könnte ein Kondi die µs Lücken überbrücken.

Sind in den ms Pausen/Lücken Störimpulse hätte ich keine Idee.

ich rede von aktiv high 100ms -> 0 und 200ms -> 1

und Pausen Lücken müssen 800ms oder 900ms low sein (Ausnahme 59 Sekunde) 
2000ms?

: Bearbeitet durch User
von Oliver G. (suchoi31)


Lesenswert?

Hallo,

habe das Signal überprüft mit einem Oszilloskop.
Sieht soweit gut aus. Nur habe ich noch ein Problem mit dem Programm.

Wenn ich alles einschalte und ich bin noch weit von der Schaltsekunde 
entfernt synchronisiert er einfach nicht und bleibt sogar manchmal 
hängen, komischerweise meistens bei 9 Sekunden.Manchmal springt er dann 
wieder auf 0 zurück und fängt neu an zu zählen.Synchronisiert aber nicht 
bei der DCF Sekunde 59.

Wenn ich hingegen die Anlage bei DCF Sekunde 51 anschalte synchronisiert 
er wie er soll. Die Schaltsekunde kommt also eher, als der interne Timer 
Sekunde 9 erreicht hat.

Ein weiters Problem:Wenn ich zwischendrin das DCF Signal wegnehme, wenn 
er sich zuvor richtig synchronisiert hat, hängt er sich auf.

Wie kann man die Probleme beheben, einer eine Idee?

MFG suchoi31

von Joachim B. (jar)


Lesenswert?

Oliver Go schrieb:
> Sieht soweit gut aus.

das bedeutet noch nix, wenn high erkannt wird ABFRAGE dann schalte an 
einem anderen Port eine LED an und diese wieder aus wenn low erkannt 
wird und schau dir das Signal am LED Port an ob das immer noch schön die 
LED an und aus schaltet im Sekundentakt, dann weisst du der Prozessor 
erkennt richtig

Oliver Go schrieb:
> Nur habe ich noch ein Problem mit dem Programm.

Oliver Go schrieb:
> Wenn ich alles einschalte und ich bin noch weit von der Schaltsekunde
> entfernt synchronisiert er einfach nicht und bleibt sogar manchmal
> hängen, komischerweise meistens bei 9 Sekunden.

dann wird doch mal ein Impuls ausfallen, soweit zu sieht gut aus.

Du könntest sogar Merker setzen der alle Impulse high low zählt die ins 
Raster passen müssen, ich tippe mal der kommt nie bis 59

von Johannes M. (johannesm)


Lesenswert?

Hi,
lese mal mit dem Oszilloskop auf dem einen Kanal das DCF Signal direkt 
am Modul ein und auf dem anderen Kanal gibts du per Pin-Toggle das 
erkannte Signal vom Mikrocontroller aus. Diese sollten mit wenigen 
Millisekunden Versatz nahezu identisch sein.

Die Schaltsekunde würde ich noch gar nicht betrachten, erstmal muss der 
Empfang ordentlich funktionieren. Die Schaltsekunde ist glaube ich auch 
noch gar nicht implementiert.

Oliver Go schrieb:
> Ein weiters Problem:Wenn ich zwischendrin das DCF Signal wegnehme, wenn
> er sich zuvor richtig synchronisiert hat, hängt er sich auf.

Was passiert genau? Eigentlich (wenn ich mich noch korrekt erinnere) 
sollte er nur die Synchronisierung verlieren und die Uhrzeit läuft 
weiter.

von Joachim B. (jar)


Lesenswert?

Oliver Go schrieb:
> Ein weiters Problem:Wenn ich zwischendrin das DCF Signal wegnehme, wenn
> er sich zuvor richtig synchronisiert hat, hängt er sich auf.

dann ist deine Code falsch, wenn zwischendurch keine Impulse mehr kommen 
musst du deine Zählerei verwerfen und auf Pulse die gültig sind warten.

maximaler Pulsausfall 2000ms Minutenlücke 59 Sekunde, du musst eh einen 
Timer mitlaufen lassen um Zeiten der Pulse festzustellen wenn Lücke mit 
größer 2500ms und dabei der Puls nicht bis 59(58?) hochgezählt hat, 
ERROR, RESET der Zähler, warten auf neue......

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.