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


von gast (Gast)


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
1
main()
2
{    
3
  DDRD  = 0x00;
4
  MCUCR = (1<<ISC01) | (1<<ISC00) ;    //positive flanke
5
  GICR  = (1<<INT0);            //int0  aktiv
6
7
  TCCR1A  = 0x00;
8
  TCCR1B   = (1<<CS12);          //prescaler 256 //wertet die signallängen aus
9
10
  lcd_pwrup();
11
  
12
  TCNT1=0;
13
  sei();
14
  
15
  while(1)
16
  {  
17
    if(k==2) 
18
    {
19
      cli(); 
20
      lcd_choporder(1);         //clear screen
21
      _delay_ms(2);
22
23
      sprintf(out,"%08lx",ether3); 
24
      lcd_sendstring(out);      //gibt den out string aus
25
26
      sprintf(out,"%08lx",ether4);
27
      lcd_sendstring(out);
28
      while(1);
29
    }
30
  }
31
}
32
33
ISR(INT0_vect)
34
{
35
  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
36
37
  TCNT1=0;
38
  
39
  if(z>=15) {lcd_choporder(1); z=0;}          //leert das display periodisch damit es nicht überläuft
40
41
  while(up);
42
  
43
  
44
  if(TCNT1<1800 && TCNT1>1200 && i<32) {ether1|=(0l<<31-i); lcd_senddata('0'); i++; z++;}        //füllt die erste long variable
45
  if(TCNT1>2700 && TCNT1<3600 && i<32) {ether1|=(1l<<31-i); lcd_senddata('1'); i++; z++;}
46
47
  if(TCNT1<1800 && TCNT1>1200 && i>31) {ether2|=(0l<<31-j); lcd_senddata('0'); j++; z++;}        //füllt die zweite long variable
48
  if(TCNT1>2700 && TCNT1<3600 && i>31) {ether2|=(1l<<31-j); lcd_senddata('1'); j++; z++;}
49
50
  
51
   
52
  TCNT1=0;
53
}

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ß

von gast (Gast)


Lesenswert?

evtl. noch erwähnenswert

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

von David M. (md2k7)


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

von gast (Gast)


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 :(

von (prx) A. K. (prx)


Lesenswert?

Was ist es denn für ein Empfänger?

von gast (Gast)


Lesenswert?

der empfänger kommt aus einem funkwecker

viel mehr weiß ich nicht darüber

von (prx) A. K. (prx)


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.

von Karl H. (kbuchegg)


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?

von Volker (Gast)


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

von gast (Gast)


Lesenswert?

hab das problem jetzt gelöst

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

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.