DCF-77 radio clock with PIC microcontroller

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:
DCF-77 radio clock


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:

  1. Radio-orienteering – modifying fox hunting PIC asm – yo5at
  2. World Amateur Radio Day 2010
  3. Open source USB PIC programmer for Linux and Windows
  4. Ham radio KITS
  5. Amateur radio wire antenna SWR table

One Response to “DCF-77 radio clock with PIC microcontroller”

  1. pontikakis Anthony Says:

    Hi your project is very intersting

    Best regards Anthony


Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>