;; ;; 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 . ;; ;; ------------------------------------- ;; PREAMBLE LIST p=16F887 include "p16f887.inc" __config _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_NSLEEP & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC __config _CONFIG2, _BOR21V & _WRT_OFF ;; ------------------------------------- ;; DEFINES ;; constants ;; I/O Pins ;; PortA SOLAR_C0 EQU 0 SOLAR_C1 EQU 1 SOLAR_C2 EQU 2 SOLAR_C3 EQU 3 OWIRE EQU 4 SOLAR_C4 EQU 5 ;; PortB DTMF_INT EQU 0 BAT_V EQU 1 SOLAR_V EQU 2 BAT_C EQU 3 RTC_SDA EQU 4 RTC_SCL EQU 5 RTC_INT EQU 6 MPU_INT EQU 7 ;; PortC MPU_PWRDWN EQU 0 MPU_RESET EQU 1 MPU_CS EQU 2 MPU_SCK EQU 3 MPU_SDI EQU 4 MPU_SDO EQU 5 ICOM_TX EQU 6 ICOM_RX EQU 7 ;; PortD DTMF_D0 EQU 0 DTMF_D1 EQU 1 DTMF_D2 EQU 2 DTMF_D3 EQU 3 DTMF_PWRDWN EQU 4 TTX_RESET EQU 5 TTX_SCL EQU 6 TTX_SDA EQU 7 ;; PortE SOLAR_C5 EQU 0 SOLAR_C6 EQU 1 SOLAR_C7 EQU 2 ;; variables ;; page 0 only TMP EQU H'0020' TTX_BYTE EQU H'0021' TTX_BIT_CNT EQU H'0022' TTX_BYTE_CNT EQU H'0023' TTX_CSUM EQU H'0024' RTC_BYTE_CNT EQU H'0028' WAIT_CNT EQU H'0030' BUF EQU H'0040' BUF_END EQU H'004F' ;; variables ;; page 2 only CALC_ACC0 EQU H'0110' CALC_ACC1 EQU H'0111' CALC_ACC2 EQU H'0112' CALC_ACC3 EQU H'0113' CALC_TEMP0 EQU H'0114' CALC_TEMP1 EQU H'0115' CALC_TEMP2 EQU H'0116' CALC_TEMP3 EQU H'0117' ;; all pages RTC_BYTE EQU H'0070' RTC_BIT_CNT EQU H'0071' OWIRE_BYTE EQU H'0072' OWIRE_BIT_CNT EQU H'0073' OWIRE_CNT EQU H'0074' W_TEMP EQU H'007E' STATUS_TEMP EQU H'007F' ;; bits ;; ------------------------------------- ;; Reset Vector org 0 goto init ;; ------------------------------------- ;; Interrupt Vector org 4 ;; save context movwf W_TEMP swapf STATUS,W movwf STATUS_TEMP bcf STATUS,RP0 bcf STATUS,RP1 btfsc PIR1,RCIF goto int_uart_rx goto interrupt_end int_uart_rx call uart_rx_byte btfsc PIR1,RCIF call uart_rx_byte btfss RCSTA,OERR goto int_uart_rx_oe goto interrupt_end int_uart_rx_oe bcf RCSTA,CREN bsf RCSTA,CREN interrupt_end ;; restore context swapf STATUS_TEMP,W movwf STATUS swapf W_TEMP,F swapf W_TEMP,W retfie ;; ------------------------------------- ;; INIT init ;; bank 3 bsf STATUS,RP0 bsf STATUS,RP1 movlw b'00000000' movwf BAUDCTL movlw b'00000111' movwf ANSELH ;; bank 1 bsf STATUS,RP0 bcf STATUS,RP1 movlw b'11110000' movwf WPUB movlw b'11000000' movwf IOCB movlw b'01000001' movwf OPTION_REG clrf PSTRCON movlw b'00010000' movwf OSCCON movlw b'11111111' movwf TRISA movlw b'11111111' movwf TRISB movlw b'11111000' movwf TRISC movlw b'10001111' movwf TRISD movlw b'00100100' movwf TXSTA movlw .12 movwf SPBRG clrf SPBRGH movlw b'00100000' movwf PIE1 clrf PIE2 ;; bank 0 bcf STATUS,RP0 bcf STATUS,RP1 movlw b'10010000' movwf RCSTA movlw B'01000000' movwf INTCON clrf PORTB bsf PORTD,DTMF_PWRDWN bcf PORTD,TTX_RESET ;reset TTX bcf PORTD,TTX_SCL bcf PORTD,TTX_SDA clrf TMR0 bsf INTCON,GIE clrf TMP call rtc_init bsf PORTD,TTX_RESET goto main ;; ------------------------------------- ;; TABLES include "tables.inc" ;; ------------------------------------- ;; SUBROUTINES wait_ms movwf WAIT_CNT wait_next movlw .9 movwf TMR0 bcf INTCON,T0IF wait_loop btfss INTCON,T0IF goto wait_loop decfsz WAIT_CNT,f goto wait_next return ;; ------------------------------------- uart_rx_byte btfsc RCSTA,FERR goto uart_rx_fe movf RCREG,w ; TODO: move to input string movwf TMP return uart_rx_fe movf RCREG,w return ;; ------------------------------------- include "math.inc" ;; ------------------------------------- include "ttx.inc" ;; ------------------------------------- include "rtc.inc" ;; ------------------------------------- include "temp.inc" ;; ------------------------------------- ;; MAINLOOP main movf TMP,f btfsc STATUS,Z goto main movlw BUF movwf FSR call rtc_get_time swapf BUF+4,w andlw b'00000011' call digit movwf TXREG movlw .1 call wait_ms movf BUF+4,w andlw b'00001111' call digit movwf TXREG movlw .1 call wait_ms movlw '.' movwf TXREG movlw .1 call wait_ms swapf BUF+5,w andlw b'00000001' call digit movwf TXREG movlw .1 call wait_ms movf BUF+5,w andlw b'00001111' call digit movwf TXREG movlw .1 call wait_ms movlw '.' movwf TXREG movlw .1 call wait_ms swapf BUF+6,w andlw b'00001111' call digit movwf TXREG movlw .1 call wait_ms movf BUF+6,w andlw b'00001111' call digit movwf TXREG movlw .1 call wait_ms movlw ' ' movwf TXREG movlw .1 call wait_ms swapf BUF+2,w andlw b'00000011' call digit movwf TXREG movlw .1 call wait_ms movf BUF+2,w andlw b'00001111' call digit movwf TXREG movlw .1 call wait_ms movlw ':' movwf TXREG movlw .1 call wait_ms swapf BUF+1,w andlw b'00000111' call digit movwf TXREG movlw .1 call wait_ms movf BUF+1,w andlw b'00001111' call digit movwf TXREG movlw .1 call wait_ms movlw ':' movwf TXREG movlw .1 call wait_ms swapf BUF,w andlw b'00000111' call digit movwf TXREG movlw .1 call wait_ms movf BUF,w andlw b'00001111' call digit movwf TXREG movlw .1 call wait_ms movlw '\r' movwf TXREG movlw .1 call wait_ms movlw '\n' movwf TXREG movlw .1 call wait_ms call temp_read_value swapf OWIRE_BYTE,w andlw b'00001111' call digit movwf TXREG movlw .1 call wait_ms movf OWIRE_BYTE,w andlw b'00001111' call digit movwf TXREG movlw .1 call wait_ms movlw '\r' movwf TXREG movlw .1 call wait_ms movlw '\n' movwf TXREG clrf TMP goto main powerdown sleep nop goto main ;; ------------------------------------- ;; END end