;; ;; 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 #define SOLAR_C0 PORTA,0 #define SOLAR_C1 PORTA,1 #define SOLAR_C2 PORTA,2 #define SOLAR_C3 PORTA,3 #define OWIRE PORTA,4 #define SOLAR_C4 PORTA,5 ;; PortB #define DTMF_INT PORTB,0 #define BAT_V PORTB,1 #define SOLAR_V PORTB,2 #define BAT_C PORTB,3 #define I2C_SDA PORTB,4 #define I2C_SCL PORTB,5 #define RTC_INT PORTB,6 #define RTC_RST PORTB,7 ;; PortC #define MPU_PWRDWN PORTC,0 #define MPU_RESET PORTC,1 #define UNDEF_C2 PORTC,2 #define UNDEF_C3 PORTC,3 #define UNDEF_C4 PORTC,4 #define UNDEF_C5 PORTC,5 #define MPU_TX PORTC,6 #define MPU_RX PORTC,7 ;; PortD #define DTMF_D0 PORTD,0 #define DTMF_D1 PORTD,1 #define DTMF_D2 PORTD,2 #define DTMF_D3 PORTD,3 #define DTMF_PWRDWN PORTD,4 #define TTX_RESET PORTD,5 #define TTX_SCL PORTD,6 #define TTX_SDA PORTD,7 ;; PortE #define SOLAR_C5 PORTE,0 #define SOLAR_C6 PORTE,1 #define SOLAR_C7 PORTE,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' DTMF_TIMEOUT EQU H'0037' 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 btfsc PIR1,TMR1IF goto int_tmr1 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 T1CON,TMR1ON clrf TMR1L clrf TMR1H movlw .6 movwf DTMF_TIMEOUT bsf T1CON,TMR1ON bcf INTCON,INTF goto interrupt_end int_tmr1 decfsz DTMF_TIMEOUT,f goto int_tmr1_end bsf DTMF_PWRDWN bcf T1CON,TMR1ON movlw DTMF_BUF movwf DTMF_BUF_PTR clrf DTMF_CS bcf DTMF_PWRDWN int_tmr1_end bcf PIR1,TMR1IF goto interrupt_end int_rtc btfsc 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'00100001' 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 DTMF_PWRDWN movlw DTMF_BUF movwf DTMF_BUF_PTR clrf DTMF_CS clrf TMR1L clrf TMR1H movlw b'00110000' movwf T1CON bcf TTX_SCL bcf TTX_SDA nop bcf TTX_RESET ;reset TTX clrf TMR0 bsf INTCON,GIE clrf TMP bsf 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