;; ;; mur.sat ;; ;; Somewhen in the year 2012, 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 I2C_SDA EQU 4 I2C_SCL EQU 5 RTC_INT EQU 6 RTC_RST EQU 7 ;; PortC MPU_PWRDWN EQU 0 MPU_RESET EQU 1 UNDEF_C2 EQU 2 UNDEF_C3 EQU 3 UNDEF_C4 EQU 4 UNDEF_C5 EQU 5 MPU_TX EQU 6 MPU_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'002F' DTMF_BUF EQU H'0030' ; 5Bytes for incoming DTMF commands DTMF_BUF_END EQU H'0034' DTMF_BUF_PTR EQU H'0035' DTMF_CS EQU H'0036' RTC_TOD0 EQU H'003A' RTC_TOD1 EQU H'003B' RTC_TOD2 EQU H'003C' RTC_TOD3 EQU H'003D' BUF EQU H'0040' BUF_END EQU H'004F' ADC_SOLAR_C0 EQU H'0050' ADC_SOLAR_C1 EQU H'0051' ADC_SOLAR_C2 EQU H'0052' ADC_SOLAR_C3 EQU H'0053' ADC_SOLAR_V0 EQU H'0054' ADC_SOLAR_C4 EQU H'0055' ADC_SOLAR_C5 EQU H'0056' ADC_SOLAR_C6 EQU H'0057' ADC_SOLAR_C7 EQU H'0058' ADC_SOLAR_V1 EQU H'0059' SOL_POWERL EQU H'005A' SOL_POWERH EQU H'005B' SOL_CALC_0 EQU H'005C' SOL_CALC_1 EQU H'005D' SOL_CALC_2 EQU H'005E' SOL_CALC_3 EQU H'005F' SOL_CALC_4 EQU H'0060' SOL_CALC_5 EQU H'0061' SOL_CALC_6 EQU H'0062' SOL_CALC_7 EQU H'0063' SOL_CALC_8 EQU H'0064' SOL_CALC_9 EQU H'0065' SOL_CALC_CNT EQU H'0066' ;; 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 I2C_BYTE EQU H'0070' I2C_BIT_CNT EQU H'0071' OWIRE_BYTE EQU H'0072' OWIRE_BIT_CNT EQU H'0073' OWIRE_CNT EQU H'0074' FSR_TEMP EQU H'007D' 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 movf FSR,w movwf FSR_TEMP bcf STATUS,RP0 bcf STATUS,RP1 ;; dispatch interrupt sources btfsc INTCON,INTF goto int_dtmf btfsc INTCON,RBIF goto int_rtc btfsc PIR1,RCIF goto int_uart_rx goto interrupt_end int_dtmf movf DTMF_BUF_PTR,w movwf FSR movf PORTD,w andlw b'00001111' xorwf DTMF_CS,f movwf INDF incf DTMF_BUF_PTR,f movlw DTMF_BUF_END subwf DTMF_BUF_PTR,w btfss STATUS,C goto int_dtmf_end btfsc STATUS,Z goto int_dtmf_end ;; DTMF command complete movlw .1 movwf TMP int_dtmf_end bcf INTCON,INTF goto interrupt_end int_rtc btfsc PORTB,RTC_RST call rtc_init goto int_rtc_end int_rtc_end bcf INTCON,RBIF 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 movf FSR_TEMP,w movwf FSR 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'11111111' movwf ANSEL movlw b'00000111' movwf ANSELH ;; bank 1 bsf STATUS,RP0 bcf STATUS,RP1 movlw b'01110000' 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'11111100' movwf TRISC movlw b'10001111' movwf TRISD movlw b'11111111' movwf TRISE clrf ADCON1 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'01000001' movwf ADCON0 movlw b'10010000' movwf RCSTA movlw B'01011000' movwf INTCON clrf PORTB bcf PORTD,DTMF_PWRDWN movlw DTMF_BUF movwf DTMF_BUF_PTR clrf DTMF_CS bcf PORTD,TTX_SCL bcf PORTD,TTX_SDA nop bcf PORTD,TTX_RESET ;reset TTX clrf TMR0 bsf INTCON,GIE clrf TMP 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 "i2c.inc" ;; ------------------------------------- include "rtc.inc" ;; ------------------------------------- include "temp.inc" ;; ------------------------------------- include "adc.inc" ;; ------------------------------------- include "solar.inc" ;; ------------------------------------- ;; MAINLOOP main ; sleep ; nop ;; -------------------- ;; TTX Test ;; movf TMP,w ;; btfsc STATUS,Z ;; goto main ;; movlw BUF ;; movwf FSR ;; movlw 0x50 ;; call ttx_send ;; clrf TMP ;; goto main ;; xorlw .0 ;; btfss STATUS,Z ;; goto main_error ;; movlw 'O' ;; movwf TXREG ;; movlw .1 ;; call wait_ms ;; movlw 'K' ;; 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 ;; goto main ;; main_error ;; movlw 'E' ;; movwf TXREG ;; movlw .1 ;; call wait_ms ;; movlw 'R' ;; movwf TXREG ;; movlw .1 ;; call wait_ms ;; movlw 'R' ;; 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 ;; goto main ;; -------------------- ;; ADC Test ;; call adc_get_solar ;; call solar_calc_power ;; movlw .255 ;; movwf TXREG ;; movlw .1 ;; call wait_ms ;; movf ADC_SOLAR_C0,w ;; movwf TXREG ;; movlw .1 ;; call wait_ms ;; movf ADC_SOLAR_C1,w ;; movwf TXREG ;; movlw .1 ;; call wait_ms ;; movf ADC_SOLAR_C2,w ;; movwf TXREG ;; movlw .1 ;; call wait_ms ;; movf ADC_SOLAR_C3,w ;; movwf TXREG ;; movlw .1 ;; call wait_ms ;; movf ADC_SOLAR_V0,w ;; movwf TXREG ;; movlw .1 ;; call wait_ms ;; movf ADC_SOLAR_C4,w ;; movwf TXREG ;; movlw .1 ;; call wait_ms ;; movf ADC_SOLAR_C5,w ;; movwf TXREG ;; movlw .1 ;; call wait_ms ;; movf ADC_SOLAR_C6,w ;; movwf TXREG ;; movlw .1 ;; call wait_ms ;; movf ADC_SOLAR_C7,w ;; movwf TXREG ;; movlw .1 ;; call wait_ms ;; movf ADC_SOLAR_V1,w ;; movwf TXREG ;; movlw .1 ;; call wait_ms ;; movf SOL_POWERH,w ;; movwf TXREG ;; movlw .1 ;; call wait_ms ;; movf SOL_POWERL,w ;; movwf TXREG ;; movlw .8 ;; call wait_ms ;; goto main ;; -------------------- ;; DTMF Test program movf TMP,f btfsc STATUS,Z goto main movlw BUF movwf FSR swapf DTMF_BUF+3,w andlw b'11110000' call ttx_send movf DTMF_BUF,w call dtmfSign movwf TXREG movlw .1 call wait_ms movf DTMF_BUF+1,w call dtmfSign movwf TXREG movlw .1 call wait_ms movf DTMF_BUF+2,w call dtmfSign movwf TXREG movlw .1 call wait_ms movf DTMF_BUF+3,w call dtmfSign movwf TXREG movlw .1 call wait_ms movf DTMF_BUF+4,w call dtmfSign movwf TXREG movlw .1 call wait_ms movlw ' ' movwf TXREG movlw .1 call wait_ms movf DTMF_CS,f btfsc STATUS,Z movlw '!' btfss STATUS,Z movlw 'x' 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 clrf TMP movlw DTMF_BUF movwf DTMF_BUF_PTR clrf DTMF_CS goto main ;; -------------------- ;; RTC Test program ;; movf TMP,f ;; btfsc STATUS,Z ;; goto main ;; call rtc_get_time ;; swapf RTC_TOD3,w ;; andlw b'00001111' ;; call digit ;; movwf TXREG ;; movlw .1 ;; call wait_ms ;; movf RTC_TOD3,w ;; andlw b'00001111' ;; call digit ;; movwf TXREG ;; movlw .1 ;; call wait_ms ;; swapf RTC_TOD2,w ;; andlw b'00001111' ;; call digit ;; movwf TXREG ;; movlw .1 ;; call wait_ms ;; movf RTC_TOD2,w ;; andlw b'00001111' ;; call digit ;; movwf TXREG ;; movlw .1 ;; call wait_ms ;; swapf RTC_TOD1,w ;; andlw b'00001111' ;; call digit ;; movwf TXREG ;; movlw .1 ;; call wait_ms ;; movf RTC_TOD1,w ;; andlw b'00001111' ;; call digit ;; movwf TXREG ;; movlw .1 ;; call wait_ms ;; swapf RTC_TOD0,w ;; andlw b'00001111' ;; call digit ;; movwf TXREG ;; movlw .1 ;; call wait_ms ;; movf RTC_TOD0,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 ;; -------------------- ;; Temp Test program ;; movf TMP,f ;; btfsc STATUS,Z ;; goto main ;; 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 ;; ------------------------------------- ;; END end