Autor Tema: Uso DB  (Leído 2961 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado T0ni0

  • PIC16
  • ***
  • Mensajes: 196
Uso DB
« 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
- T0ni0 -
30RCF112

Desconectado jaime_cr

  • PIC10
  • *
  • Mensajes: 11
RE: Uso DB
« Respuesta #1 en: 12 de Julio de 2004, 20:26:00 »
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.

Desconectado fer_zone

  • PIC12
  • **
  • Mensajes: 74
RE: Uso DB
« Respuesta #2 en: 25 de Julio de 2004, 22:15:00 »
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.

 

Desconectado Duende_Azul

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 908
RE: Uso DB
« Respuesta #3 en: 25 de Julio de 2004, 23:28:00 »
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


Desconectado T0ni0

  • PIC16
  • ***
  • Mensajes: 196
RE: Uso DB
« Respuesta #4 en: 26 de Julio de 2004, 03:40:00 »
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.
- T0ni0 -
30RCF112


 

anything