;; ;; 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 . ;; ;; ------------------------------------- ;; PREAMBLE LIST p=16F887 include "p16f887.inc" ;; This is specified via bootloader-IHU.asm ;; __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 BOOTLOADER EQU H'003' USERVECT EQU H'100' ISRVECT EQU H'104' ;; ------------------------------------- ;; DEFINES ;; constants ;; I/O Pins ;; PortA #define SOLAR_C0 PORTA,0 #define SOLAR_C1 PORTA,1 #define SOLAR_C2 PORTA,2 #define VREF PORTA,3 #define OWIRE PORTA,4 #define OW_TEMP PORTA,5 ;#define OSC2 PORTA,6 ;#define OSC1 PORTA,7 ;; PortB #define CTR_INT PORTB,0 #define POWER_FAIL PORTB,1 #define CAPGOOD PORTB,2 #define BAT_INT PORTB,3 #define DEPLOY PORTB,4 #define RTC_RST PORTB,5 ;#define PGC PORTB,6 ;#define PGD PORTB,7 ;; PortC #define MPU_RST PORTC,0 #define CTR_RST PORTC,1 #define BAT_RST PORTC,2 #define SPI_SCK PORTC,3 #define SPI_MISO PORTC,4 #define SPI_MOSI PORTC,5 #define MPU_TX PORTC,6 #define MPU_RX PORTC,7 ;; PortD #define I2C_SCL PORTD,0 #define I2C_SDA PORTD,1 I2C_PORT EQU PORTD I2C_MASK EQU b'00000011' I2C_SDA_MASK EQU b'00000010' #define CTR_SS PORTD,2 #define BAT_SS PORTD,3 #define MPU_EN PORTD,4 #define HEAT_EN PORTD,5 #define RADIO_SILENCE PORTD,6 #define MAIN_OFF PORTD,7 ;; PortE #define SOLAR_V0 PORTE,0 #define SOLAR_V1 PORTE,1 #define SOLAR_V2 PORTE,2 ;; variables ;; page 0 only TMP EQU H'0020' WAIT_CNT EQU H'002F' RTC_BYTE_CNT EQU H'0028' 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' ;; 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 USERVECT ; end of bootloader goto init ;; ------------------------------------- ;; Interrupt Vector org ISRVECT ; replocated ISR vector ;; 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_ctr btfsc INTCON,RBIF goto int_portchange btfsc PIR1,RCIF goto int_uart_rx goto interrupt_end int_ctr ;; TODO: get byte from CTR (via SPI) bcf INTCON,INTF goto interrupt_end int_portchange btfsc RTC_RST call rtc_init btfsc BAT_INT goto int_bat bcf INTCON,RBIF goto interrupt_end int_bat ;; TODO: get byte from BAT (via SPI) bcf INTCON,RBIF goto interrupt_end int_uart_rx call uart_rx_byte btfsc PIR1,RCIF call uart_rx_byte btfsc 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'00001000' ; TX non-inverted, 16bit Baudrate, no auto baud detect movlw b'00011000' ; TX inverted, 16bit Baudrate, no auto baud detect movwf BAUDCTL movlw b'11101111' ; AN0-AN3,AN5-AN7 as analog movwf ANSEL ; AN4 as digital clrf ANSELH ; AN8-AN13 as digital ;; bank 1 bsf STATUS,RP0 bcf STATUS,RP1 movlw b'00111111' ; Weak Pull-UPS for movwf WPUB ; RTC_RST, DEPLOY, CAPGOOD, POWER_FAIL, BAT_INT, CTR_INT movlw b'00101000' ; Port Change Interrup on movwf IOCB ; RTC_RST, BAT_INT movlw b'00000010' ; Weak-Pull-UPs enabled, INT -> falling edge, TMR0 internal clock movwf OPTION_REG ; Prescaler @ TMR0, Prescaler 1:8 clrf PSTRCON ; disable pulse steering movlw b'00010000' ; preselct 125 kHz, clock source as configured by configuration word movwf OSCCON ;; movlw b'11001111' ; input: RA0-RA3(analog),RA6-RA7(OSC); output: RA4-RA5(1wire) movlw b'11011111' ; input: RA0-RA3(analog),RA6-RA7(OSC), RA4(BOOTPIN); output: RA5(1wire) movwf TRISA movlw b'11111111' ; input: all (interrupts and stats) movwf TRISB ;; movlw b'11010000' ; input: SPI_MISO,RX,TX; output: (MPU|CTR|BAT)_RST,SPI_(CLK|MOSI) movlw b'11111111' ; input: all; output: none movwf TRISC movlw b'00000011' ; input: I2C_(SDA|SCL); output: (CTR,BAT)_SS, (MPU|HEAT)_EN, RADIO_SILENCE, MAIN_OFF movwf TRISD movlw b'11111111' ; intput all (analog) movwf TRISE movlw b'00010000' ; result left justified, V_REF_low = 0, V_REF_high = AN3 clrf ADCON1 movlw b'00100100' ; Baudrate = High Speed, async mode, transmit enabled, 8bit movwf TXSTA movlw .34 ; Baudrate = 57600 (@ 8MHz) -> -0,79 % Error ;; movlw .51 ; Baudrate = 38400 (@ 8MHz) -> -0,002 % Error ;; movlw .103 ; Baudrate = 19200 (@ 8MHz) -> 0,16 % Error movwf SPBRG clrf SPBRGH movlw b'00100000' ; enable UART RX Interrupt movwf PIE1 clrf PIE2 ;; bank 0 bcf STATUS,RP0 bcf STATUS,RP1 movlw b'01000001' ; CLK = FOSC/8, select AN0, ADC on movwf ADCON0 movlw b'10010000' ; enable Serial Port, 8bit, enable continues receive, disable address detection movwf RCSTA movlw B'01011000' ; enabble Peripherial, INT and Port Change movwf INTCON call i2c_init call spi_init clrf TMR0 clrf TMP bsf INTCON,GIE btfsc RTC_RST ; if RTC is already finished, initialize it! call rtc_init ; this maybe happend already via interrupt but better save than sorry goto main ;; ------------------------------------- ;; TABLES include "tables.inc" ; this needs to stay inside 0x100 and 0x200 ;; ------------------------------------- ;; 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 ;; ------------------------------------- include "uart.inc" ;; ------------------------------------- include "i2c.inc" ;; ------------------------------------- include "rtc.inc" ;; ------------------------------------- include "spi.inc" ;; ------------------------------------- ;; include "temp.inc" ;; ------------------------------------- ;; include "adc.inc" ;; ------------------------------------- ;; include "solar.inc" ;; ------------------------------------- ;; include "math.inc" ;; ------------------------------------- ;; MAINLOOP main ; sleep ; nop ;; -------------------- ;; ADC Test ;; call adc_get_solar ;; call solar_calc_power ;; movlw .255 ;; call uart_tx_byte ;; movf ADC_SOLAR_C0,w ;; call uart_tx_byte ;; movf ADC_SOLAR_C1,w ;; call uart_tx_byte ;; movf ADC_SOLAR_C2,w ;; call uart_tx_byte ;; movf ADC_SOLAR_V0,w ;; call uart_tx_byte ;; movf ADC_SOLAR_V1,w ;; call uart_tx_byte ;; movf ADC_SOLAR_V2,w ;; call uart_tx_byte ;; movf SOL_POWERH,w ;; call uart_tx_byte ;; movf SOL_POWERL,w ;; call uart_tx_byte ;; goto main ;; -------------------- ;; RTC Test program movf TMP,f btfsc STATUS,Z goto main call rtc_get_time swapf RTC_TOD3,w call digit call uart_tx_byte movf RTC_TOD3,w call digit call uart_tx_byte swapf RTC_TOD2,w call digit call uart_tx_byte movf RTC_TOD2,w call digit call uart_tx_byte swapf RTC_TOD1,w call digit call uart_tx_byte movf RTC_TOD1,w call digit call uart_tx_byte swapf RTC_TOD0,w call digit call uart_tx_byte movf RTC_TOD0,w call digit call uart_tx_byte movlw '\r' call uart_tx_byte movlw '\n' call uart_tx_byte clrf TMP goto main ;; -------------------- ;; Temp Test program ;; movf TMP,f ;; btfsc STATUS,Z ;; goto main ;; call temp_read_value ;; swapf OWIRE_BYTE,w ;; call digit ;; call uart_tx_byte ;; movf OWIRE_BYTE,w ;; call digit ;; call uart_tx_byte ;; movlw '\r' ;; call uart_tx_byte ;; movlw '\n' ;; call uart_tx_byte ;; clrf TMP ;; goto main ;; ------------------------------------- ;; END end