;; ;; 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 . ;; ;; ------------------------------------- ;; DEFINES ;; constants RTC_ADDR_W EQU b'11010000' RTC_ADDR_R EQU b'11010001' RTC_REG_SEC EQU H'00' RTC_REG_MIN EQU H'01' RTC_REG_HOUR EQU H'02' RTC_REG_DOW EQU H'03' RTC_REG_DOM EQU H'04' RTC_REG_MON EQU H'05' RTC_REG_YEAR EQU H'06' RTC_REG_A1S EQU H'07' RTC_REG_A1M EQU H'08' RTC_REG_A1H EQU H'09' RTC_REG_A1D EQU H'0A' RTC_REG_A2M EQU H'0B' RTC_REG_A2H EQU H'0C' RTC_REG_A2D EQU H'0D' RTC_REG_CON EQU H'0E' RTC_REG_STAT EQU H'0F' ;; ------------------------------------- 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 nop 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 bcf STATUS,C 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_error_ack movlw RTC_REG_STAT call i2c_send_byte btfsc RTC_BYTE,0 goto rtc_error_ack call i2c_restart movlw RTC_ADDR_R call i2c_send_byte btfsc RTC_BYTE,0 goto rtc_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_error_ack movlw RTC_REG_SEC call i2c_send_byte btfsc RTC_BYTE,0 goto rtc_error_ack movlw .4 movwf RTC_BYTE_CNT rtc_init_clear1 clrw call i2c_send_byte btfsc RTC_BYTE,0 goto rtc_error_ack decfsz RTC_BYTE_CNT,f goto rtc_init_clear1 movlw .2 movwf RTC_BYTE_CNT rtc_init_clear2 movlw .1 call i2c_send_byte btfsc RTC_BYTE,0 goto rtc_error_ack decfsz RTC_BYTE_CNT,f goto rtc_init_clear2 movlw .10 movwf RTC_BYTE_CNT rtc_init_clear3 clrw call i2c_send_byte btfsc RTC_BYTE,0 goto rtc_error_ack decfsz RTC_BYTE_CNT,f goto rtc_init_clear3 call i2c_stop return ;; --------------- rtc_get_time call i2c_start movlw RTC_ADDR_W call i2c_send_byte btfsc RTC_BYTE,0 goto rtc_error_ack movlw RTC_REG_SEC call i2c_send_byte btfsc RTC_BYTE,0 goto rtc_error_ack call i2c_restart movlw RTC_ADDR_R call i2c_send_byte btfsc RTC_BYTE,0 goto rtc_error_ack movlw .7 movwf RTC_BYTE_CNT rtc_get_time_loop call i2c_recv_byte movf RTC_BYTE,w movwf INDF decfsz RTC_BYTE_CNT,f goto rtc_get_time_next call i2c_nack call i2c_stop return rtc_get_time_next incf FSR,f call i2c_ack goto rtc_get_time_loop ;; --------------- rtc_error_ack call i2c_stop ;; TODO: add error handling return ;; -------------------------------------