; ; Firmware for the TeleTerra ground station board for TeleMetrum, ; see http://altusmetrum.org/TeleTerra for more information. ; ; Copyright © 2009 Bdale Garbee ; ; This program 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; version 2 of the License. ; ; This program 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 this program; if not, write to the Free Software Foundation, Inc., ; 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ; ;************************************************************ ; Processor: PIC16F886 using internal oscillator ;************************************************************ ; FIXME - more or less cloned from clock4robert project, not ready for use yet! LIST P=16F886, R=DEC ; Use the PIC18F4550 and decimal system #include "p16f886.inc" ; Include header file ; __config 0x300001, 0x22 ; __config 0x300003, 0xe ; __config 0x300006, 0x81 ; ; CBLOCK 0x20 ; Declare variable addresses starting at 0x20 ; Loop1,Loop2,Loop3,Counter ; ENDC ; ; ; ----------- ; ; Vectors ; ; ----------- ; ; ORG 0x0800 ; GOTO Start ; ; ORG 0x0808 ; CALL H_PRIO_ISR ; RETFIE ; ; ORG 0x0818 ; RETFIE ; ; ; ----------- ; ; INITIALIZE ; ; ----------- ; ; Start ; CLRF PORTA ; Initialize port A ; CLRF PORTD ; Initialize port D ; CLRF PORTE ; Initialize port E ; ; CLRF TRISA ; All pins port A output ; CLRF TRISD ; All pins port D output ; CLRF TRISE ; All pins port E output ; ; ; CLRF WDTCON ; ; ; ----------- ; ; Timer0 ; ; ----------- ; ; CLRF TMR0H ; clear timer 0 ; CLRF TMR0L ; ; ; this works out to about 1.4 seconds per tick ; ; MOVLW b'10000111' ; enable 16 bit timer, 256:1 prescaler ; ; this works out to about 350ms per tick ; ; MOVLW b'10000101' ; enable 16 bit timer, 64:1 prescaler ; ; this works out to about 10.4ms per tick, or 91.6hz ; ; MOVLW b'10000000' ; enable 16 bit timer, 2:1 prescaler ; ; this works out to 5.46ms per tick, 183.32hz ; MOVLW b'10001000' ; enable 16 bit timer, no prescaler ; MOVWF T0CON ; ; BCF INTCON, TMR0IF ; clear Timer0 interrupt flag ; BSF INTCON, TMR0IE ; enable Timer0 interrupt ; BSF INTCON, GIE ; enable interrupts ; ; ; ------------------------ ; ; FUNCTION OF PORT A PINS ; ; ------------------------ ; ; ; ; MOVLW 7 ; ; MOVWF CMCON ; Comparators off, all pins digital I/O ; ; ; ; ---------- ; ; MAIN LOOP ; ; ---------- ; Main CALL LpmOn ; light PM ; CALL LamOff ; CALL LsaOn ; light segment A ; CALL LsbOn ; light segment B ; CALL LscOn ; light segment C ; CALL LsdOn ; light segment D ; CALL LseOn ; light segment E ; CALL LsfOn ; light segment F ; CALL LsgOn ; light segment G ; CALL LcOn ; colon on ; CALL Drv0On ; CALL Drv1Off ; CALL Drv2Off ; CALL Drv3Off ; CALL delay ; CALL LcOff ; colon off ; CALL Drv0Off ; CALL Drv1On ; CALL Drv2Off ; CALL Drv3Off ; CALL delay ; CALL LcOn ; colon on ; CALL LamOn ; CALL LpmOff ; CALL Drv0Off ; CALL Drv1Off ; CALL Drv2On ; CALL Drv3Off ; CALL delay ; CALL LcOff ; colon off ; CALL Drv0Off ; CALL Drv1Off ; CALL Drv2Off ; CALL Drv3On ; CALL delay ; GOTO Main ; ; ; digit select 0 ; Drv0On BSF LATA,2 ; RETURN ; ; Drv0Off BCF LATA,2 ; RETURN ; ; ; digit select 1 ; Drv1On BSF LATA,3 ; RETURN ; ; Drv1Off BCF LATA,3 ; RETURN ; ; ; digit select 2 ; Drv2On BSF LATA,4 ; RETURN ; ; Drv2Off BCF LATA,4 ; RETURN ; ; ; digit select 3 ; Drv3On BSF LATA,5 ; RETURN ; ; Drv3Off BCF LATA,5 ; RETURN ; ; ; control digit segment A ; LsaOn BSF LATD,0 ; RETURN ; ; LsaOff BCF LATD,0 ; RETURN ; ; ; control digit segment B ; LsbOn BSF LATD,1 ; RETURN ; ; LsbOff BCF LATD,1 ; RETURN ; ; ; control digit segment C ; LscOn BSF LATD,2 ; RETURN ; ; LscOff BCF LATD,2 ; RETURN ; ; ; control digit segment D ; LsdOn BSF LATD,3 ; RETURN ; ; LsdOff BCF LATD,3 ; RETURN ; ; ; control digit segment E ; LseOn BSF LATD,4 ; RETURN ; ; LseOff BCF LATD,4 ; RETURN ; ; ; control digit segment F ; LsfOn BSF LATD,5 ; RETURN ; ; LsfOff BCF LATD,5 ; RETURN ; ; ; control digit segment G ; LsgOn BSF LATD,6 ; RETURN ; ; LsgOff BCF LATD,6 ; RETURN ; ; ; control the "AM" LED ; LamOn BSF LATE,1 ; RETURN ; ; LamOff BCF LATE,1 ; RETURN ; ; ; control the "PM" LED ; LpmOn BSF LATE,2 ; RETURN ; ; LpmOff BCF LATE,2 ; RETURN ; ; ; control the "colon" LED ; LcOn BSF LATD,7 ; RETURN ; ; LcOff BCF LATD,7 ; RETURN ; ; ; control the "alarm" LED ; LaOn BSF LATE,0 ; RETURN ; ; LaOff BCF LATE,0 ; RETURN ; ; ; --------------- ; ; DELAY 0.5 SEC ; ; --------------- ; ; ; ;delay MOVLW 20 ; delay MOVLW 10 ; MOVWF Loop1 ; Outer MOVLW 250 ; MOVWF Loop2 ; Middle MOVLW 239 ; MOVWF Loop3 ; Inner NOP ; NOP ; DECFSZ Loop3,F ; GOTO Inner ; DECFSZ Loop2,F ; GOTO Middle ; DECFSZ Loop1,F ; GOTO Outer ; RETURN ; ; ; --------------- ; ; High priority interrupt service route ; ; --------------- ; H_PRIO_ISR ; BCF INTCON, TMR0IF ; clear Timer0 interrupt flag ; INCF Counter,1 ; BTFSC Counter,6 ; test bit 6 ; GOTO TurnItOn ; CALL LaOff ; turn alarm LED off ; GOTO End_ISR ; TurnItOn ; CALL LaOn ; turn alarm LED on ; End_ISR ; RETURN END