longpole001
- 28th May 2013, 14:38
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
' 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
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
' 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