PIC Microcontoller Time/IO Method

NJU6355 E or G version Real Time Clock interface code

by Andrew D. Vassallo

;-------------------------------------------------------------------------------
;
; Real Time Clock interface code
;
; by Andrew D. Vassallo
; email: snurple@hotmail.com
;
; These routines were written specifically for the NJU6355 E or G version RTC.
; They may be usable for other clocks, but have not been tested.
;
;-------------------------------------------------------------------------------

;------ All variables in Bank 0
CBLOCK
	Year
	Month
	Date
	Day
	Hours
	Minutes
	Seconds
	Time_Temp
	Time_Count
ENDC


#define	CLK	PORTB, 0
#define	DATA	PORTB, 1
#define	IO	PORTB, 2		; input/output select
#define	CE	PORTB, 3		; chip enable bit


;--------------------------------------------- Subroutines Follow ----------------------------------------------

;------ This routine sets the time for the RTC.  Note that upon power-up, the RTC has NO TIME SET.  You must
;------ define the time and set it in the RTC before attempting to read it.  Otherwise, no values will be returned.
;------ Note: the Get_Time routine reads the variables from the RTC and stores them in BCD format, not Hex.  If
;------ you want to "reset" the time with the Set_Time routine, then you don't have to use the Hex2BCD conversion.
;------ In fact, if the original variables are defined in BCD format, you don't need to convert, either.  But, since
;------ Hex is easier to work with and necessary for table lookup, it might be worthwhile to convert back and forth
;------ if you need to manipulate the variables or use a table.
Set_Time
		bcf	CLK			; need CLK low for CE toggle
		nop
		bsf	IO			; see timing diagram from NJU6355 datasheet
		nop
		bsf	CE
; Send 44 bits total (Year[8],Month[8],Date[8],Day[4],Hours[8],Minutes[8])
		movf	Year, 0
		call	Hex2BCD			; must convert each variable to BCD before sending to RTC
		movwf	Time_Temp
		call	Write_RTC

		movf	Month, 0
		call	Hex2BCD
		movwf	Time_Temp
		call	Write_RTC

		movf	Date, 0
		call	Hex2BCD
		movwf	Time_Temp
		call	Write_RTC

		movf	Day, 0
		call	Hex2BCD
		movwf	Time_Temp
		call	Write_RTC_4bits		; Day input is only 4 bits

		movf	Hours, 0
		call	Hex2BCD
		movwf	Time_Temp
		call	Write_RTC

		movf	Minutes, 0
		call	Hex2BCD
		movwf	Time_Temp
		call	Write_RTC

; Ignore Seconds - RTC does not accept "seconds" input
		bcf	CLK			; finally pull the clock low for CE toggle
		nop
		bcf	CE			; send the final write command to the RTC
		nop
		bcf	IO			; leave the RTC in output mode
		return

;------ This routine grabs the current time from the RTC and STORES IT IN
;------ BCD FORMAT in the registers Year, Month, Date, Day, Hours, Minutes, Seconds
;------ This is worth noting again: THE VARIABLES ARE STORED IN BCD FORMAT, NOT HEX
Get_Time
		bcf	CLK
		nop
		bcf	IO			; see timing diagram from NJU6355 datasheet
		nop
		bsf	CE
; Read all 52 bits (Year[8],Month[8],Date[8],Day[4],Hours[8],Minutes[8],Seconds[8])
		call	Read_RTC
		movwf	Year

		call	Read_RTC
		movwf	Month

		call	Read_RTC
		movwf	Date

		call	Read_RTC_4bits		; Day value is only 4 bits
		movwf	Day

		call	Read_RTC
		movwf	Hours

		call	Read_RTC
		movwf	Minutes

		call	Read_RTC
		movwf	Seconds

; Turn off RTC output
		bcf	CE
		return

;------ This just clocks the next RTC function into Time_Temp and returns it in W.
; Call with: nothing required for call
; Returns with: time function byte in W
; Uses: Time_Temp as temporary storage and Time_Count for bit counter
Read_RTC_4bits
		movlw	0x04
		goto	$+2
Read_RTC
		movlw	0x08
		movwf	Time_Count
Read_Loop
		bsf	CLK			; data valid after CLK->high
		bsf	STATUS, C		; default is "1" output from RTC
		btfss	DATA
		bcf	STATUS, C
		bcf	CLK
		rrf	Time_Temp, 1		; LSB output first
		decfsz	Time_Count, 1
		goto	Read_Loop
		movf	Time_Temp, 0		; move into W for return
		return

;------ This just clocks whatever is in the W register out to the RTC.
; Use "Write_RTC" to send 8-bit values.  Use "Write_RTC_4bits" for 4-bit values.
; Call with: number to be sent in Time_Temp
; Returns with: nothing returned
; Uses: Time_Temp as temporary storage
Write_RTC_4bits
		movlw	0x04
		goto	$+2
Write_RTC
		movlw	0x08
		movwf	Time_Count
Write_Loop
		bcf	CLK
		nop
		bsf	DATA			; default is "1" output from RTC
		btfss	Time_Temp, 0		; send LSB first each time
		bcf	DATA
		nop
		bsf	CLK			; data valid after CLK->high
		rrf	Time_Temp, 1
		decfsz	Time_Count, 1
		goto	Write_Loop
		return

;------ Must convert from Hex to BCD for output to RTC
; Note that this BCD conversion is limited to input values less than 99 decimal (0x63 hex)
; Call with: number to be converted in W
; Returns with: converted BCD number in W
; Uses: Time_Temp and Time_Count to hold value during calculations
Hex2BCD
		movwf	Time_Count		; use as temporary holding register for conversion
		clrw
		btfsc	Time_Count, 4
		addlw	0x16
		btfsc	Time_Count, 5
		addlw	0x32
		addlw	0x06
		skpdc
		addlw	-0x06
		btfsc	Time_Count, 6
		addlw	0x64
		addlw	0x06
		skpdc
		addlw	-0x06
		movwf	Time_Temp
		movf	Time_Count, 0
		andlw	0x0F
		addwf	Time_Temp, 0
		skpndc
		addlw	0x06
		addlw	0x06
		skpdc
		addlw	-0x06
		return

See:

Comments:

Questions: