Hi guys
Found this example on the site but could not find how the tris bits are set for for the data direction from out to in the code , is it required , if not how did the data pin change direction for the read ( shiftin)
cheers
sheldon
Code:
' An example routines to use the DS1302 timer chip
' based on code provided by Omer Yildiz, Copyright (c) 2006 [2005]
' http://www.picbasic.co.uk/forum/showthread.php?t=423
' This code uses a supercap at VCC1 to provide power when VCC2 is interupted
' Set initial time manually in clockinit
' Then reprogramme with convertTime and setClock commented out
DEFINE LOADER_USED 1 'enable bootloader
DEFINE osc 20
'defines for debug
INCLUDE "modedefs.bas"
'set-up debug serial
DEFINE DEBUG_REG PORTB ' Set Debug pin port
DEFINE DEBUG_BIT 6 ' Set Debug pin bit
DEFINE DEBUG_BAUD 9600 ' Set Debug baud rate
DEFINE DEBUG_MODE 1 ' Set Debug mode: 0 = true, 1 = inverted
LED VAR PORTC.5
'clock pin definitions--------------------------------------------
timer_clk var portb.3 ' DS1302 Clock Pin
timer_dq var portb.2 ' DS1302 Data Pin
timer_rst var portb.1 ' DS1302 Reset Pin
'decimal variables for setting up time---------------
second var byte
minute var byte
hour var byte
day var byte
month var byte
year var byte
'hex variables for actual time display--------------
secondx Var byte
minutex var byte
hourx var byte
dayx var byte
monthx var byte
yearx var byte
RTC var byte
'Write Commands For DS1302 --------------------------
writectrl con $8E ' Control byte
writechrg CON $91 ' Write trickle charge
tricklereg CON $A0 ' Enable trickle charge for supercap
writeram con $80 ' Write to RAM
writeprotect con $00 ' Write-protect DS1302
writesec con $80 ' Write seconds
writemin con $82 ' Write minutes
writehour con $84 ' Write hour
writedate con $86 ' Write date
writemonth con $88 ' Write month
writeyear con $8C ' Write year
'Read Commands For DS1302 -------------------------
readsec con $81 ' Read seconds from DS1302
readmin con $83 ' Read minutes from DS1302
readhour con $85 ' Read hours from DS1302
readdate con $87 ' Read date from DS1302
readyear con $8D ' Read year from DS1302
readmonth con $89 ' Read month from DS1302
'Time Variables ------------------------------
mem var byte ' Temporary data holder
outbyte var byte ' Second byte to ds1302
reg_adr var byte ' First byte to DS1302
decx var byte ' A swap variable
HIGH LED
PAUSE 1000
LOW LED
'Initial Settings For Ports ------------------------
clockInit:
DEBUG "DS1302 timer with trickle charge",10,13
' set intial time and date here
second = 20
minute = 14
hour = 12
day = 10
month = 9
year = 7
low timer_rst ' Set reset pin low
low timer_clk ' Set clock pin low
' This enables the trickle charger
GOSUB setTrickleCharge
' These two should be commented out after initialising the PIC
' with the time date above
'GOSUB convertTime
'GOSUB setClock
GOTO loop
'Read time at 5 secind intervals-------------------------
loop:
call readclk ' go read DS1302
pause 5000
goto loop
'Time Commands Subroutines --------------------------
readclk:
reg_adr = readsec 'Read seconds
gosub timerRead
second = mem
reg_adr = readmin 'Read minutes
gosub timerRead
minutex = mem
reg_adr = readhour 'Read Hours
gosub timerRead
hourx = mem
reg_adr = readyear 'Read Year
gosub timerRead
yearx = mem
reg_adr = readdate 'Read Date
gosub timerRead
dayx = mem
reg_adr = readmonth 'Read Month
gosub timerRead
monthx = mem
DEBUG HEX hourx,":",HEX minutex,":",HEX second," ",HEX dayx,"/",HEX monthx,"/",HEX yearx,10,13
return
setTrickleCharge:
reg_adr = writectrl ' Set to control byte
outbyte = writeprotect ' Set turn off protection
gosub timerWrite ' Send both bytes
reg_adr = writechrg
outbyte = tricklereg
gosub timerWrite
reg_adr = writectrl
outbyte = writeprotect
gosub timerWrite
RETURN
setClock:
reg_adr = writectrl ' Set to control byte
outbyte = writeprotect ' Set turn off protection
gosub timerWrite ' Send both bytes
reg_adr = writesec ' Set to write seconds register
outbyte = secondx ' Set to write 00 to seconds register in HEX format
gosub timerWrite
reg_adr = writemin
outbyte = minutex 'Our minutex and others with x (except for monthx) are now in HEX format.
gosub timerWrite
reg_adr = writehour
outbyte = hourx
gosub timerWrite
reg_adr = writedate
outbyte = dayx
gosub timerWrite
reg_adr = writemonth
outbyte = monthx
gosub timerWrite
reg_adr = writeyear
outbyte = yearx
gosub timerWrite
reg_adr = writectrl
outbyte = writeprotect
gosub timerWrite
RETURN
timerRead:
mem = reg_adr ' Set mem variable to reg_adr contents
high timer_rst ' Activate the DS1302
shiftout timer_dq,timer_clk,0, [mem] ' Send control byte
shiftin timer_dq,timer_clk,1, [mem] ' Retrieve data in from the DS1302
low timer_rst ' Deactivate DS1302
return
timerWrite:
mem = reg_adr ' Set mem variable to reg_adr contents
high timer_rst ' Activate the DS1302
shiftout timer_dq,timer_clk,0, [mem] ' Send control byte
mem = outbyte ' Set mem variable to outbyte contents
shiftout timer_dq,timer_clk,0, [mem] ' Send data stored in mem variable to DS1302
low timer_rst ' Deactivate DS1302
return
'Convert initial set up times to hex---------------------------------
convertTime:
pause 100
call chkLeap
pause 20
decx=year
gosub convertion
yearx=rtc
pause 100
decx=month
gosub convertion
monthx=rtc
pause 100
decx=day
gosub convertion
dayx=rtc
pause 100
decx=hour
gosub convertion
hourx=rtc
pause 100
decx=minute
gosub convertion
minutex=rtc
pause 100
decx=second
gosub convertion
secondx=rtc
RETURN
'Convert DEC to HEX
convertion:
RTC=decx DIG 1
RTC=RTC<<4
RTC=RTC+decx DIG 0
return
'Check for leap year
chkLeap:
if year=8 or year=12 or year=16 or year=20 Then
write 2,29 'Years with Feb=29 days (for 50 yrs.)
pause 20
else
write 2, 28
pause 20
endif
return
END
Bookmarks