mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme um das DCF77-Signal zu lesen


Autor: Luca Bertoncello (lucabert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, Leute!

Nachdem ich mit dem Display klar gekommen bin, habe ich das nächste 
Problem auf dem Tisch, und zwar: die Zeit von einem DCF77-Modul 
(Reichelt) zu lesen.

Ich habe die PIN "Signal" an PB1 und VDD an PB0 eines ATMega32 
verbunden.

Nun schalte ich das Ding ein:
#define DCF77_SIGNAL_PORT     PORTB
#define DCF77_SIGNAL_DDR      DDRB
#define DCF77_SIGNAL_PIN      PINB
#define DCF77_SIGNAL          1

#define DCF77_UB_PORT         PORTB
#define DCF77_UB_DDR          DDRB
#define DCF77_UB_PIN          PINB
#define DCF77_UB              0

  DCF77_UB_DDR |= _BV(DCF77_UB);
  DCF77_SIGNAL_DDR &= ~_BV(DCF77_SIGNAL);
  DCF77_UB_PORT |= _BV(DCF77_UB);

Und in einer Schleife werde ich die Daten lesen...
Laut Doku wenn ein Signal 100ms lang ist, ist eine 0, wenn 200ms lang 
ist, eine 1.
Hier meine Schleife:
  while(1)
  {
    lcdGotoXY(2, 2);
    if (PORTB & (1<<PB1))
    {
      PORTB = ~(1<<PB1) & ~(1<<PB0);
      len = getUptime() - start;
      if(len > 100)
        c = '1';
      else
        c = '0';
    }
    else
    {
      PORTB = (1<<PB1) | (1<<PB0);
      start = getUptime();
    }
    sprintf(str, "%ld - %c - %ld", (getUptime() / 1000), c, len);
    lcdPuts(str);
  }

Leider ist c immer 0... len ist gerade 97 (immer! Es ändert sich NICHT).

Was mache ich denn jetzt falsches?

Danke euch!
Luca Bertoncello

Autor: Ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuch mal das DCF-Signal ungeändert auf einer LED auszugeben. Du 
müsstest lange und kurze Impulse sehen. Schreib eine Minute mit und 
berechne die Zeit daraus.

Autor: Luca Bertoncello (lucabert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich schrieb:
> Versuch mal das DCF-Signal ungeändert auf einer LED auszugeben. Du
> müsstest lange und kurze Impulse sehen. Schreib eine Minute mit und
> berechne die Zeit daraus.

Ich habe kein LED...

Ich habe schon probiert die Hintergrundbeleuchtung des Displays an- und 
auszuschalten, aber flackert SO schnell, daß man nur beim sehr 
aufmerksam gucken verstehen kann, daß es doch flackert...

Das war mein Code:
  while(1)
  {
    lcdGotoXY(2, 2);
    if (PORTB & (1<<PB1))
    {
      PORTB = ~(1<<PB1) & ~(1<<PB0);
      lcdBacklightOff();
    }
    else
    {
      PORTB = (1<<PB1) | (1<<PB0);
      lcdBacklightOn();
    }
  }

Ideen?

Grüße
Luca Bertoncello

Autor: Ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ge du wirst doch wohl ne led haben.

Autor: Luca Bertoncello (lucabert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich schrieb:
> Versuch mal das DCF-Signal ungeändert auf einer LED auszugeben. Du
> müsstest lange und kurze Impulse sehen. Schreib eine Minute mit und
> berechne die Zeit daraus.

Korrektur: jetzt blinkt, aber immer sind die Impulse gleich lang...

Kaputtes Ding oder was?

Grüße
Luca Bertoncello

Autor: Ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendeine 5mm 20mA 2V rote LED (mit Vorwiderstand natürlich).
Es sollte genau einmal pro Sekunde blinken,
entweder 100ms (Binäre 0) oder 200ms (Binäre 1).
Den Unterschied sieht man (kurz oder lang).

Autor: Ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einmal pro Minute (Sekunde 59, mit gekaufter Funkuhr vergleichen) sollte 
es nicht blinken.

Autor: Luca Bertoncello (lucabert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich schrieb:
> Irgendeine 5mm 20mA 2V rote LED (mit Vorwiderstand natürlich).
> Es sollte genau einmal pro Sekunde blinken,
> entweder 100ms (Binäre 0) oder 200ms (Binäre 1).
> Den Unterschied sieht man (kurz oder lang).

Na gut, die Hintergrundbeleuchtung des Displays ist nix anderes als ein 
LED.

Aber eine Sache (sehr komisch!) was ich gerade gesehen habe...

Wenn ich den DCF77 AUSSchalte, geht alles weiter wie vorher... Ist es 
normal?

Ich denke, das Ding kriegt sein Strom über ein PIN des ATMegas, aber 
sieht nicht so aus...

Einschalten tue ich mit:
DCF77_UB_PORT |= _BV(DCF77_UB);

Ausschalten mit:
DCF77_UB_PORT |= _BV(DCF77_UB);

In beide Fälle passiert das gleiche (LED flackert immer gleich lang). 
Warum denn?

Danke
Luca Bertoncello

Autor: Ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lass das Ganze mal 10 Minuten laufen, vielleicht empfängt es dann erst 
das Signal. Das mit dem Ausschalten kann ich nicht erklären, schalt VCC 
über einen Schalter und nicht über den AVR.

Autor: Andreas K. (derandi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie ist denn das Modul von Reichelt angeschlossen? Wenn ich mich recht 
entsinne konnten die nur 5 µA am Ausgang treiben...

Ausserdem reagieren DCF-77-Empfänger, egal welcher Lieferant, 
empfindlich auf Störquellen, kann also sein das du einfach keinen 
Empfang hast. Nachts ist besserer Empfang als Tagsüber.

Autor: Luca Bertoncello (lucabert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas K. schrieb:
> Wie ist denn das Modul von Reichelt angeschlossen? Wenn ich mich recht
> entsinne konnten die nur 5 µA am Ausgang treiben...

PIN Signal an PB1, PIN UB an PB0 (mit einem Widerstand 1K), die andere 
zwei an GND.
Ein Kerko 100n zwischen GND und UB.

Was ich noch nicht verstanden habe ist: was ist UB?!? Ist es ein 
Eingang? Oder Ausgang? Bekomme ich Daten von dort? Oder muß ich was 
geben?

> Ausserdem reagieren DCF-77-Empfänger, egal welcher Lieferant,
> empfindlich auf Störquellen, kann also sein das du einfach keinen
> Empfang hast. Nachts ist besserer Empfang als Tagsüber.

Naja, 1 und 0 empfange ich jetzt, aber die lange Pause nach dem 59. 
Sekunde immer nicht...

Ideen?
Wie kann ich prüfen, ob das Problem bei meinem Programm ist, und nicht 
bei dem Modul?

Danke
Luca Bertoncello

Autor: Rainer Unsinn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei dem Modul von Reichelt oder Pollin gibt es häufiger 
Empfangsprobleme. Suche am besten mal hier im Forum. Die besten 
Ergebnisse habe ich selbst mit dem Modul von Conrad gemacht. Allerdings 
ist auch das empfindlich gegenüber einer unsauberen Versorgungsspannung. 
Also ordentlich filtern.

Autor: Ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also wenn du kurze und lange Impulse siehst, dann muss es auch eine 
Pause in der 59. Sekunde geben. Es ist keine lange Pause, es fehlt eben 
nur ein Impuls. Versuch mal die Impulse aufzuschreiben (ja ich weiß, das 
ist schwierig, am besten mit 2 Personen -> einer schaut, einer schreibt) 
und dann herauszufinden, ob du daraus Datum und Uhrzeit lesen kannst.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.