Autor Tema: Cambio de página en manejo de tablas  (Leído 3312 veces)

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

Desconectado XTOPIC

  • PIC10
  • *
  • Mensajes: 17
Cambio de página en manejo de tablas
« en: 28 de Diciembre de 2009, 18:36:24 »
Hola.
Alguien tendría por favor alguna rutinita para manejar tablas y despreocuparse del manejo de cambio de página en entorno PIC16F ?
El tema es así: si la tabla es muy grande, puede darse el caso en que usando la típica forma de leer una Tabla como por ejemplo:

movf  offset,w
call     Tabla
.
.
Tabla
       addwf    PCL,W
DT ..... distintos valores dentro de la tabla

El tema es que dependiendo de dónde esté la Tabla,  el offset puede hacer un cambio de página con resultados no deseados.
Por ejemplo: si la tabla cae en la dirección de programa 0x0F3 y el offset es 0x1B la instrucción addwf PCL,F manda el PCL a 0x0E y no a 0x10E.
Se que para esto hay que manejar el PCLATH pero no encuentro una manera cómoda de hacerlo.
Por otra parte, no siempre se produce desborde de página.
En fin, si alguien ya lo hizo sabe de lo que estoy hablando.

Gracias por la ayuda

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: Cambio de página en manejo de tablas
« Respuesta #1 en: 28 de Diciembre de 2009, 18:42:04 »
mira justo antes que tu tuve este problema, pon en el buscador del foro "tablas" y te saldran muchos ejemplos. si no encuentras ninguno postea el codigo y vemos por ande se puede coger

un saludo

Desconectado XTOPIC

  • PIC10
  • *
  • Mensajes: 17
Re: Cambio de página en manejo de tablas
« Respuesta #2 en: 29 de Diciembre de 2009, 10:47:33 »
A ver,
Tomando como base el ejemplo de la AN556 de Microchip según el siguiente listado:
org 0x80
lazo_ppal
               movlw   LOW Tablita
               addwf    offset,F
               movlw   HIGH Tablita
               btfsc      STATUS,C
               addlw    1
               movwf   PCLATH
               movf     offset,W
               call       Tablita
               movwf   dummy
               goto      lazo_ppal

org 0x1fe
Tablita
             movwf     PCL  ; posición de memoria de programa 0x1fe
             retlw        'A'   ; posición de memoria de programa 0x1ff
             retlw        'B'   ; posición de memoria de programa 0x200
             retlw        'C'   ; posición de memoria de programa 0x201
             retlw        'D'   ; posición de memoria de programa 0x202
   end

El programa funciona bien para offsets mayores a cero (hace el cambio de página sin problemas cuando el offset es, por ejemplo: 3 entonces lee lo que está en la posición de memoria 0x201).
Cuando el offset es cero, se planta en 0x1fe y alli que ineternum .... :(
Si en lugar de movwf  PCL,  uso  addwf  PCL,F no hace el cambio de página cuando el offset es mayor que 1.

Ya busqué en el foro pero no encontré nada similar.
Gracias por cualquier ayuda.  :)


Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: Cambio de página en manejo de tablas
« Respuesta #3 en: 29 de Diciembre de 2009, 11:40:49 »
hola,mira lo que yo hago es utilizar macros.
dentro las direcciones comprendidas entre los valores FF,utilizo las siguientes lineas.

por ejemplo:

   org 0x000
   goto   inicio
inicio   org 0x005
   PAGINA_0
   
   call   1
   call    2
   call    3
   
   goto    inicio
   .
   .
   .
   .
   org 0x100
1   PAGINA_1
   
   codigo
   return
   .
   .
   .
2   org 0x200
   PAGINA_2
   
   return
   .
   .
   .
3   org 0x300
   include "otro_programa.inc"
   PAGINA_3
   
   return

abajo pongo tambien los macros para la conmutacion de los bancos de ram.
   





BANK0      MACRO                        ;CONMUTACION DE BANCOS
         BCF   STATUS,IRP
         bcf      STATUS,RP0
         bcf      STATUS,RP1
         ENDM
BANK1      MACRO
         BCF   STATUS,IRP
         bsf      STATUS,RP0
         bcf      STATUS,RP1
         ENDM
BANK2      MACRO
         BSF   STATUS,IRP
         bcf      STATUS,RP0
         bsf      STATUS,RP1
         ENDM
BANK3      MACRO
         BSF   STATUS,IRP
         bsf      STATUS,RP0
         bsf      STATUS,RP1
         ENDM

PAGINA_0   MACRO                        ;CONMUTACION DE PAGINAS
         BCF      PCLATH,3
         BCF      PCLATH,4
         ENDM
PAGINA_1    MACRO
         BSF      PCLATH,3
         BCF      PCLATH,4
         ENDM
PAGINA_2   MACRO
         BCF      PCLATH,3
         BSF      PCLATH,4
         ENDM
PAGINA_3   MACRO
         BSF      PCLATH,3
         BSF      PCLATH,4
         ENDM   

lo que en definitiva quiero decir.es que no se puede saltar de un banco a otro si no conmutamos las paginas.
por eso si saltamos de un banco a otro.hay que reflejarlo poniendo la conmutacion en la primera instruccion

ya hace tiempo que no he hecho programas tan largos y no se si se me ha saltado algun detalle.
o estoy equivocado en algo.pero el camino es este.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: Cambio de página en manejo de tablas
« Respuesta #4 en: 29 de Diciembre de 2009, 13:06:52 »
yo lo veo asi
Citar
lazo_ppal
               movlw   LOW Tablita
               addwf    offset,F
               movlw   HIGH Tablita
               btfsc      STATUS,C 
               addlw    1               
               movwf   PCLATH
               movf     offset,W
               call       Tablita           ya aqui cuando hace el salto va a ir al la pagina donde esta apuntando el pcH, que a lo mejor no es la misma pagina que ''tablita''
               movwf   dummy
               goto      lazo_ppal

org 0x1fe
Tablita
             movwf     PCL  ; posición de memoria de programa 0x1fe ;ademas aqui deberias sumarle w al pcl para que añada el nº al que se encuentra
             retlw        'A'   ; posición de memoria de programa 0x1ff
             retlw        'B'   ; posición de memoria de programa 0x200
             retlw        'C'   ; posición de memoria de programa 0x201
             retlw        'D'   ; posición de memoria de programa 0x202

por si te da una idea
Citar
lazo_ppal
               pagesel  tablita            ;antes de saltar se cambia el pch por si no coincide en la misma pagina
               call        tablita           ;salta y al volver
               pagesel  lazo_ppal        ;se restaura el pch, no es necesario la pila lo pone como estaba el pc antes del salto (digamoslo asi)
               movwf   dummy           ;y al dummy
               goto      lazo_ppal        ;y vuelve otra vez

tablita
               movlw   LOW Tablita
               addwf    offset,F
               movlw   HIGH Tablita
               btfsc      STATUS,C
               addlw    1                 
               movwf   PCLATH
             addwf    PCL  ; posición de memoria de programa 0x1fe   y al saltar carga pcH 5bits y pcL 8bits sobre el registro pc
             retlw        'A'   ; posición de memoria de programa 0x1ff
             retlw        'B'   ; posición de memoria de programa 0x200
             retlw        'C'   ; posición de memoria de programa 0x201
             retlw        'D'   ; posición de memoria de programa 0x202

un saludo

Desconectado XTOPIC

  • PIC10
  • *
  • Mensajes: 17
Re: Cambio de página en manejo de tablas
« Respuesta #5 en: 29 de Diciembre de 2009, 13:34:52 »
Hola groundman
Muchas gracias por tu respuesta y son muy útiles los datos que me has dado.
Sin embargo el problema está en que no siempre el comienzo de la tabla está al comienzo de página y por otra parte qué pasa si la tabla es de, por ejemplo, 520 bytes?
Ya sé que parece exagerado, pero necesito generar tablas grandes.
Seguiré probando y nuevamente , gracias.

 :)

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: Cambio de página en manejo de tablas
« Respuesta #6 en: 30 de Diciembre de 2009, 11:11:34 »
se lo que quieres decir.por eso siempre intento comenzar una tabla al principio de una paginal.
pero si tienes que poner la tabla compartiendo dos paginas,vas a tener que guardar el PCL.y realizar unos calculos para los saltos.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Cambio de página en manejo de tablas
« Respuesta #7 en: 27 de Enero de 2010, 02:04:52 »
Me parece que es un error tuyo.

Código: ASM
  1. org 0x80
  2. lazo_ppal
  3.                movlw   LOW (Tablita+1)
  4.                addwf    offset,F                           ;ojo! Hay destruccion del valor original de "offset"
  5.                movlw   HIGH (Tablita+1)
  6.                btfsc      STATUS,C
  7.                addlw    1
  8.                movwf   PCLATH
  9.                movf     offset,W
  10.                call       Tablita
  11.                movwf   dummy
  12.                goto      lazo_ppal
  13.  
  14. org 0x1fe
  15. Tablita
  16.              movwf     PCL  ; posición de memoria de programa 0x1fe
  17.              retlw        'A'   ; posición de memoria de programa 0x1ff
  18.              retlw        'B'   ; posición de memoria de programa 0x200
  19.              retlw        'C'   ; posición de memoria de programa 0x201
  20.              retlw        'D'   ; posición de memoria de programa 0x202
  21.    end

Debes haber cambiado algo de la AN556, o bien no contemplaba offset = 0. Con ese detalle deberia funcionar.

Suerte.
"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.


 

anything