DCF77 Simulator - Vorgehensweise

OP #3495834
Lesenswert?

Hallo,

ich habe mir hier eine Uhr mit DCF77 Empfang gebaut. Dank der vielen 
Post's hier kein Problem. Nun möchte ich verschiedene Funktionen mit der 
Uhr realisieren, die ich logischerweise auch testen muss 
(Rückwärtscountdown, Schaltuhr,...). Ich möchte mir deshalb einen 
DCF77-Simulator bauen. Also keinen Sender in dem Sinne dass ich die 
Empfängerschaltung meiner Uhr beeinflusse, sondern ich will bei einem 
Mega16 mit einem digitalen Ausgang das Signal des Empfängerbausteins 
nachbilden.
Dazu habe ich zunächst Timer0 so konfiguriert, dass er im 1 ms Zyklus 
aufgerufen wird. Damit habe ich mir eine Uhr mit Stunden, Minuten, 
Sekunden und Datum gebaut. Soweit funktioniert das auch alles.
Nur habe ich keine Idee wie ich weiter vorgehen soll. Klar, die 
Zeitangaben (ohne Sekunde) dem Telegrammaufbau entsprechend ins 
BCD-Format wandeln, die Paritätsbits ergänzen,... und das Ganze in eine 
64 Bit Variable schieben.
Von dieser Variablen muss ich dann jede Sekunde ein Bit ausgeben, d.h. 
den Ausgang, der normalerweise High ist, für 100 bzw. 200 ms absenken.
Aber wie mache ich das ? Irgendwie habe ich hier keinen Plan .....
Moderator (Firma: Titel) Persönliche Seite #3495851
Lesenswert?

Karlheinz Druschel schrieb:
> und das Ganze in eine 64 Bit Variable schieben.
Ich würde hier ein Array vorziehen. Dann kannst du einfach über einen 
Index auf die Inhalte zugreifen...

> Dazu habe ich zunächst Timer0 so konfiguriert, dass er im 1 ms Zyklus
> aufgerufen wird.
Dann zählst du dort erst mal auf 100 und setzt dann ein 100ms-Flag.

Der Rest läuft in der Hauptschleife deines Programms. Hier mal in 
Pseudo-Code:
1
Interrupt1ms() {
2
   msec++;
3
   if msec=100 {
4
      msec=0;
5
      hundertmsFlag=1;
6
   }
7
}
8

9
main() {
10
  while (1) {
11
    if hundertmsFlag {
12
      hundertmsFlag=0;
13
      sec10++;
14
      if sec10==10 {
15
         sec10=0;
16
         if sec=59
17
           sec=0; 
18
         else {
19
           dcfout = 1;
20
           sec++;  
21
         }
22
      }
23
      else sec10==1 {
24
        dcfout = bitmuster[sec];
25
      }
26
      else
27
        dcfout = 0;
28
    }
29
  }
30
}

Karlheinz Druschel schrieb:
> Damit habe ich mir eine Uhr mit Stunden, Minuten, Sekunden und Datum
> gebaut.
Du könntest natürlich auch einfach diese Uhr zum Antriggern der 
Impulserzeugung nehmen. Wie sieht denn diese Uhr aus?
#3495865
Lesenswert?

Für einen Simulator kommt es doch nicht darauf an, ob der jetzt auf die 
Millisekunde genau ist oder nicht. Auch ist das ein Werkzeug, das du 
jetzt mal schnell benötigst und danach ist er wieder uninteressant. Jede 
Sekunde Aufwand, die du dahe rzuviel reinsteckst, ist schon vertan
1
uint8_t Bits[59];
2

3
int main()
4
{
5
 ....
6

7
  while( 1 )
8
  {
9

10
     ... bestimme die Werte für die Bits
11

12
    ... und DCF codiert ausgeben
13

14
    for( i = 0; i < 59; i++ )
15
    {
16
      PortPin auf 1
17
      if( Bits[i] )
18
        _delay_ms( 100 );
19
      else
20
        _delay_ms( 200 );
21

22
      PortPin auf 0
23
      if( Bits[i] )
24
        _delay_ms( 900 );
25
      else
26
        _delay_ms( 800 );
27
    }
28

29
    _delay_ms( 1000 );
30
  }
31
}

denk dir noch was aus, wie du die Bits bestimmst (zb indem du eine Uhr 
nachbildest, die tatsächlich Stunden und Minuten hochzählt) und fertig 
ist die Sache.
Mach keinen Aufwand. Hilfsmittel und Tools dürfen quick % dirty gemacht 
sein.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren