;; ;; 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 & _XT_OSC __config _CONFIG2, _BOR21V & _WRT_OFF ;; ------------------------------------- ;; DEFINES ;; constants ;; I/O Pins 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 ;; 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' WAIT_CNT EQU H'0030' BUF EQU H'0040' BUF_END EQU H'004F' ;; all pages 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 btfsc PIR1,RCIF goto int_uart_rx 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 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 ;; bank 1 bsf STATUS,RP0 bcf STATUS,RP1 movlw b'11000001' movwf OPTION_REG clrf PSTRCON movlw b'00010000' movwf OSCCON movlw b'10001111' movwf TRISD 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'10010000' movwf RCSTA movlw B'01000000' movwf INTCON bsf PORTD,DTMF_PWRDWN bcf PORTD,TTX_RESET ;reset TTX nop nop bsf PORTD,TTX_RESET bcf PORTD,TTX_SCL bcf PORTD,TTX_SDA clrf TMR0 bsf INTCON,GIE clrf TMP goto main ;; ------------------------------------- ;; TABLES ;; TODO: add lookup tables if needed ;; ------------------------------------- ;; 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 ;; ------------------------------------- ttx_send_byte bsf STATUS,RP0 bcf TRISD,TTX_SDA bcf STATUS,RP0 movwf TTX_BYTE xorwf TTX_CSUM,f movlw .8 movwf TTX_BIT_CNT ttx_send_next_bit btfsc TTX_BYTE,7 bsf PORTD,TTX_SDA btfss TTX_BYTE,7 bcf PORTD,TTX_SDA bsf PORTD,TTX_SCL nop nop nop bcf PORTD,TTX_SCL nop nop nop nop rlf TTX_BYTE,f decfsz TTX_BIT_CNT,f goto ttx_send_next_bit bsf STATUS,RP0 bsf TRISD,TTX_SDA bcf STATUS,RP0 return ;; ------------------------------------- ttx_recv_byte movlw .8 movwf TTX_BIT_CNT ttx_recv_next_bit rlf TTX_BYTE,f bsf PORTD,TTX_SCL nop nop nop bcf PORTD,TTX_SCL nop nop nop nop nop btfsc PORTD,TTX_SDA bsf TTX_BYTE,0 btfss PORTD,TTX_SDA bcf TTX_BYTE,0 decfsz TTX_BIT_CNT,f goto ttx_recv_next_bit return ;; ------------------------------------- ttx_break movlw .13 movwf TTX_BIT_CNT ttx_wait_octet decfsz TTX_BIT_CNT,f goto ttx_wait_octet return ;; ------------------------------------- ttx_send_frame movwf TTX_BYTE andlw b'00001111' movwf TTX_BYTE_CNT bsf PORTD,TTX_SCL movlw .3 bcf PORTD,TTX_SCL call wait_ms clrf TTX_CSUM movf TTX_BYTE,w call ttx_send_byte movf TTX_BYTE_CNT,f btfsc STATUS,Z return ttx_next_byte call ttx_break movf INDF,w call ttx_send_byte incf FSR,f decfsz TTX_BYTE_CNT,f goto ttx_next_byte call ttx_break call ttx_recv_byte movf TTX_BYTE,w xorwf TTX_CSUM,w btfss STATUS,Z goto ttx_csum_error movlw '.' movwf TXREG return ttx_csum_error movlw 'E' movwf TXREG return ;; ------------------------------------- ;; MAINLOOP main movf TMP,f btfsc STATUS,Z goto main movlw BUF movwf FSR movlw b'10101010' movwf INDF movlw b'00010001' call ttx_send_frame clrf TMP goto main powerdown sleep nop goto main ;; ------------------------------------- ;; END end