DCF77 ur til gameport under linux

af Frank Damgaard (1998, sidst opdateret 20000121).

DCF77 relaterede links

Simpel DCF77 modtager til PC

I stedet for at købe et færdigt DCF77-ur til PC'en, kan man også selv ombygge de fleste DCF77-ure man billigt kan købe på tilbud (ofte 65-70kr). Der er flere artikler/links på internettet der beskriver hvordan, så efter at have købt et billigt ur til 62.50kr i en lokal butik skulle jeg også forsøge. Dette billige ur havde ikke datovisning , og jeg tænkte at PC'en burde kunne læse alle DCF77 data der modtages. Derudover kan man stadig aflæse tiden på urets display, hvad ikke alle færdige DCF77 ure til PC har mulighed for.

Jeg har valgt at tilkoble uret til min gameport (joystik), dels fordi jeg ikke har en joystik, og dels fordi gameporten har +5V som kan bruges til at forsyne uret. Alternativt kunne en parallelport også anvendes, men her mangler en 5V forsyning (og jeg ville gerne kunne bruge min printer).

Man kan også koble uret til serielporten, her kan man få ca. +12V (og -12V) fra et af de andre RS232 signaler. Derudover skal udgangssignalet skifte meller +12V og -12V, så denne del bliver også lidt mere kompliceret. Nu mangler jeg hele tiden serielporte, så jeg syntes ikke at jeg ville anvende denne løsning.

Forbindelse af DCF77 ur til gameport

Først skal man finde 2 signaler på printet. De fleste DCF-77 ure består af 2 "chips" (f.eks. SMD IC'er). Evt. er disse direkte monteret på printet med en sort klat ovenover. Den chip der modtager signalet er forbundet direkte til spolen på ferritantennen. Udover lidt lokale komponenter (resistorer og kondensatorer), er chip'en forbundet til forsyningsspændingen (ofte +1.5V), stel (GND / 0 Volt), og til den anden ur chip med 2 forbindelser. Den ene er pulserne (DCF) til selve DCF77-signalet, og det andet er ON/OFF signalet der tænder/slukker modtageren. Hvis uret er af typen med kun en sort klat (dvs. en chip) så er det ikke sikkert at man kan finde DCF77 signalet, og dermed anvende uret.

For at finde printbanen med DCF signalet kan et oscilloscop anvendes. Alternativt kan man forsøge med en lysdiode i serie med en modstand på ca. 1-2 kohm forbundet til +5V (De 1.5V fra batteriet er ikke altid nok til at få lysdioden til at lyse). Husk at GND fra 5 volt forsyningen også skal forbindes til GND (-) på uret.

                   LED |\|        1.5kohm
        +5V -----------| |--------VVVVVVV-------> "probe"
                       |/|

Lysdioden burde så blinke kort (gå ud), en gang for hvert sekund. Hvis den kun lyser et kort øjeblik hvert sekund, så skal programmet, med nedenstående forbindelser, have inverteret den bit der læses på porten.

De fleste DCF-ure anvender enten et 1.5V eller 2 stk 1.5V batterier. Til dem med kun et 1.5V batteri kan spændingsforsyningen klares med en passende modstand og en rød lysdiode (LED), da denne diode har et spændingsfald på ca. 1.6V. Til 3V urene kan man evt. anvende 2 stk røde lysdioder i serie og ændre de 680 ohm til f.eks. 330 eller 390 ohm.

Gameport
  ben:
                       ca. 680 ohm
  1   +5V------+--------VVVVVVVV------+-------->  til +1.5V på Ur
               |                      |
               |                      |(+)
               >                    +---+  Rød LED 
               >  6,8 kohm           \ /  (ca. 1.6V)
               >                     -+-
  4   --GND    >                      |
               |                      |
               |                     GND
               |                       
               |
  2   (-DCF)-<-+
               |
               |
              (C)           22 kohm
             NPN-Tr.(B)-----VVVVVVV-----------------< DCF signal på chip
              (E)
               |
              GND

NPN transistoren er f.eks. en BC547B eller tilsvarende, men en vilkårlig småsignal transistor burde kunne anvendes.

Normalt synkroniserer batteridrevne DCF-ure kun en gang hver time, derfor skal DCF-ON signalet være lav for at man får signal hele tiden. Da uret alligevel forsynes med strøm fra computeren gør det ikke så meget at DCF77 modtageren kører hele tiden. Man kan finde signalet med et oscilloscop eller voltmeter. Signalet er normalt lav (0 volt) når man isætter batteri (og starter) uret. Det vil så gå høj når tiden vises på urets display.

Blot at forbinde dette signal til GND kan evt. ødelægge udgangstrinet fra den anden urchip, så jeg skar printbanen over med en lille hobbykniv. Man kan så forbinde DCF-ON på følgende 2 måder:

  1. for at DCF77-chip'en skal modtage hele tiden (og derved generere pulserne) loddes den ende af printbanen der går til DCF-chip'en med et kort stykke ledning til 0V.
        DCF-chip/ON----+-------   X    ----+----------<---- ur-chip
                       |    (afbrudt bane)
                      GND
    
  2. eller for at uret stadig skal kunne virke uden tilkobling til PC (når batteri isættes), så forbindes f.eks. som følgende:
                               D1 - 1N4148 (skal vendes rigtig)
                       +--------->|--------+
                       |                   |
        DCF-chip/ON----+-------   X    ----+----------<---- ur-chip
                       |    (afbrudt bane)
                       |
                       |
    Gameport           |        47 kohm
     5  GND ----|<-----+--------VVVVVVV----> +1.5V
              D2 - 1N4148
    

    Når stikket til Gameport ikke er isat, så er der ikke GND på DCF77-ON signalet, og uret styrer selv modtageren. D2 kan evt. undværes og der forbindes direkte til GND på gameport.

De ovenstående valgte komponentværdier (specielt modstande) er ikke kritiske, så har man noget liggende i skuffen der har omtrentlig samme værdi, så virker det også.

For at stabilisere spændingsforsyningen kan man evt. montere en ca. 1-10uF mellem +1.5V og GND. Hvis uret har alarm og/eller baggrundslys, så vær opmærksom på at den viste spændingsforsyning ikke kan levere strøm nok til at lys eller "bip" toner kan virke ordentligt. I så fald må man lave en anden spændingsforsyning, evt. ekstern. Men normalt har man ikke brug for dette når man bruger uret til sin PC.

Program

Jeg anvendte dcf77.c (DCF Empfang für Linux © 1996 by Michael Bosch). Programmet er fra en artikel i det tyske Linux Magazin november 1996 . Hvis DCF signalet man modtager på gameporten er inverteret, så kan man evt. rette i programmet i den linie der læser på porten med "inb(port)". Jeg har lavet bla. denne tilføjelse (-i option), samt et år 2000 fix af Kurt Mielke. Programmet kan downloades her: dcf77-fd.c, og det oprindelige program: dcf77.c.

Programmet oversættes med f.eks. gcc -O2 dcf77-fd.c -o dcf77. Man skal være root for at anvende programmet.

Diverse

Jeg havde problemer med min gameport, da jeg havde glemt at det var PnP, og at OSS driveren til lydkortet kun indstillede lydkortets porte mv. Efter at have anvendt isapnptools fik jeg også aktiveret gameporten og alt virkede derefter.

Artiklen i Linux Magazin baserer sig på et DCF77 modul fra Conrad Elektronik, men en anden webside "DCF77 for Linux" beskriver hvorledes man kan forbinde PC'en til et vilkårlig DCF77 ur, og det var dette der inspirerede mig til selv at forsøge. Der stod at visse ure ikke kan anvendes da de giver et "unsauberes" urent? signal. Nu blev det ikke nævnt om det var fordi signalet er inverteret, eller det er fordi det ikke var kraftigt nok til at kunne forbindes direkte til gameporten.

På UA2124 og UA2125 IC'ere som jeg har datablad på, er udgangen af typen open collector, som burde kunne trække en del til 0V. I de fleste færdige ure kan man dog ikke se hvilken chip det er, derfor satte jeg et lille transistortrin på DCF77 udgangen, så jeg var sikker på at signalet var godt nok. Derudover ville jeg ikke risikere at ødelægge indgangen på den anden chip, hvis den nu ikke kunne tåle mere end max. ca. 1.5V. Hos mig virker det fint med et 5 meter 4-leder kabel.

Vil man lave en simplere tilslutning, så kan man jo spare transistortrinet, og direkte forbinde DCF77 signalet til porten. Har man derudover et oscilloscop, så kan signalets kvalitet nemt kontrolleres.

Hos bla. conrad elektronik (http://www.conrad.de) kan man købe et lille print med færdig DCF77 modtager, der direkte kan forbindes til gameport (DB15 stik medfølger ikke). Men prisen er 19.95DM (ca. 76kr) og uden display. Man kan også købe et WT100 modul med serieludgang til ca. samme pris. Bestillingsnummer 641871-62, samt dos-software + kabler 641979. Andre dcf77 (byggesæt) moduler: 641138-62, 115789-62, 642002-62, 967602, 975788. Bestillingsnummer for UA4224 smd er 142409-62.

Men i alle tilfælde kommer forsendelsen oveni (ofte ca. 60-100kr) samt man skal bestille for minimum 100DM, så det er billigere at ombygge et standard DCF77 ur.

NB.: Man bør ikke placere uret tæt på PC'en da denne kan støje en del. Det samme gælder for placering tæt på lysstofrør, sparepærer, TV mv. . Selv har jeg med success placeret uret ved en I-bjælke der vender øst-vest i kælderen ved siden af PC'en. Det virker som om signalet er bedst der, muligvis fordi jernbjælken virker som "forstærker" til ferritantennen i uret.

Lidt baggrund til DCF77 signalet

Dette kan sikkert findes andet steds, men ganske kort:

I Frankfurt er det en sender der sender på 77.5 kHz. Signaler kan modtages i omkring 1500-2000 km omkreds fra senderen. Selve tidsinformationen sendes over et minut med korte pulser hvert sekund. Længden af denne puls afgør om det er et "0" eller "1". Længden er henholdsvis 0.1 eller 0.2 sekund. Det 59'ende sekund indeholder ingen puls, og skal bruges til at synkronisere starten af første (0'te) sekund (puls) i et minut. Alle disse 0'er og 1'er giver over et minut tid, ugedag, måned, år mv. Jeg har et hæfte der beskriver dette, samt smd-ic'erne UA2124 og UA2125. (Disse IC'ere er sikkert udgået, og bla. U4224 er en afløser for disse.)

De fleste, hvis ikke alle DCF77 ure, har en chip der modtager de 77.5kHz, og laver disse "pulser" som sendes til en speciel urchip der dekoder signalet. For at spare strøm tændes modtageren ofte kun en gang per time, og dette tænd/sluk signal sendes fra urchip til DCF77-chip.

DCF77 programmer til game/parallel/serielport læser disse pulser og udfra længden afgør om det er 0/1, og over et minut afkodes disse til fuld tid- og datoinformation.

Tid og dato information er kodet i en slags BCD efter nedenstående tabel:

Zeittelegramm von DCF77
0Start af minutLo
1..14Ikke anvendtX
15Reserveantenne (i drift=1)X
16Tidsskifte (anmeldes en time forinden = 1)X
17Sommertid (MESZ=1)X
18Tidzone-bitLo
19Tillægssekund (anmeldes en time forinden = 1)X
20 Start, altid 1   "Telegrammbeginn" Hi
21Minuter bcd 11
22Minuter bcd 22
23Minuter bcd 44
24Minuter bcd 88
25Minuter bcd 10'ere10
26Minuter bcd 10'ere20
27Minuter bcd 10'ere40
28Paritetsbit #1 (lige paritet)X
29Timer bcd 1
30Timer bcd 2
31Timer bcd 4
32Timer bcd 8
33Timer bcd 10'ere10
34Timer bcd 10'ere20
35Paritetsbit #2 (lige paritet)X
36Dag bcd1
37Dag bcd2
38Dag bcd4
39Dag bcd 8
40Dag bcd 10'ere10
41Dag bcd 10'ere20
42Ugedag bcd (mandag=001,...)1
43Ugedag bcd 2
44Ugedag bcd 4
45Måned bcd 1
46Måned bcd 2
47Måned bcd 4
48Måned bcd 8
49Måned bcd 10'er10
50År bcd 1
51År bcd 2
52År bcd 4
53År bcd 8
54År bcd 10'ere10
55År bcd 10'ere20
56År bcd 10'ere40
57År bcd 10'ere80
58Paritetsbit #2 (lige paritet)X
59Ingen markering (ingen puls)-
60=00Begyndelse af næste minutLo

Nogle gode links:

Til sidst

Egentlig kunne jeg blot synkronisere uret med en NTP server når jeg er koblet op på internet, men det er ikke ligeså sjovt......

... frda(a)post3.tele.dk   counter dcf77

Valid HTML 4.0! .