-- Title: DS1307 / I2C read write & bcd routines. -- Author: Jean-Bernard, Copyright (c) 2001...2012, all rights reserved. -- Adapted-by: Enzo SERAFINI,Sunish Issac -- Compiler: 2.4o -- Revision: $Revision: 2760 $ -- -- This file is part of jallib (http://jallib.googlecode.com) -- Released under the ZLIB license (http://www.opensource.org/licenses/zlib-license.html) -- -- Description: DS1307 / I2C read write & bcd routines. -- -- Some DS1307 registers -- Second adress is 0x00 values 0-59 -- Minuts adress is 0x01 values 0-59 -- Hour adress is 0x02 values 0-12 or 0-24 -- Week day adress is 0x03 values 1-7 -- Month day adress is 0x04 values 01-28,29,30,31 -- Month adress is 0x05 values 1-12 -- Year adress is 0x06 values 0-99 -- for more details download the pec.sheet -- http://pdfserv.maxim-ic.com/arpdf/DS1307.pdf -- const RTC_HW = 1307 include rtc_hw_common -------------------------------------------------------------------------------- -- Init ds1307 (start it's clock) -------------------------------------------------------------------------------- procedure rtc_ds1307_init() is var byte data -- start the clock (only if it is off) var bit CH at data : 7 ; of register 0 (seconds) CH= Clock Halt = 1 => halted var bit en24hr at data : 6 ; of register 2 (hours) data = rtc_hw_read(0x00) if CH == 1 then CH = 0 -- turn on oscillator rtc_hw_write(0x00, data) -- write data end if data = rtc_hw_read(0x2) if en24hr then en24hr = 0 rtc_hw_write(0x2, data) end if ; enable 24hr end procedure -------------------------------------------------------------------------------- -- ds1307 sqwe -------------------------------------------------------------------------------- procedure rtc_ds1307_sqon(bit*2 in freq, bit in acthigh) is var byte data var bit SQWE at data : 4 ; var bit*2 RS at data : 0 ; var bit state at data : 7 ; SQWE = high Rs = freq state = acthigh rtc_hw_write(0x7, data) end procedure procedure rtc_ds1307_sqoffis is var byte data var bit SQWE at data : 4 ; var bit*2 RS at data : 0 ; var bit state at data : 7 ; SQWE = low rtc_hw_write(0x7, data) end procedure -------------------------------------------------------------------------------- -- read clock week day (1-7) -------------------------------------------------------------------------------- function rtc_week_day'get() return byte is return rtc_hw_read(0x03) end function -------------------------------------------------------------------------------- -- read clock second -------------------------------------------------------------------------------- function rtc_second'get() return byte is return bcd2bin(rtc_hw_read(0x00)) end function function rtc_minute'get() return byte is return bcd2bin(rtc_hw_read(0x01)) end function function rtc_hour'get() return byte is var byte data data = rtc_hw_read(0x02) ;change 24 hr bit to 0 data = data & 0b0011_1111 return bcd2bin(data) end function procedure rtc_hour'put(byte in hh) is hh = hh & 0b0011_1111 rtc_hw_write(0x02,bin2bcd(hh)) ;rtc_hw_write(0x02,(hh)) end procedure procedure rtc_hour_bcd'put(byte in hh) is hh = hh & 0b0011_1111 rtc_hw_write(0x02,(hh)) end procedure function rtc_hour_bcd'get() return byte is var byte data data = rtc_hw_read(0x02) ;change 24 hr bit to 0 data = data & 0b0011_1111 return (data) end function procedure rtc_minute'put(byte in mm) is rtc_hw_write(0x01,bin2bcd(mm)) end procedure procedure rtc_second'put(byte in ss) is ss = ss & 0b0111_1111 rtc_hw_write(0x00,bin2bcd(ss)) end procedure procedure rtc_minute_bcd'put(byte in mm) is rtc_hw_write(0x01,(mm)) end procedure procedure rtc_second_bcd'put(byte in ss) is ss = ss & 0b0111_1111 rtc_hw_write(0x00,(ss)) end procedure -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- function rtc_year'get() return byte is return bcd2bin(rtc_hw_read(0x06)) end function function rtc_month'get() return byte is return bcd2bin(rtc_hw_read(0x05)) end function function rtc_date'get() return byte is return bcd2bin(rtc_hw_read(0x04)) end function procedure rtc_year'put(byte in yy) is rtc_hw_write(0x06,bin2bcd(yy)) end procedure procedure rtc_month'put(byte in mm) is rtc_hw_write(0x05,bin2bcd(mm)) end procedure procedure rtc_date'put(byte in dd) is rtc_hw_write(0x04,bin2bcd(dd)) end procedure -------------------------------------------------------------------------------- function rtc_year_bcd'get() return byte is return (rtc_hw_read(0x06)) end function function rtc_month_bcd'get() return byte is return (rtc_hw_read(0x05)) end function function rtc_date_bcd'get() return byte is return (rtc_hw_read(0x04)) end function procedure rtc_year_bcd'put(byte in yy) is rtc_hw_write(0x06,(yy)) end procedure procedure rtc_month_bcd'put(byte in mm) is rtc_hw_write(0x05,(mm)) end procedure procedure rtc_date_bcd'put(byte in dd) is rtc_hw_write(0x04,(dd)) end procedure procedure rtc_get_time(byte out hh, byte out mm, byte out ss) is ss = rtc_second mm = rtc_minute hh = rtc_hour end procedure procedure rtc_get_date(byte out yy, byte out mm, byte out dd) is dd = rtc_date mm = rtc_month yy = rtc_year end procedure procedure rtc_set_time(byte in hh, byte in mm, byte in ss) is rtc_second = ss rtc_minute = mm rtc_hour = hh end procedure procedure rtc_set_date(byte in yy, byte in mm, byte in dd) is rtc_date = dd rtc_month = mm rtc_year = yy end procedure ;procedure rtc_sqwe,rate select, frequency todo -------------------------------------------------------------------------------- -- Write to SRAM memory. SRAM is backed up during power outage if VBAT is -- connected. There are 56 bytes available. -------------------------------------------------------------------------------- procedure rtc_ram_write(byte in offset, byte in data) is rtc_hw_write(offset + 0x8, data) end procedure -------------------------------------------------------------------------------- -- Read from SRAM memory. SRAM is backed up during power outage if VBAT is -- connected. There are 56 bytes available. -------------------------------------------------------------------------------- function rtc_ram(byte in offset) return byte is return rtc_hw_read(offset + 0x8) end function procedure rtc_ram_read(byte in offset,byte out data ) is data = rtc_hw_read(offset + 0x8) end procedure procedure rtc_ram_write_word(byte in offset,word in data) is var byte tempbyte[2] at data offset = offset + 0x8 rtc_hw_write(offset,tempbyte[0]) rtc_hw_write(offset+1,tempbyte[1]) end procedure function rtc_ram_read_word(byte in offset) return word is var word data var byte tempbyte[2] at data offset = offset + 0x8 tempbyte[0] = rtc_hw_read(offset+0) tempbyte[1] = rtc_hw_read(offset+1) return data end function