Autor Tema: Problemas con tablas DT  (Leído 3005 veces)

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

Desconectado telojurito

  • PIC12
  • **
  • Mensajes: 55
Problemas con tablas DT
« en: 10 de Septiembre de 2009, 16:12:10 »
Hola estimados amigos,

Sucede que estoy con un proyecto de enviar una serie de caracteres a un LCD SDEC y ya logré la inicialización y todo, de hecho ya logro mandar caracteres al display pero uno a uno y me dí a la tarea de hacerlo usando la instrucción DT en forma de tablas. Sucede que de acuerdo al código que adjunto sí manda los caracteres:

Código: ASM
  1. movlw   0x0A            ;Cursor low address setting
  2.         call    Send_CMD
  3.         movlw   0x06            ;Low address start
  4.         call    Send_DAT        ;Data complete
  5.  
  6.         movlw   0x0B            ;Cursor high address setting
  7.         call    Send_CMD
  8.         movlw   0x00            ;High address start from 00H
  9.         call    Send_DAT        ;Data complete
  10.  
  11.                 clrf    J
  12.                 banksel PCL
  13. GetDat  movf    J,W
  14.                 call    Txt_MPPal
  15.                 movwf   TxtDat          ;Pone el dato recibido en W en TxtDat
  16.                 movlw   0x0C            ;Write Display Data
  17.                 call    Send_CMD
  18.                 movf    TxtDat,W
  19.                 call    Send_DAT
  20.                 incf    J,1
  21.                 movlw   0x0E
  22.                 xorwf   J,W
  23.                 btfss   STATUS,Z        ;Si XOR entre J y W dió cero, son iguales y salta Z=1
  24.                 goto    GetDat
  25.  
  26. ;****************************************************************************
  27.         movlw   0x0A            ;Cursor low address setting
  28.         call    Send_CMD
  29.         movlw   0x63            ;Low address start
  30.         call    Send_DAT        ;Data complete
  31.  
  32.         movlw   0x0B            ;Cursor high address setting
  33.         call    Send_CMD
  34.         movlw   0x00            ;High address start from 00H
  35.         call    Send_DAT        ;Data complete
  36.  
  37.                 clrf    J
  38.                 banksel PCL
  39. GetDat1 movf    J,W
  40.                 call    Txt_MPPal_1
  41.                 movwf   TxtDat          ;Pone el dato recibido en W en TxtDat
  42.                 movlw   0x0C            ;Write Display Data
  43.                 call    Send_CMD
  44.                 movf    TxtDat,W
  45.                 call    Send_DAT
  46.                 incf    J,1
  47.                 movlw   0x10
  48.                 xorwf   J,W
  49.                 btfss   STATUS,Z        ;Si XOR entre J y W dió cero, son iguales y salta Z=1
  50.                 goto    GetDat1
  51.  
  52. ;****************************************************************************
  53.         movlw   0x0A            ;Cursor low address setting
  54.         call    Send_CMD
  55.         movlw   0x83            ;Low address start
  56.         call    Send_DAT        ;Data complete
  57.  
  58.         movlw   0x0B            ;Cursor high address setting
  59.         call    Send_CMD
  60.         movlw   0x00            ;High address start from 00H
  61.         call    Send_DAT        ;Data complete
  62.  
  63.                 clrf    J
  64.                 banksel PCL
  65. GetDat2 movf    J,W
  66.                 call    Txt_MPPal_2
  67.                 movwf   TxtDat          ;Pone el dato recibido en W en TxtDat
  68.                 movlw   0x0C            ;Write Display Data
  69.                 call    Send_CMD
  70.                 movf    TxtDat,W
  71.                 call    Send_DAT
  72.                 incf    J,1
  73.                 movlw   0x15
  74.                 xorwf   J,W
  75.                 btfss   STATUS,Z        ;Si XOR entre J y W dió cero, son iguales y salta Z=1
  76.                 goto    GetDat2
  77.  
  78. ;****************************************************************************
  79.         movlw   0x0A            ;Cursor low address setting
  80.         call    Send_CMD
  81.         movlw   0xA3            ;Low address start
  82.         call    Send_DAT        ;Data complete
  83.  
  84.         movlw   0x0B            ;Cursor high address setting
  85.         call    Send_CMD
  86.         movlw   0x00            ;High address start from 00H
  87.         call    Send_DAT        ;Data complete
  88.  
  89.                 clrf    J
  90.                 banksel PCL
  91. GetDat3 movf    J,W
  92.                 call    Txt_MPPal_3
  93.                 movwf   TxtDat          ;Pone el dato recibido en W en TxtDat
  94.                 movlw   0x0C            ;Write Display Data
  95.                 call    Send_CMD
  96.                 movf    TxtDat,W
  97.                 call    Send_DAT
  98.                 incf    J,1
  99.                 movlw   0x19
  100.                 xorwf   J,W
  101.                 btfss   STATUS,Z        ;Si XOR entre J y W dió cero, son iguales y salta Z=1
  102.                 goto    GetDat3
  103.  
  104. Txt_MPPal:
  105.         addwf   PCL, f
  106.         dt              0x4D,0x65,0x6E,0x75,0x20,0x50,0x72,0x69,0x6E,0x63,0x69,0x70,0x61,0x6C
  107.  
  108. Txt_MPPal_1:
  109.         addwf   PCL, f
  110.         dt              0x31,0x2D,0x54,0x6F,0x6D,0x61,0x72,0x20,0x4C,0x65,0x63,0x74,0x75,0x72,0x61,0x73
  111.  
  112. Txt_MPPal_2:
  113.         addwf   PCL, f
  114.         dt              0x32,0x2D,0x43,0x61,0x72,0x67,0x61,0x72,0x20,0x44,0x61,0x74,0x6F,0x73,0x20,0x64,0x65,0x20,0x4D,0x65,0x6D
  115.  
  116. Txt_MPPal_3:
  117.         addwf   PCL, f
  118.         dt              0x33,0x2D,0x42,0x6F,0x72,0x72,0x61,0x72,0x20,0x44,0x61,0x74,0x6F,0x73,0x20,0x64,0x65,0x20,0x4D,0x65,0x6D,0x34,0x2D,0x45,0x6E

y bueno.... hasta aquí muestra todos los caracteres bién, pero si le agrego otra tabla, el PIC se bloquea y no aparece nada, sólo se queda el display con todos los pixeles activados (es un display gráfico)

Código: ASM
  1. ;****************************************************************************
  2.         movlw   0x0A            ;Cursor low address setting
  3.         call    Send_CMD
  4.         movlw   0xC3            ;Low address start
  5.         call    Send_DAT        ;Data complete
  6.  
  7.         movlw   0x0B            ;Cursor high address setting
  8.         call    Send_CMD
  9.         movlw   0x00            ;High address start from 00H
  10.         call    Send_DAT        ;Data complete
  11.  
  12.                 clrf    J
  13.                 banksel PCL
  14. GetDat4 movf    J,W
  15.                 call    Txt_MPPal_4
  16.                 movwf   TxtDat          ;Pone el dato recibido en W en TxtDat
  17.                 movlw   0x0C            ;Write Display Data
  18.                 call    Send_CMD
  19.                 movf    TxtDat,W
  20.                 call    Send_DAT
  21.                 incf    J,1
  22.                 movlw   0x13
  23.                 xorwf   J,W
  24.                 btfss   STATUS,Z        ;Si XOR entre J y W dió cero, son iguales y salta Z=1
  25.                 goto    GetDat4
  26.  
  27.  
  28. Txt_MPPal_4:
  29.         addwf   PCL, f
  30.         dt              0x34,0x2D,0x45,0x6E,0x76,0x69,0x61,0x72,0x20,0x44,0x61,0x74,0x6F,0x73,0x20,0x61,0x20,0x50,0x43

La pregunta es porqué sucede esto. Estuve buscando temas relacionados y de un tema de maunix y otro de LeonPIC me salió el manejo de estas tablas, pero de seguro estoy cometiendo algún error, no se si es por no incluir o definir PCLATCH o algún otro parámetro, lo curiosos es como les digo que con las 3 tablas del primer ejemplo sí mustra los caracteres pero al adicionarle al código las rutinas para que muestre la 4 tabla ya no funciona.

Por cierto, estoy usando un PIC16F877A con un Xtal de 8MHz. Alguna ayuda al respecto por favor??????

Gracias de antemano

Desconectado telojurito

  • PIC12
  • **
  • Mensajes: 55
Re: Problemas con tablas DT
« Respuesta #1 en: 10 de Septiembre de 2009, 16:24:41 »
Una disculpa, ya que por error dupliqué el tema. Si alguien pudiera borrar el anterior que está en este link se lo agradeceré.... para no crear confusiones....

http://www.todopic.com.ar/foros/index.php?topic=27505.0

Gracias

Desconectado telojurito

  • PIC12
  • **
  • Mensajes: 55
Re: Problemas con tablas DT
« Respuesta #2 en: 10 de Septiembre de 2009, 21:27:02 »
Hola estimados amigos,

En verdad como hace falta leer.....

Revisando el datasheet del PIC encontré que hay que tener cuidado al usar ADDWF PCL y menciona una referencia que es una Appl Note la AN556, en donde se menciona que es una buena practica realizar una serie de instrucciones antes de leer una tabla:

CALL and GOTO Instructions
When executing a CALL or GOTO, the low 11-bits are
loaded directly from the instruction opcode. The high
2-bits are loaded from bits 3 and 4 of the PCLATH register.
It is a good practice to pre-load PCLATH with the
high byte of the routine’s address before executing the
routine. This can be done as follows:

EXAMPLE 2:
Código: ASM
  1. .
  2. .
  3. movlw HIGH Table        ;load high 8-bit
  4.                         ;address of Table
  5. movwf PCLATH            ;into PCLATH
  6. call Routine            ;execute Call
  7.                         ;instruction
  8. .
  9. .
Realice los cambios descritos en esta Nota y problema resuelto.....  :-/ :-/ :-/ :-/

Los cambios quedaron como sigue, sólo muestro la primera de las rutinas ya que las demás son similares:

Código: ASM
  1. clrf    J
  2.                 banksel PCL
  3. GetDat  movlw   HIGH Txt_MPpal
  4.                 movwf   PCLATH
  5.                 movf    J,W
  6.                 call    Txt_MPpal
  7.                 movwf   TxtDat          ;Pone el dato recibido en W en TxtDat
  8.                 movlw   0x0C            ;Write Display Data
  9.                 call    Send_CMD
  10.                 movf    TxtDat,W
  11.                 call    Send_DAT
  12.                 incf    J,1
  13.                 movlw   0x0E
  14.                 xorwf   J,W
  15.                 btfss   STATUS,Z        ;Si XOR entre J y W dió cero, son iguales y salta Z=1
  16.                 goto    GetDat

Agradezco la atención prestada a la presente

Saludos

Desconectado jim_17

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 309
    • Blog personal
Re: Problemas con tablas DT
« Respuesta #3 en: 11 de Septiembre de 2009, 00:04:55 »
telojurito, Tengo una duda...

El programa no te funcionaba porque al hacer la llamada a la tabla, ésta se encuentra en otra página de la memoria de programa y por eso cargas esos dos bits donde se especifica en que página se encuentra la tabla, no ?

 Saludos !
Share the world !

Blog's

http://www.area0x33.com

Desconectado telojurito

  • PIC12
  • **
  • Mensajes: 55
Re: Problemas con tablas DT
« Respuesta #4 en: 11 de Septiembre de 2009, 01:52:12 »
Hola jim17,

No precisamente, ya que comente anteriormente con las 3 primeras rutinas de leer las tablas si me manda los caracteres y el problema viene al tratar de leer una cuarta tabla, que incluso note que no excedian los 256 bytes entre las 4 tablas apenas llegaban como 93 bytes o caracteres. Pense tambien dehecho en esto de las paginas de la memoria pero deduje que no era problema, ya que como se ve en el codigo cada vez que se lee una nueva tabla el PCL comienza en cero.

Lo que si deo reconocer es que no alcanzo aun a comprender bien las 2 lineas adicionadas:

GetDat   movlw   HIGH Txt_MPpal4.      
              movwf   PCLATH

en cuanto a que de que manera influyen en el codigo, si alguien pudiera ayudar a esclarecer esto se los agradecere mucho.

Saludos