APÉNDICE A ;********************************************************************** ; * ; TESIS * ; ADQUISICION DE LA POSICION DE UN VEHÍCULO * ; * ;********************************************************************** ; * ; Programa que recibe datos de un GPS y los transmite * ; * ; 1. Recibe datos del GPS * ; 2. Filtra la informacion * ; 3. Espera un tiempo (X) para empezar a transmitir * ; los datos recibidos a la Creatalink * ; * ;********************************************************************** ; * ; Filename: filtro.asm * ; Date: 26/Nov/03 * ; File Version: * ; * ; Author: Cesar Martinez Mozo * ; Company: UDLA * ; * ; * ;********************************************************************** list p=16f874 #include <p16f874.inc> definitions ; list directive to define processor ; processor specific variable __CONFIG _CP_OFF & _WDT_ON & _BODEN_ON & _PWRTE_ON & _RC_OSC & _WRT_ENABLE_ON & _LVP_ON & _CPD_OFF ; '__CONFIG' directive is used to embed configuration data within .asm file. ; The lables following the directive are located in the respective .inc file. ; See respective data sheet for additional information on configuration word. ;====================================================================== ; DEFINICION DE VARIABLES ;====================================================================== w_temp status_temp BYTE_COUNTER BYTE_ARROBA BYTE_E BYTE_Q DATOS_PTR0 DATOS_PTR1 EQU EQU EQU EQU EQU EQU EQU EQU 0x70 0x71 0X72 0X40 0X45 0X71 0X20 0XA0 ; variable used for context saving ; variable used for context saving ;CONTADOR DE BYTES ;40=CODIGO ASCII DE @ ;45=CODIGO ASCII DE E ;71=CODIGO ASCII DE q ;INICIO DE MEMORIA RAM LIBRE BANCO 0 ;INICIO DE MEMORIA RAM LIBRE BANC0 1 92 LIM_BANK0 EQU BRG_VALUE BYTE_PARO EQU EQU 0X32 ;LIMITE DE MEMORIA RAM DEL BANCO 0 ;32h=50 LOCALIDADES DE MEMORIA 0x81 0X0A ;2A=CODIGO ASCII DE * NO_SEG EQU 0X01 ;NUMERO DE SEGUNDOS EN HEXADECIMAL SEC_COUNTER EQU 0X73 ;CONTADOR DE SEGUNDOS ;********************************************************************** ORG 0x000 ; processor reset vector clrf PCLATH ; ensure page bits are cleared goto LOAD ; go to beginning of program ORG 0x004 movwf w_temp movf STATUS,w bcf STATUS,RP0 movwf status_temp ; interrupt vector location ; save off current W register contents ; move status register into W register ; ensure file register bank set to 0 ; save off contents of STATUS register ; isr code can go here or be located as a call subroutine elsewhere bcf STATUS,RP0 movf status_temp,w movwf STATUS swapf w_temp,f swapf w_temp,w retfie ; ensure file register bank set to 0 ; retrieve copy of STATUS register ; restore pre-isr STATUS register contents ; restore pre-isr W register contents ; return from interrupt ;====================================================================== ; TIEMPO DE ESPERA ANTES DE INICIAR RECEPCION ;====================================================================== LOAD ;ESPERA TIEMPO PARA QUE LA CREATALINK CLRF STATUS ;ENCUENTRE LA RED DE SKYTEL CLRF PORTB BSF STATUS,RP0 CLRF TRISB BCF STATUS, RP0 BSF PORTB, 0X07 MOVLW 0X3C ;3CH=60D MOVWF SEC_COUNTER ;CARGA EL CONTADOR CON 60 SEG CALL TIMER BCF PORTB, 0X07 ;====================================================================== ; INICIALIZACION ;====================================================================== MAIN CLRF CLRF MOVLW MOVWF CLRF BSF STATUS BYTE_COUNTER DATOS_PTR0 FSR PORTB STATUS, RP0 ;INICIALIZA EL CONTADOR ;CONFIGURACION DEL PUERTO B ;PARA LA DETECCION DE ERRORES 93 CLRF CLRF BCF BSF MOVLW MOVWF MOVLW MOVWF BCF MOVLW MOVWF TRISB TRISC TRISC, 0X06 TRISC, 0X07 BRG_VALUE SPBRG 0X26 TXSTA STATUS, RP0 0X90 RCSTA ;CONFIGURA TX = SALIDA ;CONFIGURA RX = ENTRADA ;CONFIGURA EL BAUD RATE ;RX DE 8 BITS, BRG ALTA ;HABILITA TX ;HABILITA EL PUERTO SERIAL ASINCRONO ;RECEPCION CONTINUA ;====================================================================== ; SELECION DE INFORMACION ;====================================================================== SEL_INFO BCF STATUS, RP0 BTFSS PIR1, RCIF GOTO SEL_INFO BCF BTFSC GOTO BTFSC GOTO MOVF XORLW BTFSS GOTO PIR1, RCIF RCSTA, FERR ERR_FERR RCSTA, OERR ERR_OERR RCREG, W BYTE_ARROBA STATUS, Z SEL_INFO ;COPIA EL DATO RECIBIDO A W CHK_ARROBA BCF STATUS, RP0 BTFSS PIR1, RCIF GOTO CHK_ARROBA bcf BTFSC GOTO BTFSC GOTO MOVF xorlw btfss goto pir1, rcif RCSTA, FERR ERR_FERR RCSTA, OERR ERR_OERR RCREG, W byte_arroba status, z sel_info ;COPIA EL DATO RECIBIDO A W chk_e bcf status, rp0 btfss pir1, rcif goto chk_e bcf pir1, rcif BTFSC RCSTA, FERR GOTO ERR_FERR 94 BTFSC GOTO MOVF xorlw btfss goto RCSTA, OERR ERR_OERR RCREG, W byte_e status, z sel_info ;COPIA EL DATO RECIBIDO A W chk_q bcf status, rp0 btfss pir1, rcif goto chk_q bcf BTFSC GOTO BTFSC GOTO MOVF xorlw btfss goto pir1, rcif RCSTA, FERR ERR_FERR RCSTA, OERR ERR_OERR RCREG, W byte_q status, z sel_info ;COPIA EL DATO RECIBIDO A W ;====================================================================== ; RECEPCION ;====================================================================== RX_DATOS BCF STATUS, RP0 BTFSS PIR1, RCIF GOTO RX_DATOS BCF BTFSC GOTO BTFSC GOTO PIR1, RCIF RCSTA, FERR ERR_FERR RCSTA, OERR ERR_OERR MOVF XORLW BTFSC CALL BYTE_COUNTER, W LIM_BANK0 STATUS, Z CAMB_BANK1 MOVF CALL MOVWF INCF incf GOTO RCREG, W COMP_RX INDF FSR byte_counter RX_DATOS ;ESPERA TERMINO DE TRANSMISION ;POLEO DE RCIF ;RCIF=1==>RECEPCION COMPLETA ;RCIF=0==>RSR ES LEIDO Y ESTA VACIO ;Z=0 DIFERENTES=>BANCO0 ;Z=1 IGUALES=>BANCO1 ;COPIA EL DATO RECIBIDO A W ;COPIA W A UNA LOCALIDAD ;INCREMENTA EL FSR ;incrementa el contador ;======================================================================= ; TANSMISION ;======================================================================= 95 TX_DATOS BCF bcf MOVLW MOVWF clrf MOVLW MOVWF TX_AUN movf xorlw btfsc call MOVF CALL INCF incf MOVWF ESPERA BCF BTFSS GOTO BCF GOTO STATUS, RP0 rcsta, cren BYTE_PARO INDF byte_counter DATOS_PTR0 FSR byte_counter, w lim_bank0 status, z camb_bank1 INDF, W COMP_TX FSR byte_counter TXREG ;deshabilita la recepcion ;GUARDA COMO DATO FINAL AL BYTE DE PARO ;inicializa el contador ;Z=0 DIFERENTES=>BANCO0 ;Z=1 IGUALES=>BANCO1 ;EL DATO APUNDADO POR FSR, SE COPIA A W ;ESPERA TERMINO DE TRANSMISION STATUS, RP0 PIR1, TXIF ESPERA PIR1, TXIF TX_AUN ;====================================================================== ; SUBRUTINA TIMER ;====================================================================== TIMER movwf w_temp ; save off current W register contents movf STATUS,w ; move status register into W register movwf status_temp ; save off contents of STATUS register CLRF STATUS ;Borra el registro STATUS ;CLRF PORTB ;MOVLW NO_SEG ;MOVWF SEG_COUNTER CLRF T1CON ;Borra el registro T1CON MOVLW 0x0A ;Preescaldor 1:1, Clk externo, MOVWF T1CON ;sincroniza Clk, stop Timer1 BCF PIR1, TMR1IF ;Desactiva TMR1IF BSF STATUS, RP0 ;CLRF TRISB BSF PIE1,TMR1IE ;Habilita el TMR1IE AGAIN BCF BCF MOVLW MOVWF MOVLW MOVWF STATUS, RP0 PIR1, TMR1IF 0x00 TMR1L 0x80 TMR1H ;Carga el TMR1L con 0x00 ;Carga el TMR1H con 0x80 96 BSF T1CON, TMR1ON WAIT_SEC BTFSS PIR1, TMR1IF GOTO WAIT_SEC DECF SEC_COUNTER BTFSS STATUS, Z GOTO AGAIN movf status_temp,w movwf STATUS MOVF W_TEMP, W RETURN ;Start Timer1 ;ESPERA 1 SEGUNDO ;DECREMENTA EL CONTADOR DE SEGUNDOS ; retrieve copy of STATUS register ; restore pre-isr STATUS register contents ; restore pre-isr W register contents ;======================================================================= ; SUBRUTINA CAMB_BANK1 ;======================================================================= CAMB_BANK1 movwf w_temp ; save off current W register contents movf STATUS,w ; move status register into W register movwf status_temp ; save off contents of STATUS register MOVLW DATOS_PTR1 MOVWF FSR movf status_temp,w movwf STATUS MOVF W_TEMP, W RETURN ; retrieve copy of STATUS register ; restore pre-isr STATUS register contents ; restore pre-isr W register contents ;======================================================================= ; SUBRUTINA SEL_INFO ;======================================================================= SEL_INFO1 movwf w_temp ; save off current W register contents movf STATUS,w ; move status register into W register movwf status_temp ; save off contents of STATUS register movf status_temp,w movwf STATUS MOVF W_TEMP, W RETURN ; retrieve copy of STATUS register ; restore pre-isr STATUS register contents ; restore pre-isr W register contents ;======================================================================= ; SUBRUTINA COMP_RX ;======================================================================= COMP_RX movwf w_temp movf STATUS,w ;SUBRUTINA QUE COMPARA W CON ASTERISCO ; save off current W register contents ; move status register into W register 97 movwf status_temp MOVF XORLW BTFSC GOTO W_TEMP, W BYTE_PARO STATUS, Z TX_DATOS movf status_temp,w movwf STATUS MOVF W_TEMP, W RETURN ; save off contents of STATUS register ;COMPRUBA SI W = BYTE_PARO ;Z=0 => DIFERENTES; Z=1 => IGUALES ;INICIA LA TRANSMISION ; retrieve copy of STATUS register ; restore pre-isr STATUS register contents ; restore pre-isr W register contents ;======================================================================= ; SUBRUTINA COMP_TX ;======================================================================= COMP_TX movwf w_temp movf STATUS,w movwf status_temp MOVF XORLW BTFSC GOTO W_TEMP, W BYTE_PARO STATUS, Z REST_BP movf status_temp,w movwf STATUS MOVF W_TEMP, W RETURN ;SUBRUTINA QUE COMPARA W CON ASTERISCO ; save off current W register contents ; move status register into W register ; save off contents of STATUS register ;COMPRUBA SI W = BYTE_PARO ;Z=0 => DIFERENTES; Z=1 => IGUALES ;RESTAURA EL BYTE DE PARO ; retrieve copy of STATUS register ; restore pre-isr STATUS register contents ; restore pre-isr W register contents ;====================================================================== ; RESTAURA EL BYTE DE PARO ;====================================================================== REST_BP movf status_temp,w movwf STATUS MOVF W_TEMP, W ; retrieve copy of STATUS register ; restore pre-isr STATUS register contents ; restore pre-isr W register contents INCF FSR incf byte_counter MOVWF TXREG ESPERA1 ;ESPERA TERMINO DE TRANSMISION BCF STATUS, RP0 BTFSS PIR1, TXIF GOTO ESPERA1 goto load ;===================================================================== ; ERRORES ;===================================================================== err_ferr bcf status, rp0 movlw 0x01 98 movwf portb goto error_rx err_oerr bcf movlw movwf goto status, rp0 0x02 portb error_rx error_rx goto error_rx END ;directive 'end of program' 99