TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: pollastre 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,
-
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
-
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.
-
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,
-
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