I'm using a DS1302 real time clock for a project. The clock is set in hex values I believe, I'm using a DEC variable x to set time, how do i convert this to a HEX to then output it to the 1302. Thanks
It doesnt really matter how you represent it in high level code.
In this·clock code the register addresses are represented in binary(%00010), the control register commands in Hex($80) and the data in decimal (12). It all gets converted to binary. Basically you can send it decimal numbers no problem.
' {$STAMP BS2sx}
' {$PBASIC 2.5}
'***************************************************************************
'* DS1302 RTC
'*
'***************************************************************************
' ----------------------------------------
' I/O Definitions
' ----------------------------------------
Clk PIN 0
Dta PIN 1
RTCReset PIN 2
DIRS = %0000000000111111
OUTS = %0000000000000000
' ----------------------------------------
' Constants
' ----------------------------------------
CoreBank CON 0 'Program Banks
ClockBank CON 2
TskResetRCT CON 0 'Program Tasks
TskReadRTCBurst CON 1
YskWriteRTC CON 2
TskReadRTCRAM CON 3
TskWriteRTCRAM CON 4
SecReg CON %00000 'Register Adresses
MinReg CON %00001
HrsReg CON %00010
DayReg CON %00011
MonReg CON %00100
YrReg CON %00110
CtrlReg CON %00111
BurstReg CON %11111
' ----------------------------------------
' Variables
' ----------------------------------------
Task VAR Nib 'Current Task
RTCCmd VAR Byte
Temp VAR Byte
Seconds VAR Byte
Minutes VAR Byte
Hours VAR Byte
Day VAR Byte
Month VAR Byte
Year VAR Byte
TaskManager:
GET ClockBank, Task
BRANCH Task, [noparse][[/noparse]ResetRTC, ReadRTCBurst, WriteRTC, ReadRTCRAM, WriteRTCRAM]
[color=red]ResetRTC: 'Set Time and date to RTC[/color]
GET 10,Seconds,Minutes,Hours,Day,Month,Year
Temp = [b]$10[/b] ' Clear Write Protect bit in control register
RTCCmd = CtrlReg
GOSUB WriteRTC
Temp = Year 'Set Year
RTCCmd = YrReg
GOSUB WriteRTC
Temp = Month 'Set Month
RTCCmd = MonReg
GOSUB WriteRTC
Temp = Day 'Set Day
RTCCmd = DayReg
GOSUB WriteRTC
Temp = Hours 'Set Hours
RTCCmd = HrsReg
GOSUB WriteRTC
Temp = Minutes 'Set Minutes
RTCCmd = MinReg
GOSUB WriteRTC
Temp = Seconds'Set Seconds
RTCCmd = SecReg
GOSUB WriteRTC
Temp = [b]$80[/b] 'Set Write Protect bit in control register
RTCCmd = CtrlReg
GOSUB WriteRTC
GOSUB Done
ReadRTCBurst:
'Read From RTC
HIGH RTCReset
SHIFTOUT DTA, Clk, LSBFIRST, [noparse][[/noparse]%1\1,BurstReg\5,%10\2]
SHIFTIN DTA, Clk, LSBPRE, [noparse][[/noparse]Seconds,Minutes,Hours,Day,Month,Year,Year]
LOW RTCReset
PUT 10, Seconds, Minutes, Hours, Day, Month, Year
GOSUB Done
WriteRTC:
'Write to DS1202 RTC
HIGH RTCReset
SHIFTOUT Dta, Clk, LSBFIRST, [noparse][[/noparse]%0\1,RTCCmd\5,%10\2,Temp]
LOW RTCReset
RETURN
ReadRTCRAM:
'Read from RTC RAM
HIGH RTCReset
SHIFTOUT DTA, Clk, LSBFIRST, [noparse][[/noparse]%1\1,RTCCmd\5,%11\2]
SHIFTIN DTA, Clk, LSBPRE, [noparse][[/noparse]Temp]
LOW RTCReset
GOSUB Done
WriteRTCRAM:
'Write to RTC RAM
HIGH RTCReset
SHIFTOUT Dta, Clk, LSBFIRST, [noparse][[/noparse]%0\1,RTCCmd\5,%11\2,Temp]
LOW RTCReset
GOSUB Done
Done:
RUN CoreBank
Ok, now that I've got the setting of the time working, why does minutes 59 roll over to 68 (instead of increasing the hour by 1 and going to minutes 00).
Code:
setting:
number=-1
y=-1
GOSUB inbutton
SEROUT 0, BAUDRATE, 1, [noparse][[/noparse]"?f"]
SELECT number
CASE =1
x=x+1
CASE =2
x=x-1
CASE =3
y=0
ENDSELECT
SEROUT 0, BAUDRATE, 1, [noparse][[/noparse]DEC x]
PAUSE 100
IF y<>0 THEN setting
RETURN
Thank you JonB and Jon Williams, I was able to use Williams' dec to bcd to solve my problem, and JonB's information to solve some of my other issues.
An interesting note, all posters in this thread have the name Jon (I'm Jon Gowa).
·· In case you need it, I also recently posted some very easy to use code for accessing the DS1302, including the on-board RAM.· The code handles 12 and 24 hour modes very easily as well.· You can find it here:
Comments
In this·clock code the register addresses are represented in binary(%00010), the control register commands in Hex($80) and the data in decimal (12). It all gets converted to binary. Basically you can send it decimal numbers no problem.
' {$STAMP BS2sx} ' {$PBASIC 2.5} '*************************************************************************** '* DS1302 RTC '* '*************************************************************************** ' ---------------------------------------- ' I/O Definitions ' ---------------------------------------- Clk PIN 0 Dta PIN 1 RTCReset PIN 2 DIRS = %0000000000111111 OUTS = %0000000000000000 ' ---------------------------------------- ' Constants ' ---------------------------------------- CoreBank CON 0 'Program Banks ClockBank CON 2 TskResetRCT CON 0 'Program Tasks TskReadRTCBurst CON 1 YskWriteRTC CON 2 TskReadRTCRAM CON 3 TskWriteRTCRAM CON 4 SecReg CON %00000 'Register Adresses MinReg CON %00001 HrsReg CON %00010 DayReg CON %00011 MonReg CON %00100 YrReg CON %00110 CtrlReg CON %00111 BurstReg CON %11111 ' ---------------------------------------- ' Variables ' ---------------------------------------- Task VAR Nib 'Current Task RTCCmd VAR Byte Temp VAR Byte Seconds VAR Byte Minutes VAR Byte Hours VAR Byte Day VAR Byte Month VAR Byte Year VAR ByteTaskManager: GET ClockBank, Task BRANCH Task, [noparse][[/noparse]ResetRTC, ReadRTCBurst, WriteRTC, ReadRTCRAM, WriteRTCRAM] [color=red]ResetRTC: 'Set Time and date to RTC[/color] GET 10,Seconds,Minutes,Hours,Day,Month,Year Temp = [b]$10[/b] ' Clear Write Protect bit in control register RTCCmd = CtrlReg GOSUB WriteRTC Temp = Year 'Set Year RTCCmd = YrReg GOSUB WriteRTC Temp = Month 'Set Month RTCCmd = MonReg GOSUB WriteRTC Temp = Day 'Set Day RTCCmd = DayReg GOSUB WriteRTC Temp = Hours 'Set Hours RTCCmd = HrsReg GOSUB WriteRTC Temp = Minutes 'Set Minutes RTCCmd = MinReg GOSUB WriteRTC Temp = Seconds'Set Seconds RTCCmd = SecReg GOSUB WriteRTC Temp = [b]$80[/b] 'Set Write Protect bit in control register RTCCmd = CtrlReg GOSUB WriteRTC GOSUB Done ReadRTCBurst: 'Read From RTC HIGH RTCReset SHIFTOUT DTA, Clk, LSBFIRST, [noparse][[/noparse]%1\1,BurstReg\5,%10\2] SHIFTIN DTA, Clk, LSBPRE, [noparse][[/noparse]Seconds,Minutes,Hours,Day,Month,Year,Year] LOW RTCReset PUT 10, Seconds, Minutes, Hours, Day, Month, Year GOSUB Done WriteRTC: 'Write to DS1202 RTC HIGH RTCReset SHIFTOUT Dta, Clk, LSBFIRST, [noparse][[/noparse]%0\1,RTCCmd\5,%10\2,Temp] LOW RTCReset RETURN ReadRTCRAM: 'Read from RTC RAM HIGH RTCReset SHIFTOUT DTA, Clk, LSBFIRST, [noparse][[/noparse]%1\1,RTCCmd\5,%11\2] SHIFTIN DTA, Clk, LSBPRE, [noparse][[/noparse]Temp] LOW RTCReset GOSUB Done WriteRTCRAM: 'Write to RTC RAM HIGH RTCReset SHIFTOUT Dta, Clk, LSBFIRST, [noparse][[/noparse]%0\1,RTCCmd\5,%11\2,Temp] LOW RTCReset GOSUB Done Done: RUN CoreBank▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Post Edited (Jonb) : 4/17/2005 7:00:40 AM GMT
· bcdVal = (decVal / 10 << 4) + (decVal // 10)
You can go the other direction too:
· decVal = (bcdVal.NIB1 * 10) + bcdVal.NIB0
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Jon Williams
Applications Engineer, Parallax
Dallas, TX· USA
Code:
setting:
number=-1
y=-1
GOSUB inbutton
SEROUT 0, BAUDRATE, 1, [noparse][[/noparse]"?f"]
SELECT number
CASE =1
x=x+1
CASE =2
x=x-1
CASE =3
y=0
ENDSELECT
SEROUT 0, BAUDRATE, 1, [noparse][[/noparse]DEC x]
PAUSE 100
IF y<>0 THEN setting
RETURN
set:
Temp = $10
RTCCmd = CtrlReg
GOSUB WriteRTC
Temp = 98
RTCCmd = YrReg
GOSUB WriteRTC
Temp = $08
RTCCmd = MonReg
GOSUB WriteRTC
Temp = $27
RTCCmd = DateReg
GOSUB WriteRTC
GOSUB setting
Temp = x
RTCCmd = HrsReg
GOSUB WriteRTC
x=0
GOSUB setting
Temp = x
RTCCmd = MinReg
GOSUB WriteRTC
Temp = $00
RTCCmd = SecReg
GOSUB WriteRTC
Temp = $80
RTCCmd = CtrlReg
GOSUB WriteRTC
readtime:
GOSUB ReadRTCBurst
SEROUT 0, BAUDRATE, 1, [noparse][[/noparse]DEC Hours,":",DEC Minutes,":",DEC Seconds.HIGHNIB,DEC Seconds.LOWNIB," ",DEC Month.HIGHNIB,DEC Month.LOWNIB,"/",DEC Date.HIGHNIB, DEC Date.LOWNIB,"/",DEC Year.HIGHNIB, DEC Year.LOWNIB]
PAUSE 80
SEROUT 0, BAUDRATE, 1, [noparse][[/noparse]"?f"]
GOTO readtime
WriteRTCRAM:
'Write to DS1202 RTC
HIGH RTCReset
SHIFTOUT Dta, Clk, LSBFIRST, [noparse][[/noparse]%0\1,RTCCmd\5,%11\2,Temp]
LOW RTCReset
RETURN
WriteRTC:
'Write to DS1202 RTC
HIGH RTCReset
SHIFTOUT Dta, Clk, LSBFIRST, [noparse][[/noparse]%0\1,RTCCmd\5,%10\2,Temp]
LOW RTCReset
RETURN
ReadRTCBurst:
HIGH RTCReset
SHIFTOUT DTA, Clk, LSBFIRST, [noparse][[/noparse]%1\1,BrstReg\5,%10\2]
SHIFTIN DTA, Clk, LSBPRE, [noparse][[/noparse]Seconds,Minutes,Hours,Date,Month,Year,Year]
LOW RTCReset
RETURN
ReadRTCRAM:
HIGH RTCReset
SHIFTOUT DTA, Clk, LSBFIRST, [noparse][[/noparse]%1\1,RTCCmd\5,%11\2]
SHIFTIN DTA, Clk, LSBPRE, [noparse][[/noparse]Temp]
LOW RTCReset
RETURN
An interesting note, all posters in this thread have the name Jon (I'm Jon Gowa).
·· In case you need it, I also recently posted some very easy to use code for accessing the DS1302, including the on-board RAM.· The code handles 12 and 24 hour modes very easily as well.· You can find it here:
http://forums.parallax.com/showthread.php?p=531080
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Chris Savage
Parallax Tech Support
csavage@parallax.com