;; ;; 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 & _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' ;; FLAGS UNDERRUN EQU .0 OVERRUN EQU .1 ;; I/O Pins ;; PortA MPU_INT EQU .4 ;; PortC ;; variables ;; page 0 only ;; all pages TMP 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 ;; ------------------------------------- ;; 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 goto interrupt_end int_tmr2 ; movlw b'00010000' ; xorwf PORTA,f bsf ADCON0,GO 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 movwf TXREG int_tmr2_end bcf PIR1,TMR2IF 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'10100000' movwf CM1CON0 movlw b'10110000' 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 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 movwf T2CON movlw b'01000000' movwf INTCON clrf TMR2 movlw b'10010101' movwf ADCON0 ; bcf PORTA,MPU_INT call wbuf_reset call rbuf_reset clrf TMP 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 ; TODO: move to input string movwf TMP 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 ;; ------------------- 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 return wbuf_move_ptr bcf FLAGS,UNDERRUN 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 ;; ------------------- 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 return rbuf_move_ptr bcf FLAGS,OVERRUN 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 ;; movf TMP,f ;; btfsc STATUS,Z ;; goto main goto main powerdown sleep nop goto main ;; ------------------------------------- ;; END end