mikrocontroller.net

Forum: Compiler & IDEs DCF77 Empfang in C


Autor: bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

ich versuche mit folgendem Programm das DCF77 Signal meines
Conrad Empfängers auszuwerten. Der Code wird mit einem 100 HZ
Interrupt aufgerufen. Dummerweise funktioniert er nicht, er
erzeugt immer falsche Werte die mit der aktuellen Uhrzeit genau
nichts zutun haben. Ob das Bit 0,1 oder Sync ist erkennt der Code
richtig. So langsam gehen mir die Ideen aus, ich hoffe ihr könnt
mir helfen.
  static unsigned char counter,counter_threshold,reset_counter,lastreset_counter,level_threshold,sync_threshold,bit_counter,synced;
  static unsigned char minute_temp, hour_temp,bit,parity_counter;
  counter_threshold=14;
  level_threshold=20;
  sync_threshold=210;
    
  if (bit_is_clear(dcf77d_pin,dcf77d_bit) && counter>0) counter--;
  if (bit_is_set(dcf77d_pin,dcf77d_bit)) counter++;
  
  if (counter>=counter_threshold) {
    counter=0;
    reset_counter++;
    lastreset_counter=0;
  } else {
    lastreset_counter++;
  }
    
  if (lastreset_counter==level_threshold) {   
    if (reset_counter==1){
      bit=0;
    } else if (reset_counter==2) {
      bit=1;
    }
    reset_counter=0;
    parity_counter+=bit;
  }
  if (lastreset_counter>=sync_threshold) {
    synced=1;
    bit_counter=0;
    
    lastreset_counter = 0;
  }
  if (synced==1) {
    if (bit_counter==21) { 
      parity_counter=bit;
      minute_temp=bit;
    }
    if (bit_counter==22) minute_temp+=bit*2;
    if (bit_counter==23) minute_temp+=bit*4;
    if (bit_counter==24) minute_temp+=bit*8;
    if (bit_counter==25) minute_temp+=bit*10;
    if (bit_counter==26) minute_temp+=bit*20;
    if (bit_counter==27) minute_temp+=bit*40;
    if (bit_counter==28) {
      if (parity_counter %2!=0 && bit==1) minute=minute_temp;
    }
    if (bit_counter==29) { 
      parity_counter=bit;
      hour_temp=bit;
    }
    if (bit_counter==30) hour_temp+=bit*2;
    if (bit_counter==31) hour_temp+=bit*4;
    if (bit_counter==32) hour_temp+=bit*8;
    if (bit_counter==33) hour_temp+=bit*10;
    if (bit_counter==34) hour_temp+=bit*20;
    if (bit_counter==35) {
      if (parity_counter %2!=0 && bit==1)  hour=hour_temp;
    }
    if (bit_counter==58) {
      synced=0;
    }
    bit_counter++;
  }

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lass dir doch einfach mal die Einzelbits ausgeben und sieh sie dir an, 
was sich in der nächsten Minute verändert.

Autor: Joachim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Bernd,

Du hälst dich genau an diesen berühmten Ausspruch:
Real Programmers Don't Document - If it was hard to write, it should be 
hard to understand.

Kann es sein, dass der bitcounterstand gegenüber der tatsächlichen 
Sekunde um eine Stelle voraus ist?

Gruß
Joachim

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.