donderdag 22 september 2011

DS1307 klok in combinatie met DCF77

In het basisstation wil ook graag een nauwkeurig klok het liefst met DCF77
Op het internet vind je verschillende beschrijvingen voor een DCF77 klok.
Ik ben hiermee aan het experimenteren gegaan met de bedoeling om een
DS1307 met de juiste tijd in te stellen. Ik ontvang twee keer een minuut van de dcf77
ontvanger zit hier een idd een minuut tussen dan zetten we de dcf77 tijd in de ds1307
en zijn we klaar. De tijd word alleen gezet als de ds1307 nog niet gestart is.
Wat er verder nog moet gebeuren is dat de tijd op een bepaald tijdstip op de dag
de ds1307 weer gesynchroniseerd word met de dcf77 ontvanger.



Device 18F4620
Xtal 20                       

ADCON1=7
   
LCD_DTPin PORTB.4    'lcd 16x2 op portb
LCD_ENPin PORTB.3
LCD_RSPin PORTB.2

'I2c op c.3 en c.4
SCL_Pin    = PORTC.3   '
SDA_Pin    = PORTC.4


Symbol ds1307       = %11010000   'adres ds1307
Symbol Dcfin        = PORTC.0     'portc.0 dcf77 ontvanger ingang (positief)
Symbol Blok         = 255

Dim SignaalCheck    As Word
Dim    Teller            As Word
Dim    Bittijdtel        As Word

Dim Sec             As Byte
Dim Minuut          As Byte
Dim Uur             As Byte     
Dim    Startbyte        As Byte
Dim    Ontvbyte        As Byte
Dim    Dag             As Byte
Dim    Week            As Byte
Dim    Maand              As Byte
Dim    Jaar            As Byte
Dim    I                As Byte
Dim    N                 As Byte
Dim Dcfmin          As Byte

Dim Fout            As Bit
Dim    Ontvbit            As Bit
Dim ParBit          As Bit
Dim Loops           As Bit

DelayMS 100   ' opstarttijd disp

BusIn ds1307,$00,[Sec]           'controleer of de klok loopt zo niet instellen met dcf77
If Sec.7=1 Then Call setklok

Cls

' tijd uitlezing met ds1307

main:

BusIn ds1307,0,[Sec,Minuut,Uur,Week,Dag,Maand,Jaar]

Print At 1,1,Hex2 Dag, "-", Hex2 Maand, "-", Hex2 Jaar
Print At 2,9,Hex2 Uur, ":", Hex2 Minuut, ":", Hex2 Sec

GoTo main


setklok:

Cls
Clear

Print At 1,1, "DCF77"
Print At 2,1, "Wacht op start"

GoSub Wachtopstartbit

'we hebben de startbit gevonden
init:

Print At 1,7, Rep " " \ 10
Print At 2,1,"Wacht op tijd "

Clear Sec
Clear ParBit

For I = 0 To 20            '0 TOT 20 OVERSLAAN
      GoSub Eenbitontv
Next   
   
N = 7
GoSub Bytesontv            '21-27 MINUUT
Minuut = Ontvbyte
           
GoSub Eenbitontv        '28 PARITY
If ParBit = 1 Then setklok

       
N = 6
GoSub Bytesontv            '29-34 UUR
Uur = Ontvbyte   
           
GoSub Eenbitontv        '35 PARITY
If ParBit = 1 Then setklok
       
N = 6
GoSub Bytesontv            '36-41 DAG
Dag = Ontvbyte       
       
N = 3
GoSub Bytesontv            '42-44 WEEK
Week = Ontvbyte
   
N = 5
GoSub Bytesontv            '45-49 MAAND
Maand = Ontvbyte
       
N = 8
GoSub Bytesontv            '50-57 JAAR
Jaar = Ontvbyte
       
GoSub Eenbitontv        '58 PARITY

If ParBit = 1 Then setklok     ' fout opgetreden

' we gaan twee keer de tijd binnenhalen en controleren of er een minuut
' verschil is. zo ja dan gaan we tijd in de ds1307 zetten.
' we nemen de overgang van 59 naar 0 voor lief

Select Case Loops
    Case 0
        Dcfmin = Minuut
        Loops = 1
        GoTo init
    Case 1
        If Dcfmin <> Minuut - 1 Then setklok 
End Select       

DelayMS 1000       ' 1 seconde wachten (sec59)
BusOut ds1307,$00,[0,Minuut,Uur,Week,Dag,Maand,Jaar]
Return                              


Wachtopstartbit: 

' routine voor opstart tijd voor de DCF77 ontvanger bij power-on

Clear Teller
While Dcfin = 0
  Inc Teller
  DelayMS 1
  If Teller > 50000 Then ErrorOntvangst 
Wend
  
Clear Sec  
Clear Startbyte
While Startbyte = 0
    Clear Bittijdtel
    Clear Teller
    While Dcfin = 1
       Inc Teller
       DelayMS 1
       If Teller > 5000 Then ErrorOntvangst ' meer dan 5 seconden een 1 dan error
    Wend
    While Dcfin = 0
       Bittijdtel = Bittijdtel + 1
       DelayMS 10
       If Bittijdtel > 500 Then ErrorOntvangst ' meer dan 5 sec een 0 dan error
    Wend
    If Bittijdtel > 100 Then Startbyte = 1  
    Inc Sec
    If Sec > 65 Then Clear Sec ' langer bezig dan 65 sec dan geen blokjes meer
    Print At 1,7+(Sec/7),Blok
Wend
Return       
       
Eenbitontv:
        Clear Teller   
        Clear Bittijdtel
        While Dcfin = 0
          DelayMS 1
          Inc Teller
          If Teller > 3000 Then ErrorOntvangst         
        Wend
        While Dcfin = 1
            Bittijdtel = Bittijdtel + 1
            DelayMS 10
        Wend
        If Bittijdtel > 16 Then
            Ontvbit = 1
        Else
            Ontvbit = 0
        EndIf
        ParBit = ParBit + Ontvbit
        Inc Sec
        Print At 1,7+(Sec/6),Blok
        Return
       
Bytesontv:

Clear    Ontvbyte
For I = 0 To N - 1
GoSub Eenbitontv
If Ontvbit = 1 Then SetBit Ontvbyte,  I
Next I
Return

       
ErrorOntvangst:

Print At 1,7, Rep " " \ 10
Print At 2,1, "Ontvangst slecht"       
Repeat
   Clear
   Fout = Dcfin
   While Dcfin = Fout    ;Wacht op signaal verandering
     Inc SignaalCheck
     DelayMS 1
   Wend
   Fout = Fout ^ 1
   While Dcfin = Fout    ;Wacht op signaal verandering
     Inc SignaalCheck
     DelayMS 1
   Wend
Until SignaalCheck < 500
      
GoTo setklok

       

Geen opmerkingen:

Een reactie posten