Introducción a los microprocesadores / microcontroladores
Capítulo 1Análisis de un procesador simple
El concepto de Arquitectura de computadoras se define como el funcionamiento, estructura y diseño de computadoras.
Dentro de este término se engloban entre otros aspectos tales como:
• Almacenamiento • Control • Interconexión • Temporización • Entrada/salida • Instrucciones • Direccionamiento Controlador
Se denomina controlador al dispositivo que se emplea para el manejo o gobierno de uno o varios procesos.
El controlador conceptualmente no ha cambiado con el tiempo, pero su implementación ha tenido diversas transformaciones a lo largo del mismo, aunque muchas de ellas se utilizan en la actualidad con mucha frecuencia ya sea por costo, confiabilidad o sencillez.
Hubo transformaciones desde mecánicas, luego con elementos de lógica discreta, Relay, y en la década del ´60 aparecen los PLC (sigla de origen inglés para denominar al Controlador Lógico Programable); posteriormente se emplearon los microprocesadores, que se rodeaban con chips de memoria y elementos de E/S
En la actualidad, todos estos elementos se encuentran incluidos en un chip que recibe el nombre de microcontrolador. La diferencia fundamental entre un microcontrolador y un microprocesador está en que el primero posee una cantidad limitada de procesos e instrucciones de lógica y cálculo pero un manejo versátil y poderoso de distintos periféricos, como ser varios puertos de entrada/salida, conversiones AD/DA, etc.; en cambio en el microprocesador estas características son a la inversa.
Un microcontrolador dispone normalmente de los siguientes componentes: • Procesador o UCP (Unidad Central de Proceso).
• Memoria RAM para Contener los datos.
• Memoria para el programa tipo ROM/PROM/EPROM. • Líneas de E/S para comunicarse con el exterior.
• Diversos módulos para el control de periféricos (temporizadores, Puertas Serie y Paralelo, CAD: Conversores Analógico/Digital, CDA: Conversores Digital/Analógico, etc.).
• Generador de impulsos de reloj que sincronizan el funcionamiento de todo el sistema.
Las primeras computadoras consistían en máquinas compuestas por distintos elementos, cuya finalidad era ejecutar una serie de operaciones. Dichas operaciones se realizaban cableando dichos elementos (Hardware) y estos respondían generalmente de forma secuencial.
Por ejemplo si consideramos como sistema una caldera, el controlador que regula el funcionamiento de la misma recibirá información de un sensor que mide constantemente la temperatura del agua, y cuando traspasa los límites prefijados, el controlador genera las señales adecuadas que accionaran los correspondientes
actuadores que intentan llevar el valor de la temperatura dentro del rango estipulado. En este caso el controlador esta llevando a cabo un control llamado a “lazo cerrado” pues toma información sobre una determinada variable que quiere controlar y luego ejecuta las acciones necesarias sobre los actuadores para que dicha variable llegue al valor preestablecido.
Otro ejemplo sería el control de la secuencia de un semáforo, este tipo de control no posee sensores aunque en algunos casos pueden utilizarse, el encendido de las luces del semáforo siguen una determinada secuencia con tiempos prefijados para cada una de ellas. En este caso el controlador lleva a cabo un control a lazo abierto, pues actúa sobre la variable de salida sin tener en cuenta el estado en que se encuentra esta o sea sin tomar información del estado de la misma.
Este ejemplo lo tomaremos como base para explicar la arquitectura de un microcontrolador rudimentario y a partir de él llegar a los utilizados en la actualidad..
El siguiente circuito se puede utilizar para controlar la secuencia de un semáforo.
J
Q
Q
K
SET CLRJ
Q
Q
K
SET CLRJ
Q
Q
K
SET CLR 1 Hz Vcc V Vcc A R V A R L1 CKEl principio de funcionamiento de este circuito podría sintetizarse de la siguiente manera:
En este caso inicialmente se activa la llave L1 seteandose el flip flop V
encendiéndose la luz verde. Al primer pulso de CK el FF V por tener sus entradas JK en 01, su salida pasa a 0 apagándose la luz verde, como el FF A cambia de estado con cada pulso de CK, se enciende la luz Amarilla y el FF R al tener sus entradas en nivel bajo permanece en 0. Al segundo pulso de CK el FF V permanece en 0 por tener las mismas condiciones anteriores, el FF A vuelve a cambiar de estado por lo que se apaga la luz amarilla y como el FF R tiene sus entradas en 1 cambia de estado encendiéndose la luz roja. Al tercer pulso de CK el FF V repite las condiciones anteriores por lo que la luz verde permanece apagada, el FF A vuelve a cambiar de estado, no así el FF R por lo que quedan encendidas las luces amarilla y roja. Al siguiente pulso de CK los 3 FF quedan con la condición de cambiar de estado por lo que se enciende la luz verde y se apagan la amarilla y la roja volviendo a la condición inicial y a repetir la secuencia [ V – A – R – RA – V ...].
Los tiempos que permanecen encendidas cada luz dependen de la frecuencia del CK que se utilice.
Si se quisiera cambiar la secuencia de encendido de las luces o tener tiempos distintos para cada una de ellas se debería cambiar la estructura del circuito.
Se debía hacer un cambio conceptual en los sistemas basados en comportamientos secuenciales para no tener que cambiar la estructura circuital del mismo cada vez que se quería modificar su secuencia. Para ello, el científico John von Neumann, propuso el concepto de programa almacenado (software), el cual consiste en una serie de instrucciones guardadas en una memoria que se deben ejecutar ordenadamente.
Basándonos en las consideraciones propuestas por von Neumann desarrollaremos un circuito que permita controlar la secuencia de encendido de las luces del semáforo. Dicho circuito podría representarse por el siguiente esquema:
10 Hz Decodificador de Instrucciones Contador Rst Ck Q0 Qn Memoria A0 An D0 D4 D3 D2 D1 D5 D6 D7 x y a b S1 R A V S2 R A V
Para este circuito el contador utilizado es uno del tipo ascendente que incrementa su cuenta por cada pulso de CK que aparece en su entrada. Las salidas Q0 a Qn de este contador están conectadas a las entradas de dirección A0 a An de
una memoria con palabras de 8 bits de dato D0 a D7 . Al ir contando el contador, la
memoria se va recorriendo en forma secuencial desde la dirección 0 en adelante y esta entregará en sus salidas los datos que tenga almacenados en las distintas direcciones.
Se puede observar que mientras el bit de datos D7 permanezca en 1, al
contador le llegaran los pulsos de CK provistos por el generador correspondiente haciendo que el contador incremente su cuenta por lo que se procede a recorrer secuencialmente la memoria. En cambio si el bit de datos D7 permanece en 0 la
compuerta inhabilita el paso de los pulsos de CK y el contador se detiene en el valor que estaba y por consiguiente la memoria quedará direccionada en una dirección fija. El bit de datos D6 es el que proporcionará el reset de la memoria que
supondremos se logrará con un 1 en la entrada correspondiente, en este caso el contador volverá a la posición inicial 0 por lo que la memoria quedará direccionada también en la dirección 0 .
• Ejemplo 1 Si quisiéramos encender solamente las luces del semáforo S1 con
una sola secuencia [ R – A – V ] y que luego este quede apagado, deberíamos escribir lo siguiente en la memoria:
Inicialmente al estar la memoria posicionada “direccionada” en la dirección 0, el bit D0 enciende la luz roja y con D7 en 1 queda habilitada la entrada de CK, con el
próximo pulso de CK la memoria pasa a la dirección 1encendiendo la luz amarilla mediante D1 , al siguiente pulso de CK se enciende la luz verde que está comandada
por el bit D2 , por último con el próximo pulso de CK quedan apagadas todas las
luces y como el bit D7 está en 0 queda inhabilitada la entrada de pulsos de CK por
lo que el semáforo quedará permanentemente apagado.
• Ejemplo 2 Si ahora quisiéramos encender los 2 semáforos simulando la secuencia de un cruce de calles deberíamos escribir en la memoria lo mostrado en la tabla. a b V2 A2 R2 V1 A1 R1 D7 D6 D5 D4 D3 D2 D1 D0 Dir 0 1 0 0 0 0 0 0 1 Dir 1 1 0 0 0 0 0 1 0 Dir 2 1 0 0 0 0 1 0 0 Dir 3 0 0 0 0 0 0 0 0 Dir 4 x x x x x x x x a b V2 A2 R2 V1 A1 R1 D7 D6 D5 D4 D3 D2 D1 D0 Dir 0 1 0 1 0 0 0 0 1 Dir 1 1 0 0 1 0 0 0 1 Dir 2 1 0 0 0 1 0 0 1 Dir 3 1 0 0 0 1 0 1 1 Dir 4 1 0 0 0 1 1 0 0 Dir 5 1 0 0 0 1 0 1 0 Dir 6 1 0 0 0 1 0 0 1 Dir 7 1 0 0 1 1 0 0 1 Dir 8 1 1 1 0 0 0 0 1 Dir 9
Como puede observarse desde la dirección 0 hasta la dirección 7 están escritos los datos que comandan una secuencia completa de los semáforos y en la dirección 8 al poner en 1 el bit D6 este resetea al contador permitiendo que la memoria se
direccione en la posición 0 reiniciándose la secuencia, por lo que quedan funcionando los semáforos permanentemente.
Como se ha mostrado, con sólo cambiar unos datos en la memoria se cambió la secuencia de encendido de las luces y si se quisiera mantener por mas tiempo alguna de las luces encendidas podríamos repetir los datos de la correspondiente dirección varias veces: por esto es que a diferencia del circuito anterior no hay que cambiar la estructura del mismo sino solamente algunos datos, demostrando su versatilidad.
Este circuito básico que denominaremos “procesador” posee datos almacenados en las distintas direcciones de memoria que se van seleccionando secuencialmente, a esta propiedad la podríamos denominar “ejecución del programa” de control de secuencia del semáforo.
A los bits D0 ... D5 los llamaremos bits de dato propiamente dicho, pues estos corresponden a la información que se va a utilizar en el semáforo. Los bits D7 y D6
representan lo que llamaremos las “instrucciones” del programa, estos dos bits ingresan al bloque que hemos denominado “Decodificador de instrucciones”, quien es el encargado de operar sobre el contador “Contador de Programa PC“, para que este direccione la memoria convenientemente. Como sólo posee 2 bits de instrucciones se lo denomina “procesador de 2 bits”.
En la siguiente tabla se muestra el valor que pueden adoptar estos dos bits, la operación que realiza el circuito con su abreviatura:
D7 D6 Operación que se realiza Abreviaturas
0 0 El contador de programa se bloquea, deteniéndose la ejecución del programa.
STOP HLT ALTO PAUSA 1 0 El contador de programa queda habilitado para
continuar ejecutando el programa CONT 0 1 El contador de programa se resetea reiniciándose
la ejecución del programa. RST
1 1 El contador de programa se resetea reiniciándose
la ejecución del programa. RST
Como se puede observar con dos bits se pueden tener cuatro posibles “instrucciones” que llamaos con las abreviaturas STOP CONTINUAR y RESET, pero como se observa se está desperdiciando una posibilidad debido a que el contador se resetea con el D6 en 1 sin importar el valor de D7. Cabe destacar que los bits D0 ...
D5 sombreados en este caso, podrían adoptar cualquier valor, debido a que el
tiempo que se va a estar ejecutando esta instrucción no depende del valor de período de CK sino al tiempo que tarda el contador de programa en resetearse que es mucho menor, pero se ha decidido escribir el próximo valor que adoptarán estos bits y por ende los semáforos para que estos no presenten aunque mas no sea por un tiempo pequeño una información errónea, este inconveniente será subsanado mas adelante.
Modificando el circuito anterior, para no desperdiciar una opción y disponer de las cuatro instrucciones que nos permiten los dos bits, se puede obtener el circuito siguiente: 1 Hz Decodificador de Instrucciones Contador de Programa Rst Ck Q0 Qn Memoria A0 An D0 D4 D3 D2 D1 D5 D6 D7 P0 P1 P2 P3 P4 P5 Pst S1 R A V S2 R A V a b x y z
Con este circuito se optimiza el “juego de instrucciones” detalladas anteriormente debido a que ahora tendremos la posibilidad de utilizar las cuatro posibles instrucciones que permite este procesador de dos bits. Para ello se ha modificado también el circuito “decodificador de instrucciones” y el Contador utilizado ahora tiene la propiedad de ser preseteable o sea que si se ingresa un valor determinado por las entradas P0 ... P5 y al activar el comando Pst dicho contador
pasará a tener en sus salidas Q0 ... Qn, el valor prefijado y continuará la cuenta a
partir de este o sea que la ejecución del programa dará un salto hasta la nueva dirección desde donde este proseguirá.
El nuevo “set” de instrucciones correspondiente a este nuevo circuito será: D7 D6 Abreviaturas Operación que se realiza
0 0 STOP El contador de programa se bloquea, deteniéndose la ejecución del programa.
1 0 CONT El contador de programa queda habilitado para continuar ejecutando el programa
0 1 RST El contador de programa (PC) se resetea reiniciándose la ejecución del programa.
1 1 JMP El “ PC ” se presetea con el valor a donde saltará y proseguirá con la ejecución del programa.
• Ejemplo 3 Veamos como se podría escribir un programa que realice inicialmente el encendido secuencial de cada una de las 6 luces y que luego los 2 semáforos queden titilando en amarillo.
Como se observa desde la dirección 0 a la 5, se realiza el encendido secuencial de todas las luces del semáforo, durante el tiempo que el contador permanece en la dirección 6, los semáforos estarán en amarillo, mientras que cuando el contador esté en la dirección 7 los semáforos permanecerán apagados. Al llegar el contador al valor 8, se preseteará el mismo con el valor 6 “000110”, por lo que los semáforos pasarán nuevamente a amarillo.
a b V2 A2 R2 V1 A1 R1 PC D7 D6 D5 D4 D3 D2 D1 D0 Dir 0 1 0 1 0 0 0 0 0 Dir 1 1 0 0 1 0 0 0 0 Dir 2 1 0 0 0 1 0 0 0 Dir 3 1 0 0 0 0 1 0 0 Dir 4 1 0 0 0 0 0 1 0 Dir 5 1 0 0 0 0 0 0 1 Dir 6 1 0 0 1 0 0 1 0 Dir 7 1 0 0 0 0 0 0 0 Dir 8 1 1 0 0 0 1 1 0 Dir 9
Cabe destacar que por un lapso muy breve el semáforo 1 encenderá conjuntamente las luces verde y amarilla lo cual es un estado no deseado de las luces del semáforo.
Para que esto no ocurra modificaremos el circuito de la siguiente manera:
Decodificador de Instrucciones Contador de Programa Rst Ck Q0 Qn Memoria A0 An D 0 D4 D3 D2 D1 D5 D 6 D7 P 0 P 1 P 2 P 3 P 4 P 5 Pst
S
1 R A VS
2 R A V L A T C H Le 1 Hz a b w x y z Vcc FF Q T QCon este circuito se puede guardar en el “Latch” cuando se desee, el valor que se mostrará en los semáforos, y cuando se quiera direccionar el PC con el número correspondiente a la dirección a dónde saltar, este nuevo valor no se mostrará como dato de salida debido a que se inhabilita la posibilidad de posibilidad de “latchear” el dato. Se agregó también al decodificador de instrucciones un divisor de pulsos de reloj por lo que cada incremento del “PC” al que llamaremos “ Ciclo de máquina “ le corresponderán varios pulsos de reloj ( en este caso 2 pulsos): esto nos dará la posibilidad de tener mas tiempo para hacer distintas cosas dentro de una misma instrucción. Cabe destacar que el decodificador de instrucciones es el encargado organizar para cada una de las instrucciones los pasos que debe seguir el procesador para ejecutar convenientemente esa instrucción, o sea en cada Ciclo de máquina debe primero leer la instrucción, luego si debe producir un salto bloquear la
dependiendo de la complejidad del procesador deberá realizar distintas operaciones antes de pasar a la próxima instrucción activando la entrada de cuenta del PC.
El siguiente diagrama de tiempos muestra un ejemplo de esta técnica.
Gu ard a r dato Incrmenta r dire c c ió n D e c o difica r instru cció n Gu ard a r dato Incrmenta r dire c c ió n D e c o difica r instru cció n Saltar a otra dire c c ió n D e c o difica r instru cció n Gu ard a r dato Incrmenta r dire c c ió n D e c o difica r instru cció n Gu ard a r dato Incrmenta r dire c c ió n Instrucción CONT Instrucción CONT Instrucción JMP D e c o difica r instru cció n Rei n ic iar el pr ogra ma Instrucción RST D e c o difica r instru cció n
t
PC
t
Le
t
CK
t
CM
Es importante destacar que para el análisis que estamos realizando sobre la arquitectura de un procesador no profundizaremos en la circuitería correspondiente al decodificador de instrucciones ni en los tiempos involucrados en el mismo sino en que este debe tomar la información proveniente de los bits de instrucción, decodificarla y realizar las acciones necesarias para que los datos se guarden, se realice un salto a una dirección determinada, etc. sin que haya ningún tipo de ambigüedad en la decisión a tomar, este análisis se realizará en el momento que sea necesario.