esta parte que pongo aqui es el codigo asm del programa para visualizar los datos recividos del puerto serie de un gps.que se visualizaran en una pantalla lcd.
;*****************************************
; PROGRAMA : rs232.asm
; Funcion : visualizador coordenadas gps en display
; Serial port config: 38400 baudios,8 bits,paridad = none
;
; Revision : 1.0 7/2/2002 Programa para : PIC16F876
; CPU Clock : 3.6864 MHz Reloj instruccion :
; WDT : Deshabilitado Tipo de reloj : XT
; Code Prot : OFF
;******************************************
LIST P=16F876 ;Se indica el modo de procesador
RADIX HEX ;Sistema de numeracion hexadecimal
INCLUDE "P16f876.inc" ;se incluye la definicion de los
;registros internos
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC & _BODEN_OFF &_LVP_OFF &_CPD_OFF &_WRT_ENABLE_OFF
ERRORLEVEL -302
PRINCIPAL_VAR EQU 20h ;direccion de las variables desde 20h
CBLOCK PRINCIPAL_VAR
CounterA
CounterB
CounterC
KEY_1
OFFSET
RESUL
TEMPO1
ENDC
BANK0 MACRO
BCF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK1 MACRO
BSF STATUS,RP0
BCF 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
;<<<<<<---------------------- VECTOR DE RESET ------------------------>>>>>>>
ORG 0x00 ;Inicio en el Vector de Reset
goto INICIO ;Va a la primera instruccion del
;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>>
INICIO clrf PORTA ;borra las salidas de porta
clrf PORTB ;borra las salidas de portb
clrf PORTC ;borra las salidas de portc
clrf KEY_1
BANK1 ;selecciona banco 1
clrf TRISB ;Puerta B como salida
movlw b'11111111' ;configura PORTC para el uso de la USART
movwf TRISC
movlw b'00000110'
movwf ADCON1 ;porta entradas digitales
movlw 0xFF
movwf TRISA
movlw b'00100100' ;Configuracion USART modo alta velocidad 38400 baud
movwf TXSTA ;y activacion de transmision
clrf PIE1 ;prohive interrupciones perifericas
BANK0 ;selecciona banco 0 -------------
movlw b'10010000' ;Configuracion de la usart
movwf RCSTA ;para recepcion continua y habilitacion de la usart
clrf INTCON ;prohive todas las interrupciones
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<PROGRAMA PRINCIPAL DE RECEPCION DE DATOS DEL GPS>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
RECEPCION BANK0
clrf PORTB
call PROG_GPS ;buscar comando nmea
call MEM_DAT ;memorizar datos en registros
call LCD ;visualiza coordenadas
goto INICIO
;<<<<<<----------------------- RETARDO---------------- ------------------------->>>>>>>
RETARDO movlw D'6'
movwf CounterC
movlw D'24'
movwf CounterB
movlw D'168'
movwf CounterA
loop decfsz CounterA,1
goto loop
decfsz CounterB,1
goto loop
decfsz CounterC,1
goto loop
return
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<INICIALIZA LCD>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
LCD clrf INTCON
BANK0
clrf PORTA
BANK1
movlw 0x06
movwf ADCON1
clrf TRISA ; Puerta A como salidas digitales
call UP_LCD
call BORRA_Y_HOME
call DISPLAY_ON_CUR_OFF
call LCD_INI
BANK1
movlw b'00000111'
movwf OPTION_REG
BANK0
clrf OFFSET
call MENS
BUCLE goto INICIO
MENS clrf RESUL
MENS_1 movf OFFSET,W
addwf RESUL,W
call DATOS
iorlw 0
btfsc STATUS,2
return
call LCD_DATO
incf RESUL,F
incf RESUL,F
MOVLW d'28'
XORWF RESUL,W
btfss STATUS,Z
GOTO SALTO1
call LCD_LINEA2 ;para escribir en la segunda
;fila del lcd
SALTO1 movlw d'10'
movwf TEMPO1
goto MENS_1
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<DATOS PARA ORDENAR LAS COORDENADAS EN EL DISPLAY>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DATOS BANK0
SECTOR_000
addwf PCL,F
movf KEY_1_L,W
return
movf KEY_2_L,W
return
movlw 0xdf ;simbolo grados
return
movf KEY_3_L,W
return
movf KEY_4_L,W
return
movlw "'" ;simbolo minutos
return
;movf KEY_5_L,W
;return
movf KEY_6_L,W
return
movf KEY_7_L,W
return
movf KEY_8_L,W
return
movf KEY_9_L,W
return
movlw 0x22 ;simbolo segundos
return
;movf KEY_10_L,W
;return
movf KEY_11_L,W
return
movlw " ";movf KEY_12_L,W
return
movlw " ";movf KEY_13_L,W
return
movf KEY_14_L,W
return
movf KEY_15_L,W
return
movlw 0xdf ;simbolo grados
return
movf KEY_16_L,W
return
movf KEY_17_L,W
return
movlw "'" ;simbolo minutos
return
;movf KEY_18_L,W
;return
movf KEY_19_L,W
return
movf KEY_20_L,W
return
movf KEY_21_L,W
return
movf KEY_22_L,W
return
movlw 0x22 ;simbolo segundos
return
;movf KEY_23_L,W
;return
movf KEY_24_L,W
return
retlw 0x00
org 0x200
INCLUDE "recepcion_usart_r14.inc"
org 0x300
INCLUDE "lcd_cxx.inc"
END
AQUI PONGO EL CODIGO DEL ARCHIVO recepcion_usart_r14.inc QUE DEBEREIS INCLUIR EN EL PROYECTO
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<recepcion_usart_r14.inc>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
USART_VAR EQU 0x35 ;direccion de inicio del bloque para meter datos en variables
CBLOCK USART_VAR
GGA ;temporal offset trama $GPGGA
GPS ;temporal byte recivido del gps
KEY_1_L
KEY_2_L
KEY_3_L
KEY_4_L
KEY_5_L
KEY_6_L
KEY_7_L
KEY_8_L
KEY_9_L
KEY_10_L
KEY_11_L
KEY_12_L
KEY_13_L
KEY_14_L
KEY_15_L
KEY_16_L
KEY_17_L
KEY_18_L
KEY_19_L
KEY_20_L
KEY_21_L
KEY_22_L
KEY_23_L
KEY_24_L
ENDC
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<TABLA $GPGGA>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DAT_GGA SECTOR_200
movf GGA,W
addwf PCL,F
retlw "$"
retlw "G"
retlw "P"
retlw "G"
retlw "G"
retlw "A"
retlw ","
return
;<<<<<<<<<<<<<<<<<<<<<<<BUSCAR CABEZERA MENSAGE NMEA $GPGGA>>>>>>>>>>>>>>>>>>>
PROG_GPS BANK1
movlw .5 ;(.5 =38400 baudios crystal 3.6864 MHz)
movwf SPBRG
BANK0
COMAN_GPS clrf GGA
clrf GPS
COMAN_GPS2 call LEE_DATO ;MOVWF PORTB
movwf GPS ;carga en el acumulador el valor capturado por la usart
call DAT_GGA ;salta a tabla $GPGGA
incf GGA,F
xorwf GPS,F ;compara el valor recivido con el de la tabla
btfss STATUS,Z ;si es el mismo sigue comparando en la tabla
goto BORRA_RET ;si no empieza de nuevo
xorlw "A" ;cuando encuentres el caracter "A",salta a MEM_DAT.(ultimo caracter de $CPGGA)
btfss STATUS,Z
goto COMAN_GPS2
goto MEM_DAT
BORRA_RET clrf GGA
goto COMAN_GPS
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<METE EN LOS GPR LOS DATOS DE LAS COORDENADAS>>>>>>>>>>>>>>>
MEM_DAT
BANK0
call LEE_DATO
xorlw ","
btfss STATUS,Z ;comprueva primera coma encontrada
goto MEM_DAT
MEM_DAT2 call LEE_DATO
xorlw ","
btfss STATUS,Z ;comprueva segunda coma encontrada
goto MEM_DAT2
call LEE_DATO
movwf KEY_1_L
call LEE_DATO
movwf KEY_2_L
call LEE_DATO
movwf KEY_3_L
call LEE_DATO
movwf KEY_4_L
call LEE_DATO
movwf KEY_5_L
call LEE_DATO
movwf KEY_6_L
call LEE_DATO
movwf KEY_7_L
call LEE_DATO
movwf KEY_8_L
call LEE_DATO
movwf KEY_9_L
call LEE_DATO
movwf KEY_10_L
call LEE_DATO
movwf KEY_11_L
call LEE_DATO
movwf KEY_12_L
call LEE_DATO
movwf KEY_13_L
call LEE_DATO
movwf KEY_14_L
call LEE_DATO
movwf KEY_15_L
call LEE_DATO
movwf KEY_16_L
call LEE_DATO
movwf KEY_17_L
call LEE_DATO
movwf KEY_18_L
call LEE_DATO
movwf KEY_19_L
call LEE_DATO
movwf KEY_20_L
call LEE_DATO
movwf KEY_21_L
call LEE_DATO
movwf KEY_22_L
call LEE_DATO
movwf KEY_23_L
call LEE_DATO
movwf KEY_24_L
call LEE_DATO
call LCD
RETURN
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<LEE DATO USART>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
LEE_DATO BANK0
btfss PIR1,RCIF ;espera al proximo caracter
goto LEE_DATO
btfsc RCSTA,OERR
call BORR_US ;Error de Sobreescritura
btfsc RCSTA,FERR
call BORR_US ;Error de Trama
btfsc PIR1,TXIF
movf RCREG,W ;Lectura dato recibido
return
;<<<<<<<<<<<<<<<<<<<<<<<<BORRAR USART>>>>>>>>>>>>>>>>>>>>>>>>>>
BORR_US bcf RCSTA,CREN
movf RCREG,w
movf RCREG,w
movf RCREG,w
bsf RCSTA,CREN
return
Y AQUI PONGO EL ARCHIVO lcd_cxx.inc QUE ENCONTRE POR AHI PARA LA GESTION DE LA LCD,QUE TAMBIEN SE DEBERA INCLUIR EN EL PROYECTO.
;El conjunto de rutinas que se presentan a continuaci¢n permiten realizar
;las tareas b sicas de control del m¢dulo de visualizaci¢n LCD. Se emplean
;con los PIC 16c8xx. En el programa principal se deber reservar memoria
;para el bloque de variables que utiliza el LCD del modo:
LCD_VAR EQU 0x5A ;direccion de inicio del bloque para meter datos en variables
;BLOQUE DE ETIQUETAS
#define ENABLE bsf PORTA,2 ;Activa E
#define DISABLE bcf PORTA,2 ;Desactiva
#define LEER bsf PORTA,1 ;Pone LCD en Modo RD
#define ESCRIBIR bcf PORTA,1 ;Pone LCD en Modo WR
#define OFF_COMANDO bcf PORTA,0 ;Desactiva RS (modo comando)
#define ON_COMANDO bsf PORTA,0 ;Activa RS (modo datos)
CBLOCK LCD_VAR
LCD_TEMP_2 ;Inicio de las variables. Ser la primera direcci¢n libre
; disponible
LCD_TEMP_1
ENDC
LIST
;RUTINA UP_LCD: Con esta rutina se configura el PIC para que trabaje con el LCD.
UP_LCD
BANK1 ;Banco 1
clrf PORTB ;RB <0-7> salidas digitales
clrf PORTA ;RA <0-4> salidas digitales
BANK0 ;Banco 0
OFF_COMANDO ;RS=0
DISABLE ;E=0
return
;RUTINA LCD_BUSY: Con esta rutina se chequea el estado del
;flag BUSY del m¢dulo LCD, que indica, cuando est activado, que el
;m¢dulo a£n no ha terminado el comando anterior. La rutina espera a
;que se complete cualquier comando anterior antes de retornar al
;programa principal, para poder enviar un nuevo comando.
LCD_BUSY LEER ;Pone el LCD en Modo RD
BANK1
movlw H'FF'
movwf PORTB ;Puerta B como entrada
BANK0 ;Selecciona el banco 0
ENABLE ;Activa el LCD
nop
L_BUSY btfsc PORTB,7 ;Chequea bit de Busy
goto L_BUSY
DISABLE ;Desactiva LCD
BANK1
clrf PORTB ;Puerta B salida
BANK0
ESCRIBIR ;Pone LCD en modo WR
return
;RUTINA LCD_E: Se trata de una peque¤a rutina que se encarga de generar
;un impulso de 1æ s (para una frecuencia de funcionamiento de 4 Mhz)
;por la patita de salida de la Puerta A RA2, que se halla conectada
;a la se¤al E (Enable) del m¢dulo LCD. Con esta rutina se pretende activar
;al m¢dulo LCD.
LCD_E ENABLE ;Activa E
nop
DISABLE ;Desactiva E
return
;RUTINA LCD_DATO: Es una rutina que pasa el contenido cargado en el
;registro W, el cual contiene un car cter ASCII, a la PUERTA B, para
;visualizarlo por el LCD o escribirlo en la CGRAM.
LCD_DATO OFF_COMANDO ;Desactiva RS (modo comando)
movwf PORTB ;Valor ASCII a sacar por PORTB
call LCD_BUSY ;Espera a que se libere el LCD
ON_COMANDO ;Activa RS (modo dato)
call LCD_E ;Genera pulso de E
return
;RUTINA LCD_REG: Rutina parecida a la anterior, pero el contenido de W
;ahora es el c¢digo de un comando para el LCD, que es necesario pasar
;tambi‚n a la PUERTA B para su ejecuci¢n.
LCD_REG OFF_COMANDO ;Desactiva RS (modo comando)
BANK0
movwf PORTB ;C¢digo de comando
call LCD_BUSY ;LCD libre?.
call LCD_E ;S¡. Genera pulso de E.
return
;RUTINA LCD_INI: Esta rutina se encarga de realizar la secuencia de
;inicializaci¢n del m¢dulo LCD de acuerdo con los tiempos dados por
;el fabricante (15 ms). Se especifican los valores de DL, N y F,
;as¡ como la configuraci¢n de un interfaz de 8 l¡neas con el bus
;de datos del PIC, y 2 l¡neas de 16 caracteres de 5 x 7 pixels.
LCD_INI
movlw b'00111000'
call LCD_REG ;C¢digo de instrucci¢n
call LCD_DELAY ;Temporiza
movlw b'00111000'
call LCD_REG ;C¢digo de instrucci¢n
call LCD_DELAY ;Temporiza
movlw b'00111000'
call LCD_REG ;C¢digo de instrucci¢n
call LCD_DELAY ;Temporiza
return
;RUTINA BORRA_Y_HOME: Borra el display y retorna el cursor a la posici¢n 0.
BORRA_Y_HOME movlw b'00000001' ;Borra LCD y Home.
call LCD_REG
return
;RUTINA DISPLAY_ON_CUR_OFF: Control del display y cursor.
;Activa el display y desactiva es cursor
DISPLAY_ON_CUR_OFF movlw b'00001100' ;LCD on, cursor off.
call LCD_REG
return
;RUTINA LCD_LINEA2
LCD_LINEA2 movlw 0xC0
call LCD_REG
return
;RUTINA LCD_LINEA1
LCD_LINEA1 movlw 0x80
call LCD_REG
return
;RUTINA LCD_DELAY: Se trata de un rutina que implementa un retardo
;o temporizaci¢n de 5 ms. Utiliza dos variables llamadas LCD_TEMP_1
;y LCD_TEMP_2, que se van decrementando hasta alcanzar dicho tiempo.
LCD_DELAY clrwdt
movlw 10
movwf LCD_TEMP_1
clrf LCD_TEMP_2
LCD_DELAY_1 decfsz LCD_TEMP_2,F
goto LCD_DELAY_1
decfsz LCD_TEMP_1,F
goto LCD_DELAY_1
return
LIST