Al igual que BANKSEL, PAGESEL es tomado por el compilador como un comando a ser convertido a ensamblador, solo que PAGESEL es utilizado para hacer cambios de pagina del programa (memoria flash) y BANKSEL se utiliza para hacer cambios en los bancos de memoria RAM y registros especiales del micro controlador.
Cuando utilizas BANKSEL tienes que especificar el registro al que te quieres dirigir, por ejemplo:
CMCON se encuentra en el banco 1 de la memoria RAM de PIC16F873A,874A,876A y 877A; por lo tanto es necesario realizar el cambio de los bits STATUS <RP1:RP0>. Y es lo que hace la comando BANKSEL, cambia esos bits para asegurarte de que estés en el Banco adecuado.
Ahora, te muestro la misma rutina, pero en ensamblador:
NOTA: Te preguntaras por que en el "Program Memory" aparece MOVWF CCPR2H en lugar de aparecer MOVWF CMCON como la instrucción lo pide. Bueno, pues es un "error" que tiene IDE, en realidad lo que sucede es que, si vas al Datasheet, CCPR2H y CMCON están a la misma "altura" de bancos:
Y los toma como si se tratase del mismo registro, pero no, el puntero se dirige al registro CMCON, de ahí se origina el famoso mensaje:
Message[302]C: ... Register in operand not in bank 0. Ensure that bank bits are correct.
El cual eliminas con: errorlevel -302
Ahora, y disculpa que te haya tirado el choro acá arriba pero es mejor demostrar con ejemplos, te muestro lo de PAGESEL.
Funciona de la misma manera que BANKSEL. Es un comando que toma MPLAB para convertir a ensamblador. Solo que aquí, en lugar de darle como referencia un Banco de trabajo, le das como referencia una etiqueta, es decir:
Y la instrucción es cambiar los bits de PCLATH. Como podrás darte cuenta, lo que se hace es poner el comando PAGESEL seguido de la etiqueta, esto te dirigirá a la pagina en la que se encuentra esa etiqueta y después puedes llamar a esa etiqueta y a cualquier otra que se encuentre dentro de esa misma página, solo recuerda que cuando ya no vayas a trabajar con funciones o etiquetas de esa pagina debes de regresar a la página en la que estabas trabajando, puedes volver a utilizar PAGESEL y poner la etiqueta de una función que se encuentre en esa pagina, por que, cabe aclarar, PAGESEL no te dirige a funciones, te dirige a paginas donde se encuentran esas funciones, yo puedo venir y poner:
Código:
PAGESEL FUNCION_0_PAG_1
;PERO DESPUES VENIR Y LLAMAR A
CALL FUNCION_1_PAG_1
Ahora, te muestro como se hace en ensamblador:
Si te das cuenta, aquí me ahorre una línea de código al poner solo BSF PCLATH,4; puesto que yo sabia que me encontraba trabajando en la pagina 0 (unas cuantas líneas arriba estaba el código ORG 0x0000), solo hice el cambio de PCLATH,4 para dirigirme a la pagina 2.
Como te darás cuenta son exactamente lo mismo, solo que PAGESEL y BANKSEL siempre tomaran 2 líneas de código de ensamblador puesto que no sabe en que página o banco se encuentran trabajando. Tú como programador sabes en que banco y pagina trabajas y puedes ahorrarte unas cuantas líneas de código al saber eso, líneas que te ahorran tiempo de procesamiento.
Esos cambios de banco y de pagina son en los que muchas veces los compiladores, no dedicados a ensamblador, abusan y generan "código basura" y te consumen memoria flash.