Forum: Mikrocontroller und Digitale Elektronik DCF77 probleme bei decodierung


von Daniel (Gast)


Lesenswert?

Hallo, ich bin gerade dabei mir eine DCF77-Uhr mit LCD zu bauen. Leider 
bekomme ich das Bit-Signal nicht decodiert. Die Auswertung des Signals, 
das Finden der Startposition usw. funktioniert. Bei dem unten stehenden 
Quelltext-Auszug sollen die Signale von Sekunde 21-27 erfassen und 
anschließend auf das LCD ausgeben. Aber irgendwie funktioniert das 
nicht. Kann mir jemand einen Tip geben? Muss mir die funktion 
get_signal() etwas anderes liefern?
Die Funktion get_signal() liefert mir jede Sekunde eine 1 oder 0 als 
int.
1
char buffer;
2
unsigned char minute=0x00;
3
4
for (int i=1; i<=7; i++)
5
{
6
get_signal();       // sendet 1 oder 0         
7
8
minute |= signal;   // Signal in minute schreiben
9
minute >>= 1;       // Inhalt um eine Stelle verschieben
10
}
11
12
stunde >>= 1;       // 1x verschieben um auf 8bit zu kommen
13
14
utoa( minute, buffer, 10 );   // in ascii umwandeln
15
lcd_string(buffer);           // auf dem LCD ausgeben

von Helmut -. (dc3yc)


Lesenswert?

Kann das sein, dass >>= die Daten aus dem Byte schiebt? Ich würde es mal 
mit << probieren! Ausserdem kommen zuerst die niederwertigen Bits, 
sodass du am Schluss das Ganze noch umdrehen musst.
Andere Möglichkeit wäre, ins MSB zu schreiben und dann nach unten (>>) 
zu verschieben.

Helmut.

von Tom (Gast)


Lesenswert?

Die Variable "Signal" wird in der Funktion get_signal() verändert? 
(liefert 1 oder 0 zurück?)

Mein Vorredner hat recht mit >> schiebst du alles um eine Stelle nach 
rechts (also raus).

Alternative:
1
  minute |= (1 << i);

Kannst dir auch mal folgendes programm anschauen. Funktioniert bei mir 
recht gut.
Beitrag "AVR DCF-77 Codereview"

Grüße

von Daniel (Gast)


Lesenswert?

Ich habe jetzt eine Lösung: Warum nicht gleich so:

Die Funktion „get_signal() gab mir bei einem 1-Signal des DCF eine 1 
raus, bei einem 0-Signal eine 0. Die Funktion habe ich nun so 
umgeschrieben, dass sie mir bei einem 1-Signal des DCF eine 0x80 
ausgibt.

0x80 => 0b1000 000

Dieses Bit-Muster kann ich nun problemlos nach recht verschieben, sodass 
am Ende die Bits automatisch in der richtigen Reihenfolge in der 
Variablen stehen.

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.