352 lines
32 KiB
Plaintext
352 lines
32 KiB
Plaintext
{{
|
|
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
│ Real Time Clock Engine │
|
|
│ │
|
|
│ Author: Kwabena W. Agyeman │
|
|
│ Updated: 11/22/2009 │
|
|
│ Designed For: P8X32A │
|
|
│ │
|
|
│ Copyright (c) 2009 Kwabena W. Agyeman │
|
|
│ See end of file for terms of use. │
|
|
│ │
|
|
│ Driver Info: │
|
|
│ │
|
|
│ The RTCEngine interfaces with the DS1307RTC. │
|
|
│ │
|
|
│ The driver is only guaranteed and tested to work at an 80Mhz system clock or higher. The driver is designed for the P8X32A │
|
|
│ so port B will not be operational. │
|
|
│ │
|
|
│ Nyamekye, │
|
|
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
}}
|
|
|
|
CON
|
|
''
|
|
'' 3.3V
|
|
''
|
|
'' │
|
|
'' 10KΩ
|
|
'' │
|
|
Data_Pin = 29 '' ─┻─ SDA
|
|
''
|
|
'' 3.3V
|
|
''
|
|
'' │
|
|
'' 10KΩ
|
|
'' │
|
|
Clock_Pin = 28 '' ─┻─ SCL
|
|
|
|
RTC_Address = %1101000
|
|
|
|
CON
|
|
|
|
' For use with "getDay" and "setDay".
|
|
|
|
#1, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
|
|
|
|
' For use with "getMonth" and "setMonth".
|
|
|
|
#1, January, February, March, April, May, June, July, August, September, October, November, December
|
|
|
|
PUB getSeconds '' 11 Stack Longs
|
|
|
|
'' ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
'' │ Returns the current second (0 - 59) from the real time clock. │
|
|
'' └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
|
|
return BCDToNumber(getRAM(0))
|
|
|
|
PUB getMinutes '' 11 Stack Longs
|
|
|
|
'' ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
'' │ Returns the current minute (0 - 59) from the real time clock. │
|
|
'' └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
|
|
return BCDToNumber(getRAM(1))
|
|
|
|
PUB getHours '' 11 Stack Longs
|
|
|
|
'' ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
'' │ Returns the current hour (0 - 23) from the real time clock. │
|
|
'' └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
|
|
return BCDToNumber(getRAM(2))
|
|
|
|
PUB getDay '' 11 Stack Longs
|
|
|
|
'' ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
'' │ Returns the current day (1 - 7) from the real time clock. │
|
|
'' └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
|
|
return BCDToNumber(getRAM(3))
|
|
|
|
PUB getDate '' 11 Stack Longs
|
|
|
|
'' ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
'' │ Returns the current date (1 - 31) from the real time clock. │
|
|
'' └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
|
|
return BCDToNumber(getRAM(4))
|
|
|
|
PUB getMonth '' 11 Stack Longs
|
|
|
|
'' ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
'' │ Returns the current month (1 - 12) from the real time clock. │
|
|
'' └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
|
|
return BCDToNumber(getRAM(5))
|
|
|
|
PUB getYear '' 11 Stack Longs
|
|
|
|
'' ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
'' │ Returns the current year (2000 - 2099) from the real time clock. │
|
|
'' └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
|
|
return (BCDToNumber(getRAM(6)) + 2000)
|
|
|
|
PUB setSeconds(seconds) '' 13 Stack Longs
|
|
|
|
'' ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
'' │ Sets the current real time clock seconds. │
|
|
'' │ │
|
|
'' │ Seconds - Number to set the seconds to between 0 - 59. │
|
|
'' └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
|
|
setRAM(0, numberToBCD(((seconds <# 59) #> 0)))
|
|
|
|
PUB setMinutes(minutes) '' 13 Stack Longs
|
|
|
|
'' ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
'' │ Sets the current real time clock minutes. │
|
|
'' │ │
|
|
'' │ Minutes - Number to set the minutes to between 0 - 59. │
|
|
'' └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
|
|
setRAM(1, numberToBCD(((minutes <# 59) #> 0)))
|
|
|
|
PUB setHours(hours) '' 13 Stack Longs
|
|
|
|
'' ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
'' │ Sets the current real time clock hours. │
|
|
'' │ │
|
|
'' │ Hours - Number to set the hours to between 0 - 23. │
|
|
'' └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
|
|
setRAM(2, numberToBCD(((hours <# 23) #> 0)))
|
|
|
|
PUB setDay(day) '' 13 Stack Longs
|
|
|
|
'' ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
'' │ Sets the current real time clock day. │
|
|
'' │ │
|
|
'' │ Day - Number to set the day to between 1 - 7. │
|
|
'' └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
|
|
setRAM(3, numberToBCD(((day <# 7) #> 1)))
|
|
|
|
PUB setDate(date) '' 13 Stack Longs
|
|
|
|
'' ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
'' │ Sets the current real time clock date. │
|
|
'' │ │
|
|
'' │ Date - Number to set the date to between 1 - 31. │
|
|
'' └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
|
|
setRAM(4, numberToBCD(((date <# 31) #> 1)))
|
|
|
|
PUB setMonth(month) '' 13 Stack Longs
|
|
|
|
'' ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
'' │ Sets the current real time clock month. │
|
|
'' │ │
|
|
'' │ Month - Number to set the month to between 1 - 12. │
|
|
'' └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
|
|
setRAM(5, numberToBCD(((month <# 12) #> 1)))
|
|
|
|
PUB setYear(year) '' 13 Stack Longs
|
|
|
|
'' ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
'' │ Sets the current real time clock year. │
|
|
'' │ │
|
|
'' │ Year - Number to set the year to between 2000 - 2099. │
|
|
'' └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
|
|
setRAM(6, numberToBCD((((year - 2000) <# 99) #> 0)))
|
|
|
|
PUB setSQWOUTFrequency(frequency) '' 13 Stack Longs
|
|
|
|
'' ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
'' │ Turns the square wave on. │
|
|
'' │ │
|
|
'' │ Frequency - Selects the frequency of the square wave pin. (0 - 1HZ), (1 - 4.096KHZ), (2 - 8.192KHZ), (3 - 32.768KHZ). │
|
|
'' └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
|
|
setRAM(7, ($10 | ((frequency <# 3) #> 0)))
|
|
|
|
PUB setSQWOUTState(state) '' 13 Stack Longs
|
|
|
|
'' ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
'' │ Turns the square wave off. │
|
|
'' │ │
|
|
'' │ State - Selects the state of the square wave pin. │
|
|
'' └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
|
|
setRAM(7, ((not(not(state))) & $80))
|
|
|
|
PUB setNVSRAM(index, value) '' 14 Stack Longs
|
|
|
|
'' ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
'' │ Sets the NVSRAM to the selected value (0 - 255) at the index (0 - 55). │
|
|
'' │ │
|
|
'' │ Index - The location in NVRAM to set (0 - 55). │
|
|
'' │ Value - The value (0 - 255) to change the location to. │
|
|
'' └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
|
|
setRam((((index <# 55) #> 0) + 8), value)
|
|
|
|
PUB getNVSRAM(index) '' 12 Stack Longs
|
|
|
|
'' ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
'' │ Gets the selected NVSRAM value at the index (0 - 55). │
|
|
'' │ │
|
|
'' │ Returns the selected location's value (0 - 255). │
|
|
'' │ │
|
|
'' │ Index - The location in NVRAM to get (0 - 55). │
|
|
'' └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
|
|
return getRam(((index <# 55) #> 0) + 8)
|
|
|
|
PUB pauseForSeconds(number) '' 4 Stack Longs
|
|
|
|
'' ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
'' │ Pauses execution for a number of seconds. │
|
|
'' │ │
|
|
'' │ Returns a puesdo random value derived from the current clock frequency and the time when called. │
|
|
'' │ │
|
|
'' │ Number - Number of seconds to pause for between 0 and 2,147,483,647. │
|
|
'' └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
|
|
result := cnt
|
|
|
|
repeat (number #> 0)
|
|
result += clkfreq
|
|
waitcnt(result)
|
|
|
|
PUB pauseForMilliseconds(number) '' 4 Stack Longs
|
|
|
|
'' ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
'' │ Pauses execution for a number of milliseconds. │
|
|
'' │ │
|
|
'' │ Returns a puesdo random value derived from the current clock frequency and the time when called. │
|
|
'' │ │
|
|
'' │ Number - Number of milliseconds to pause for between 0 and 2,147,483,647. │
|
|
'' └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
|
|
result := cnt
|
|
|
|
repeat (number #> 0)
|
|
result += (clkfreq / 1000)
|
|
waitcnt(result)
|
|
|
|
PRI BCDToNumber(BCD) ' 4 Stack Longs
|
|
|
|
return (((BCD >> 4) * 10) + (BCD & $F))
|
|
|
|
PRI numberToBCD(number) ' 4 Stack Longs
|
|
|
|
return (((number / 10) << 4) + (number // 10))
|
|
|
|
PRI setRAM(index, value) ' 9 Stack Longs
|
|
|
|
startDataTransfer
|
|
transmitPacket(constant(RTC_Address << 1))
|
|
transmitPacket(index)
|
|
transmitPacket(value)
|
|
stopDataTransfer
|
|
|
|
PRI getRAM(index) ' 8 Stack Longs
|
|
|
|
startDataTransfer
|
|
transmitPacket(constant(RTC_Address << 1))
|
|
transmitPacket(index)
|
|
stopDataTransfer
|
|
|
|
' Repeated Start
|
|
|
|
startDataTransfer
|
|
transmitPacket(constant((RTC_Address << 1) | 1))
|
|
result := receivePacket(false)
|
|
stopDataTransfer
|
|
|
|
PRI transmitPacket(value) ' 4 Stack Longs
|
|
|
|
value := ((!value) >< 8)
|
|
|
|
repeat 8
|
|
|
|
dira[constant(((Data_Pin <# 31) #> 0))] := value
|
|
|
|
dira[constant(((Clock_Pin <# 31) #> 0))] := false
|
|
|
|
dira[constant(((Clock_Pin <# 31) #> 0))] := true
|
|
|
|
value >>= 1
|
|
|
|
dira[constant(((Data_Pin <# 31) #> 0))] := false
|
|
|
|
dira[constant(((Clock_Pin <# 31) #> 0))] := false
|
|
dira[constant(((Clock_Pin <# 31) #> 0))] := true
|
|
|
|
dira[constant(((Data_Pin <# 31) #> 0))] := true
|
|
|
|
PRI receivePacket(aknowledge) ' 4 Stack Longs
|
|
|
|
dira[constant(((Data_Pin <# 31) #> 0))] := false
|
|
|
|
repeat 8
|
|
|
|
result <<= 1
|
|
|
|
dira[constant(((Clock_Pin <# 31) #> 0))] := false
|
|
|
|
result |= ina[constant(((Data_Pin <# 31) #> 0))]
|
|
|
|
dira[constant(((Clock_Pin <# 31) #> 0))] := true
|
|
|
|
dira[constant(((Data_Pin <# 31) #> 0))] := aknowledge
|
|
|
|
dira[constant(((Clock_Pin <# 31) #> 0))] := false
|
|
dira[constant(((Clock_Pin <# 31) #> 0))] := true
|
|
|
|
dira[constant(((Data_Pin <# 31) #> 0))] := true
|
|
|
|
PRI startDataTransfer ' 3 Stack Longs
|
|
|
|
dira[constant(((Data_Pin <# 31) #> 0))] := true
|
|
dira[constant(((Clock_Pin <# 31) #> 0))] := true
|
|
|
|
PRI stopDataTransfer ' 3 Stack Longs
|
|
|
|
dira[constant(((Clock_Pin <# 31) #> 0))] := false
|
|
dira[constant(((Data_Pin <# 31) #> 0))] := false
|
|
|
|
{{
|
|
|
|
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
│ TERMS OF USE: MIT License │
|
|
├─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
|
|
│Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation │
|
|
│files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, │
|
|
│modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the │
|
|
│Software is furnished to do so, subject to the following conditions: │
|
|
│ │
|
|
│The above copyright notice and this permission notice shall be included in all copies or substantial portions of the │
|
|
│Software. │
|
|
│ │
|
|
│THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE │
|
|
│WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR │
|
|
│COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, │
|
|
│ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │
|
|
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
}} |