This module is part of the original MMBasic library. It is reproduced here with kind permission of Hugh Buckle and Geoff Graham. Be aware it may reference functionality which has changed or is deprecated in the latest versions of MMBasic.¶
Note: Any required file(s) are available in the attachments tab (top right).
I2CTime.BAS
'****** Program for setting and reading time on DS1307 Real Time Clock
'****** Author: Ian Quirk
CLS
INPUT "Do you want to set the external clock"; temp$
if temp$ <> "y" and temp$ <> "Y" GOTO Readtime
Start_i2c_clock
INPUT "Do you want to set Time (T) Date (D) or Both (B)"; temp$
if temp$ = "T" or temp$ = "t" then
SetTime
elseif temp$ = "D" or temp$ = "d" then
SetDate
ElseIf temp$ = "B" or temp$ = "b" then
SetTime
SetDate
ENDIF
' CLS
Readtime:
delay = 10000
DO WHILE a$ = ""
a$ = INKEY$
read_i2cRTC (minutes,hours,days,months,year)
'LOCATE 50, 50
PRINT "Confirming I2C Time"
PRINT Hours;": ";minutes;" ";days;"/";months;"/";year+2000
PRINT "internal time"
print TIME$, DATE$
PAUSE delay
LOOP
''''''''''''''
'get time subroutine insert this subroutine to set Maximite time from dsi307
' readi2cRTC and bcd_bin also required.
'''''''''''''''''''''
GetTime: ' Get time and date
read_i2cRTC (minutes,hours,days,months,year)
in$ = FORMAT$(days)+"-"+ FORMAT$(months) +"-"+ FORMAT$(year+2000)
Date$ = in$
in$ = FORMAT$(Hours) +":"+ FORMAT$(minutes)
Time$ = in$
Return
''''''''''''''
'set time subroutine
'''''''''''''''''''''
SUB SetTime: ' set time
local t1$, hrs, mins
Print "Enter Time HH : MM "
Input in$
Time$ = in$
t1$ = "&h"+LEFT$(in$,2)
hrs = VAL(t1$)
t1$ = "&h"+RIGHT$(in$,2)
mins = VAL(t1$)
' bin_bcd (mins,hrs)
print hrs;": ";mins,
Set_i2cRTC ( 1,mins,hrs,0)
END SUB
''''''''''''''
'set Date subroutine
'''''''''''''''''''''
SUB SetDate: ' set date
local t1$, temp, in$
Print "Enter Date DD/MM/YY "
Input in$
t1$ = "&h"+LEFT$(in$,2) ' make equivelent hex string = BCD
dys = VAL(t1$)
t1$ = "&h"+mid$(in$,4,2)
mths = VAL(t1$)
t1$ = "&h"+RIGHT$(in$,2)
yr = VAL(t1$)
Date$ = (LEFT$(in$,6) +"20"+RIGHT$(in$,2))
temp = 0
Set_i2cRTC ( 4,dys,mths,yr)
END SUB
'------------------------------------------------
' Initalise RTC and turm off square wave out and zer0 Seconds regesters
'-------------------------------------------------------------------
SUB Start_i2c_clock:
I2CEN 100, 100 ' i2c enable 100kHz, 100ms timeout
I2CSEND &h68, 0, 2,0,0 ' i2c send adress, option, send length, data,data..
I2CSEND &h68, 0, 2,7,0 ' i2c send adress, option, send length, data,data..
I2CDIS ' i2c disable
END SUB
'-------------------------------------------------------
'*******Sub to Read DS1307 RTC and return *************
' Minutes
' Hours
' Date (day of Month)
' Month
' Year ( 2 didget can add 20 to front)
'*****************************************************
SUB read_i2cRTC (min,hrs,dys,mth,yr)
Local temp(8), tmp
' MSb Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 LSb
I2CEN 100, 100 ' i2c enable 100kHz, 200ms timeout
I2CRCV &h68, 0, 6, temp(0),1,&h01 ' i2c read adress, option, recieve length, rec buffer
print "Result = "; MM.i2c
I2CDIS ' i2c disable
tmp = temp(0)
bcd_bin (tmp,min)
tmp = temp(1)
bcd_bin (tmp,hrs)
tmp = temp(3)
bcd_bin (tmp,dys)
tmp = temp(4)
bcd_bin (tmp,mth)
tmp = temp(5)
bcd_bin (tmp,yr)
END SUB
'----------------------------------------------------------------
'******************Sub Procedure Write data to DS13207 RTC********
'-------------------------------------------------------------------
SUB Set_i2cRTC (SAdrs,Dat1,Dat2,Dat3)
Local temp(4)
temp(0) = SAdrs
temp(1) = Dat1
temp(2) = Dat2
temp(3) = Dat3
print
print temp(0), temp(1), temp(2), temp(3)
' MSb Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 LSb
I2CEN 100, 100 ' i2c enable 100kHz, 100ms timeout
I2CSEND &h68, 0, 2,temp(0) ' i2c send adress, option, send length, data,data..
I2CDIS ' i2c disable
END SUB
'-----------------------------------------------------
'***** Sub Procedure - convert BCD to binary *****
'----------------------------------------------------
SUB bcd_bin (Val,Vout)
local temp
' convert the DS1307 BCD values to binary
temp = val AND &b00001111
Vout = (val AND &b11110000) * 10 / 16 + temp
END SUB