;; ;; 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 RTC_ADDR_W EQU b'11010000' RTC_ADDR_R EQU b'11010001' I2C_SPEED EQU .19 ;; I/O Pins ;; PortA SOLAR_C0 EQU 0 SOLAR_C1 EQU 1 SOLAR_C2 EQU 2 SOLAR_C3 EQU 3 OWIRE EQU 4 SOLAR_C4 EQU 5 ;; PortB DTMF_INT EQU 0 BAT_V EQU 1 SOLAR_V EQU 2 BAT_C EQU 3 MPU_PWRDWN EQU 4 MPU_RESET EQU 5 MPU_INT EQU 6 RTC_INT EQU 7 ;; PortC MPU_CLK EQU 0 MPU_SDO EQU 1 MPU_SDI EQU 2 RTC_SCL EQU 3 RTC_SDA EQU 4 MPU_CS EQU 5 ICOM_TX EQU 6 ICOM_RX EQU 7 ;; PortD 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 ;; PortE SOLAR_C5 EQU 0 SOLAR_C6 EQU 1 SOLAR_C7 EQU 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' 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 movlw b'00000111' movwf ANSELH ;; bank 1 bsf STATUS,RP0 bcf STATUS,RP1 movlw b'11000001' movwf WPUB movlw b'11000000' movwf IOCB movlw b'01000001' movwf OPTION_REG clrf PSTRCON movlw b'00010000' movwf OSCCON movlw b'11001111' movwf TRISB movlw b'11011100' movwf TRISC movlw b'10001111' movwf TRISD movlw b'00100100' movwf TXSTA movlw .12 movwf SPBRG clrf SPBRGH movlw I2C_SPEED movwf SSPADD bsf SSPSTAT,SMP movlw b'00100000' movwf PIE1 clrf PIE2 ;; bank 0 bcf STATUS,RP0 bcf STATUS,RP1 movlw b'10010000' movwf RCSTA movlw b'00101000' movwf SSPCON 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 bsf PORTD,TTX_SCL nop nop nop bcf PORTD,TTX_SCL nop nop nop nop nop rlf TTX_BYTE,f 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 ;; ------------------------------------- i2c_start bcf PIR1,SSPIF bsf STATUS,RP0 bsf SSPCON2,SEN bcf STATUS,RP0 goto i2c_wait ;; ------------------ i2c_restart bcf PIR1,SSPIF bsf STATUS,RP0 bsf SSPCON2,RSEN bcf STATUS,RP0 goto i2c_wait ;; ------------------ i2c_stop bcf PIR1,SSPIF bsf STATUS,RP0 bsf SSPCON2,PEN bcf STATUS,RP0 goto i2c_wait ;; ------------------ i2c_send_byte bcf PIR1,SSPIF movwf SSPBUF goto i2c_wait ;; ------------------ i2c_recv_byte bcf PIR1,SSPIF bsf STATUS,RP0 bsf SSPCON2,RCEN bcf STATUS,RP0 goto i2c_wait ;; ------------------ i2c_ack bcf PIR1,SSPIF bsf STATUS,RP0 bcf SSPCON2,ACKDT bsf SSPCON2,ACKEN bcf STATUS,RP0 goto i2c_wait ;; ------------------ i2c_nack bcf PIR1,SSPIF bsf STATUS,RP0 bsf SSPCON2,ACKDT bsf SSPCON2,ACKEN bcf STATUS,RP0 i2c_wait btfss PIR1,SSPIF goto i2c_wait return ;; ------------------------------------- rtc_init call i2c_start movlw RTC_ADDR_W call i2c_send_byte bsf STATUS,RP0 btfsc SSPCON2,ACKSTAT goto rtc_init_error_ack bcf STATUS,RP0 movlw H'0E' call i2c_send_byte bsf STATUS,RP0 btfsc SSPCON2,ACKSTAT goto rtc_init_error_ack bcf STATUS,RP0 call i2c_restart movlw RTC_ADDR_R call i2c_send_byte bsf STATUS,RP0 btfsc SSPCON2,ACKSTAT goto rtc_init_error_ack bcf STATUS,RP0 call i2c_recv_byte movf SSPBUF,w movwf TXREG call i2c_ack call i2c_recv_byte movf SSPBUF,w movwf TXREG call i2c_nack call i2c_stop movlw '.' movwf TXREG return rtc_init_error_ack bcf STATUS,RP0 call i2c_stop movlw 'E' movwf TXREG return ;; ------------------------------------- ;; MAINLOOP main movf TMP,f btfsc STATUS,Z goto main call rtc_init clrf TMP goto main powerdown sleep nop goto main ;; ------------------------------------- ;; END end