diff options
Diffstat (limited to 'software/ihu/rtc.inc')
-rw-r--r-- | software/ihu/rtc.inc | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/software/ihu/rtc.inc b/software/ihu/rtc.inc new file mode 100644 index 0000000..18ac185 --- /dev/null +++ b/software/ihu/rtc.inc @@ -0,0 +1,207 @@ + ;; + ;; mur.sat + ;; + ;; Somewhen in the year 2011, mur.at will have a nano satellite launched + ;; into a low earth orbit (310 km above the surface of our planet). The + ;; satellite itself is a TubeSat personal satellite kit, developed and + ;; launched by interorbital systems. mur.sat is a joint venture of mur.at, + ;; ESC im Labor and realraum. + ;; + ;; Please visit the project hompage at sat.mur.at for further information. + ;; + ;; + ;; Copyright (C) 2011 Christian Pointner <equinox@mur.at> + ;; + ;; This file is part of mur.sat. + ;; + ;; mur.sat is free software: you can redistribute it and/or modify + ;; it under the terms of the GNU General Public License as published by + ;; the Free Software Foundation, either version 3 of the License, or + ;; any later version. + ;; + ;; mur.sat is distributed in the hope that it will be useful, + ;; but WITHOUT ANY WARRANTY; without even the implied warranty of + ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + ;; GNU General Public License for more details. + ;; + ;; You should have received a copy of the GNU General Public License + ;; along with mur.sat. If not, see <http://www.gnu.org/licenses/>. + ;; + + ;; ------------------------------------- +i2c_start + bsf STATUS,RP0 + bcf TRISB,RTC_SDA + nop + bcf TRISB,RTC_SCL + bcf STATUS,RP0 + return + + ;; ------------------ +i2c_restart + bsf STATUS,RP0 + bsf TRISB,RTC_SDA + nop + bsf TRISB,RTC_SCL + nop + nop + nop + bcf TRISB,RTC_SDA + nop + bcf TRISB,RTC_SCL + bcf STATUS,RP0 + return + + ;; ------------------ +i2c_stop + bsf STATUS,RP0 + bsf TRISB,RTC_SCL + nop + bsf TRISB,RTC_SDA + bcf STATUS,RP0 + return + + ;; ------------------ +i2c_send_byte + movwf RTC_BYTE + movlw .8 + movwf RTC_BIT_CNT + bsf STATUS,RP0 +i2c_send_byte_next + btfss RTC_BYTE,7 + bcf TRISB,RTC_SDA + btfsc RTC_BYTE,7 + bsf TRISB,RTC_SDA + bsf TRISB,RTC_SCL + nop + nop + bcf TRISB,RTC_SCL + rlf RTC_BYTE,f + decfsz RTC_BIT_CNT,f + goto i2c_send_byte_next + + nop + nop + bsf TRISB,RTC_SDA + bsf TRISB,RTC_SCL + bcf STATUS,RP0 + movf PORTB,w + bsf STATUS,RP0 + bcf TRISB,RTC_SCL + bcf TRISB,RTC_SDA + bcf STATUS,RP0 + andlw b'00010000' + movwf RTC_BYTE + swapf RTC_BYTE,f + return + + ;; ------------------ +i2c_recv_byte + clrf RTC_BYTE + movlw .8 + movwf RTC_BIT_CNT + bsf STATUS,RP0 + bsf TRISB,RTC_SDA +i2c_recv_byte_loop + bsf TRISB,RTC_SCL + bcf STATUS,RP0 + btfsc PORTB,RTC_SDA + bsf RTC_BYTE,0 + bsf STATUS,RP0 + bcf TRISB,RTC_SCL + decfsz RTC_BIT_CNT,f + goto i2c_recv_byte_next + + bcf TRISB,RTC_SDA + bcf STATUS,RP0 + return + +i2c_recv_byte_next + rlf RTC_BYTE,f + goto i2c_recv_byte_loop + + ;; ------------------ +i2c_ack + bsf STATUS,RP0 + bcf TRISB,RTC_SDA + bsf TRISB,RTC_SCL + nop + nop + bcf TRISB,RTC_SCL + bcf STATUS,RP0 + return + + ;; ------------------ +i2c_nack + bsf STATUS,RP0 + bsf TRISB,RTC_SDA + bsf TRISB,RTC_SCL + nop + nop + bcf TRISB,RTC_SCL + bcf TRISB,RTC_SDA + bcf STATUS,RP0 + return + + ;; ------------------------------------- +rtc_init + call i2c_start + + movlw RTC_ADDR_W + call i2c_send_byte + btfsc RTC_BYTE,0 + goto rtc_init_error_ack + + movlw RTC_REG_STAT + call i2c_send_byte + btfsc RTC_BYTE,0 + goto rtc_init_error_ack + + call i2c_restart + + movlw RTC_ADDR_R + call i2c_send_byte + btfsc RTC_BYTE,0 + goto rtc_init_error_ack + + call i2c_recv_byte + call i2c_nack + + btfsc RTC_BYTE,7 + goto rtc_init_after_clock_fail + + call i2c_stop + return + +rtc_init_after_clock_fail + call i2c_restart + + movlw RTC_ADDR_W + call i2c_send_byte + btfsc RTC_BYTE,0 + goto rtc_init_error_ack + + movlw RTC_REG_SEC + call i2c_send_byte + btfsc RTC_BYTE,0 + goto rtc_init_error_ack + + movlw .16 + movwf RTC_BYTE_CNT +rtc_init_clear + clrw + call i2c_send_byte + btfsc RTC_BYTE,0 + goto rtc_init_error_ack + decfsz RTC_BYTE_CNT,f + goto rtc_init_clear + + call i2c_stop + return + +rtc_init_error_ack + call i2c_stop + ;; TODO: add error handling + return + + ;; ------------------------------------- |