DCF-77 radio clock with PIC microcontroller
Sep 5, 2009 Projects
In 2001 I started to learn PIC microcontrollers and Microchip PIC assemble language.
The project was ordered by yo5oee for our city’s Administrative Palace.
This was my first project related to PIC microcontrollers and it wasn’t so easy.
I’d used a DCF-77 radio controlled clock chip which made date and time synchronization every night. The picmicro was PIC16F877.
This is the DC-77 module schematics:

I written the atomic.inc file, the purpose was to synchronize the PIC clock with DCF clock.
atomic.inc
;------------------------------------------------------------------------- ;Author : Istvan Vanyi, yo5ofj ;Filename : atomic.inc ;DCF-77 atomic radio controlled clock ;------------------------------------------------------------------------- errorlevel -302 ORG 700H ;add this code to an upper address DECIDE: BTFSS NEXT_BIT ;is new input bit allowed? RETURN ;no ;yes MOVF UNIT, w SUBLW .5 BTFSC STATUS,C ;is the new bit is 0 GOTO BIT_CLEAR ;yes MOVF UNIT, w SUBLW .8 BTFSC STATUS,C ;is the new bit is 1? GOTO BIT_SET ;yes BSF FIRST_LOAD ;keep dcf input LOW RETURN BIT_SET: BSF BIT_VALUE ;ne bit is 1 BCF B0 ;these are just controls to display 1 BCF C0 BSF A0 BSF D0 BSF E0 BSF F0 BSF G0 GOTO END_DECIDE BIT_CLEAR: ;new bit is 0 BSF G0 ;these are just controls to display 0 BCF A0 BCF B0 BCF C0 BCF D0 BCF E0 BCF F0 BCF BIT_VALUE END_DECIDE: CALL ROTATE ;rotate the newest byte BCF NEXT_BIT ;prohibid the input CLRF UNIT ;bew cycle CLRF HIGH_STATE clrf dcf_no INCF SECOND ;a new second has been passed RETURN ROTATE: BCF STATUS,C ;rotate bytes BTFSC BIT_VALUE BSF STATUS,C RLF BYTE0 RLF BYTE1 RLF BYTE2 RLF BYTE3 RLF BYTE4 RLF BYTE5 RLF BYTE6 RLF BYTE7 RETURN PARITY_CALC: ;parity calculation inside the bytes MOVLW .0 MOVWF PARITY MOVLW .9 MOVWF CONTOR REPEAT: MOVLW .1 SUBWF CONTOR,1 BTFSC STATUS, Z GOTO PARITY_END MOVLW .0 BTFSC BYTE, 7 MOVLW .1 XORWF PARITY RLF BYTE GOTO REPEAT PARITY_END: RETURN SEPARATE: ;separate the received bytes into registries incf try ;try 5 times, not handled MOVF SECOND,W SUBLW .59 BTFSS STATUS,Z BSF FIRST_LOAD BSF NEW_FRAME BTFSC FIRST_LOAD RETURN ;YEAR************************** BTFSC BYTE0,1 BSF YEAR,7 BTFSC BYTE0,2 BSF YEAR,6 BTFSC BYTE0,3 BSF YEAR,5 BTFSC BYTE0,4 BSF YEAR,4 BTFSC BYTE0,5 BSF YEAR,3 BTFSC BYTE0,6 BSF YEAR,2 BTFSC BYTE0,7 BSF YEAR,1 BTFSC BYTE1,0 BSF YEAR,0 ;MONTH************************ BTFSC BYTE1,1 BSF MONTH,4 BTFSC BYTE1,2 BSF MONTH,3 BTFSC BYTE1,3 BSF MONTH,2 BTFSC BYTE1,4 BSF MONTH,1 BTFSC BYTE1,5 BSF MONTH,0 ;DAYS*********************** Don't need this BTFSC BYTE1,6 BSF DAYS,2 BTFSC BYTE1,7 BSF DAYS,1 BTFSC BYTE2,0 BSF DAYS,0 ;DAY************************ BTFSC BYTE2,1 BSF DAY,5 BTFSC BYTE2,2 BSF DAY,4 BTFSC BYTE2,3 BSF DAY,3 BTFSC BYTE2,4 BSF DAY,2 BTFSC BYTE2,5 BSF DAY,1 BTFSC BYTE2,6 BSF DAY,0 ;HOUR********************* BTFSC BYTE3,0 BSF HOURS,5 BTFSC BYTE3,1 BSF HOURS,4 BTFSC BYTE3,2 BSF HOURS,3 BTFSC BYTE3,3 BSF HOURS,2 BTFSC BYTE3,4 BSF HOURS,1 BTFSC BYTE3,5 BSF HOURS,0 ;MINUTES******************* BTFSC BYTE3,7 BSF MINUTES,6 BTFSC BYTE4,0 BSF MINUTES,5 BTFSC BYTE4,1 BSF MINUTES,4 BTFSC BYTE4,2 BSF MINUTES,3 BTFSC BYTE4,3 BSF MINUTES,2 BTFSC BYTE4,4 BSF MINUTES,1 BTFSC BYTE4,5 BSF MINUTES,0 ;CONTROL************************** BTFSC BYTE4,7 BSF CONTROL,3 BTFSC BYTE5,0 BSF CONTROL,2 BTFSC BYTE5,1 BSF CONTROL,1 BTFSC BYTE5,2 BSF CONTROL,0 ;*************parity checker****************** ;START BIT S = BYTE4,6****************** BTFSS BYTE4, 6 BSF PARITY_ERR ;NO START BIT ;PARITY VERIFYING ;PARITY P1 = BYTE3,6******************* MOVF MINUTES,W MOVWF BYTE CALL PARITY_CALC MOVLW .0 BTFSS BYTE3, 6 MOVLW .1 XORWF PARITY ;P1 PARITY BTFSS PARITY,0 BSF PARITY_ERR ;PARITY P2 = BYTE2,7************************* MOVF HOURS,W MOVWF BYTE CALL PARITY_CALC MOVLW .0 BTFSS BYTE2, 7 MOVLW .1 XORWF PARITY ;P2 PARITY BTFSS PARITY,0 BSF PARITY_ERR ;PARITY P3 = BYTE0,0*********************** MOVF YEAR, W MOVWF BYTE CALL PARITY_CALC MOVLW .0 BTFSC PARITY, 0 MOVLW .1 XORWF MONTH,W ;MOVF MONTH, W MOVWF BYTE CALL PARITY_CALC MOVLW .0 BTFSC PARITY, 0 MOVLW .1 XORWF DAYS,W ;MOVF DAYS, W MOVWF BYTE CALL PARITY_CALC MOVLW .0 BTFSC PARITY, 0 MOVLW .1 XORWF DAY,W ;MOVF DAY, W MOVWF BYTE CALL PARITY_CALC MOVLW .0 BTFSS BYTE0, 0 MOVLW .1 XORWF PARITY ;P3 PARITY BTFSS PARITY,0 BSF PARITY_ERR ;BTFSC PARITY_ERR ;parity error, not handled ;no parity error then display ;CALL DISPLAY ;incf hours ;this is used when there are difference between our time zone and DCF time zone movf hours,w sublw 09h btfss status,z goto displayforme1 movlw 10h movwf hours goto displayforme displayforme1: movf hours,w sublw 19h btfss status,z goto displayforme2 movlw 20h movwf hours goto displayforme displayforme2: movf hours,w sublw 23h btfss status,z goto displayforme3 movlw 0h movwf hours goto displayforme displayforme3: incf hours displayforme: MOVF hours,W ;display hours just for testing CALL DISP32 MOVF MINUTES,W ;display minutes CALL DISP10 CALL DISPLAY btfsc szink_end1 BSF SZINK_END2 BSF SZINK_END1 btfsc parity_err goto separate_end btfss szink_end2 goto first_time MOVF MINUTES, W MOVWF MINUTES2 MOVF HOURS, W MOVWF HOURS2 MOVF MINUTES1, W SUBWF MINUTES2 BTFSS STATUS, Z GOTO read_err ;Read error ... continue using PIC date and time MOVF HOURS1, W SUBWF HOURS2 BTFSS STATUS, Z GOTO read_err ;Read error ... continue using PIC date and time goto separate_end first_time: MOVF MINUTES, W MOVWF MINUTES1 INCF MINUTES1 MOVF HOURS, W MOVWF HOURS1 clrwdt goto separate_end read_err: bsf parity_err separate_end: RETURN |
Related posts:




December 25th, 2009 at %I:%M %p
Hi your project is very intersting
Best regards Anthony