Autor Tema: BANKSEL , qué banco elige si hay varias opciones?  (Leído 10355 veces)

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

Desconectado pollastre

  • PIC12
  • **
  • Mensajes: 65
BANKSEL , qué banco elige si hay varias opciones?
« en: 16 de Abril de 2007, 14:45:05 »
buenas a todos,

una pregunta muy sencilla: en determinados PICs (hablo de la serie 16x) , ciertos registros pueden ser direccionados desde más de un banco, como sabeis. Los ejemplos más claros y conocidos son STATUS (accesible desde los cuatro bancos), o por ejemplo OPTION_REG.

Mi pregunta es, una directiva BANKSEL, frente a un registro que puede ser accedido desde varios bancos... cómo se comportará? cual banco elegirá?

La pregunta no es baladí, considerad este sencillo ejemplo :

------------------
BANKSEL PORTA
clrf PORTA

movf RCREG,0
-------------------


En un 16F648A, la directiva BANKSEL siempre irá al banco '0', y el código tendrá un comportamiento determinista. Sin embargo, si tomamos un 16F689, PORTA podría ser accedido desde el banco 0 o desde el banco 2.
Si BANKSEL me selecciona el banco 2, automáticamente el código deja de funcionar, pues RCREG pertenece al banco 0, y no al 2.

Por lo tanto, la pregunta es: existe alguna regla según la cual BANKSEL se guíe para elegir un banco determinado, cuando tiene varias opciones?

gracias y un saludo,


Desconectado fartet

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 145
Re: BANKSEL , qué banco elige si hay varias opciones?
« Respuesta #1 en: 16 de Abril de 2007, 20:22:50 »
Aún queda una tercera posibilidad en el caso del 16F689, y es que
BANKSEL PORTA
se limite a poner a cero el bit RP0, ignorando el valor que pueda tener RP1 puesto que su valor es irrelevante para direcionar el registro PORTA, con lo que tenemos tres posibilidades:
- Que seleccione siempre el banco 0
- Que seleccione siempre el banco 2
- Que seleccione el banco 0 si RP1 era 0 y el banco 2 si RP1 era 1*

Supongo que no será muy dificil comprobarlo con el MPLAB provocando los distintos supuestos de partida.

(*) Intuyo que los ficheros accesibles desde diferentes bancos no están repetidos, sino que son ficheros únicos, simplemente no les afectan algunos, o incluso ninguno como a STATUS, de los bits de direccionamiento de banco, por lo que podría ser factible que BANKSEL ignore a dichos bits cuando no son determinantes en el direccionamiento del registro seleccionado (Lo comprobaré en cuando tenga un rato sin calentura).

saludos

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: BANKSEL , qué banco elige si hay varias opciones?
« Respuesta #2 en: 16 de Abril de 2007, 21:35:26 »
Tendrías que comprobarlo con el MPASM y fijarte qué sucede.

Por mis conocimientos adquiridos, creo poder asegurar que si un registro es accedible desde todos los bancos del PIC en cuestión, es completamente INDISTINTO el banco seleccionado desde el cual se desee acceder a el mísmo.

Las leyes de selección puede que estén determinadas, en primera instancia, dentro del archivo .inc del PIC seleccionado.

Si el registro en cuestión aparece declarado sólo 1 vez en dicho archivo(pese a existir en más de una vez en el mapa de memoria del PIC) creería y casi aseguraría que el MPASM al ejecutar la MACRO BANKSEL, seleccionaría los valores para RP0 y RP1 según el único valor que figure en dicho archivo.

Con respecto a la macro BANKSEL, cada vez que la llames SI O SI debería generar el siguiente par de instrucciones:

   B*F STATUS,RP0
   B*F STATUS,RP1

donde el asterisco podría adquirir el valor "C" o "F"(quedando BCF o BSF segun corresponda).



NO ES CIERTO QUE SI POR EJEMPLO HAGO:

   BCF STATUS,RP1
   BCF STATUS,RP0

   movlw .5
   movwf PORTA

Inicia
   BANKSEL PORTA
   nop
   ...

el MPASM al ensamblarlo NO GENERE dicho par de instrucciones, si bien parecería a primera vista innecesario

¿Por que?

Porque en otra parte del código del programa podría tener:

   BANKSEL   TRISB
   movlw   0xFF
   movwf   TRISB
   goto   Inicia

Y como vemos aquí, surgiría un error si el MPASM hubiese ignorado el BANKSEl, ya que para que el codigo funcione bien, al momento de ejecutarse el goto el PIC se encuentra en el banco1
y necesito de las instrucciones generadas por el BANKSEL PORTA para poder afectar corretamente luego al PORTA y no al TRISA.
¿Se entiende?





P.D. Recién husmee el archivo .inc del 16F689 y efectivamente,como era logico y de esperarse,los registros repetidos en mas de un banco son declarados sólo con su MENOR posición de memoria entre todas las disponibles.

Entonces, podría estar en condición necesaria y suficiente para afirmar que el MPASM al hacer un BANKSEL, en caso que el registro exista en más de un banco del PIC, eligirá el banco correspondiente al valor asignado dentro del archivo .inc

Ejemplo:

Si el PIC se encuentra en el banco 1 y hago:

   BANKSEL INTCON

Si bien INTCON existe en el banco 1, también existe en el cero y es precisamente este último el UNICO que está declarado en el archivo .inc. Entonces quedará:

   BANKSEL 0x0B

Lo que generará el siguiente código ASM final:

   BCF 0x03,6      ;BCF STATUS,RP1
   BCF 0x03,5      ;BCF STATUS,RP0


Saludos.
« Última modificación: 16 de Abril de 2007, 21:39:38 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 pollastre

  • PIC12
  • **
  • Mensajes: 65
Re: BANKSEL , qué banco elige si hay varias opciones?
« Respuesta #3 en: 17 de Abril de 2007, 06:23:58 »
Citar
Entonces, podría estar en condición necesaria y suficiente para afirmar que el MPASM al hacer un BANKSEL, en caso que el registro exista en más de un banco del PIC, eligirá el banco correspondiente al valor asignado dentro del archivo .inc



Hay premio para el caballero....
exactamente, esa es la solución. A mí no se me ocurrió mirar en los .INC, pero usando un poco la lógica, de alguna manera intuía que un BANKSEL siempre debería apuntar al MENOR banco disponible en el caso de que hubiera varios. Una generación de código determinista por parte del assembler MPASM exigía algo similar... sino, podrían montarse buenos pollos en algunos códigos  :mrgreen:

muchísimas gracias a todos,

Desconectado fartet

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 145
Re: BANKSEL , qué banco elige si hay varias opciones?
« Respuesta #4 en: 17 de Abril de 2007, 09:22:07 »
Totalmente de acuerdo con Bruno, el MPASM utiliza el .inc correspondiente para determinar la acción de BANKSEL, incluso sobre aquellos registros que son visibles desde diferentes bancos.

Saludos