mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik dcf77 ich werd noch wahnsinnig (was könnte falsch sein?)


Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,

ich bastle jetzt seit einiger zeit an meinem dcf77 empfänger.
und ich weiß einfach nicht was falsch läuft :/

ich kann das signal zwar empfangen aber irgendwie passt es nicht wenn 
ich es manuell auswerte...
ich habe mehr mals in reihe das signal empfangen lassen und es mir 
notiert
es sieht immer sehr ähnlich aus (datum/jahr usw.)
von daher kann es nicht sooo arg falsch sein :/

hier mal zwei komplette signale..
mag sein das das ganze atm noch nicht 100%ig verkabelt ist aber wenn 
sich zwei strings so stark ähnlich sind wird es ja so schlecht auch 
nicht sein oder? :/
0110010100101010001010010010000110100001001010100011001000010000
0111011110000010001010001110100110100001001010100011001000010000


hier der code
main()
{    
  DDRD  = 0x00;
  MCUCR = (1<<ISC01) | (1<<ISC00) ;    //positive flanke
  GICR  = (1<<INT0);            //int0  aktiv

  TCCR1A  = 0x00;
  TCCR1B   = (1<<CS12);          //prescaler 256 //wertet die signallängen aus

  lcd_pwrup();
  
  TCNT1=0;
  sei();
  
  while(1)
  {  
    if(k==2) 
    {
      cli(); 
      lcd_choporder(1);         //clear screen
      _delay_ms(2);

      sprintf(out,"%08lx",ether3); 
      lcd_sendstring(out);      //gibt den out string aus

      sprintf(out,"%08lx",ether4);
      lcd_sendstring(out);
      while(1);
    }
  }
}

ISR(INT0_vect)
{
  if(TCNT1>23000) {ether3=ether1; ether4=ether2; ether1=0; ether2=0; lcd_senddata('x'); if(j>26){k++;}; i=0;j=0;}    //anfang einer neuen minute

  TCNT1=0;
  
  if(z>=15) {lcd_choporder(1); z=0;}          //leert das display periodisch damit es nicht überläuft

  while(up);
  
  
  if(TCNT1<1800 && TCNT1>1200 && i<32) {ether1|=(0l<<31-i); lcd_senddata('0'); i++; z++;}        //füllt die erste long variable
  if(TCNT1>2700 && TCNT1<3600 && i<32) {ether1|=(1l<<31-i); lcd_senddata('1'); i++; z++;}

  if(TCNT1<1800 && TCNT1>1200 && i>31) {ether2|=(0l<<31-j); lcd_senddata('0'); j++; z++;}        //füllt die zweite long variable
  if(TCNT1>2700 && TCNT1<3600 && i>31) {ether2|=(1l<<31-j); lcd_senddata('1'); j++; z++;}

  
   
  TCNT1=0;
}

ein problem was vereinzelt auftritt ist das schnell hintereinander 
2zahlen aufs display geschrieben werden...ist mir schleierhaft wie das 
sein kann :/

wäre echt klasse wenn ihr mir weiterhelfen könnt

gruß

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
evtl. noch erwähnenswert

>23000 entspricht >1500ms filtert die 59 sekunde
1562 = 100ms
3125 = 200ms

Autor: David Madl (md2k7)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

(DCF77 macht man, damit es störsicherer ist, nicht per 
Flanken-Interrupt, sondern tastet mehrfach pro Bit ab und entscheidet 
dann z.B. anhand der Mehrheit, in welchem Zustand sich das Bit 
befindet.)

Ansonsten bringt dir jede Störung sofort das gesamte Datenpaket 
durcheinander.

Beispiele gibt es in der Codesammlung zu Genüge.

PS: sehe gerade, dass du zumindest die Zeiten der Flanken prüfst, ob sie 
ungefähr stimmen. Naja, wie gesagt, inspirier dich in der Codesammlung.

Gruß
David

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
naja wie gesagt ich glaube allzu störanfällig ist es glaube ich nicht, 
denn die letzten bits (jahr,monat) sind immer gleich hex(2a3210)

nur passen sie nicht zum heutigen datum :(

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist es denn für ein Empfänger?

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der empfänger kommt aus einem funkwecker

viel mehr weiß ich nicht darüber

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du die exakte Signalform nicht kennst (Oszi?), dann lass das mit 
dem Flanken-Interrupt sein und frag alle zig Millisekunden im 
Timerinterrupt nach. Bei den Reichelt/Pollin-Modulen ist das 
beispielsweise ziemlich nützlich.

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

Bewertung
0 lesenswert
nicht lesenswert
gast schrieb:
> naja wie gesagt ich glaube allzu störanfällig ist es glaube ich nicht,
> denn die letzten bits (jahr,monat) sind immer gleich hex(2a3210)
>
> nur passen sie nicht zum heutigen datum :(

Probier es auch mal anders rum
Aus 0 mach 1, aus 1 mach 0

Kommt dann was Vernünftiges raus?

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ein problem was vereinzelt auftritt
Wahrscheinlich, wenn i==31 ist. Dann greift die erste if und die dritte 
if, bzw. die zweite und vierte.

Volker

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab das problem jetzt gelöst

respekt volker genau daran lag es ;) nur das ich x stunden zum finden 
gebraucht habe -.-

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.