X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=teleterra.asm;fp=teleterra.asm;h=629d42c057ae20b21ca4d4a973bb26805341e192;hb=07a375434772e3b28d117420f91208cab4ac8ed1;hp=0000000000000000000000000000000000000000;hpb=b4e051dda2e378c889e45c62eafd859bbebe9ef3;p=hw%2Fteleterra diff --git a/teleterra.asm b/teleterra.asm new file mode 100644 index 0000000..629d42c --- /dev/null +++ b/teleterra.asm @@ -0,0 +1,276 @@ +; +; 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=18F886, 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