Thanks guys for your comments.
I still haven't got to the bottom as to why the display jumps to 08:00 when turning 16:00 when powered up, but won't do it when the time is set manually to something like 15:58.
I've browsed through my other snippets of code for RTC and came up with this.
Code:
DB0 var byte[8]
CMCON = %00000111 ' Comparators = off
gosub write_1307
read_1307: ' Read time Secs,Mins,Hours,Day,Date,Month,Year,Control
I2CREAD SDA,SCL,$D1,$00,[STR DB0\8] ' Read 8 bytes from DS1307
lcdout $fe,1,"Time=",hex2 DB0[2],":",hex2 DB0[1],":",hex2 DB0[0] 'bit 0=sec, bit 1=min, bit 2=hrs
lcdout $fe,$c0,"Date=",hex2 DB0[4],":",hex2 DB0[5],":",hex2 db0[6] 'bit 4=day, bit 5=month, bit 6=year
goto read_1307
end
Write_1307: ' Set time & date to 19:00:00 14th Feb 201
I2CWRITE SDA,SCL,$D0,$00,[$00,$00,$19,$7,$14,$2,$10,$90] ' Write to DS1307
pause 10
RETURN ' Sec Min Hr Day D M Y Control
This worked a treat and seems a better way than having all the BCD conversion code that other examples used, and I've used in my current project. However I want to be able to use variables to set the time so I tried substituting [$00,$00,$19,$7,$14,$2,$10,$90] for [RTCSec,RTCMin,RTCHour,RTCDay,RTCMonth,RTCYear,$90] and then have the following to set the hrs and mins and copy them to the RTC variables
Code:
LCDOUT $FE,1
LCDOUT $FE,2,"Set Time"
inp3:
IF H_butt = 0 THEN GOSUB IncHours
IF M_butt = 0 THEN GOSUB IncMinutes
SetHour=Hours
SetMin=Minutes
LCDOUT $FE,$C0,#SetHour DIG 1,#SetHour DIG 0,":",#SetMin DIG 1,#SetMin DIG 0
pause 200
If S_butt = 0 then
pause 250
goto savetime
endif
goto inp3
savetime:
RTCmin = setmin
rtchour = sethour
gosub Write_1307
Write_1307: ' Secs,Mins,Hours,Day,Date,Month,Year,Control
I2CWrite SDApin,SCLpin,$D0,$00,[RTCSec,RTCMin,RTCHour,RTCDay,RTCMonth,RTCYear,$90]
pause 10
RETURN
The original example has the following to read the DS1307 and display the second and 1st bytes for the time
Code:
I2CREAD SDApin,SCLpin,$D1,$00,[STR DB0\8] ' Read 8 bytes from DS1307 Secs,Mins,Hours,Day,Date,Month,Year,Control
LCDOut $FE,$c0+11,hex2 DB0[2],":",hex2 DB0[1]
This worked fine when the values for the time and date etc were stored a $10,$30 etc, but when I used the RTChour and RTCmin variables the LCD displays 0A:1E when RTCHour=10 and RTCMin=30 for example. I'm sure it's a classic noob error, but for the life of me I can't see what I need to do to store the values for these variables in the I2Cwrite statement, and then read them back and display them correctly on the screen.
Bookmarks