aqui pongo el codigo.he desviado algunos flujos del programa para centrarme en el error.el codigo no esta muy depurado que digamos.
pero hasta que no funcione,no quiero entratenerme en su limpieza.
en la zona de la etiqueta PRINCIPAL tengo dos lineas deshabilitadas por unos puntos y coma.si las habilitamos y deshabilitamos las interrupciones en la linea anterior,el programa deja de indicar el error.con signo de eclamacion.
el error en letras rojas de la imagen anterior.sigue apareciendo.aun deshabilitando las interrupciones.pero me parece que es un problema de lectura del isis con la emulacion del COMPIM.ya que sale al poner en pausa la emulacion.y no durante la emulacion en curso.
;*****************************************
; PROGRAMA : gps_usart.asm
; Funcion : guarda la trama GPS en memoria ram
; Serial port config: 38400 baudios,8 bits,paridad = none
;
; Revision : 1.0 23/8/2009 Programa para : PIC16F876A
; CPU Clock : 3.6864 MHz Reloj instruccion :
; WDT : Deshabilitado Tipo de reloj : XT
; Code Prot : OFF
;******************************************
;
;NOTAS:
; este programa almacena una trama complata de GPS en la direccion 0x20
; la trama podemos elegirla cambiando los caracteres de C1,C2,C3,C4,C5,C6,C7.
;
LIST P=16F876A ;Se indica el modo de procesador
RADIX HEX ;Sistema de numeracion hexadecimal
INCLUDE "P16f876A.inc" ;se incluye la definicion de los
;registros internos
__CONFIG _CP_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC & _BODEN_OFF &_LVP_OFF &_CPD_OFF ;&_WRT_ENABLE_OFF
ERRORLEVEL -302
CBLOCK 0X20 ;BLOQUE DEL COMANDO A LEER
C1 ;'$'
C2 ;'G'
C3 ;'P'
C4 ;'G'
C5 ;'G'
C6 ;'A'
C7 ;'.'
ENDC
CBLOCK 0x74
W_TEMP
STATUS_TEMP
PCLATH_TEMP
TEMP_DATO_H
TEMP_DATO_L
DIR_EEPROM
DATO_EEPROM
TEMP_EEP
TEMP_NUMERICO
PRINCIPIO_RAM
TEMP_FSR
CARACTER
FSR_TEMP
ENDC
PUSH MACRO ;macro para salvar registros antes de una llamada a interrupcion
movwf W_TEMP
swapf STATUS,W
movwf STATUS_TEMP
clrf STATUS
movfw PCLATH
movwf PCLATH_TEMP
clrf PCLATH
ENDM
POP MACRO ;macro para restaurar registros despues de una llamada a interrupcion
movfw PCLATH_TEMP
movwf PCLATH
swapf STATUS_TEMP,W
movwf STATUS
swapf W_TEMP,F
swapf W_TEMP,W
ENDM
BANK0 MACRO
BCF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK1 MACRO
BSF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK2 MACRO
BCF STATUS,RP0
BSF STATUS,RP1
ENDM
BANK3 MACRO
BSF STATUS,RP0
BSF STATUS,RP1
ENDM
;<<<<<<<<<<<<<SELECCION DE LOS SECTORES DE LA MEMORIA DE PROGRAMA>>>>
;--------IMPORTANTE:
;ANTES DE UBICAR UNA TABLA DEL TIPO (ADDWF PCL,F)TENEMOS QUE INDICAR EL SECTOR DONDE SE UBICA ESE SUBPROGRAMA
;EJM.SI PONEMOS EL SUBPROGRAMA EN EL SECTOR A PARTIR DE LA DIR:100 .PONDREMOS LA LINEA SECTOR_100 ANTES DE LA TABLA DE DATOS
;
SECTOR_000 MACRO
BCF PCLATH,0
BCF PCLATH,1
ENDM
SECTOR_100 MACRO
BSF PCLATH,0
BCF PCLATH,1
ENDM
SECTOR_200 MACRO
BCF PCLATH,0
BSF PCLATH,1
ENDM
SECTOR_300 MACRO
BSF PCLATH,0
BSF PCLATH,1
ENDM
#define GIE_ON bsf INTCON,GIE
#define GIE_OFF bcf INTCON,GIE
;<<<<<<---------------------- VECTOR DE RESET ------------------------>>>>>>>
ORG 0x00 ;Inicio en el Vector de Reset
goto INICIO ;Va a la primera instruccion del programa
;<<<<<<--------------------VECTOR DE INTERRUPCION---------------------->>>>>>>
ORG 0x04
goto INTER ;Va al programa de interrupcion
;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>>
INICIO BANK1 ;selecciona banco 1
movlw .5 ;(.5 =38400 baudios crystal 3.6864 MHz)
movwf SPBRG
movlw b'00000110'
movwf ADCON1 ;porta entradas digitales
movlw 0xFF
movwf TRISA
clrf TRISB
movlw b'00000110' ;Configuracion USART modo alta velocidad
movwf TXSTA
movlw b'11000000'
movwf TRISC ;configura pins TX y RX
BANK0 ;selecciona banco 0 -------------
movlw b'10010000' ;Configuracion de la usart
movwf RCSTA ;para recepcion continua y habilitacion de la usart
movlw '$'
movwf C1 ;registros para la cabezera NMEA(cambiarlos para otra cabecera)
movlw 'G'
movwf C2
movlw 'P'
movwf C3
movlw 'G'
movwf C4
movlw 'G'
movwf C5
movlw 'A'
movwf C6
movlw ','
movwf C7
clrf DIR_EEPROM
BANK1
movlw b'00100000' ;habilita interrupcion por recepcion de usart
movwf PIE1
movlw b'11000000' ;habilita interrupciones generales y perifericas
movwf INTCON
PRINCIPAL ;CALL LEEDATO
;GOTO PRINCIPAL;GIE_ON
BANK0
movlw 0xA2
movwf FSR
movfw INDF
movwf PORTB
nop
nop
nop
nop
goto PRINCIPAL;
GRARAM ;GIE_OFF ;prohibe interrupciones
BANK1
movlw 0xA0
movwf PRINCIPIO_RAM
BANK0
movlw 0x27 ;valor del primer caracter de la ram a traducir
movwf TEMP_FSR
REP3
movfw TEMP_FSR
movwf FSR ;carga el puntero de ram
movfw FSR ;
xorlw 2D ;direccion comienzo a ignorar
btfsc STATUS,Z
call SUMA5 ;cinco pociciones de memoria a ignorar
movfw FSR ;
xorlw 36 ;direccion comienzo a ignorar
btfsc STATUS,Z
call SUMA1 ;una pocicion de memoria a ignorar
;movfw FSR ;
;xorlw 3B ;direccion comienzo a ignorar
;btfsc STATUS,Z
;call SUMA2 ;cuatro pociciones de memoria a ignorar
movfw FSR ;
xorlw 3B ;direccion centenas de coordenada ecuador
btfsc STATUS,Z
call CENTENAS
movfw FSR ;
xorlw 43 ;direccion comienzo a ignorar
btfsc STATUS,Z
call SUMA1 ;una pocicion de memoria a ignorar
movfw FSR ;
xorlw 48 ;direccion comienzo a ignorar
btfsc STATUS,Z
return ;final del subprograma
movfw TEMP_FSR
movwf FSR ;carga el puntero de ram
movfw INDF ;recoge valor
movwf CARACTER
movfw CARACTER
call TRADUCE ;traduce el valor ascii a numerico
movwf TEMP_NUMERICO
BANK1
movfw PRINCIPIO_RAM
movwf FSR
BANK0
movfw TEMP_NUMERICO
movwf INDF
BANK1
incf PRINCIPIO_RAM,F
BANK0
incf TEMP_FSR,F
REP4 incf TEMP_FSR,F
goto REP3
SUMA5 movlw 0x05
addwf TEMP_FSR,f
return
SUMA1 movlw 0x01
addwf TEMP_FSR,f
return
SUMA2 movlw 0x02
addwf TEMP_FSR,f
return
CENTENAS movlw 0x3E
movwf FSR
;movfw INDF
clrf TEMP_DATO_H
movlw '0'
xorwf INDF,W
btfss STATUS,Z
incf TEMP_DATO_H,F
movlw 0x3F
movwf TEMP_FSR
BANK1
incf PRINCIPIO_RAM,F
BANK0
movlw 0xA7
movwf FSR
movfw TEMP_DATO_H
movwf INDF
return
movwf DATO_EEPROM
incf DIR_EEPROM,F
movfw DIR_EEPROM
call ESCRIBIR_DATO
GIE_ON
GOTO GRARAM
;<<<<<<<<<<<-------------CONVERTIR VALORES HEX EN DECIMALES--------------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>
TRADUCE movwf TEMP_DATO_H ;
movlw 0x30
NOP
NOP
subwf TEMP_DATO_H,F
swapf TEMP_DATO_H,F
incf FSR,F
movfw INDF
movwf TEMP_DATO_L
movlw 0x30
subwf TEMP_DATO_L,W
addwf TEMP_DATO_H,W
return
;<<<<<<<<<<--------------METE EN UN BLOQUE DE RAM LOS COMANDOS RECIBIDOS------------>>>>>>>>>>>>>>>
LEEDATO ;GIE_OFF
BANK0 ;Cambio al banco 0
movlw 0x1f ;carga en w el valor 0x1F principio de RAM para introducir mensages recividos"
movwf FSR ;cargalo en el puntero de registro de proposito general
LEEDATO2 incf FSR,F ;incrementa la siguiente direccion de la ram
movfw INDF ;carga en W el valor direcionado en FSR
xorwf RCREG,W ;comparalo con el caracter recivido de la USART
btfss STATUS,Z ;si es el mismo continua con el programa
return;GOTO PRINCIPAL ;en caso contrario empieza de nuevo
call ERR_USART ;salta a ERR_USART
movlw ',' ;carga en w el caracter '.' caracter posterior de cabezera
xorwf RCREG,W ;comparalo con el caracter recivido de la USART
btfss STATUS,Z ;si es el mismo salta
goto LEEDATO2
SIGUIENTE incf FSR,F ;incrementa FSR
movfw RCREG ;carga en W el caracter recivido
movwf INDF ;mete el caracter en la posicion de memoria que apunta FSR
;movlw '*' ;carga valor '$' en w
;xorwf RCREG,W ;comparalo con el valor recivido de la usart(primer caracter de siguiente trama)
;btfsc STATUS,Z
;return ;si es igual retorna(fin de captura de trama)
movlw 0x73 ;valor limite de RAM
xorwf FSR,W
btfsc STATUS,Z
return ;si se excede del valor anterior.retorna
call ERR_USART ;salta a ERR_USART
goto SIGUIENTE
;<<<<<<<<<<<<<<<<<<<<------SUBPROGRAMA PARA ESPERA DE CARACTER Y CORRECTOR DE ERRORES----->>>>>>>>>>>>>
ERR_USART btfss PIR1,RCIF ;espera al proximo caracter
goto ERR_USART
btfsc RCSTA,OERR
call BORR_ERR ;Error de Sobreescritura
btfsc RCSTA,FERR
call BORR_ERR ;Error de Trama
BCF PIR1,RCIF ;borra el flag de interrupcion por caracter recivido
return
BORR_ERR bcf RCSTA,CREN
movf RCREG,w
movf RCREG,w
movf RCREG,w
bsf RCSTA,CREN
return
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<PROGRAMA DE GESTION DE INTERRUPCIONES>>>>>>>>>>>>>>>>>>>>>>
INTER PUSH ;salva el contenido de W,STATUS Y PCLATH
BANK0
;btfsc PIR1,RCIF ;comprueba si el shift register(RSR)esta lleno.y si es asi salta
call LEEDATO
;xorlw '*'
;btfss STATUS,Z
;call GRARAM
POP ;restaura el contenido de W,STATUS Y PCLATH
bcf PIR1,RCIF ;borra flag de interrupcion por recepcion de usart
;bsf PIR1,RCIF
call BORR_ERR
;incf INT_CONT,F ;incrementa el contador de interrupciones para asegurarnos de que se entra al programa
;btfsc INT_CONT,0 ;-almenos una vez por cada dos interrupciones
;retfie ;retorno de interrupcion
;GIE_ON ;deshabilita interrupciones
retfie
;//////////////////////////////////////////////ESCRIBIR DATO EN EEPROM///////////////////////////////////////////////////
;org 200
ESCRIBIR_DATO ;SECTOR_200
;GIE_OFF
BANK0
movfw DIR_EEPROM ;DIRECCION A ACCEDER
BANK2
movwf EEADR
BANK0
movfw DATO_EEPROM
BANK2
movwf EEDATA
BANK3
bcf EECON1,EEPGD ;acceso a memoria de datos
bsf EECON1,WREN ;HABILITA ESCRITURA
movlw 0X55
movwf EECON2
movlw 0XAA
movwf EECON2
bsf EECON1,WR ;INICIA ESCRITURA
ESPERA btfsc EECON1,WR
goto ESPERA
bcf EECON1,WREN ;deshabilitar escritura en eeprom
BANK0
bcf PIR2,EEIF
bcf EECON1,WR
movfw DIR_EEPROM
call VERIFICA
return
VERIFICA call LEER_DATO
movfw TEMP_EEP
subwf DATO_EEPROM,W
btfss STATUS,Z
goto ESCRIBIR_DATO
return
;///////////////////////////////////////////LEER DATO DE MEMORIA EEPROM ///////////////////////////////////////////////////////
LEER_DATO GIE_ON
BANK2
movwf EEADR ;escribir direccion de memoria eeprom
BANK3
bsf EECON1,RD ;ORDEN DE LECTURA
LEE btfsc EECON1,RD
goto LEE
BANK2
movf EEDATA,W ;carga valor de eeprom en el registro W
BANK0
movwf TEMP_EEP
return
END