Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Circuitos secuenciales
10.1.- Introducción.
Los circuitos digitales secuenciales son aquellos cuya salida no depende únicamente del valor de las
entradas en el momento actual, sino del estado interno del circuito lógico. Esto significa que tienen memoria (es
decir, ciertas variables internas tienen un valor determinado que afecta a la salida). En realidad el valor de esas
variables internas depende de la historia pasada de las variables de entrada (de la secuencia que han seguido las
entradas en el pasado).
El circuito secuencial más simple es el biestable. En esencia es un circuito que tiene una variable de
memoria (1 bit). Una cierta combinación de las variables de entrada puede cambiar el valor de ese bit de
memoria (pasar de 0 a 1 o viceversa).
S Q
EN
R
Q
La salida suele estar disponible en forma normal e invertida. El funcionamiento es como sigue. Si la entrada de
habilitación EN está baja, la salida permanece en el valor que tenga, valgan lo que valgan R y S. Si EN está
alta, la salida cambiará en función de los valores de R y S, según la tabla:
S R Qn+1 Acción
0 0 Qn Sin cambio
1 0 1 Set
0 1 0 Reset
1 1 Indet. Ambiguo
en esta tabla, Qn representa la salida que había antes del cambio de S, R ó EN. Como se ve, si R=S=0, la salida
no cambia (continúa en 0 si valía 0 o en 1 si valía 1). De esta forma, la salida no solo depende de las entradas,
sino del valor anterior que tenía esa salida (memoria). Hay que resaltar que si las entradas R y S son 1 al mismo
tiempo, la salida es indeterminada, por lo que se debe evitar esa combinación de entradas. Si no se tiene en
cuenta la señal de habilitación, el biestable RS se puede implementar con dos puertas NOR:
Las entradas S yR pueden ser activas a nivel bajo (negadas), lo que se indica con un círculo en cada entrada. La
tabla de verdad quedaría:
S R Qn+1 Acción
1
Sistemas electrónicos. Tema 10. Circuitos secuenciales
1 1 Qn Sin cambio
0 1 1 Set
1 0 0 Reset
0 0 Indet. Ambiguo
Si no se tiene en cuenta la entrada de habilitación, el biestable RS con entradas negadas se puede implementar
con dos puertas NAND:
Un ejemplo de circuito TTL es el 74279. Este circuito tiene 4 biestables RS activos por nivel, que no disponen
de entrada de habilitación. Las entradas R y S son activas a nivel bajo. Además solo dispone de la salida
normal, Q, no la salida invertida Q .
D
Q
EN Q
Al igual que en el anterior, si EN está a nivel bajo la salida no cambia. Si EN se pone a nivel alto, la salida
cambia haciéndose igual a la entrada, es decir:
EN D Qn+1 Acción
0 X Qn Sin cambio
1 0 0 Carga dato
1 1 1 Carga dato
En este caso, la salida almacena el valor de la entrada D (entrada de datos). Si se desea que el dato almacenado
no cambie aunque cambie D, basta con volver a hacer baja la entrada de habilitación, quedándose memorizado
el valor que tenía D cuando EN estaba alta. El biestable tipo D se puede implementar con puertas NAND:
La entrada de habilitación podría ser activa a nivel bajo, indicándose con un círculo.
Existen varios circuitos TTL que implementan biestables de este tipo. Suelen tener varios biestables en
el mismo integrado.
Por ejemplo el 7477 tiene 4 biestables, con una entrada de habilitación común para dos de ellos, y otra
entrada de habilitación para los otros dos. Solo dispone de las salidas normales, no invertidas. Los 4 biestables
permiten memorizar 4 señales binarias (4 bits).
El 7475 es igual al anterior, pero dispone además de las salidas invertidas.
El 74373 tiene 8 biestables con una entrada de habilitación común a todos ellos. Sirve por tanto para
memorizar 8 señales binarias (8 bits).
2
Sistemas electrónicos. Tema 10. Circuitos secuenciales
S
Q
CLK
Q
R
Si la entrada de reloj es constante (0 ó 1), la salida del biestable no cambia. Cuando la señal de reloj cambia de
0 a 1 (biestable activo por flanco de subida) o cambia de 1 a 0 (biestable activo por flanco de bajada, indicado
con un círculo en la entrada), la salida toma el valor de acuerdo con la tabla del biestable RS vista antes.
Este tipo de biestable no es muy usual en circuitos integrados. En su lugar se utiliza el biestable tipo
JK que es una pequeña variación.
D
Q
CLK
Q
Cuando la señal de reloj cambia de 0 a 1 (biestable activo por flanco de subida) o cambia de 1 a 0 (biestable
activo por flanco de bajada), la salida toma el valor de la señal de entrada de datos D. Si la señal de reloj no
cambia, la salida del biestable permanece con su valor memorizado.
Existen varios circuitos integrados que implementan biestables de este tipo.
El 7474 tiene 2 biestables tipo D activos por flanco de subida. Además de la entrada de reloj y la de datos
disponen de 2 señales de Set y de Clear que permiten poner a cero o a uno la salida del biestable
independientemente de la señal de reloj. Se llaman entradas asíncronas. En este dispositivo son activas a nivel
bajo. Su efecto es similar a las entradas S y R de un biestable tipo RS activo por nivel. Su diagrama y su tabla
de verdad son:
3
Sistemas electrónicos. Tema 10. Circuitos secuenciales
0 0 X X Indet.
1 1 ↑ 1 1
1 1 ↑ 0 0
Es decir, se carga el dato cuando el reloj tiene un flanco de subida, siempre que las entradas de Set y Clear
estén altas (desactivadas).
J K Qn+1 Acción
0 0 Qn Sin cambio
1 0 1 Set
0 1 0 Reset
1 1 Qn Báscula
es decir, si cuando llega la subida del reloj, J=K=1, la salida del biestable cambia su valor (bascula).
Hay varios circuitos integrados que implementan biestables tipo JK activos por flanco. El 7473 es el más
simple. Tiene 2 biestables independientes. La entrada de reloj es sensible al flanco de bajada. Además de las
entradas de reloj y J,K, dispone de una entrada de Clear activa a nivel bajo. Esta entrada es asíncrona, pues su
funcionamiento es independiente del reloj. Cuando se pone a nivel bajo, hace la salida del biestable igual a 0.
El 7476 es un poco más complejo. También tiene 2 biestables JK independientes, activos por flanco de
bajada. Además de las entradas de reloj y JK dispone de una señal de Clear y una de Set (PR) asíncronas,
activas a nivel bajo, que permiten poner la salida a 0 ó a 1 independientemente del reloj. Estas entradas
asíncronas permiten utilizar el biestable como un biestable tipo RS activo por nivel (basta con conectar las
entradas de reloj, J y K a nivel bajo. Las figuras siguientes muestran el diagrama de este integrado biestable, y
su tabla de verdad:
4
Sistemas electrónicos. Tema 10. Circuitos secuenciales
El 74109 tiene 2 biestables JK activos por flanco de subida. Es similar al 7476 (dispone de Set y Clear)
salvo que la entrada de reloj es activa en la subida, y la entrada K es activa a nivel bajo (está invertida
internamente).
Biestables
El circuito consta de un conjunto de biestables que memorizan el estado del proceso. Por ejemplo, con 3
biestables se podrían memorizar 8 estados diferentes del proceso. Por otra parte se tiene un circuito
combinacional que tiene como entradas las entradas del proceso y las salidas de los propios biestables que
definen el estado, y que tiene como salidas, las salidas a los actuadores, y unas señales que son las entradas de
los biestables. El circuito combinacional decide, en función del estado en que se encuentra el proceso, y del
valor de las entradas, qué salidas deben activarse, y cómo debe cambiar el propio estado del proceso,
cambiando los biestables que correspondan.
El circuito combinacional también deberá dar como salidas las señales que van a actuar sobre el
proceso, que serán función en general de los estados (biestables) y de las entradas.
Los biestables que implementan el circuito anterior pueden ser de diversos tipos. Una posibilidad es
utilizar biestables tipo RS activos por nivel. En ese caso el circuito secuencial se denomina asíncrono, pues no
interviene ninguna señal de reloj. Las salidas del circuito combinacional actuarán sobre las entradas R y S de
los biestables. Otra posibilidad es utilizar biestables tipo JK activos por flanco. En ese caso las salidas del
circuito combinacional actúan sobre las entradas J y K de los biestables. Estos circuitos necesitan una entrada
de reloj que habilite con su flanco las transiciones del biestable. Se denominan circuitos secuenciales síncronos,
5
Sistemas electrónicos. Tema 10. Circuitos secuenciales
porque todos los biestables cambian a la vez (cuando sube o baja el reloj). Normalmente se utilizan circuitos
síncronos, porque eso simplifica el diseño, ya que si se usan biestables asíncronos, un biestable puede cambiar
un poco antes que el otro y provocar una transición incorrecta.
Contadores asíncronos.
Un contador es un circuito con una entrada principal de reloj y varias salidas, de forma que cada vez
que hay un flanco (de subida o de bajada) en la entrada de reloj, el número binario de la salida aumenta en 1.
Por ejemplo, un contador de 4 bits tiene 4 salidas, y la evolución de las mismas es:
Q3Q2Q1Q0=0000 → 0001 → 0010 →0011→ 0100→0101→0110→0111→1000→etc.
Un contador asíncrono es aquel en el que el cambio en las salidas no se produce a la vez, sino que
cambia primero la salida más baja (Q0), ésta produce el cambio de la segunda salida, ésta de la tercera, y ésta
de la cuarta. El retraso desde que cambia la primera hasta que cambia la segunda es pequeño, pero aun así hay
un instante en que la salida pasa por un valor incorrecto. Por ejemplo, al pasar de 0001 a 0010 la secuencia que
ocurre es: 0001→0000→0010. En el estado 0000 solo está un pequeño intervalo de tiempo (el retraso del
contador), pero puede ser importante. En el caso de que este fenómeno pueda causar problemas debe usarse un
contador síncrono. La figura siguiente muestra cómo sería un contador asíncrono de 4 bits, formado con
biestables JK, con entrada de reloj activa por flanco de bajada:
Inicialmente se supone que los 4 biestables están a 0. Cuando llega un flanco de bajada en el reloj, el primer
biestable pasa a 1, quedándose los demás en 0. Al segundo flanco de bajada del reloj, el biestable 1 pasa a 0,
introduciendo un flanco de bajada en la entrada de reloj del segundo biestable, que pasa a 1. Entra la bajada de
la señal de reloj y la bajada de la señal Q1 hay un pequeño retardo, por lo que primero cambia Q1 de 1 a 0 y
después Q2 de 0 a 1. En el siguiente flanco de bajada del reloj, el biestable 1 vuelve a pasar a 1, y así se repite
6
Sistemas electrónicos. Tema 10. Circuitos secuenciales
el ciclo. Cada vez que Q1 pasa de 1 a 0, Q2 cambia un poco después. Cada vez que Q2 pasa de 1 a 0, Q3
cambia un poco después, y cada vez que Q3 cambia de 1 a 0, Q4 cambia un poco después.
Cada contador tiene un valor máximo de cuenta. Cuando llega al valor máximo de cuenta, el contador vuelve a
cero. Se llama contador módulo N a aquel cuya cuenta máxima es N. Los más habituales son el módulo 16
(contador binario de 4 bits normal que vuelve a cero después de la salida 1111), el módulo 10 (contador de 4
bits que vuelve a cero cuando pasa de 9, es decir, después de la salida 1001) y el contador módulo 12 (que
vuelve a cero después de 1011).
Estos contadores asíncronos se utilizan fundamentalmente para obtener señales de reloj de frecuencias
menores a partir de una señal de reloj dada. Por ejemplo, un contador de módulo 16 cuya entrada de reloj sea
de 16kHz, la salida más baja Q0 es una señal de 8kHz, ya que sólo cambia con el flanco de subida del reloj. La
salida Q1 es una señal de frecuencia 4kHz, la salida Q2 es de 2kHz, y la salida Q3 es una señal de 1kHz.
Debido a esto se llaman también divisores de frecuencia.
La familia TTL tiene varios contadores asíncronos. Los más comunes son:
• El 7490. Es un contador de módulo 10, también llamado de década. Permite obtener una salida de
frecuencia dividida por 10, 5 ó 2.
• El 7492. Es un contador de módulo 12. Permite obtener salidas de frecuencia dividida por 12, 6 ó 2.
• El 7493. Es un contador de módulo 16, también llamado binario. Permite obtener salidas de frecuencia
dividida por 16, 8 ó 2.
Los tres disponen de entrada de Reset, que permite ponerlos a cero. Los tres son activos por flanco de
bajada. La división de frecuencias es muy útil para contar un tiempo determinado. Si se desea contar un tiempo
de 1 segundo y se dispone de una señal de reloj de 1 kHz, bastaría con conectar en cascada 3 contadores
módulo 10 (7490).
Contadores síncronos.
A diferencia de los anteriores sus salidas cambian a la vez cuando hay un flanco de subida (o bajada)
en la entrada de reloj. Son por tanto mejores para ser utilizados como contadores, si se desea utilizar las salidas
del contador en otros circuitos lógicos. La figura siguiente muestra cómo sería un contador síncrono de 4 bits,
formado con biestables JK, con entrada de reloj activa por flanco de bajada:
7
Sistemas electrónicos. Tema 10. Circuitos secuenciales
Cuando llega el primer flanco de bajada, solo pasa de 0 a 1 el primer biestable, ya que los otros tienen sus
entradas J y K a 0. Al ponerse a 1 el biestable Q1, en el siguiente flanco de bajada del reloj, cambian tanto el
Q1 como el Q2 (cambian exactamente a la vez), pasando el Q1 a 0 y el Q2 a 1. En el siguiente flanco de bajada
solo cambia Q1, que vuelve a 1. En el siguiente cambian Q1, Q2 y Q3 (los 3 a la vez), pasando Q1 y Q2 a 0, y
Q3 a 1, etc. Los cambios en todos los biestables se producen de forma sincronizada, cuando llega el flanco de
subida de la señal de reloj.
Al igual que los asíncronos, tienen un valor máximo de cuenta que cuando se sobrepasa hace volver a
cero al contador. En este caso existen 2 tipos, el contador de década (módulo 10) que pasa de 9 (1001) a 0
(0000), y el contador binario, que pasa de 15 (1111) a 0 (0000). En el caso del contador binario, no hay que
añadir nada al circuito, pues cuando los 4 biestables valen 1, al siguiente pulso todos cambian a 0. En el caso
del contador de década, hay que añadir algunas puertas adicionales para asegurar que después del 1001, se
pasa al 0000. En la figura se muestra cómo sería el contador de década:
Los contadores pueden ser ascendentes o descendentes, o ambas cosas. Los contadores ascendentes
incrementan su salida cuando les llega un pulso. El descendente la decrementa. Cuando llega a cero, vuelve al
valor máximo, y así sucesivamente.
La familia TTL dispone de varios contadores síncronos. Los más comunes son:
• 74160. Es un contador ascendente de década (módulo 10). Además de la entrada de reloj (de subida) y las 4
salidas, dispone de 4 entradas de precarga, que permiten cargar un valor determinado en el contador.
Dispone además de una señal de reset asíncrona para poner el contador a cero. También dispone de una
entrada que inhabilita la cuenta (deja de incrementarse).
• 74162. Es un contador idéntico al anterior, salvo que la entrada de reset es síncrona (solo actúa durante el
flanco de subida del reloj). Esto es importante si queremos medir un tiempo con precisión, pues el contador
se pone a cero justo en el flanco del reloj.
8
Sistemas electrónicos. Tema 10. Circuitos secuenciales
• 74161. Es un contador binario (módulo 16). Las demás características son idénticas al 74160.
• 74163. Es un contador idéntico al anterior, pero con la entrada reset síncrona.
• 74168, 74190. Son contadores de década. Los dos son bidireccionales, es decir, tienen una entrada que
selecciona el modo de funcionamiento (cuenta ascendente o descendente). Disponen de posibilidad de
precarga de un valor determinado en el contador. Tiene también una entrada de habilitación de cuenta, que
inhibe la cuenta cuando está a nivel alto. Esto permite la conexión en cascada síncrona de varios
contadores.
• 74169, 74191. Son contadores idénticos a los anteriores, pero de módulo 16 (binarios).
• 74192. es un contador de década bidireccional. Tiene 2 entradas de reloj, una para la cuenta ascendente y
otra para la cuenta descendente. Dispone de opción de precarga y de reset.
• 74193. es idéntico al 74192, pero de módulo 16 (binario). La figura siguiente muestra el diagrama de este
contador, y la tabla de verdad que explica su funcionamiento.
Los contadores de 4 bits pueden conectarse en cascada para dar lugar a contadores de 8 o de más bits.
Para ello disponen también de salidas de fin de cuenta, que indican que se ha llegado al valor máximo, y que
pueden ser utilizadas como entradas del siguiente contador. Esta conexión en cascada puede ser asíncrona (la
señal de fin de cuenta del primer contador es la entrada de reloj del segundo contador), o puede ser síncrona (la
señal de fin de cuenta del primer contador es la señal de habilitación de cuenta del segundo, mientras la señal
de reloj es la misma para los dos).
Registros de desplazamiento.
Son circuitos secuenciales que permiten transformar bits de información en paralelo a una sucesión de
bits por una sola línea (serie), o bien al revés. Hay de 4 tipos.
9
Sistemas electrónicos. Tema 10. Circuitos secuenciales
10
Sistemas electrónicos. Tema 10. Circuitos secuenciales
10.6.1. Introducción.
Se denomina microcontrolador a un circuito integrado (un solo “chip”) que incluye un microprocesador y los
periféricos necesarios para llevar a cabo el control de un proceso.
11
Sistemas electrónicos. Tema 10. Circuitos secuenciales
Los datos y el programa pueden ocupar el mismo espacio físico (memoria RAM) o pueden ocupar espacios
físicos diferentes (RAM para los datos y ROM para el programa, por ejemplo), pero en cualquier caso ocupan
direcciones de memoria del mismo espacio de direcciones. Los PC tienen una arquitectura de este tipo (los
datos y el programa están en la misma memoria RAM). La ventaja que tiene es que se puede aprovechar mejor
la memoria al distribuirla libremente entre datos y programa. El inconveniente que tiene es que el tamaño de las
posiciones de memoria de datos y de programa es el mismo, cuando en muchas ocasiones sería conveniente
utilizar tamaños diferentes. Otro inconveniente es que la ejecución de las instrucciones es más lenta, pues se
tiene que leer la instrucción y el operando de la misma memoria (por el mismo bus). Un inconveniente
importante es la posibilidad de producirse un error fatal en el sistema en el caso de que se escriba por error un
dato en una dirección dentro de la zona del programa. En ese caso se modifica el programa con una instrucción
aleatoria (la que resulta del código representado por el valor del dato) lo que normalmente provoca que el
sistema se cuelgue.
Arquitectura Harvard.
Hay dos espacios de memoria diferentes para los datos y para el programa, con sus propios buses de
direcciones y de datos (o instrucciones).
12
Sistemas electrónicos. Tema 10. Circuitos secuenciales
RAM ROM
EEPROM OTP PROM
EPROM
FLASH EEPROM
Los datos y el programa no solo ocupan un espacio físico diferente sino también un espacio diferente de
direcciones de memoria, pues cada uno tiene su bus de direcciones.
Las ventajas que tiene esta arquitectura son principalmente que el tiempo de ejecución puede ser menor, ya que
se puede leer a la vez la instrucción y el dato con el que opera. Por otra parte, el tamaño de las posiciones de
memoria puede ser diferente en la memoria de datos y la de programa, ajustándose a la necesidad del
procesador (es habitual tener instrucciones de 12, 14 ó 16 bits, y datos de 8 bits, por ejemplo). Otra ventaja
importante es la robustez del funcionamiento. El programa que se está ejecutando no puede escribir sobre la
memoria de programa, por lo que es más difícil que se produzca un error.
El inconveniente principal es que la memoria de datos solo puede ser de datos y la de programa solo de
programa, por lo que el aprovechamiento de toda la memoria puede ser más difícil. Otro inconveniente que
tiene es la mayor complejidad del circuito integrado, pues tiene dos sistemas de buses diferentes.
La mayoría de microcontroladores actuales utiliza una arquitectura Harvard. Los autómatas programables
también utilizan este tipo de arquitectura.
13
Sistemas electrónicos. Tema 10. Circuitos secuenciales
La siguiente figura muestra cómo evoluciona la pila cuando se producen dos llamadas encadenadas a
subrutinas. Dir1 es la dirección del programa principal en la que se llama a la subrutina. Dir2 es la dirección de
la subrutina en la que se llama a la subrutina secundaria. En principio la pila está vacía. Cuando se llama a la
subrutina se guarda en la primera posición de la pila la dirección del programa principal a la que se debe volver
al terminar la subrutina. Si dentro de la subrutina se llama a otra subrutina secundaria, se guarda en la pila la
dirección a donde debe volver cuando acabe esa subrutina secundaria. Se observa que la primera dirección
guardada se corre hacia abajo. Cuando termina la subrutina secundaria se recupera el valor del contador de
programa Dir_2+1 , y se continúa con la subrutina inicial. Al recuperar una dirección de la pila ésta se corre
hacia arriba. Cuando termina la subrutina inicial se recupera el valor del contador de programa Dir1+1 y la pila
queda vacía.
Dir1+1
El microprocesador suele tener también una serie de registros especiales. El acumulador es de hecho el registro
especial más importante (lo tienen todos los procesadores). Los registros especiales se suelen utilizar para
guardar variables u operandos intermedios.
10.6.4. Memorias.
Un microcontrolador puede tener memorias de diversos tipos:
• RAM. Se borra si se quita la alimentación. Se utiliza para datos.
• ROM. Grabable solo una vez en fábrica (cuando se fabrica el chip). No se puede borrar. Se utiliza
para memoria de programa.
• OTP PROM. Grabable solo una vez, pero se graba después de fabricar el chip (la puede grabar el
propio usuario). Una vez grabada no se puede borrar. Se utiliza para memoria de programa.
• EPROM. Es una memoria no volátil (no se borra aunque se quite la alimentación), pero que además
se puede borrar con luz ultravioleta y volver a grabar eléctricamente. Se utiliza para memoria de
programa, aunque hoy en día está en desuso.
• EEPROM. Es una memoria no volátil, pero que es grabable y borrable eléctricamente. Se utiliza para
datos que no se deben perder aunque se quite la alimentación y para programa.
• FLASH EEPROM. Como la anterior es grabable y borrable eléctricamente, siendo no volátil (no se
borra si se quita la alimentación). La diferencia con la EEPROM normal es que no se puede grabar
dirección a dirección, sino que es necesario borrarla toda para poder volver a escribirla (o al menos se
tiene que borrar por bloques). Debido a esto no sirve para datos. Se utiliza para memoria de programa.
Tiene la ventaja sobre la EEPROM normal de ocupar mucho menos espacio y ser más barata que
aquella.
Procesador CISC.
Significa “Complex Instruction Set Computer” e indica que el número de instrucciones diferentes es muy
elevado. Tienen la ventaja de que muchas operaciones se programan como una sola instrucción. El
inconveniente que tienen es que aprenderse todas esas instrucciones lleva bastante tiempo. Además, la
ejecución de las instrucciones es más lenta (al tener que decodificar un número grande de posibles
instrucciones).
14
Sistemas electrónicos. Tema 10. Circuitos secuenciales
Procesador RISC.
Significa “Reduced Instruction Set Computer” e indica que el número de instrucciones es muy pequeño. La
ventaja respecto del CISC es que esas pocas instrucciones se aprenden en muy poco tiempo. Además, la
ejecución de las instrucciones es muy rápida, pues la decodificación también lo es (hay pocos códigos de
instrucción diferentes que distinguir).
La estrategia RISC permite además aplicar el concepto de “pipelining” que consiste en que las instrucciones
consecutivas se ejecutan solapadas (mientras se lee una instrucción de memoria, a la vez se decodifica la
anterior y se ejecuta la anterior a ésta). Esto permite aumentar mucho la rapidez de ejecución.
Los microcontroladores se pueden programar de dos formas fundamentales: a bajo nivel en ensamblador, o con
un compilador de alto nivel (como C).
Lenguaje ensamblador.
Las instrucciones del programa que está en la memoria del microcontrolador son en realidad números binarios
de una longitud (nº de bits) determinada. Estos números binarios son los que interpreta el procesador para
decodificar y ejecutar la instrucción. A este formato de las instrucciones (el que entiende de hecho el
procesador) se le denomina código máquina. Cuando se realiza un programa para un microcontrolador se
podría escribir directamente los números binarios de las instrucciones, pero esto resulta extremadamente
engorroso y lento. En lugar de eso se ha creado el lenguaje ensamblador, que representa esas instrucciones en
forma de nemónicos mucho más fáciles de entender y de manejar por parte del programador.
El lenguaje ensamblador es una representación directa de las instrucciones en código máquina, pero permite
utilizar nemónicos para referirse a las instrucciones y etiquetas para referirse a los datos y a las direcciones.
Una vez escrito el programa en ensamblador el programa ensamblador lo traduce a código máquina (que puede
grabarse directamente en la memoria de programa del microcontrolador).
Herramientas de desarrollo.
Se llaman herramientas de desarrollo a aquellas herramientas hardware o software que permiten desarrollar un
circuito electrónico basado en microcontrolador. Éstas herramientas son:
• Programador. Es un equipo que sirve para introducir el programa en la memoria de programa del
microcontrolador. Este programador suele funcionar conectado a un PC por el puerto serie, USB o
paralelo. Desde el software del PC se escribe el programa, se ensambla y se manda al
programador, que lo graba en el microcontrolador.
• Simulador. Es un software que se ejecuta en el PC, y que permite simular la ejecución del
programa que se ha elaborado sin necesidad de grabarlo en el microcontrolador. Permite corregir
errores antes de programar el microcontrolador.
• Depurador residente. Consiste en un programa monitor que se encuentra en una parte de la
memoria ROM del microcontrolador, y que permite comunicar éste con un PC para poder
monitorizar el estado de las diversas variables mientras se ejecuta el programa que se ha grabado
en el microcontrolador. Permite depurar los errores que contiene el programa. El inconveniente
que tiene es que ocupa una parte de la memoria de programa (normalmente pequeña), y que utiliza
una interrupción. Esta interrupción no puede ser utilizada por el programa de usuario. Por otra
15
Sistemas electrónicos. Tema 10. Circuitos secuenciales
parte, si el programa que se está probando utiliza otras interrupciones, el funcionamiento puede no
ser exactamente igual al del sistema final, debido a la presencia del programa monitor (que
interrumpe cada cierto tiempo al programa de usuario para comunicar con el PC).
• Emulador en tiempo real. Es un circuito electrónico complejo (que tiene un microprocesador más
potente que el que se está programando) que emula totalmente el comportamiento del
microcontrolador. A este emulador se le pasa el programa, y éste reproduce exactamente lo que
haría el microcontrolador en el circuito en el que se conectara (para ello dispone de un terminal
con el patillaje idéntico al del microcontrolador). Al mismo tiempo permite monitorizar el estado
de todas las variables, por lo que permite depurar errores cómodamente. El mayor inconveniente
de los emuladores suele ser su elevado precio.
16
Sistemas electrónicos. Tema 10. Circuitos secuenciales
17
Sistemas electrónicos. Tema 10. Circuitos secuenciales
18
Sistemas electrónicos. Tema 10. Circuitos secuenciales
La distribución de los elementos principales de la tarjeta de Arduino UNO es la que se muestra a continuación:
Como se puede observar, la tarjeta cuenta con varios pines hembra para poder conectar entradas y salidas
tanto analógicas como digitales, así como pines con la alimentación y GROUND. Además cuenta con un puerto
USB que permite conectar la placa con el PC. La placa toma su alimentación del conector USB (5 V), aunque
también se puede alimentar con una tensión de 7 a 12 V a través de un conector, ya que la placa incorpora un
regulador de 5 V. La tarjeta tiene las siguientes características:
19
Sistemas electrónicos. Tema 10. Circuitos secuenciales
El programa se escribe en un fichero de texto, que se edita con el propio entorno de desarrollo. Una vez escrito
el programa, se puede compilar y cargar en la tarjeta de Arduino, que comienza a ejecutarlo inmediatamente
(botón con la flecha horizontal).
El código de un programa para la tarjeta de Arduino tiene una estructura muy simple:
//declaración de variables, como por ejemplo:
int velocidad;
void setup() {
// En esta función se pone lo que se ejecuta solo una vez al //
principio
}
void loop() {
// En esta función se pone lo que se ejecuta como un bucle
//infinito
}
El siguiente ejemplo de programa de Arduino produce un parpadeo en la salida digital 13 en la que hay
conectado un LED:
El lenguaje de programación es muy similar al C++, usándose por ejemplo para el control del flujo del
programa los comandos "if" y "else", o los bucles "for" o "while".
Programa de ejemplo:
El siguiente es un ejemplo de programa para atacar un puente en H de transistores conectado a un motor de
continua. El programa lee la entrada analógica 0 (donde se conecta un potenciómetro para dar una tensión entre
0 y 5V), y aplica una tensión media al motor que depende del valor de esa entrada analógica. Si la entrada
analógica es de 2.5 V (en ese caso el convertidor lee un valor de 512), la tensión que llega al motor será 0. Si la
entrada es de 5 V (valor leído por el convertidor de 1023), la tensión que llega al motor será máxima y positiva,
mientras que si la entrada es de 0 V (valor leído por el convertidor de 0), la tensión que llega al motor será
máxima y negativa. Como puente en H se utiliza el integrado comercial L298, que contiene dos puentes en H
20
Sistemas electrónicos. Tema 10. Circuitos secuenciales
completos (para atacar a dos motores), y que se muestra en la figura. Se utilizará la salida digital 10 para atacar
la rama 2 del puente en H de la izquierda, conectándola al pin In2. Con esa salida se pondrá a conducir el
transistor de abajo (salida a 0) o el de arriba (salida a 1), según se quiera tensión positiva o negativa en el
motor. La salida digital 9 se utilizará como salida PWM, y atacará la rama 1 del puente en H, conectándola al
pin In1, produciendo la conmutación en PWM de los dos transistores de esa rama. El motor se conectaría entre
los pines OUT1 y OUT2. La salida PWM produce un ciclo de trabajo de 0 si se escribe un 0, un ciclo de
trabajo de 0.5 si se escribe 127, y un ciclo de trabajo de 1 si se escribe 255 (el valor más alto en 8 bits). La
entrada analógica del Arduino lee un valor de 0 si la tensión de entrada es 0 V, lee 512 si hay 2.5V y 1023
(valor máximo en 10 bits) si hay 5 V.
void loop() {
potenciometro = analogRead(A0); //lee la entrada analógica
if (potenciometro>512) { // tensión positiva en el motor
analogWrite(In1, (potenciometro-512)/2);// escribe la salida PWM
del pin 9
digitalWrite(In2,LOW); //conduce el trans.de abajo de la rama 2
}
if (potenciometro<512) { // tensión negativa en el motor
analogWrite(In1, potenciometro/2);// escribe la salida PWM del
pin 9
digitalWrite(In2,HIGH); //conduce el trans.de arriba de la rama 2
}
}
21