Autor Tema: Consulta: varias tablas con una misma subrutina  (Leído 3537 veces)

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

Desconectado flacoclau

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1692
    • El Micro Reactor
Consulta: varias tablas con una misma subrutina
« en: 28 de Agosto de 2006, 04:19:52 »
Hola a todos:

mi consulta es: como puedo hacer para mostrar distintos mensajes en un display, utilizando siempre el mismo bucle pero seleccionando distintas tablas, si alguien me puede ayudar se lo agradecería.
este es un bosquejo de lo que sería parte del programita:

     movlw   .1          ;selecciona mensaje 1
     movwf   nro_mensaje
     call    bucle
     .
     .
     movlw   .2          ;selecciona mensaje 2
     movwf   nro_mensaje
     call    bucle
     .
     .
     movlw   n           ;selecciona mensaje n
     movwf   nro_mensaje
     call    bucle
     .
     .
bucle
     clrf contador
incremento
     incf   contador,1
     movf   contador,0
     call   tabla        ;en esta parte podría seleccionar la tabla
     btfsc  contador,7   ;si el bit 7 es 0 continúa el bucle
     return
     call   caracter
     goto   incremento


tabla1
     addwf  pcl,1
     retlw  'h'
     retlw  'o'
     retlw  'r'
     retlw  'a'
     retlw  'r'
     retlw  'i'
     retlw  'o'
     bsf contador,7      ;avisa el fin de la tabla
     return

tabla2
     addwf  pcl,1
     retlw  'e'
     retlw  'n'
     retlw  't'
     retlw  'r'
     retlw  'a'
     retlw  'd'
     retlw  'a'
     bsf contador,7
     return

tablan
     addwf  pcl,1
     retlw  'a'
     retlw  'd'
     retlw  'i'
     retlw  'o'
     retlw  's'
     bsf contador,7
     return

Saludos.   
« Última modificación: 28 de Agosto de 2006, 04:22:22 por flacoclau »
Las personas con buena ortografía me atraen textualmente.

El Micro Reactor

Córdoba capital - Argentina.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Consulta: varias tablas con una misma subrutina
« Respuesta #1 en: 28 de Agosto de 2006, 16:27:04 »
Hola.
Bueno, nada facil lo que pedis, pero acepto el desafío :D :D.
Como podras saber, los PIC contienen paginas.No se que modelo de PIC estas usando. Supuse que es un 16F84A, aunque es facil migrar el codigo a otro modelo de PIC.
Aqui te muestro la estructura de las sub-páginas del 16F84A:

PIC 16F84A
Sub-página:Rango memoria:
00x000-0x0FF
10x100-0x1FF
20x200-0x2FF
30x300-0x3FF

La subrutina "bucle" es ahora un gestor de mensajes. Es el que selecciona la tabla de la cual tomar los datos y hace el resto de las operaciones necesarias. El maximo numero de mensajes que puede llamar son 124 aprox.(no he sacado las cuentas, pero por ahi anda).
¿Como funciona? Pues basicamente he hecho una tabla que selecciona una de las tablas de los mensajes.
Como deseabas que el bucle se encargara de todo, lo que hice, fue multiplicar nro_mensaje por 2.
¿Para que?
Para que una vez que se haya llamado a la tabla  correspondiente y vuelva, poder redireccionarla a la rutina de analisis: sale.

Entonces, aqui tienes una rutina que controla hasta 124 tablas de mensajes.
Con respecto a los limites y precauciones con las tablas de mensajes:
Debes asegurarte que ninguna tabla cruce dos sub-paginas. Las sub-paginas son porciones de memoria de programa y su tamaño es 256 words.
¿Que pasa si una tabla cruza dos sub-paginas?
El programa se desviara de su curso, y saltara a zonas erroneas, produciendo que el programa falle.

¿Cómo darse cuenta que una tabla esta cruzando dos sub-paginas?
Pues lo mas simple es usando la opcion "Disassembly Listing" del MPLAB. una vez ensamblado tu archivo en el MPLAB, te vas a esta opcion, y veras el codigo. A la izquierda mostrara la posicion de memoria en la cual se encuentra cada linea.

La primer imagen adjunta muestra una tabla de mensaje que cruza dos sub-paginas.
Fijate que es facil detectarla, ya que el 2XX pasa a valer 3XX. Esto significa que esta cruzando una sub-pagina.

¿Cómo lo solucionas?
Pues en la imagen, puedes ver que la tabla que cruza es la tabla46.Para evitarlo, reacomodas la tabla al inicio de la proxima sub-pagina. ¿Cómo? Agregando la directiva ORG   0x300 antes de declarar la tabla.Al hacerlo podras ver que una vez ensamblado nuevamente, y dirigiendote al Disassembly Listing, veras que la tabla ya no cruza mas dos sub-paginas. Mira la otra imagen y te daras cuenta.

He aquí un resumen de cómo quedaría organizada la memoria tal cual yo hice el programa:

PIC 16F84A
Sub-página:Rango memoria:
00x000-0x0FF
10x100-0x1FFreservado para gestor de tablas
20x200-0x2FFlas tablas aquí
30x300-0x3FFposibles futuras tablas aquí


Las imágenes del "Disassembly Listing":

Tabla mal ubicada Tabla bien ubicada


El código:

Código: ASM
  1. movlw   .0              ;selecciona mensaje 0
  2.         call    bucle
  3.  
  4.         movlw   .1              ;selecciona mensaje 1
  5.         call    bucle
  6.  
  7.         movlw   .2              ;selecciona mensaje 2
  8.         call    bucle
  9.  
  10.         movlw   .n              ;selecciona mensaje "n"
  11.         call    bucle
  12.  
  13.  
  14.         ORG     0x100
  15.  
  16. bucle
  17.         movwf   nro_mensaje
  18.         clrf    contador
  19.  
  20. mini_loop
  21.         PAGESELW        $
  22.         movwf   PCLATH
  23.         bcf     STATUS,C
  24.         rlf     nro_mensaje,0
  25.         addwf   PCL,F
  26.         call    tabla0
  27.         goto    sale
  28.         call    tabla1
  29.         goto    sale
  30.         call    tabla2
  31.         goto    sale
  32.         call    tablan
  33.        
  34. sale
  35.         btfsc   contador,7      ;si el bit 7 es 0 continúa el bucle
  36.         return
  37.  
  38.         incf    contador,1
  39.         call    caracter
  40.         goto    mini_loop
  41.  
  42.         ORG     0x200
  43.  
  44. tabla0
  45.         PAGESELW        $
  46.         movwf   PCLATH
  47.         movf    contador,w
  48.         addwf  PCL,1
  49.         DT      "horario"
  50.         bsf     contador,7      ;avisa el fin de la tabla
  51.         return
  52.  
  53. tabla1
  54.         PAGESELW        $
  55.         movwf   PCLATH
  56.         movf    contador,w
  57.         addwf   PCL,1
  58.         DT      "entrada"
  59.         bsf     contador,7
  60.         return
  61.  
  62. tabla2
  63.         PAGESELW        $
  64.         movwf   PCLATH
  65.         movf    contador,w
  66.         addwf   PCL,1
  67.         DT      "adios"
  68.         bsf     contador,7
  69.         return
  70.  
  71. tablan
  72.         PAGESELW        $
  73.         movwf   PCLATH
  74.         movf    contador,w
  75.         addwf   PCL,1
  76.         DT      "TABLAN"
  77.         bsf     contador,7
  78.         return
  79.  
  80. caracter
  81.         ;W contiene el dato a enviar
  82.         ;rutina envio dato al LCD aqui!
  83.  
  84.         return

Adjunto el programa listo para simular con MPLAB SIM.

Saludos.
« Última modificación: 28 de Agosto de 2006, 16:28:37 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Consulta: varias tablas con una misma subrutina
« Respuesta #2 en: 28 de Agosto de 2006, 18:05:49 »
flacoclau, sin desmerecer el valioso aporte del amigo Bruno, te pongo otros link que tal vez también te sirvan

1) Tablas para PIC16F84A
2) Tablas para 16F628A - 16F648A
3) Tablas para 16F876



Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado flacoclau

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1692
    • El Micro Reactor
Re: Consulta: varias tablas con una misma subrutina
« Respuesta #3 en: 28 de Agosto de 2006, 22:46:01 »
Hola de nuevo: BrunoF impecable lo tuyo!!, eso de hacer una tabla para seleccionar tablas me sorprendió, no creo que se me hubiera ocurrido nunca jajaja, de verdad te agradezco muchisimo la solución y que te pusieras a escribir el assembler y encima probarlo!!!, y para maunix también, espectacular tu trabajo para solucionar el sobrepaso de las tablas, ya me pongo a hacer un hibrido con ambas "tesis" en mi programa (jejeje).
 Bueno para dato estoy usando un 16f877 y tengo un montón de mensajes para sacar por el lcd, el tema es que tengo el niple pero cuando me compila el asm no realiza los saltos de página y por lo tanto me dispongo a modificarlo como les comenté para reducir las tablas.
Bueno gracias de nuevo y saludos.
Las personas con buena ortografía me atraen textualmente.

El Micro Reactor

Córdoba capital - Argentina.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Consulta: varias tablas con una misma subrutina
« Respuesta #4 en: 29 de Agosto de 2006, 00:00:36 »
Bueno, muchas gracias por los halagos. Habia olvidado que Maunix habia hecho las rutinas para esto tambien.
Lo que yo intente aqui es mantener la estructura de tu programa. Hay muchas formas de hacer esto.
Las soluciones que propone Maunix a este tema son muy interesantes, deberias verlas y analizarlas. Valen la pena.
Deberias analizar cual de todos los metodos que te estamos indicando ocupa menos memoria de programa, ya que los mensajes se devoran la memoria de programa.

Otra cosa a tener en cuenta:

Código: ASM
  1. bsf     contador,7      ;avisa el fin de la tabla
  2.         return

yo cambiaría esas 2 líneas por un: RETLW 0xFF.
Cuando detectas el 0xFF, salis de la subrutina.
Por ahi parece poco el ahorro, pero si tenes 100 tablas ganas 100 posiciones de memoria.

Suerte con el "híbrido".
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado flacoclau

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1692
    • El Micro Reactor
Re: Consulta: varias tablas con una misma subrutina
« Respuesta #5 en: 29 de Agosto de 2006, 01:29:53 »
listooooo me gustó la modificación, la cambio ya!! gracias.
Las personas con buena ortografía me atraen textualmente.

El Micro Reactor

Córdoba capital - Argentina.