;; ;; mur.sat ;; ;; Somewhen in the year 20xx, 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-2015 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_TOD0 EQU H'00' RTC_REG_TOD1 EQU H'01' RTC_REG_TOD2 EQU H'02' RTC_REG_TOD3 EQU H'03' RTC_REG_ALM0 EQU H'04' RTC_REG_ALM1 EQU H'05' RTC_REG_ALM2 EQU H'06' RTC_REG_CTL EQU H'07' RTC_REG_STAT EQU H'08' RTC_REG_TCH EQU H'09' RTC_INIT_CTL EQU b'00001000' ;; RTC_INIT_TCH EQU b'10101011' ; trickle charger enabled with diode and 4kohm ;; RTC_INIT_TCH EQU b'10101010' ; trickle charger enabled with diode and 2kohm RTC_INIT_TCH EQU b'10101001' ; trickle charger enabled with diode and 250ohm ;; RTC_INIT_TCH EQU b'00001100' ; trickle charger disabled ;; ------------------------------------- rtc_init call i2c_start movlw RTC_ADDR_W call i2c_send_byte btfsc I2C_BYTE,0 goto rtc_error_ack movlw RTC_REG_STAT call i2c_send_byte btfsc I2C_BYTE,0 goto rtc_error_ack call i2c_restart movlw RTC_ADDR_R call i2c_send_byte btfsc I2C_BYTE,0 goto rtc_error_ack call i2c_recv_byte call i2c_nack btfsc I2C_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 I2C_BYTE,0 goto rtc_error_ack movlw RTC_REG_TOD0 call i2c_send_byte btfsc I2C_BYTE,0 goto rtc_error_ack movlw .7 movwf RTC_BYTE_CNT rtc_init_clear clrw call i2c_send_byte btfsc I2C_BYTE,0 goto rtc_error_ack decfsz RTC_BYTE_CNT,f goto rtc_init_clear movlw RTC_INIT_CTL call i2c_send_byte btfsc I2C_BYTE,0 goto rtc_error_ack clrw call i2c_send_byte btfsc I2C_BYTE,0 goto rtc_error_ack movlw RTC_INIT_TCH call i2c_send_byte btfsc I2C_BYTE,0 goto rtc_error_ack call i2c_stop return ;; --------------- rtc_get_time movlw RTC_TOD0 movwf FSR call i2c_start movlw RTC_ADDR_W call i2c_send_byte btfsc I2C_BYTE,0 goto rtc_error_ack movlw RTC_REG_TOD0 call i2c_send_byte btfsc I2C_BYTE,0 goto rtc_error_ack call i2c_restart movlw RTC_ADDR_R call i2c_send_byte btfsc I2C_BYTE,0 goto rtc_error_ack movlw .4 movwf RTC_BYTE_CNT rtc_get_time_loop call i2c_recv_byte movf I2C_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 ;; -------------------------------------