;; ;; 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=12F635 include "p12f635.inc" __config _WUREN_ON & _FCMEN_OFF & _IESO_OFF & _BOD_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT ;; ------------------------------------- ;; DEFINES BEACON_INT EQU .3 ; *2 = Beacon Interval in seconds SECCNT EQU H'007D' CHAR EQU H'0041' CHARCNT EQU H'0042' ELEMENT EQU H'0043' ELECNT EQU H'0044' DOT EQU .256 - .29 DASH EQU .256 - .87 ESPACE EQU .256 - .29 CSPACE EQU .256 - .87 WSPACE EQU .256 - .203 CWENABLE EQU GP0 CWOUT EQU GP1 SCLK EQU GP2 SDAT EQU GP4 W_TEMP EQU H'007E' STATUS_TEMP EQU H'007F' ;; ------------------------------------- ;; Reset Vector org 0 goto init ;; ------------------------------------- ;; Interrupt Vector org 4 ;; save context movwf W_TEMP swapf STATUS,W movwf STATUS_TEMP btfss INTCON,INTF goto tmr1_int ext_int ;; TODO: read bit from GPIO,SDAT and add to received string goto interrupt_end tmr1_int decf SECCNT,f interrupt_end ;; restore context swapf STATUS_TEMP,W movwf STATUS swapf W_TEMP,F swapf W_TEMP,W retfie ;; ------------------------------------- ;; INIT init ;; bank 1 bsf STATUS,RP0 bcf STATUS,RP1 movlw b'10000011' movwf OPTION_REG movlw b'11111100' movwf TRISIO movlw b'10000001' movwf PIE1 movlw b'00000000' movwf OSCCON bcf STATUS,RP0 ;; bank 0 movlw b'01010000' movwf INTCON movlw b'00000111' movwf T1CON movlw b'00000111' movwf CMCON0 bcf GPIO,CWOUT bcf GPIO,CWENABLE movlw BEACON_INT movwf SECCNT bsf INTCON,GIE goto main ;; ------------------------------------- ;; TABLES ;; Morse Codes: 0=dot, 1=dash getcw addwf PCL,f nop retlw b'00010000' ; ! retlw b'01001000' ; " retlw b'00000000' ; # retlw b'00010010' ; $ retlw b'00000000' ; % retlw b'01000000' ; & retlw b'01111000' ; ' retlw b'10110000' ; ( retlw b'10110100' ; ) retlw b'00000000' ; * retlw b'01010000' ; + retlw b'11001100' ; , retlw b'10000100' ; - retlw b'01010100' ; . retlw b'10010000' ; / retlw b'11111000' ; 0 retlw b'01111000' ; 1 retlw b'00111000' ; 2 retlw b'00011000' ; 3 retlw b'00001000' ; 4 retlw b'00000000' ; 5 retlw b'10000000' ; 6 retlw b'11000000' ; 7 retlw b'11100000' ; 8 retlw b'11110000' ; 9 retlw b'11100000' ; : retlw b'10101000' ; ; retlw b'00010100' ; < retlw b'10001000' ; = retlw b'10001010' ; > retlw b'00110000' ; ? retlw b'01000000' ; @ retlw b'01000000' ; A retlw b'10000000' ; B retlw b'10100000' ; C retlw b'10000000' ; D retlw b'00000000' ; E retlw b'00100000' ; F retlw b'11000000' ; G retlw b'00000000' ; H retlw b'00000000' ; I retlw b'01110000' ; J retlw b'10100000' ; K retlw b'01000000' ; L retlw b'11000000' ; M retlw b'10000000' ; N retlw b'11100000' ; O retlw b'01100000' ; P retlw b'11010000' ; Q retlw b'01000000' ; R retlw b'00000000' ; S retlw b'10000000' ; T retlw b'00100000' ; U retlw b'00010000' ; V retlw b'01100000' ; W retlw b'10010000' ; X retlw b'10110000' ; Y retlw b'11000000' ; Z ;; Morse Code Length getcwlen addwf PCL,f nop retlw .5 ; ! retlw .6 ; " retlw .0 ; # retlw .7 ; $ retlw .0 ; % retlw .5 ; & retlw .6 ; ' retlw .5 ; ( retlw .6 ; ) retlw .0 ; * retlw .5 ; + retlw .6 ; , retlw .6 ; - retlw .6 ; . retlw .5 ; / retlw .5 ; 0 retlw .5 ; 1 retlw .5 ; 2 retlw .5 ; 3 retlw .5 ; 4 retlw .5 ; 5 retlw .5 ; 6 retlw .5 ; 7 retlw .5 ; 8 retlw .5 ; 9 retlw .6 ; : retlw .6 ; ; retlw .6 ; < retlw .5 ; = retlw .7 ; > retlw .6 ; ? retlw .6 ; @ retlw .2 ; A retlw .4 ; B retlw .4 ; C retlw .3 ; D retlw .1 ; E retlw .4 ; F retlw .3 ; G retlw .4 ; H retlw .2 ; I retlw .4 ; J retlw .3 ; K retlw .4 ; L retlw .2 ; M retlw .2 ; N retlw .3 ; O retlw .4 ; P retlw .4 ; Q retlw .3 ; R retlw .3 ; S retlw .1 ; T retlw .3 ; U retlw .4 ; V retlw .3 ; W retlw .4 ; X retlw .4 ; Y retlw .4 ; Z ;; test string string addwf PCL,f nop retlw 'T' - ' ' retlw 'A' - ' ' retlw 'S' - ' ' retlw '.' - ' ' retlw 'R' - ' ' retlw 'U' - ' ' retlw 'M' - ' ' ;; ------------------------------------- ;; SUBROUTINES dottime movwf TMR0 bcf INTCON,T0IF dot_inner btfss INTCON,T0IF goto dot_inner return ;; ------------------------------------- send_beacon bsf GPIO,CWENABLE movlw .7 movwf CHARCNT beacon_next_char movf CHARCNT,w call string call getcw movwf ELEMENT movf CHARCNT,w call string call getcwlen movwf ELECNT movf ELECNT,f btfsc STATUS,Z goto beacon_invalid_char beacon_next_element bsf GPIO,CWOUT btfss ELEMENT,7 movlw DOT btfsc ELEMENT,7 movlw DASH call dottime bcf GPIO,CWOUT rlf ELEMENT,f decfsz ELECNT,f goto beacon_element_space movlw CSPACE call dottime beacon_invalid_char decfsz CHARCNT,f goto beacon_next_char bcf GPIO,CWENABLE return beacon_element_space movlw ESPACE call dottime goto beacon_next_element ;; ------------------------------------- ;; MAINLOOP main ;; this gets called after reset and whenever a wakeup occured ;; (after TMR1 overrun or interrupt on GP2) movf SECCNT,f btfss STATUS,Z goto powerdown ;; this gets called every BEACON_INT*2 seconds movlw BEACON_INT movwf SECCNT call send_beacon powerdown sleep goto main ;; ------------------------------------- ;; END end