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 .....
Tante goole < 5Sek. http://www.elektronik-kompendium.de/public/arnerossius/schaltungen/avr/dcfsim.htm
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
Danke, da war ich auch schon. Aber ich nutze gcc, keinen Assembler. Hatte ich vergessen zu erwähnen, sorry.
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
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... :-/
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.