;; ;; 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 ;; ;; 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 . ;; ;; ------------------------------------- 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 ;; -------------------------------------