Forum: Mikrocontroller und Digitale Elektronik DCF77 Simulator - Vorgehensweise


von Karlheinz D. (kdruschel)


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 .....

von aGast (Gast)


Lesenswert?


von aGast (Gast)


Lesenswert?

aGast schrieb:
> Tante goole

Sorry Google war gemeint. ;)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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?

: Bearbeitet durch Moderator
von Karlheinz D. (kdruschel)


Lesenswert?

Danke, da war ich auch schon.
Aber ich nutze gcc, keinen Assembler.
Hatte ich vergessen zu erwähnen, sorry.

von Karl H. (kbuchegg)


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.

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Karlheinz Druschel schrieb:
> Aber ich nutze gcc, keinen Assembler.
Ich meine, schon fast compilierbaren C-Pseudo-Code hingeschrieben zu 
haben. Und du solltest das auch eher als Denkanstoß verstehen. Also 
nicht kopieren, sondern kapieren...  :-/

von Karlheinz D. (kdruschel)


Lesenswert?

So gesehen hast du absolut recht. es geht mir nicht um genauigkeit, und 
schon gar nicht im sekundenbereich. ich will ja nur der uhr ein falsches 
datum und eine falsche uhrzeit vorgaukeln

von Karlheinz D. (kdruschel)


Lesenswert?

Sorry, meine Antwort hatte sich nicht auf deinen Beitrag bezogen, 
sondern auf den Link des Gastes.

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.