TriOS/lib/adm-rtc.spin

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. │
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
}}