TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: T0ni0 en 08 de Julio de 2004, 09:50:00
-
Hola a todos.
Estoy intentando utilizar la directiva DB
Al principio pongo:
MESAG DB "HOLA",0X0D,D"13"
Si quiero enviar HOLA por el puerto serie o comparar caracter a caracter como debo hacerlo?
MESAG seria la primera dirección y luego voy incrementando?
Es que tengo una quantas frases por enviar y caracter por caracter se hace muy duro.
Puede ayudarme alguien? thx
-
creo que para el ejemplo que pusiste no aplica la directiva DB pues esa lo que hace es declarar datos de 1 Byte, y ahi tienes mas de uno.
No te puedo ayudar mucho en eso pero si me interesa pusto que yo tambien quiero hacer algo similar, estoy utilizando un LCD 2x16 y quisiera encontrar una forma muy eficiente de mandar a imprimir varios mensajes diferentes, sin tener que pasar todo por el W y luego enviarlo a LCD, lo que pasa es que no se si se pueda hacer.
No se si la directiva DATA te puede ayudar mas. En el documento "MPASM Assembler User"s Guide with MPLINK Object Linker" de Microchip viene un apartado con directivas, tal vez ese te pueda ayudar.
Si encuentro alguna manera de hacer eso que ud. dice se lo comunicare.
jaime.
Pura vida.
-
Hola, primero que nada la respuesta no es la misma si estas usando 16f o 18f.
En el primer caso recorda que una palabra de programa no es de 8bits y por tanto la directiva DB (DataByte) no puede ser aplicable como menciona jaime_cr.
Pero si podrias usarla si el puntero Mesag corresponde a una dirección de datos eeprom (en caso que el pic que uses posee eeprom data), entonces solo tendrias que seguir los pasos correspondientes para la lectura de dicha memoria eeprom.
Otra forma es usar la estructura clasica de tablas en los 16f
Mesag ADDWF PCL
RETLW "H"
RETLW "O"
........
........
y luego una rutina de lectura donde coloco en w la posición del caracter (H es 00h) y hacer un call Mesag, luego vuelve en w el caracter y lo transmitis.
Lamentablemente en lenguaje ensamblador tenes que Tx caracter por caracter, sino podes simplificarte un poco usando rutinas en c, pero con los pic ese no es un campo que domine mucho.
Para los 18f las cosas son bien diferentes, ahora sí podes usar el ejemplo que vos pones, solo que tendrías que estudiar muy bien el uso de las intrucciones (no existentes en 16f) para lectura y escritura de tablas (TBLRD Y TBLWR y otros registros para colocar el puntero Mesag) Encontras más info el la pagina 58 del datasheet del pic18fxx2.
Aunque de manera mucho más facil, aqui tambien tenes que enviar caracter por caracter. Denuevo usando el lenguage c te simplifica mucho todo esto.
-
Segun tengo entendido, la directiva DB (Define Byte) sirve para asignar un nombre a una localidad de memoria, es como para crear tus propios registros, particularmente yo prefiero el Cblock.
Lo de crear tablas con los pic16fxxx es muy sencillo, utiliza la directiva "dt" (Define table) lo cual crea automaticamente una estructura como la mensionada por fer_zone, es decir, le incluye los RETLW, asi puedes definir tu mensaje muy comodamente:
dt "Hola mundo"
en este archivo hay un ejemplo muy bueno, es para un lcd, pero con una pequeña modificacion se puede usar para enviar datos por puerto serie, enviando los datos al registro TXREG.
PD: Este codigo no es mio, lo saque no recuerdo de donde, asi que lo copio tal cual.
;ejem_lcd_2.asm
;
;Realizado por A. Marin
;
;Programa para manejar la pantalla del LCD. Pone en la misma en peridos de 2 Sgd.
;las palabras Blanco/Negro
;
;Vamos a utilizar la instruccion de ensamblador "dt" (define table). Con esta orden
;se facilita la realizacion de tablas. Ver el archivo "Instruccion Dt"
;
;
List p=16F84a ;Tipo de procesador
include "P16F84a.INC" ;Programa de Microchip
Lcd_var equ 0x0c ;Variables (2) de las rutinas de manejo del LCD
Contador equ 0x0e ;Variable para la temporizaci©n
Temp_1 equ 0x0f ;Variable temporal
Temp_2 equ 0x10 ;Variable temporal
org 0x00 ;Vector de Reset
goto Inicio
org 0x05 ;Salva vector de interrupci©n
include "lcd_amr.inc" ;Incluye las rutinas del LCD
;--------------------------
;Mensajes a visualizar
;--------------------------
Mensa_jes movwf PCL ;Control de desplazamiento sobre la tabla
Mensa_1 equ $
dt "BLANCO",0X00 ;El codigo 0x00 determina que es el ultimo dato
;de mensa_1
Mensa_2 equ $
dt "NEGRO",0X00
;--------------------------
;Control de tiempo. Periodos de 50 mS por valor en Segun_dos
;--------------------------
Tiem_po bcf INTCON,T0IF ;Desconecta el flag de rebosamiento
movlw b"00111100" ;60 ----->W
movwf TMR0 ;TMR0=255-60=195
clrwdt ;limpia WDT
Bucle btfss INTCON,T0IF ;Cumpueva si flag de rebosamiento cambia
goto Bucle
decfsz Contador,1 ;Va reduciendo la variable por cada paso
goto Tiem_po ;Vuelve a la rutina de Tiem_po
return
;--------------------------
;Rutina de visualizacion en el LCD
;--------------------------
Mensaje movwf Temp_1 ;Salva posicion de la tabla
Mensaje_1 movf Temp_1,W ;Recupera posicion de la tabla
call Mensa_jes ;Busca caracter de salida
movwf Temp_2 ;Guarda el caracter
movf Temp_2,F
btfss STATUS,Z ;Mira si es el ultimo
goto No_es_ultimo
return
No_es_ultimo call LCD_DATO ;Visualiza en el LCD
incf Temp_1,F ;Siguiente caracter
goto Mensaje_1
;--------------------------
;Inicio general del programa
;--------------------------
Inicio clrf PORTB ;Borra los latch de salida
bsf STATUS,RP0 ;Selecciona banco 1
clrf TRISB ;Puerta B se configura como salida
movlw b"00011000"
movwf TRISA ;RA0-RA2 salidas, RA3-RA4 entradas
movlw b"00000111"
movwf OPTION_REG ;Preescaler de 256 para el TMR0
bcf STATUS,RP0 ;Selecciona banco 0
call LCD_INI ;Secuencia de inicio del LCD
movlw b"00001100"
call LCD_REG ;Envia instruccion a modo LCD
Loop movlw b"00000001"
call LCD_REG ;Borra LCD y Cursor a Inicio
movlw Mensa_1
call Mensaje ;Visualiza el mensaje 0
movlw .20
movwf Contador ;Carga registro bucles con 20
call Tiem_po ;Temporiza 2 segundos
movlw b"00000001"
call LCD_REG ;Borra LCD y Cursor a Inicio
movlw Mensa_2
call Mensaje ;Visualiza el mensaje 1
movlw .20
movwf Contador
call Tiem_po ;Temporiza 2 segundos
goto Loop
end ;Fin del programa fuente
-
Hola, pues bien, el tema ya lo solucioné.
Con los 16F no sabría como hacerlo con el 18F lo he solucionado de la siguiente manera:
en el espacio de Flash pongo
MESAG DB "HOLA",0X0D,D"13"
Y resulta que los 18F disponen de un registro para conseguir leer la flash, Tabla voy recorriendo la memória con este registro y ya ta. 
Me funciona todo correctamente. Ahora en mi programa envio datos de la Flash de la RAM y de la EEPROM.