En los microcontroladores tradicionales todas las operaciones se realizan sobre el acumulador. La salida del acumulador esta conectada a una de las entradas de la Unidad Aritmética y Lógica (ALU), y por lo tanto éste es siempre uno de los dos operandos de cualquier instrucción. Por convención, las instrucciones de simple operando (borrar, incrementar, decrementar, complementar), actúan sobre el acumulador. La salida de la ALU va solamente a la entrada del acumulador, por lo tanto el resultado de cualquier operación siempre quedara en este registro. Para operar sobre un dato de memoria, luego realizar la operación siempre hay que mover el acumulador a la memoria con una instrucción adicional.
En los microcontroladores PIC, la salida de la ALU va al registro W y también a la memoria de datos, por lo tanto el resultado puede guardarse en cualquiera de los dos destinos. En las instrucciones de doble operando, uno de los dos datos siempre debe estar en el registro W, como ocurría en el modelo tradicional con el acumulador. En las instrucciones de simple operando el dato en este caso se toma de la memoria (también por convención). La gran ventaja de esta arquitectura es que permite un gran ahorro de instrucciones ya que el resultado de cualquier instrucción que opere con la memoria, ya sea de simple o doble operando, puede dejarse en la misma posición de memoria o en el registro W, según se seleccione con un bit de la misma instrucción. Las operaciones con constantes provenientes de la memoria de programa (literales) se realizan solo sobre el registro W.
En la memoria de datos de los PIC’s se encuentran ubicados casi todos los registros de control del microprocesador y sus periféricos autocontenidos, y también las posiciones de memoria de usos generales. En el caso de los 16C5X, algunos registros especiales de solo escritura (TRIS y OPTION) no están accesibles dentro del bloque de memoria de datos, sino que solo se pueden cargar desde el registro W por medio de instrucciones especiales.
Contador de Programa
Este registro, normalmente denominado PC, es totalmente equivalente
al de todos los microprocesadores y contiene la dirección de la
próxima instrucción a ejecutar. Se incrementa automáticamente
al ejecutar cada instrucción, de manera que la secuencia natural
de ejecución del programa es lineal, una instrucción después
de la otra. Algunas instrucciones que llamaremos de control, cambian el
contenido del PC alterando la secuencia lineal de ejecución. Dentro
de estas instrucciones se encuentran el GOTO y el CALL que permiten cargar
en forma directa un valor constante en el PC haciendo que el programa salte
a cualquier posición de la memoria. Otras instrucciones de control
son los SKIP o “salteos” condicionales, que producen un incremento adicional
del PC si se cumple una condición especifica, haciendo que el programa
saltee, sin ejecutar, la instrucción siguiente.
El PC es un registro de 9 bits en los 16C54/55, 10 bits en el 16C56, y 11 bits en el 16C57, lo que permite direccionar respectivamente 512, 1024 o 2048 posiciones de memoria de programa.
Al resetearse el microprocesador, todos los bits del PC toman valor 1, de manera que la dirección de arranque del programa es siempre la ultima posición de memoria de programa. En esta posición se deberá poner una instrucción de salto al punto donde verdaderamente se inicia el programa.
A diferencia de la mayoría de los microprocesadores convencionales, el PC es también accesible al programador como registro de memoria interna de datos, en la posición de 02. Es decir que cualquier instrucción común que opere sobre registros puede ser utilizada para alterar el PC y desviar la ejecución del programa. El uso indiscriminado de este tipo de instrucciones complica el programa y puede ser muy peligroso, ya que puede producir comportamientos difíciles de predecir. Sin embargo, algunas de esta instrucciones utilizadas con cierto método, pueden ser muy útiles para implementar poderosas estructuras de control tales como el goto computado. Como el microprocesador opera con datos de 8 bits, y la memoria de datos es también de 8 bits, estas instrucciones solo pueden leer o modificar los bits 0 a 7 del PC.
Stack
En los microcontroladores PIC el stack es una memoria interna dedicada,
de tamaño limitado, separada de las memorias de datos y de programa,
inaccesible al programador, y organizada en forma de pila, que es utilizada
solamente, y en forma automática, para guardar las direcciones de
retorno de subrrutinas e interrupciones. Cada posición es de 11
bits y permite guardar una copia completa del PC. Como en toda memoria
tipo pila, los datos son accedidos de manera tal que el primero que entra
es el ultimo que sale.
En los 16C5X el stack es de solo dos posiciones, mientras que en los 16CXX es de 8 posiciones y en los 17CXX es de 16 posiciones. Esto representa, en cierta medida, una limitación de estos microcontroladores, ya que no permite hacer uso intensivo del anidamiento de subrutinas. En los 16C5X, solo se pueden anidar dos niveles de subrutinas, es decir que una subrutina que es llamada desde el programa principal, puede a su vez llamar a otra subrutina, pero esta ultima no puede llamar a una tercera, porque se desborda la capacidad del stack, que solo puede almacenar dos direcciones de retorno. Esto de hecho representa una traba para el programador y además parece impedir o dificultar la programación estructurada, sin embargo es una buena solución de compromiso ya que estos microcontroladores están diseñados para aplicaciones de alta velocidad en tiempo real, en las que el overhead (demoras adicionales) que ocasiona un excesivo anidamiento de subrutinas es inaceptable. Por otra parte existen técnicas de organización del programa que permiten mantener la claridad de la programación estructurada, sin necesidad de utilizar tantas subrutinas anidadas.
Como ya se menciono anteriormente, el stack y el puntero interno que lo direcciona, son invisibles para el programador, solo se los accede automáticamente para guardar o rescatar las direcciones de programa cuando se ejecutan las instrucciones de llamada o retorno de subrutinas, o cuando se produce una interrupción o se ejecuta una instrucción de retorno de ella.
Palabra de Estado del Procesador
La palabra de estado del procesador contiene los tres bits de estado
de la ALU (C, DC y Z), y otros bits que por comodidad se incluyeron
en este registro.
El bit PD (POWER DOWN) sirve para detectar si la alimentación fue apagada y encendida nuevamente, tiene que ver con la secuencia de inicialización, el watch dog timer y la instrucción sleep, y su uso se detallara en la sección referida al modo POWER DOWN. El bit TO (TIME-OUT) sirve para detectar si una condición de reset fue producida por el watch dog timer, esta relacionado con los mismos elementos que el bit anterior y su uso se detallara en la sección referida al WATCH DOG TIMER. Los bits de selección de pagina PA0/PA1/PA2 se utilizan en las instrucciones de salto GOTO y CALL, y se explicaran con detalle en la sección referida a las instrucciones de control, y a la organización de la memoria de programa. En realidad en el 16C54 estos bits no se usan y sirven para propósitos generales. En el 16C57 el PA0 si se usa pero los otros dos no. En el 16C55 se utilizan PA0 y PA1. PA2 esta reservado para uso futuro y en cualquiera de los PIC 16C5X sirve para propósitos generales.
OTROS REGISTROS ESPECIALES
Las ocho primeras posiciones del área de datos están reservadas para alojar registros de propósito especial, quedando las restantes libres para contener los datos u operandos que se desee (registros de propósito general).
El registro INDF que ocupa la posición 0 no está implementando
físicamente y, como se ha explicado, se le referencia en el direccionamiento
indirecto de datos aunque se utiliza el contenido de FSR.
En la dirección esta el registro TAR0 (Temporizador) que puede
ser leído y escrito como cualquier otro registro. Puede incrementar
su valor con una señal externa aplicada al pin T0CKI o mediante
el oscilador interno.
El PC ocupa la posición 2 del área de datos en donde se halla el registro PCL al que se añaden 3 bits auxiliares y se conectan con los dos niveles de la Pila en las instrucciones CALL y RETLW.
El registro de Estado ocupa la posición 3 y entre
sus bits se encuentran los señalizadores
C, DC y Z y los bits PA1 y PA0 que seleccionan la página
en la memoria de programa. El bit 7 (PA2) no está implementando
en los PIC de la gama baja.
FRS se ubica en la dirección 4 y puede usarse para contener las dirección del dato en las instrucciones con direccionamiento indirecto y también para guardar operandos en sus 5 bits de menos peso.
Los registros que ocupan las posiciones 5 ,6 y 7 soportan los Puertos A, B y C de E/S. Pueden ser leídos y escritos como cualquier otro registro y manejan los valores de los bits que entran y salen por los pines de E/S del microcontrolador.