Autor Tema: Error con la directiva PAGESEL  (Leído 3317 veces)

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

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Error con la directiva PAGESEL
« en: 28 de Febrero de 2010, 13:47:34 »
Estoy trabajando con el MPLAB versión 8,43.

Realicé una tabla y antes de llamar a la tabla, coloco la instrucción pagesel  tabla. El problema se presenta porque no se comporta como se debe comportar y he tenido que sacar la directiva y configurar manualmente al PCLATH

Por ejemplo, tengo la siguiente tabla ubicada en la posición 0110h

Código: ASM
  1. TABLA       ADDWF       PCL,F
  2.             NOP
  3.             GOTO         A
  4.             GOTO         B

Cuando coloco la directiva PAGESEL   TABLA, en la memoria de programa se carga con

Código: ASM
  1. BCF    PCLATH,0
  2. BCF    PCLATH,1

Al momento de ejecutar la tabla, cuando hace la suma, el CP salta a cualquier lado, menos donde tiene que ir. Para ello tuve que sacar la directiva y ajustar manualmente al pclath:

Código: ASM
  1. BSF     PCLATH,0
  2. BCF     PCLATH,1

Y entonces funciona de 10.
¿A alguien más le pasa?
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: Error con la directiva PAGESEL
« Respuesta #1 en: 28 de Febrero de 2010, 14:35:15 »
creo que es por que la primera pagina del pic es hasta la linea 0x03ff si tu tabla esta en la 0x0110 esta dentro de la pagina 0 por lo que el pagesel te dara
      BCF    PCLATH,0
      BCF    PCLATH,1
ponla en ORG 0x0800 y prueba el pagesel a ver si te cambia el pclath

un saludo

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Error con la directiva PAGESEL
« Respuesta #2 en: 28 de Febrero de 2010, 15:21:04 »
Es lo que me llama la atención. Porque para cambiar de página, debería de ajustar los bit 3;4 (que es lo que hace el pagasel) pero para evitar que el CP haga cualquiera, tengo que ajustar manualmente los bit 0;1 del pclath  :shock:

Al estar los primeros 2K de memoria, no debería haber problemas, sin embargo me los presenta.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: Error con la directiva PAGESEL
« Respuesta #3 en: 28 de Febrero de 2010, 16:21:20 »
a ver si repasando un poco me entero y puedo explicarlo sin que me lie, los saltos en una tabla se pueden dar de 0xff por los 8 bits del registro pcl y a cada bloque de pagina de 255 con los bits 0-2 del pclath,  usea son 8. y la pagina con los bits 3 y 4 de pclath por lo que son 4
pagina - bloque - linea
 X X  -  X X X  -  X X X X X X X
la directiva pagesel solo escribe sobre pclath 3 y 4 que no me habia fijado. no direcciona el salto si cambias de bloque dentro de una misma pagina
creo que lo que normalmente se hace es sumar al pc la direccion del salto addwf pcl,f y testear btfsc status,c si el valor es mayor al bloque de pagina, incf pclath deberia colocarte el siguiente bloque o pagina al que este situado
Citar
tabla
   movf   pcl,w
   addwf  direccion_de_salto,w
   btfsc   status,c
   incf    pclath,f

   movf  direccion_de_salto,w
   addwf  pcl,f
 dt .0, .1, .2, ........
quede claro que se me acaba de ocurrir mientras repasaba, mas como ejemplo para explicar, si el salto es de mas de un bloque, dificil con 0xff ya se me salen las cuentas. prueba y nos cuentas

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Error con la directiva PAGESEL
« Respuesta #4 en: 28 de Febrero de 2010, 16:55:46 »
Me ganaste de mano.
Tuve que repasar todo de nuevo sobre el PCL y pasa eso. Solo se puede sumar hasta 8 bit (255) y como la tabla está más de 8 bit pasa lo que me pasó.
En efecto, lo que pasaba era lo siguiente:

Supongamos que tengo la tabla así

01CE  tabla  addwf    pcl,f
01CF         nop
01D0         retlw    .....
01D1         retlw    .....


Y W = 0, cuando se hace la suma, el PC va a saltar al valor 00CF (CE + W +1 = CF) y como el PCLATH 0;1 valen cero, salta a CF.Como bien lo has dicho alogic, para sumarle al PCL en una posición mayor a FF, hay que ajustar los bit 0;1 del PCLATH.

Resumiendo, no es un error del PAGESEL, es un error por no ajustar los bit de bajo peso del PCLATH.
Esto genera una pregunta, ¿hay alguna directiva que ajuste automáticamente los bit de menor peso del PCLATH?

Bueno, tengo que averiguarlo.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Error con la directiva PAGESEL
« Respuesta #5 en: 15 de Marzo de 2010, 21:34:56 »
El PC esta dividido en 2 registros: PCH y PCL. El PCH es solo escribible(con demora(LATCH)) mediante un registro esclavo, llamado PCLATH.

El PAGESEL sirve para hacer CALL's a subrutinas que no estan ubicadas en la pagina actual(1 pagina =2kWords).

Me parece que estas buscando la directiva HIGH, que toma los bits (8-15) de un valor pedido.

movlw HIGH TABLA
movwf PCLATH
call TABLA


TABLA addwf PCL,F
          nop
.....
....
...
"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 Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Error con la directiva PAGESEL
« Respuesta #6 en: 15 de Marzo de 2010, 23:26:18 »
Muchas gracias Bruno.
Como no podía encontrarla, me fijaba en que parte queda cada tabla y ajusto manualmente al bit PCLATH tal como hace esa directiva (HIGH)
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado JBQ

  • PIC16
  • ***
  • Mensajes: 118
Re: Error con la directiva PAGESEL
« Respuesta #7 en: 16 de Marzo de 2010, 10:18:17 »
Hola Leon Pic, me parece que esta directiva se ajusta mejor a lo que necesitas:

pageselw ............

ya que actualiza en 2 instrucciones el PCH, este donde este el origen de tu tabla.
un saludo.

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Error con la directiva PAGESEL
« Respuesta #8 en: 16 de Marzo de 2010, 10:41:11 »
Hola JBQ. Esa directiva no la he probado. En un rato hago las pruebas para ver si funciona.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.