;; ;; 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 & _INTRC_OSC_CLKOUT __config _CONFIG2, _BOR21V & _WRT_OFF ;; ------------------------------------- ;; DEFINES ;; constants BUF_PAGE_LEN EQU H'0050' BUF_PAGE_CNT EQU H'0004' BUF_OFFSET EQU H'0020' ;; I/O Pins ;; PortA DBG1 EQU .4 DBG2 EQU .5 ;; PortC ;; variables ;; page 0 only ;; all pages RX_BYTE EQU H'0070' WAIT_CNT EQU H'0071' FLAGS EQU H'0072' WBUF_PAGE_PTR EQU H'0074' WBUF_PAGE_NUM EQU H'0075' RBUF_PAGE_PTR EQU H'0076' RBUF_PAGE_NUM EQU H'0077' W_TEMP EQU H'007E' STATUS_TEMP EQU H'007F' ;; bits ;; FLAGS UNDERRUN EQU .0 OVERRUN EQU .1 CTS EQU .7 ;; ------------------------------------- ;; 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 ;; dispatch interrupt sources btfsc PIR1,TMR2IF goto int_tmr2 btfsc PIR1,RCIF goto int_uart_rx btfsc PIR1,TXIF goto int_uart_tx goto interrupt_end int_tmr2 bsf ADCON0,GO bsf STATUS,RP0 btfss FLAGS,CTS bcf PIE1,TXIE btfsc FLAGS,CTS bsf PIE1,TXIE bcf STATUS,RP0 int_tmr2_adcon btfsc ADCON0,GO goto int_tmr2_adcon call wbuf_next btfsc FLAGS,OVERRUN goto int_tmr2_end movf ADRESH,w movwf INDF int_tmr2_end bcf PIR1,TMR2IF goto interrupt_end int_uart_tx call rbuf_next btfsc FLAGS,UNDERRUN goto interrupt_end movf INDF,w movwf TXREG 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 goto interrupt_end 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'00100000' movwf ANSEL ;; bank 2 bcf STATUS,RP0 bsf STATUS,RP1 movlw b'10000000' movwf CM1CON0 movlw b'10010000' movwf CM2CON0 ;; bank 1 bsf STATUS,RP0 bcf STATUS,RP1 movlw b'10000010' movwf OPTION_REG clrf PSTRCON movlw b'01111000' movwf OSCCON movlw b'11001111' movwf TRISA movlw b'11111111' movwf TRISB movlw b'11111111' movwf TRISC movlw b'11111111' movwf TRISD movlw b'00100100' movwf TXSTA movlw .8 movwf SPBRG clrf SPBRGH movlw b'00100010' movwf PIE1 clrf PIE2 ; movlw .250 ;; 8kHz movlw .200 ;; 5kHz ; movlw .156 ;; ~50Hz / ~200Hz movwf PR2 clrf ADCON1 ;; bank 0 bcf STATUS,RP0 bcf STATUS,RP1 movlw b'10010000' movwf RCSTA ; movlw b'00000100' ;; 8kHz movlw b'00001100' ;; 5kHz ; movlw b'01111110' ;; ~50Hz ; movlw b'01111101' ;; ~200Hz movwf T2CON movlw b'01000000' movwf INTCON clrf TMR2 movlw b'10010101' movwf ADCON0 bcf PORTA,DBG1 bcf PORTA,DBG2 call wbuf_reset call rbuf_reset clrf RX_BYTE bsf INTCON,GIE goto main ;; ------------------------------------- ;; TABLES digit addwf PCL,f retlw '0' retlw '1' retlw '2' retlw '3' retlw '4' retlw '5' retlw '6' retlw '7' retlw '8' retlw '9' retlw 'A' retlw 'B' retlw 'C' retlw 'D' retlw 'E' retlw 'F' ;; ------------------------------------- ;; SUBROUTINES wait_ms movwf WAIT_CNT wait_next movlw .6 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 movwf RX_BYTE return uart_rx_fe movf RCREG,w return ;; ------------------- wbuf_reset movlw BUF_PAGE_LEN - 1 movwf WBUF_PAGE_PTR movlw BUF_PAGE_CNT - 1 movwf WBUF_PAGE_NUM bcf FLAGS,OVERRUN bcf PORTA,DBG1 ;; ------------------- wbuf_next btfsc FLAGS,UNDERRUN goto wbuf_move_ptr movf RBUF_PAGE_NUM,w xorwf WBUF_PAGE_NUM,w btfss STATUS,Z goto wbuf_move_ptr movf RBUF_PAGE_PTR,w xorwf WBUF_PAGE_PTR,w btfss STATUS,Z goto wbuf_move_ptr bsf FLAGS,OVERRUN bsf PORTA,DBG1 return wbuf_move_ptr bcf FLAGS,UNDERRUN bcf PORTA,DBG2 bsf STATUS,RP0 btfsc FLAGS,CTS bsf PIE1,TXIE bcf STATUS,RP0 movf WBUF_PAGE_PTR,f btfsc STATUS,Z goto wbuf_next_page decf WBUF_PAGE_PTR,f goto wbuf_fill_fsr wbuf_next_page movlw BUF_PAGE_LEN - 1 movwf WBUF_PAGE_PTR movf WBUF_PAGE_NUM,f btfsc STATUS,Z goto wbuf_next_cycle decf WBUF_PAGE_NUM,f goto wbuf_fill_fsr wbuf_next_cycle movlw BUF_PAGE_CNT - 1 movwf WBUF_PAGE_NUM wbuf_fill_fsr movlw BUF_OFFSET addwf WBUF_PAGE_PTR,w movwf FSR btfss WBUF_PAGE_NUM,0 bcf FSR,7 btfsc WBUF_PAGE_NUM,0 bsf FSR,7 btfss WBUF_PAGE_NUM,1 bcf STATUS,IRP btfsc WBUF_PAGE_NUM,1 bsf STATUS,IRP return ;; ------------------- rbuf_reset movlw BUF_PAGE_LEN - 1 movwf RBUF_PAGE_PTR movlw BUF_PAGE_CNT - 1 movwf RBUF_PAGE_NUM bsf FLAGS,UNDERRUN bsf PORTA,DBG2 bsf STATUS,RP0 bcf PIE1,TXIE bcf STATUS,RP0 bcf FLAGS,CTS ;; ------------------- rbuf_next btfsc FLAGS,OVERRUN goto rbuf_move_ptr movf WBUF_PAGE_NUM,w xorwf RBUF_PAGE_NUM,w btfss STATUS,Z goto rbuf_move_ptr movf WBUF_PAGE_PTR,w xorwf RBUF_PAGE_PTR,w btfss STATUS,Z goto rbuf_move_ptr bsf FLAGS,UNDERRUN bsf PORTA,DBG2 bsf STATUS,RP0 bcf PIE1,TXIE bcf STATUS,RP0 return rbuf_move_ptr bcf FLAGS,OVERRUN bcf PORTA,DBG1 movf RBUF_PAGE_PTR,f btfsc STATUS,Z goto rbuf_next_page decf RBUF_PAGE_PTR,f goto rbuf_fill_fsr rbuf_next_page movlw BUF_PAGE_LEN - 1 movwf RBUF_PAGE_PTR movf RBUF_PAGE_NUM,f btfsc STATUS,Z goto rbuf_next_cycle decf RBUF_PAGE_NUM,f goto rbuf_fill_fsr rbuf_next_cycle movlw BUF_PAGE_CNT - 1 movwf RBUF_PAGE_NUM rbuf_fill_fsr movlw BUF_OFFSET addwf RBUF_PAGE_PTR,w movwf FSR btfss RBUF_PAGE_NUM,0 bcf FSR,7 btfsc RBUF_PAGE_NUM,0 bsf FSR,7 btfss RBUF_PAGE_NUM,1 bcf STATUS,IRP btfsc RBUF_PAGE_NUM,1 bsf STATUS,IRP return ;; ------------------------------------- ;; MAINLOOP main movlw 'r' xorwf RX_BYTE,w btfsc STATUS,Z goto cmd_read movlw 'n' xorwf RX_BYTE,w btfsc STATUS,Z goto cmd_noread movlw 's' xorwf RX_BYTE,w btfsc STATUS,Z goto cmd_start movlw 'p' xorwf RX_BYTE,w btfsc STATUS,Z goto cmd_stop goto main cmd_read bsf FLAGS,CTS clrf RX_BYTE goto main cmd_noread bcf FLAGS,CTS clrf RX_BYTE goto main cmd_start ;; start sampling ;; bsf FLAGS,CTS clrf RX_BYTE goto main cmd_stop clrf RX_BYTE goto main powerdown sleep nop goto main ;; ------------------------------------- ;; END end