MICROCONTROLADORES PIC II

Introducción.

En la primera parte de este artículo empezamos a describir las particularidades de dos microcontroladores básicos de MicroChip como son los PIC16F84A y PIC12C508A, aprendimos que el PIC12C508A sólo se puede quemar una única vez y que para un mejor aprovechamiento, antes de proceder a su uso, deberíamos emplear el más versátil PIC16F84A que siendo casi igual, nos permite más posibilidades de reprogramación, con lo que ahorraremos tiempo chips en posibles errores de programación. Unas simples nociones sobre la capacidad de memoria, la descripción de los pines y un poco sobre los registros.

Como decíamos, las instrucciones que se encuentran en la memoria flash o EEPROM que forman parte de un programa, se refieren a los bits de cada registro que determinan la entrada o salida de datos por los puertos mediante la CPU. Pero sigamos con los nuevos términos con los que debemos familiarizarnos.

La CPU esta formada por distintos registros llamados contador de programa PC, registro de instrucciones RI, decodificador y control de instrucciones DCI, unidad aritmética ALU y el más accesible registro de trabajo conocido por W (del sajón Work), ver detalle en la imagen.

Fig. 1

Ciclo de Instrucción.

Un microcontrolador PIC puede correr desde CC a 20MHz. según el modelo, este dato se puede conocer hojeando las notas de datos del fabricante. Puede utilizar el cristal de 4 u 8 MHz, que garantiza mayor precisión y un buen arranque del oscilador, el cristal debe ir acompañado de dos condensadores derivados a masa. Internamente, esta frecuencia de oscilación es dividida por cuatro, lo que hace que la frecuencia efectiva de trabajo sea de 1 MHz, por lo que cada instrucción se ejecuta en un microsegundo en el caso del cristal de 4MHz, ver imagen.

Fig. 2

Esto quiere decir que un ciclo de instrucción es igual a 4 ciclos de reloj y el ciclo de reloj lo define el oscilador externo al PIC, por ejemplo si tenemos como oscilador un cristal de cuarzo de frecuencia de 4Mhz, entonces el ciclo de reloj será 1/4 = 0.25 microsegundos, por lo tanto, el ciclo de instrucción será 4×0.25 = 1 microsegundo. Durante el tiempo de demora de los 4 ciclos de reloj, el ciclo de instrucción tiene las fases de búsqueda y la de ejecución.

Esto permite que mientras está ejecutándose una instrucción, durante la segunda mitad de instrucción, estará buscando la siguiente instrucción y es por esto que se le atribuye la característica de procesador de tipo segmentado y es lo que lo diferencia de la arquitectura de los microprocesadores.

Contador de Programa PC.

El contador de programa PC, es un registro de la CPU que se encarga de iniciar el proceso de cada ciclo de instrucción. El PC es el primer registro en entrar en acción con la ejecución de cada instrucción en la fase de búsqueda, el PC indica la dirección de localización de las instrucciones que se encuentran en la memoria de programa que se está ejecutando.

Como ya se ha mencionado el ‘F84 tiene implementado 1K de memoria de programa para albergar las instrucciones que forman nuestro programa. El ancho de palabra del PC es de 13 bits, con lo que pueden direccionarse hasta 4K de memoria de programa, sin embargo como el ‘F84 sólo dispone de 1K, con 10 bits será suficiente para direccionar toda esta memoria.

Así pues, durante el primer ciclo de reloj (de cada ciclo de instrucción) el PC será incrementado, si la primera instrucción es ORG 0x00, la dirección en PC será 0001h, en el siguiente ciclo de instrucción, la dirección a la que apuntará será PC+1 o sea 0002h, en los ciclos 2º y 3º de reloj se ejecuta la decodificación y control de la instrucción (DCI), seguidamente la operación de aritmética lógica de la instrucción decodificada, se realiza por la ALU y así se incrementará el PC en las siguientes instrucciones.

El cuarto ciclo de reloj se encarga de la búsqueda del código de la instrucción que sigue y se carga en el registro RI y así sucesivamente. Por tanto, cada línea de nuestro programa en la memoria hace referencia a los archivos de la memoria RAM y a sus bits, de modo que, están relacionados todos los elementos de la arquitectura interna del microcontrolador, lo que implica que es el programa quien especifica con que registros de la memoria RAM se trabaja y esta depende de la propia aplicación. Sigamos.

INTERRUPCIONES.

Las interrupciones, es una de las características más importantes de los microcontroladores por la capacidad en su control. Cuando se produce una interrupción el micro deja automáticamente lo que esté haciendo, va directo a la dirección 04h de programa y ejecuta lo que encuentre a partir de allí, hasta encontrarse con la instrucción RETFIE que le hará abandonar la interrupción y volver al lugar donde se encontraba antes de producirse dicha interrupción, se recomienda leer el artículo las interrupciones para más detalle.

STACK o  PILA

La pila es una zona de memoria que se encuentra separada de la memoria de programa y la de datos. Tiene una estructura LIFO (Last In First Out) o sea que, el último valor que se guarda es el primero en salir. En micros del tipo PIC16F84 y similares, se dispone de 8 niveles de profundidad con una longitud de 13 bits. Los 12CXXX, disponen de 2 niveles de profundidad, cada uno de ellos con una longitud de 13 bits. Su funcionamiento es el de un buffer, de tal forma que si se supera el segundo nivel se pierde el primero y se produce un error típico llamado desbordamiento. No se dispone de indentificador o bandera que indique un desbordamiento de la Pila.

Hay dos formas posibles de cargar la Pila, una es mediante una interrupción o a través de la instrucción CALL (llamada a subrutina), ambas hacen que el valor del PC se cargue en la Pila o STACK como último valor (o valor superior). Para recuperar el contenido de la Pila en el PC, hay que ejecutar una de estas instrucciones: RETURN (retorno de una subrutina), RETLW o con RETFIE (por una interrupción). Las instrucciones de salto CALL como GOTO, duran dos ciclos de instrucción en ejecutarse.

El espacio del STACK no es parte del programa ni tampoco el espacio de datos y el puntero del STACK no es legible o escribible. El PC (programa contador) es EMPUJADO (PUSHed) en el STACK cuando una instrucción CALL es ejecutada o una  interrupción causa una bifurcación. El STACK es POPed (REBAJADO) en caso de un RETURN, RETLW o una ejecución de instrucción RETFIE. No se modifica el PCLATH cuando el STACK es PUSHed o POPed.

La instrucción CALL es bastante usada en programación, es la encargada de bifurcar la normal ejecución de un programa, esto es, cuando se rueda un programa, el micro ejecuta línea a línea las instrucciones que encuentra hasta llegar al final para terminar, sin embargo, cuando en el camino encuentra una instrucción CALL (llamada a etiqueta), ésta instrucción apunta inevitablemente a una dirección distinta a la siguiente, la cual para poder seguir la ejecución del programa se usa una etiqueta, esa es la dirección donde continuará la ejecución del programa. Es como ir a un concierto y de pronto te quedas sin gasolina, debes cambiar de dirección para pasar antes por el surtidor y luego sigues tu camino al concierto. Es un funcionamiento parecido a las interrupciones que vimos antes.

Pero, todo esto del CALL ha causado un ‘revuelo’ en los distintos registros que se ven implicados en el, es decir, ocurren dos hechos, se salta a la dirección de la etiqueta y al mismo tiempo se guarda en la pila la dirección que va a continuación del CALL, para que cuando retorne del CALL, el programa siga desde la dirección guardada en la pila.

Esto evidencia que, si se tienen varios CALL anidados o sea, uno dentro del otro, en la pila se guardará la dirección que sigue a cada CALL y con cada RETURN se cargar el registro PC, con la dirección que se encuentra en la cola de la pila que, es la última dirección que se guardó y es la primera dirección en salir (LIFO).

REGISTRO OPTION

El registro OPTION es un registro legible y escribible que contiene varios bits de control para configurar el preescaler TMR0/WDT, la interrupción externa INT, el TMR0 y el débil nivel pull-up (forzado a alto) en PORTB. Como ya se ha descrito en otra parte, este registro con sus bits, tiene un dominio total sobre el preescaler con los PS0:PS2 <bit0:bit2>, ver imagen, con el bit3 PSA se asigna el preescaler al TMR0 o al WDT, el bit4 T0SE selecciona el flanco para TMR0 externo por RA4, el bit5 T0CS selecciona la fuente para el reloj (clock) TMR0 (RA4 o TMR0), el bit6 INTEDG selecciona el flanco subida-bajada de interrupción por RB0 y el bit7 RBPU nos permite activar/desactivar los pull-ups del PORTB, una observación cuando este bit7 = 1 los pull-ups están desactivados y cuando el bit7 = 0 estarán activados.

Fig. 3

Nota: Cuando el preescaler es adjudicado al WDT (PSA = ‘1’), TMR0 tiene una asignación de preescaler 1:1. Los bits PSA y  PS2 : PS0 (OPTION_REG < 3:0 >) determinan la asignación y la proporción preescaler. El aclarado del bit PSA asignará el preescaler al módulo Timer0.

REGISTRO INTCON

El registro INTCON es un registro legible y escribible que contiene varios bits para habilitar todas las fuentes de interrupción.

Fig. 4

Nota: El bit de bandera Interrupt es puesto a 1 cuando ocurre una condición interrupt, sin tener en cuenta el estado hábil del bit correspondiente o el bit global habilitado, GIE (INTCON <7>).

OSCILADOR.

El PIC F84 tiene 4 modos distintos de oscilador para su funcionamiento. Para que el micro empiece a correr, necesita de un reloj, este puede ser creado a partir de los distintos medios que describimos a continuación:

RC. Este es el sistema más sencillo y económico, consta de una red con una resistencia y un condensador, de los valores del condensador y de la resistencia dependerá la velocidad a la que oscile el pic. En la hoja de características del Pic se muestran los valores.

 XT. Es un acrónimo, viene de XTAL (o cristal en castellano). Para este modo de funcionamiento tendremos que disponer de un cristal de cuarzo externo al micro y dos condensadores. El valor del cristal generalmente será de 4Mhz. o 10Mhz. y los condensadores cerámicos serán de entre 20 y 33 pF. La exactitud de este dispositivo es muy alta, por lo que lo es muy recomendable en casi todas las aplicaciones.

HS. Cuando necesitemos aplicaciones de «alta velocidad», entre 8 y 10Mhz. Se basa en un resonador de tres patillas, los extremos corresponden al cristal de cuarzo y la del centro es el común de los condensadores que se conecta a masa.   

LP.  Quiere decir «Low Power» la velocidad máxima a la que podemos poner el pic con este oscilador es de 200Khz. Aproximadamente y al igual que el XT y el HS, necesitaremos de un cristal de cuarzo y unos condensadores. El cristal puede ser el típico que llevan los relojes de electrónicos que es, una pequeña cápsula de aluminio.

Como ya indicamos anteriormente, debemos tener presente que, según el tipo de oscilador que decidamos usar de los descritos, es el que debe activarse en el grabador a la hora de ‘quemar’ el programa, ya que si no coincide no oscilará o puede dar problemas de oscilación. 

MAS REGISTROS.

Cuando nos referimos al Banco 0, encontramos los registros: TMR0, PCL, STATUS, FSR, PORTA y PORTB. El significado de estos son los siguientes:

TMR0

Es un temporizador/contador de 8 bits de lectura/escritura con selector de reloj interno o externo con selección de flanco del reloj externo. Con un preescaler programable de 8 bits. El TMR0 puede operar de dos modos distintos, como:

 1- Temporizador: el registro incrementa su valor en cada ciclo de instrucción (Fosc/4).
 2- Contador: el registro incrementa su valor con cada impulso introducido por la patilla RA4/TOSKI.

En ambos casos, cuando el registro se desborda, es decir, llega a su valor máximo (en este caso 2^8 = 256. Como el 0 también se cuenta, el máximo valor sería 255), empieza de nuevo a contar a partir del 0, no sin antes informar de este evento a través de la activación de una bandera o flag y/o una interrupción, lo que se conoce como interrupción por desbordamiento (interrupt on overflow). 

El temporizador TMR0, es un registro que provoca una de las interrupciones posibles, si está interesado o no conoce este registro, se recomienda leer el documento interrupcionesdonde se describe con más profundidad y se puede obtener más información.

REGISTRO STATUS

El registro STATUS contiene el estado aritmético de la ALU, el estado del RESET y el bit del banco seleccionado para la memoria de datos. Como con cualquier registro, el registro STATUS puede ser el destino para cualquier instrucción. Si el registro STATUS es el destino de una instrucción que afecta los bits Z, DC o C, entonces la escritura para estos tres bits es inhabilitada. Estos bits son activados (SETeados) o limpiados Cleared, según la lógica del dispositivo. Además, los bits TO y PD no son escribibles.

Por lo tanto, el resultado de una instrucción con el registro STATUS puede ser un destino distinto del esperado. Por ejemplo:

CLRF STATUS limpiará los tres bits superiores y pondrá a 1 el bit Z. Esto deja el registro STATUS como: 000u u1uu (donde u = no cambia).

Deberían ser usadas sólo las instrucciones BCFBSFSWAPF y MOVWF para cambiar el registro STATUS (ver tabla 7-2 de las hojas del fabricante), porque estas instrucciones no afectan ningún bit del STATUS.

Es un registro de 8 bits que sirve para configurar ciertos aspectos del PIC. En la siguiente tabla se aprecia la disposición de los bits de dicho registro:

Fig. 5

El bit RP0: Indica el banco de memoria en el que se está trabajando, cuando vale 0 se selecciona el Banco 0 y cuando vale 1 el Banco 1.

PCL y PCLATH

Es un registro que se comporta como un contador por eso se le conoce como Contador de Programa, en él se indica la dirección de memoria que se leerá a continuación para su ejecución, en el caso del uso de tablas de datos su uso se hace imprescindible como ya se verá más adelante.

El contador de programa (PC) especifica la dirección de la instrucción a traer para su ejecución. El PC tiene 13 bits de ancho, el byte bajo se llama registro PCL, este registro es legible y escribible. El byte alto se llama registro PCH, este registro contiene los bits PC <12:8> y no son directamente legibles o escribibles. Si el PC (programa contador) es modificado o un test condicional es verdadero, la instrucción requiere dos ciclos. El segundo ciclo es ejecutado como un NOP. Todas las actualizaciones del registro PCH pasan por el registro PCLATH.

PORTA

Representa el puerto A, en el que cada bit es una línea que se puede hacer E/S del puerto A. Cuando se dice que los PIC16F84/A sólo disponen de 5 bits en el puertoA, es por motivo de que los tres bits de mayor peso (bit5 a bit7) no son operativos y se leen como 0.

PORTB

Este representa el segundo puerto, en este caso llamado puertoB, este puerto dispone de los 8 bits operativos, es decir, sus 8 líneas pueden en cualquier momento ser E/S.

En cuanto nos referimos al Banco 1, los puertos toman la denominación de TRISA y TRISB, ambos son una copia de puertoA y puertoB y tienen las mismas características que aquellos.  

WDT (Watchdog Timer)

Este registro es el llamado Perro Guardián del PIC. Esta es la capacidad que disponen algunos PIC para realizar un autoreset, si se ha previsto en su programación, lo que es muy útil ya que lo resetea, cuando por cualquier motivo se «cuelga» (se queda en un bucle infinito). Se trata de un registro el cual se debe borrar a intervalos con la instrucción CLRWDT, si transcurrido cierto tiempo el registro no se ha borrado el micro se resetea. Bastará disponer de un par de instrucciones CLRWDT a lo largo de nuestro código para evitar que el micro se cuelgue.

PWRT (Power Up Timer Reset)

Este es un registro normalmente se accede al quemar el PIC (se trata de un FUSIBLE), lo que hace es que, genera un retardo al iniciarse el micro lo que permite que la tensión de trabajo se estabilice, por lo que se recomienda su uso.

CP (Code Protect)

Este registro también se trata de un FUSIBLE de protección, si lo activamos, no afecta al funcionamiento del PIC, sin embargo evitará que se pueda copiar el contenido al no permitir su lectura, no obstante permitirá ser borrado y sobre escrito su contenido.

Con esto doy por terminado este artículo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.