illera cueva marcos practicas cyse
TRANSCRIPT
“P RÁCTICAS
COMPONENTES Y SISTEMAS ELECTRÓNICOS”
Alumno: Marcos Illera Cueva Alumno de Ingeniería Industrial Universidad de La Rioja Peticionario: J. Vicuña Asignatura: C.I.S.E. Universidad de La Rioja Lugar y Fecha: Logroño, 26 de Mayo de 2010
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
2 / 99
ÍNDICE
PRÁCTICA 1: SÍNTESIS SISTEMAS COMBINACIONALES
P1A Máquina Paletizadora 5
P1A1-S1 Entradas y Salidas del sistema. 6
P1A1-S2 Tipo de sistema. 6
P1A1-S3 Elección de criterio de lógica. 7
P1A1-S4 Convenio de entradas y salidas. 7
P1A1-S5 Tabla de verdad. 8
P1A1-S6 Funciones de Salida. 9
P1A1-S7 Esquema digital. 16
P1A1-S8 Coste. 17
P1A2-S1 Xilinx ISE. 22
P1B Planta de embotellado 24
P1B1-S1 Entradas y Salidas del sistema. 25
P1B1-S2 Tipo de sistema. 26
P1B1-S3 Elección de criterio de lógica. 26
P1B1-S4 Convenio de entradas y salidas. 26
P1B1-S5 Tabla de verdad. 27
P1B1-S6 Funciones de Salida. 28
P1B1-S7 Esquema digital. 32
P1B2-S1 Circuito de memoria no volátil. 33
PRÁCTICA 2: SISTEMAS SECUENCIALES
P2 Motor Paso a Paso unipolar 34
P2-S1.1 Entradas y Salidas del sistema. 37
P2-S1.2 Tipo de sistema. 37
P2-S1.3 Elección de criterio de lógica. 38
P2-S1.4 Convenio de entradas y salidas. 38
P2-S1.5 Diagrama de Estados. 38
P2-S1.6 Codificación de estados. 39
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
3 / 99
P2-S1.7 Tabla excitación y salida del sistema. 40
P2-S1.8 Funciones de salida. 40
P2-S1.9 Esquema digital. 44
P2-S2.1 Síntesis del circuito en un PLD. 46
P2-S2.2 Modificar circuito PLD. 48
PRÁCTICA 3: VHDL
P3A Sumador números 1 Bit 52
P3A1-S1 Entradas y Salidas del sistema. 53
P3A1-S2 Tipo de sistema. 53
P3A1-S3 Elección de criterio de lógica. 54
P3A1-S4 Convenio de entradas y salidas. 54
P3A1-S5 Tabla de verdad. 54
P3A1-S6 Funciones de Salida. 54
P3A1-S7 Esquema digital. 57
P3A1-S8 VDHL. 58
P3A2-S1 Sumador de 3 Bits en VDHL. 59
P3B Multiplexor 4 canales 62
P3B-S1 Introducción. 62
P3B-S2 Código VDHL de un buffer triestato. 63
P3B-S3 Código VDHL de un decodificador. 64
P3B-S4 Código VDHL Multiplexor. 65
PRÁCTICA 4: SIMULACIÓN VHDL
P4A Contador reset, carga síncronos 67
P4A1-S Código VHDL contador. 68
P4A2-S Testbench en VHDL. 69
P4A3-S Visualizador dinámico. 75
P4B Contador reset, carga asíncronos 76
P4B-S Código VHDL contador 76
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
4 / 99
PRÁCTICA 5: MICROCONTROLADORES PIC
P5A Programa PIC16F84A 77
P5A1-S Programa desp. Izd-dcha, dcha-izda 78
P5A2-S Programa desp. central 88
P5B Programa 2º PIC16F84A 89
P5C Programa PIC16F876A 91
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
5 / 99
PRÁCTICA 1: Síntesis Sistemas Combinacionales
P1.- A) Para controlar el movimiento de una máquina paletizadora se desea
emplear un joystick de 9 posiciones (8 más posición neutra). El vehículo puede
guiarse hacia delante, atrás, girar hacia la derecha y hacia la izquierda así
como combinaciones contiguas de dos movimientos. Para ello, el vehículo
cuenta con dos motores, los cuales pueden operar en cinco modos, mediante 3
señales de control M2 M1 M0 (ver tabla adjunta).
El giro a la izquierda o a la derecha se consigue mediante el bloqueo de uno de
los motores y el accionamiento rápido de contrario. El giro combinado se
obtiene con un motor en movimiento lento y el contrario en movimiento rápido.
Se pide:
Primero:
- Diseñar el sistema mínimo de control de los motores a partir de la posición del
joystick.
- Coste en nº de circuitos integrados y precio de las alternativas de
implementación práctica del circuito:
a) funciones AND2, OR2, NOT
b) PLD.
c) Memoria no volátil.
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
6 / 99
Segundo:
Crear un proyecto con la herramienta Xilinx ISE y en él editar un archivo
esquemático que permita a partir de él sintetizar, simular y programar un
dispositivo lógico programable con la lógica requerida por el sistema.
P1A1-S1 Entradas y Salidas del sistema:
- Entradas:
• Mando IZD: si movemos el mando a la izquierda. IZD=1 Activo.
• Mando DCH: si movemos el mando a la derecha. DCH =1 Activo.
• Mando ADE: si movemos el mando adelante. ADE =1 Activo.
• Mando ATR: si movimos el mando atrás. ATR =1 Activo.
- Salidas:
• Motor MI0: señal control 1 motor de la izquierda. MI0 =1 Activo.
• Motor MI1: señal control 2 motor de la izquierda. MI1 =1 Activo.
• Motor MI2: señal control 3 motor de la izquierda. MI2 =1 Activo.
• Motor MD0: señal control 1 motor de la derecha. MD0 =1 Activo.
• Motor MD1: señal control 2 motor de la derecha. MD1 =1 Activo.
• Motor MD2: señal control 3 motor de la derecha. MD2 =1 Activo.
P1A1-S2 Tipo de sistema:
Puesto que las salidas únicamente dependen de las entradas se trata de
un sistema combinacional.
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
7 / 99
P1A1-S3 Elección de criterio de lógica:
Tomamos el criterio de lógica positiva, es decir, un 1 lógico equivaldrá a
existencia de tensión y un 0 lógico equivaldrá a no existencia de tensión.
P1A1-S4 Convenio de entradas y salidas:
Para el convenio de entradas supondremos que es posible activar al
mismo tiempo el mando hacia delante o atrás y hacia uno de los lados. El
convenio de salidas lo obtenemos de la tabla que se nos da en el enunciado.
�� � �����
Sistema
Combinacional
Salidas ���� Entradas ����
IZD MI0
DCH MI1
ADE MI1
ATR MD0
MD1
MD2
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
8 / 99
P1A1-S5 Tabla de verdad:
Tomamos IZD como el bit de mayor peso y ATR como el bit de menor peso.
Entradas ��� Salidas �� �
П Σ IZD DCH ADE ATR MI2 MI1 MI0 MD2 MD1 MD0
15 0 0 0 0 0 0 X X 0 X X
14 1 0 0 0 1 1 0 1 1 0 1
13 2 0 0 1 0 1 1 1 1 1 1
12 3 0 0 1 1 X X X X X X
11 4 0 1 0 0 1 1 1 0 X X
10 5 0 1 0 1 1 0 1 1 0 0
9 6 0 1 1 0 1 1 1 1 1 0
8 7 0 1 1 1 X X X X X X
7 8 1 0 0 0 0 X X 1 1 1
6 9 1 0 0 1 1 0 0 1 0 1
5 10 1 0 1 0 1 1 0 1 1 1
4 11 1 0 1 1 X X X X X X
3 12 1 1 0 0 X X X X X X
2 13 1 1 0 1 X X X X X X
1 14 1 1 1 0 X X X X X X
0 15 1 1 1 1 X X X X X X
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
9 / 99
P1A1-S6 Funciones de Salida:
��2 � ��1,2,4,5,6,9,10� � ��3,7,11,12,13,14,15���
��2 � ��7,15��
� ��0,1,2,3,4,8,12��
��1 � ��2,4,6,10� � ��0,3,7,8,11,12,13,14,15���
��1 � ��6,10,14��
� ��0,1,2,3,4,7,8,12,15��
��0 � ��1,2,4,5,6� � ��0,3,7,8,11,12,13,14,15���
��0 � ��5,6��
� ��0,1,2,3,4,7,8,12,15��
� 2 � ��1,2,5,6,8,9,10� � ��3,7,11,12,13,14,15���
� 2 � ��11,15��
� ��0,1,2,3,4,8,12��
� 1 � ��2,6,8,10� � ��0,3,4,7,11,12,13,14,15���
� 1 � ��6,10,14��
� ��0,1,2,3,4,8,11,12,15��
� 0 � ��1,2,8,9,10� � ��0,3,4,7,11,12,13,14,15���
� 0 � ��9,10��
� ��0,1,2,3,4,8,11,12,15��
Ahora intentamos simplificar las funciones obtenidas mediante los
mapas de Karnaugh, lo haremos tanto para las funciones expresadas como
suma de productos como para las mismas expresadas como producto de
sumas:
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
10 / 99
��2 � ��1,2,4,5,6,9,10� � ��3,7,11,12,13,14,15���
� !" � #$% � # &
��2 � ��7,15��
� ��0,1,2,3,4,8,12� � !" � #$% � # &�
X
1 1
1 1 1
1 1
X
X
X
X X X
X X
X
0
X
X
X
X
0
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
11 / 99
��1 � ��2,4,6,10� � ��0,3,7,8,11,12,13,14,15� � #$%''''''��
��1 � ��6,10,14��
� ��0,1,2,3,4,7,8,12,15� � #$%''''''�
X
1
1 1
1
X
X
X
X X X
X X
X 0
X
X
X
X
X
X
X
0
0 X
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
12 / 99
��0 � ��1,2,4,5,6� � ��0,3,7,8,11,12,13,14,15���
� �� '''''
��0 � ��5,6��
� ��0,1,2,3,4,7,8,12,15� � �� '''''�
X
1
1 1 1
X
X
X
X X X
X X
X 0
X
X
X
X
X
X
X
0
X
1
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
13 / 99
� 2 � ��1,2,5,6,8,9,10� � ��3,7,11,12,13,14,15� � �� � #$% � # &��
� 2 � ��11,15��
� ��0,1,2,3,4,8,12��
� �� � #$% � # &
X
1
1 1
X
X
1
X X X
X X
X
X
X
X
X
1
0
1
1 X
0
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
14 / 99
� 1 � ��2,6,8,10� � ��0,3,4,7,11,12,13,14,15���
� #$%''''''
� 1 � ��6,10,14��
� ��0,1,2,3,4,8,11,12,15 � #$%''''''��
X
1
X 1
1
X
X
X
X X X
X X
X 0
X
X
X
X X
X
1
0
0 X
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
15 / 99
� 0 � ��1,2,8,9,10� � ��0,3,4,7,11,12,13,14,15���
� !"''''''
� 0 � ��9,10��
� ��0,1,2,3,4,8,11,12,15��
� !"''''''
X
1
X
X
X
1
X X X
X X
X
0
X
X
X
X
X
1
0
X
1
1 X
X
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
16 / 99
P1A1-S7 Esquema digital:
��2 � !" � #$% � # &
��1 � #$%''''''
��0 � �� '''''
� 2 � �� � #$% � # &
� 1 � #$%''''''
� 0 � !"''''''
ATR
ADE
DCH
IZD
MI2
≥1
1 MI1
1 MI0
MD2
≥1
MD1
1 MD0
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
17 / 99
P1A1-S8.1 Coste puertas lógicas:
Empleando funciones AND2, OR2 y NOT necesitaríamos 3 OR2 y 3
NOT. En el esquema digital dibujado en el apartado anterior se utilizaron 2 OR3
en lugar de 3 OR2.
Para obtener un precio aproximado acudimos a la página de internet
www.alldatasheet.com. En ella podemos introducir la referencia de un
componente y visualizar sus características y precios de numerosos
proveedores.
En nuestro caso buscamos las referencias 74SL04 (circuito integrado
con 6 puertas Not) y 74SL32 (circuito integrado con 4 puertas OR2).
De entre todas las posibilidades que encuentra la citada página elegimos
los siguientes circuitos:
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
18 / 99
Teniendo en cuenta el pedido mínimo (en este caso de 2500 unidades)
el coste total sería aproximadamente de 0.32 €.
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
19 / 99
P1A1-S8.2 Coste PLD
Como en el apartado anterior obtenemos directamente en internet las
características y precio de un posible PLD a emplear.
El precio que se obtuvo fue de 2,88 €.
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
20 / 99
P1A1-S8.3 Coste memoria no volátil:
Empleamos un dispositivo de memoria no volátil con 4 entradas y 6
salidas, con capacidad para almacenar 16 datos de cuatro bits. De esa forma
podrríamos “grabar” la tabla de la verdad que se calculó anteriormente y en
función del número decimal que formen S1,S2,S3,S4 el dispositivo asignará a
las salidas los valores previamente grabados en la fila correspondiente a dicho
número:
0 0 0 0 0 0
1 0 1 1 0 1
1 1 1 1 1 1
0 0 0 0 0 0
1 1 1 0 0 0
1 0 1 1 0 0
1 1 1 1 1 0
0 0 0 0 0 0
0 0 0 1 1 1
1 0 0 1 0 1
1 1 0 1 1 1
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
PROM es el acrónimo de Programmable Read-Only Memory (ROM
programable). Es una memoria digital donde el valor de cada bit depende del estado
de un fusible (o antifusible), que puede ser quemado una sola vez. Por esto la
memoria puede ser programada (pueden ser escritos los datos) una sola vez a través
de un dispositivo especial, un programador PROM. Estas memorias son utilizadas
MI2 IZD
MI1 DCHA
MI0 ADE
MD2 ATR
MD1
MD0
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
21 / 99
para grabar datos permanentes en cantidades menores a las ROMs, o cuando los
datos deben cambiar en muchos o todos los casos.
Una PROM común se encuentra con todos los bits en valor 1 como valor por
defecto de las fábricas; el quemado de cada fusible, cambia el valor del
correspondiente bit a 0. La programación se realiza aplicando pulsos de altos voltajes
que no se encuentran durante operaciones normales (12 a 21 voltios). El término
Read-only (sólo lectura) se refiere a que, a diferencia de otras memorias, los datos no
pueden ser cambiados (al menos por el usuario final).
Escogemos una memoria capaz de grabar 32 datos de una longitud de 8 bits,
suficiente para nuestro problema.
74S288 MEMORIA PROM 32X8 BITS 2,0080EUR
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
22 / 99
P1A2-S1 Xilinx ISE:
Para simular el circuito en el programa Xilinx ISE empleamos un chip
7432, que permite utilizar 4 puertas OR2. Sus características vienen indicadas
en el programa. También empleamos un chip 7404 que permite utilizar 6
puertas not.
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
23 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
24 / 99
P1.- B) Una planta de embotellado dispone de una zona de inspección final,
para el control del correcto llenado, etiquetado y taponado de los envases. En
esta zona se dispone de cuatro sensores los cuales, captan información del
estado de los envases ver figura).
Los cuatro sensores manifiestan la presencia de envase, etiqueta, tapón
y botella llena, presentando una tensión de 5V entre sus respectivos terminales
de salida. Cuando no los detectan, presentan una tensión de 0V. En la salida
de la zona de inspección se encuentran 3 cilindros neumáticos que desplazan
los envases para distribuirlos hacia diferentes cintas transportadoras que los
desvían hacia zonas diferentes:
.- Cilindro 1: “Hacia la zona de defectuosos” (cuando los envases están
tapados pero vacíos, con o sin etiqueta)
.- Cilindro 2: “Incompleto” (cuando a los envases les falta algún proceso de
acabado: llenado, etiqueta, o tapón y se pueden reciclar)
.- Cilindro 3:”Hacia la zona de embalaje” (cuando los envases están llenos,
tapados y etiquetados).
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
25 / 99
Para activar cualquiera de los cilindros, basta con aplicar una tensión de 5V a
sus terminales de entrada.
Se pide:
1º) Diseñar el circuito digital mínimo que en función del estado de los sensores
de la zona de inspección, gobierne de forma adecuada los pistones de
distribución P1, P2, P3 y que además, active una lámpara de ALARMA, cuando
se detecte un mal funcionamiento de los sensores S1, S2, S3 y S4.
Nota: www.alldatasheet.com contiene información sobre circuitos
integrados y permite búsquedas por referencia o por tipo de función.
2º) Diseñar un circuito alternativo al anterior que emplee únicamente un
dispositivo de memoria no volátil de tamaño adecuado, mostrando los datos
que se deberían grabar en el mismo para implementar la función.
P1B1-S1 Entradas y Salidas del sistema:
- Entradas:
• Sensor S1: si detecta envase activo. S1=1 Activo.
• Sensor S2: si detecta etiqueta activo. S2=1 Activo.
• Sensor S3: si detecta llenado activo. S3=1 Activo.
• Sensor S4: si detecta tapón activo. S4=1 Activo.
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
26 / 99
- Salidas:
• Pistón P1: botella tapada y vacía activo. P1=1 Activo.
• Pistón P2: falta llenar, etiqueta o tapón activo. P2=1 Activo.
• Pistón P3: botella correcta activo. P3=1 Activo.
• Alarma A: no existe botella activa. A=1 Activo.
P1B1-S2 Tipo de sistema:
Puesto que las salidas únicamente dependen de las entradas se trata de
un sistema combinacional.
P1B1-S3 Elección de criterio de lógica:
Tomamos el criterio de lógica positiva, es decir, un 1 lógico equivaldrá a
existencia de tensión y un 0 lógico equivaldrá a no existencia de tensión.
P1B1-S4 Convenio de entradas y salidas:
Indicado en el enunciado del problema. Ver apartado P1B1-S1.
�� � �����
Sistema
Combinacional
Salidas ���� Entradas ����
S1 P1
S2 P2
S3 P3
S4 A
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
27 / 99
P1B1-S5 Tabla de verdad:
Tomamos S1 como el bit de mayor peso y S4 como el bit de menor peso.
Entradas ��� Salidas �� �
П Σ S1
envase
S2
etiqu
S3
lleno
S4
tapón
P1
defec
P2
incom
P3
emba A
15 0 0 0 0 0 0 0 0 0
14 1 0 0 0 1 0 0 0 1
13 2 0 0 1 0 0 0 0 1
12 3 0 0 1 1 0 0 0 1
11 4 0 1 0 0 0 0 0 1
10 5 0 1 0 1 0 0 0 1
9 6 0 1 1 0 0 0 0 1
8 7 0 1 1 1 0 0 0 1
7 8 1 0 0 0 0 1 0 0
6 9 1 0 0 1 1 0 0 0
5 10 1 0 1 0 0 1 0 0
4 11 1 0 1 1 0 1 0 0
3 12 1 1 0 0 0 1 0 0
2 13 1 1 0 1 1 0 0 0
1 14 1 1 1 0 0 1 0 0
0 15 1 1 1 1 0 0 1 0
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
28 / 99
P1B1-S6 Funciones de Salida:
(1 � ��9,13� � ��0,1,3,4,5,7,8,9,10,11,12,13,14,15���
(2 � ��8,10,11,12,14� � ��0,2,6,8,9,10,11,12,13,14,15���
(3 � ��15� � ��1,2,3,4,5,6,7,8,9,10,11,12,13,14,15���
# � ��1,2,3,4,5,6,7� � ��0,1,2,3,4,5,6,7,15���
Ahora intentamos simplificar las funciones obtenidas mediante los
mapas de Karnaugh, lo haremos tanto para las funciones expresadas como
suma de productos como para las mismas expresadas como producto de
sumas:
(1 � ��9,13� � )1 * )3''' * )4�
S3S4
00 01 11 10
S1S2
00 0 1 3 2
01 4 5 7 6
11 12
13 15 14
10 8 9 11 10
1
1
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
29 / 99
0
1 1
(1 � ��0,1,3,4,5,7,8,9,10,11,12,13,14,15��
� )1 * �)1''' � )3'''� * �)1''' � )4� �
� �)1 * )1''' � )1 * )3'''� * �)1''' � )4� � �)1 * )3''' * )1'''� � �)1 * )3''' * )4�� )1 * )3''' * )4
(2 � ��8,10,11,12,14� � �)1 * )4'''� ��
�)1 * )2''' * )3� � )1 * �)4''' � )2''' * )3�
0
0 0 0
0
0 0 0 0
0 0 0 0
1 1
1
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
30 / 99
0
0
0 0 0
0 0
(2 � ��0,2,6,8,9,10,11,12,13,14,15��
� )1 * �)1''' � )2''' � )4'''� * �)3 � )4'''�
(3 � ��15� � )1 * )2 * )3 * )4�
(3 � ��1,2,3,4,5,6,7,8,9,10,11,12,13,14,15� � )1 * )2 * )3 * )4�
0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
31 / 99
0
0 0 0
0 0
0
# � ��1,2,3,4,5,6,7� ��
�)1''' * )2� � �)1''' * )4� � �)1''' * )3� � )1''' * �)2 � )3 � )4�
# � ��0,1,2,3,4,5,6,7,15��
� )1''' * �)2 � )3 � )4�
1
0
0
1
1 1 1 1
1
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
32 / 99
P1B1-S7 Esquema digital:
(1 � )1 * )3''' * )4
(2 � )1 * �)4''' � )2''' * )3�
(3 � )1 * )2 * )3 * )4
# � )1''' * �)2 � )3 � )4�
&
S4 S3 S2 S1
P1 1
&
1
≥1
1
&
P2
&
P3
≥1 &
A
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
33 / 99
P1B2-S1 Circuito alternativo de memoria no volátil:
Empleamos un dispositivo de memoria no volátil con 4 entradas y 4
salidas, con capacidad para almacenar 16 datos de cuatro bits. De esa forma
podríamos “grabar” la tabla de la verdad que se calculó anteriormente y en
función del número decimal que formen S1,S2,S3,S4 el dispositivo asignará a
las salidas los valores previamente grabados en la fila correspondiente a dicho
número:
0 0 0 0
0 0 0 1
0 0 0 1
0 0 0 1
0 0 0 1
0 0 0 1
0 0 0 1
0 0 0 1
0 1 0 0
1 0 0 0
0 1 0 0
0 1 0 0
0 1 0 0
1 0 0 0
0 1 0 0
0 0 1 0
P1
P2
P3
A
S1
S2
S3
S4
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
34 / 99
PRÁCTICA 2: Sistemas Secuenciales
P2. Un motor paso a paso unipolar es una máquina eléctrica rotativa de
corriente continua que necesita para su funcionamiento una determinada
polarización consecutiva de sus devanados. Existen dos modos de
funcionamiento: modo de Paso Completo (se activan dos fases
simultáneamente) y modo de Medio Paso (sólamente una). El modo de Medio
Paso conlleva el giro de la mitad de grados que en el modo de Paso Completo.
La forma de conectar sus devanados se puede ver en la figura siguiente:
Se Pide:
1º) Diseñar el sistema electrónico digital necesario para el control de giro
de un motor de 4 fases unipolar como el descrito, que disponga de la siguientes
señales: Una entrada denominada “SENTIDO” mediante la cual especifirar el
sentido de giro del motor: (0: giro a Izda, 1: giro a Dcha.). Una entrada
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
35 / 99
denominada “ENCLAVAR” con la cual controlaremos el giro y la detención:
(0:el motor gira, 1:enclavamiento del motor). El sistema recibirá una señal de
RELOJ de 0-5 V de frecuencia variable que marcará la velocidad de giro del
motor en función de la frecuencia de esta señal de sincronismo.
2º.- Editar el archivo necesario para la síntesis posterior del circuito en
un PLD PALCE22V10.
3º.- Modificar y reprogramar el PLD del circuito para que el motor trabaje
en Medio Paso, controlado por una entrada adicional denominada MODO,
(MODO=0: Medio Paso, Modo =1: Paso Completo). Usando otro PLD adicional
PALCE16V8, se desea además que el sistema de control del motor indique (en
el modo de paso completo) en un display de 7 segmentos los estados
correspondientes a los pasos de polarización (1,2,3,4), activando los
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
36 / 99
segmentos “a, b, g, f “ respectivamente. En el modo de medio paso, los
segmentos “g, c, d, e” respectivamente.
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
37 / 99
P2-S1.1 Entradas y Salidas del sistema:
- Entradas:
• Sentido giro S. S=0 giro a la izquierda. S=1 giro a la derecha.
• Enclavar E. E=0 el motor gira. E=1 el motor se enclava.
• Reloj CLK: Señal de reloj de frecuencia variable.
- Salidas:
• Fase A: se activa la señal A del motor si A=1.
• Fase B: se activa la señal B del motor si B=1.
• Fase C: se activa la señal C del motor si C=1.
• Fase D: se activa la señal D del motor si D=1.
P2-S1.2 Tipo de sistema:
Puesto que las salidas dependen de las entradas y del Estado en el que
se encuentre el sistema se trata de un sistema Secuencial. Realizaremos un
sistema secuencial tipo Moore por su mayor sencillez respecto al Mealy.
�� � �+,��-�.
Sistema
Secuencial
Tipo Moore
Salidas ���� Entradas ����
S
E
A
B
C
D
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
38 / 99
P2-S1.3 Elección de criterio de lógica:
Tomamos el criterio de lógica positiva, es decir, un 1 lógico equivaldrá a
existencia de tensión y un 0 lógico equivaldrá a no existencia de tensión
P2-S1.4 Convenio de entradas y salidas:
Indicado en el enunciado del problema. Ver apartado P2-S1.1.
P2-S1.5 Diagrama de Estados:
Puesto que se trata de un sistema Moore identificamos los diferentes
Estados Internos que se pueden dar con una combinación de las variables de
salida. Nunca se deberá activar al mismo tiempo las fases A y B y, por otro
lado, las fases C y D. Siempre deberemos activar dos fases. Así tendremos 4
estados.
La notación empleada en el diagrama de estados será la siguiente:
Ex: Estado interno del sistema nºx.
ABCD: Valor lógico de las salidas
ES: Valor lógico de las entradas
Ex ABCD
ES
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
39 / 99
P2-S1.6 Codificación de estados:
De forma que su valor coincida con los dígitos centrales de los Estados
asignamos los siguientes valores a los estados internos.
E0: Q1=0; Q0=0
E1: Q1=0; Q0=1
E2: Q1=1; Q0=1
E3: Q1=1; Q0=0
01
1X
E0 1001
E1 1010
00
00
E3 0101
E2 0110
01
00 01 00 01
1X
1X 1X
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
40 / 99
P2-S1.7 Tabla de excitación y de salida del sistema:
Entradas ���
Est. interno
(t)
Est. interno
(t+1) Salidas �� �
Σ E S Q1 Q0 Q1 Q0 A B C D
0 0 0 0 0 1 0 1 0 0 1
1 0 0 0 1 0 0 1 0 1 0
2 0 0 1 0 1 1 0 1 0 1
3 0 0 1 1 0 1 0 1 1 0
4 0 1 0 0 0 1 1 0 0 1
5 0 1 0 1 1 1 1 0 1 0
6 0 1 1 0 0 0 0 1 0 1
7 0 1 1 1 1 0 0 1 1 0
8 1 0 0 0 0 0 1 0 0 1
9 1 0 0 1 0 1 1 0 1 0
10 1 0 1 0 1 0 0 1 0 1
11 1 0 1 1 1 1 0 1 1 0
12 1 1 0 0 0 0 1 0 0 1
13 1 1 0 1 0 1 1 0 1 0
14 1 1 1 0 1 0 0 1 0 1
15 1 1 1 1 1 1 0 1 1 0
P2-S1.8 Funciones de Salida:
/1�- � 1� � ��0,2,5,7,10,11,14,15��
/0�- � 1� � ��2,3,4,5,9,11,13,15��
# � ��0,1,4,5,8,9,12,13��
0 � ��2,3,6,7,10,11,14,15��
! � ��1,3,5,7,9,11,13,15��
� ��0,2,4,6,8,10,12,14��
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
41 / 99
Ahora simplificaremos las funciones obtenidas:
/1�- � 1� � ��0,2,5,7,10,11,14,15��
� &'. )2. /0'''' � &'. ). /0 � &. /1
/0�- � 1� � ∑ �2,3,4,5,9,11,13,15�� � &'. )2. /1 � &'. ). /1'''' � &. /0
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
42 / 99
# � ��0,1,4,5,8,9,12,13��
� /1''''
0 � ��2,3,6,7,10,11,14,15��
� /1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
43 / 99
! � ��1,3,5,7,9,11,13,15��
� /0
� ��0,2,4,6,8,10,12,14��
� /0''''
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
44 / 99
P2-S1.9 Esquema digital:
Resolveremos primero el sistema combinacional II dónde los estados
internos Qi(t+1) dependen de los estados internos inciales Q0(t) y de las
entradas Xi. Utilizaremos Biestables tipo D.
/1�- � 1� � ��0,2,5,7,10,11,14,15��
� &'. )2. /0'''' � &'. ). /0 � &. /1
/0�- � 1� � ∑ �2,3,4,5,9,11,13,15�� � &'. )2. /1 � &'. ). /1'''' � &. /0
E
Q0(t+1)
& 1 S
Bies. D
/0''''
/0
Bies. D
/1''''
/1
1 &
≥1
≥1
Q1(t+1)
CLK
&
&
&
&
&
&
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
45 / 99
Ahora resolveremos el sistema combinacional que calcula las salidas en
función de los estados internos y de las entradas (aunque en este caso por
haber elegido un sistema tipo Moore, las salidas no dependerán de las
entradas, como puede verse en las expresiones calculadas). Puede observarse
como las salidas coinciden directamente con los estados al haber codificado los
mismos de forma que coincidieran con las primeras.
# � /1''''
0 � /1
! � /0
� /0''''
S
E
Sis
tem
a
Co
mb
ina
cio
na
l II
Q0(t+1)
Q1(t+1) 1 A
B
1 C
D
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
46 / 99
P2-S2 Síntesis del circuito en un PLD.
Utilizando el programa PLDSHELL se definió un programa de acuerdo a
las especificaciones antes mencionadas. En este caso la codificación de
estados fue la siguiente:
E0: Q1=0; Q0=0
E1: Q1=0; Q0=1
E2: Q1=1; Q0=0
E3: Q1=1; Q0=1
Archivo del PLD:
Title CONTROL MOTOR PASO A PASO PRACTICA CYSE Pattern pds Revision 1 Author CYSE Date 14/04/08 CHIP MOTOR_PP 22V10 ;------------------ ASIGNACIàN DE PINES ----------- -------------- PIN RELOJ PIN DIR PIN ENCLAV PIN 16 FA PIN 17 FB PIN 18 FC PIN 19 FD NODE Q0 NODE Q1 ;-----------------DECLARACIàN DE SE¥ALES Y ECUACION ES----------- EQUATIONS Q0.CLKF = RELOJ Q1.CLKF = RELOJ T_TAB ( ENCLAV DIR Q1 Q0 :>> Q1.D Q0.D ) 0 0 0 0 : 0 1 0 0 0 1 : 1 0 0 0 1 0 : 1 1 0 0 1 1 : 0 0 0 1 0 0 : 1 1 0 1 0 1 : 0 0 0 1 1 0 : 0 1 0 1 1 1 : 1 0 1 X 0 0 : 0 0 1 X 0 1 : 0 1 1 X 1 0 : 1 0
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
47 / 99
1 X 1 1 : 1 1 ;-------------------------------------------------- ------------ T_TAB ( Q1 Q0 >> FA FB FC FD ) 0 0 : 1 0 0 1 0 1 : 1 0 1 0 1 0 : 0 1 1 0 1 1 : 0 1 0 1 ;-------------------------------------------------- ----------- SIMULATION VECTOR CUENTA := [ Q1 Q0 ] ;--------------------DECLARAR UN VECTOR DE CUENTA-- ----------- SETF /RELOJ /ENCLAV /DIR PRLDF /Q1 /Q0 ;---------DEFINIMOS EL ESTADO INICIAL DEL SISTEMA-- ----------- CLOCKF RELOJ CLOCKF RELOJ FOR k := 1 TO 10 DO BEGIN CLOCKF RELOJ END ;--------------------CUENTA 0123------------------- -------------- SETF DIR FOR k := 1 TO 10 DO BEGIN CLOCKF RELOJ END ;-----------------CUENTA 3210-------------------- SETF ENCLAV CLOCKF RELOJ CLOCKF RELOJ SETF /ENCLAV CLOCKF RELOJ CLOCKF RELOJ SETF ENCLAV CLOCKF RELOJ CLOCKF RELOJ ;-----------------------ENCLAVAMIENTO-------------- --------- ;FIN
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
48 / 99
P2-S3 Modificar y reprogramar el PLD.
Código VHDL para que el motor puede trabajar en Medio Paso,
añadiendo una entrada adicional. Asi mismo, se indica el código VHDL para
que un display muestre para el caso de paso completo los estados de
polarización.
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity motor_paso_a_paso is
Port ( RELOJ : in std_logic; SENT : in std_logic; ENCLAV : in std_logic; MODO: in std_logic; FASES : out std_logic_vector(3 downto 0));
end motor_paso_a_paso; architecture behavioral of motor_paso_a_paso is signal CUENTA:std_logic_vector (1 downto 0); begin
process (RELOJ) begin
if RELOJ'event and RELOJ='1' then if ENCLAV='0' then
if SENT='1' then CUENTA <= CUENTA + '1';
CUENTA <= CUENTA - '1'; end if;
end if; end if;
end process; process (CUENTA,MODO) begin
if MODO='1' then case CUENTA is
when "00" => FASES <= "1001";
when "01" => FASES <= "1010";
when "10" => FASES <= "0110";
when "11" => FASES <= "0101";
when others => Null; end case;
else case CUENTA is
when "00" => FASES <= "0001";
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
49 / 99
when "01" => FASES <= "0100";
when "10" => FASES <= "0010";
when "11" => FASES <= "1000";
when others => Null; end case;
end if; end process;
end behavioral;
Segunda parte: (Display de control)
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity vis is
Port ( MODO : in STD_LOGIC; SENT: in STD_LOGIC; FASES : in STD_LOGIC_VECTOR (3 downto 0); SEGMENTOS: out STD_LOGIC_VECTOR (0 to 6)); --segmen tos
display end vis; architecture Behavioral of vis is begin
process (MODO,SENT,FASES) begin if (MODO = '1' and SENTIDO = '1' ) then
case FASES is when "1001" =>
SEGMENTOS <= "1000000"; --segmento a when "1010" =>
SEGMENTOS <= "0100000"; --segmento b when "0110" =>
SEGMENTOS <= "0000001"; --segmento g when "0101" =>
SEGMENTOS <= "0000010"; --segmento f when others => Null;
end case; elsif (MODO = '1' and SENT = '0') then
case FASES is when "0101" =>
SEGMENTOS <= "1000000"; --segmento a when "0110" =>
SEGMENTOS <= "0100000"; --segmento b when "1010" =>
SEGMENTOS <= "0000001"; --segmento g when "1001" =>
SEGMENTOS <= "0000010"; --segmento f when others => Null;
end case;
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
50 / 99
elsif (MODO = '0' and SENT = '1') then case FASES is
when "1000" => SEGMENTOS <= "0000001"; --segmento g
when "0010" => SEGMENTOS <= "0010000"; --segmento c
when "0100" => SEGMENTOS <= "0001000"; --segmento d
when "0001" => SEGMENTOS <= "0000100"; --segmento e
when others => Null; end case;
else case FASES is
when "0001" => SEGMENTOS <= "0000001"; --segmento g
when "0100" => SEGMENTOS <= "0010000"; --segmento c
when "0010" => SEGMENTOS <= "0001000"; --segmento d
when "1000" => SEGMENTOS <= "0000100"; --segmento e
when others => Null; end case;
end if; end process;
end Behavioral;
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
51 / 99
PRÁCTICA 3: VHDL
Se desea diseñar un circuito digital que realice la suma de números de 1
bit (a,b), incluyendo un bit de acarreo de entrada (Ci), y genere un bit de Suma
(S) y otro de acarreo de salida (Co).
Se pide:
a.1) -Tabla de la verdad del sistema y esquema lógico.
- Descripción en VDHL del módulo
- Síntesis y simulación.
a.2) Utilizando como componentes tres módulos de los anteriores, describir
en VHDL estructural un circuito sumador de 3 bits.
a.3) El sistema se pretende diseñar en VDHL estructurado y se sintetizará
sobre un dispositivo FPGA tipo Spartan 3 (XC3S200 ft256 -4), disponible en la
tarjeta de desarrollo Digilent.
b) Análogamente, diseñar un Multiplexor de 4 canales con salida triestado
mediante la descripción de un módulo Decodificador “uno entre cuatro” y
módulos de tipo Buffer Triestado, mediante VHDL estructural.
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
52 / 99
P3A1-S1 Entradas y Salidas del sistema:
- Entradas:
• a: bit lógico. Primer número a sumar .
• b: bit lógico. Segundo número a sumar.
• Ci: bit lógico. Acarreo inicial a sumar.
- Salidas:
• S: bit lógico. Cifra de menor peso de Suma de a+b
• Co: bit lógico. Acarreo de salida. Cifra de mayor peso de Suma de
a+b (necesario para representar el número 3 en binario mediante dos
dígitos).
P3A1-S2 Tipo de sistema:
Puesto que las salidas únicamente dependen de las entradas se trata de
un sistema combinacional.
�� � �����
Sistema
Combinacional
Salidas ���� Entradas ����
a S
b
Co Ci
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
53 / 99
P3A1-S3 Elección de criterio de lógica:
Tomamos el criterio de lógica positiva, es decir, un 1 lógico equivaldrá a
existencia de tensión y un 0 lógico equivaldrá a no existencia de tensión.
P3A1-S4 Convenio de entradas y salidas:
Puesto que tanto las entradas como las salidas son números binarios no
es necesario establecer ningún convenio adicional. Únicamente señalar que en
la salida el bit de menor peso de la suma será ‘S’ y el de mayor peso ‘Co’.
P3A1-S5 Tabla de verdad:
Entradas ��� Salidas �� �
П Σ Ci a b Co S
7 0 0 0 0 0 0
6 1 0 0 1 0 1
5 2 0 1 0 0 1
4 3 0 1 1 1 0
3 4 1 0 0 0 1
2 5 1 0 1 1 0
1 6 1 1 0 1 0
0 7 1 1 1 1 1
P3A1-S6 Funciones de Salida:
!4 � ��3,5,6,7� � ��3,5,6,7�55
) � ��1,2,4,7� � ��1,2,4,7�55
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
54 / 99
Ahora intentamos simplificar las funciones obtenidas mediante los
mapas de Karnaugh, lo haremos tanto para las funciones expresadas como
suma de productos como para las mismas expresadas como producto de
sumas, obteniendo el mismo resultado:
!4 � ��3,5,6,7� � !6. 7 � 8. 7 � !6. 85
) � ��1,2,4,7� � !6. 8'. 7' � !9: . 8'. 7 � !6. 8. 7 � !9: . 8. 7' � 8. �7. !6 � 7'. !9: �5
� 8.: +7'. !6 � 7. !9: . � 8. +7 ; !9'''''''''. � 8'. �7 ; !6� � 8 ; 7 ; !6
1
1 1 1
1
1
1
1
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
55 / 99
!4 � ��3,5,6,7� �5
�!6 � 7�. �8 � 7�. �!6 � 8�
� �!6. 8 � !6. 7 � 7. 8 � 7. 7�. �!6 � 8�� !6. 8. !6 � !6. 8. 8 � !6. 7. !6 � !6. 7. 8 � 7. 8. !6 � 7. 8. 8 � 7. 7. !6� 7. 7. 8 � 8. !6 � 8. !6 � 7. !6 � !6. 7. 8 � 7. 8. !6 � 7. 8 � 7. !6 � 7. 8� 8. !6 � 7. !6 � 8. 7. !6 � 7. 8 � 8. !6 � 7. !6 � 7. 8
) � ��1,2,4,7�5
� +!6 � 8' � 7�'''. �!9'''' � 8' � 7.. �!6 � 8 � 7�. �!9: � 8 � 7�''' �
� 8. +7 ; !9'''''''''. � 8'. �7 ; !6� � 8 ; 7 ; !6
0
0 0 0
0
0
0
0
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
56 / 99
P3A1-S7 Esquema digital:
) � 8 ; 7 ; !6 !4 � !6. 7 � 8. 7 � !6. 8
b
a
Ci
S
≥1
&
Co
=1
&
&
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
57 / 99
P3A1-S8 VDHL:
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity SUMA1BIT is Port ( a : in STD_LOGIC; b : in STD_LOGIC; ci : in STD_LOGIC; s : out STD_LOGIC; co : out STD_LOGIC); end SUMA1BIT; architecture Behavioral of SUMA1BIT is begin s<=a XOR b XOR ci; co<=(a AND b) OR (a AND ci) OR (b AND ci); end Behavioral;
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
58 / 99
P3A2-S1 Sumador de 3 Bits en VDHL:
Emplearemos el código del sumador de 1Bit utilizándolo en el código del
sumador de 3 Bit como un componente.
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity SUMA3BIT is Port ( A : in STD_LOGIC_VECTOR (2 downto 0); B : in STD_LOGIC_VECTOR (2 downto 0); c_int : in STD_LOGIC; suma : out STD_LOGIC_VECTOR (2 downto 0); c_out : out STD_LOGIC); end SUMA3BIT; architecture Behavioral of SUMA3BIT is component SUMA1BIT is Port ( a : in STD_LOGIC; b : in STD_LOGIC; ci : in STD_LOGIC; s : out STD_LOGIC; co : out STD_LOGIC); end component; signal nodo1:STD_LOGIC; signal nodo2:STD_LOGIC; begin U1: SUMA1BIT port map (A(0),B(0),c_int,suma(0),nodo1); U2: SUMA1BIT port map (A(1),B(1),nodo1,suma(1),nodo2); U3: SUMA1BIT port map (A(2),B(2),nodo2,suma(2),c_out); end Behavioral;
A continuación simulamos el programa con el siguiente código de Testbench:
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
59 / 99
LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_unsigned.all; USE ieee.numeric_std.ALL; ENTITY TB_SUMA1BIT IS END TB_SUMA1BIT; ARCHITECTURE behavior OF TB_SUMA1BIT IS -- Component Declaration for the Unit Under Test (UUT) COMPONENT SUMA1BIT PORT( a : IN std_logic; b : IN std_logic; ci : IN std_logic; s : OUT std_logic; co : OUT std_logic ); END COMPONENT; --Inputs signal a : std_logic := '0'; signal b : std_logic := '0'; signal ci : std_logic := '0'; --Outputs signal s : std_logic; signal co : std_logic; BEGIN -- Instantiate the Unit Under Test (UUT) uut: SUMA1BIT PORT MAP ( a => a, b => b, ci => ci, s => s, co => co ); -- No clocks detected in port list. Replace <clock> below with -- appropriate port name -- Stimulus process stim_proc: process begin -- hold reset state for 100ms. wait for 100ms;
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
60 / 99
a<='0'; b<='1'; ci<='1'; wait for 100ms; a<='1'; b<='1'; ci<='1'; wait for 100ms; a<='0'; b<='0'; ci<='0'; wait; end process; END;
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
61 / 99
P3B-S1 Introducción
Un multiplexor es un dispositivo que dispone de un conjunto de entradas
de datos y de control y una única salida. Mediante las patillas de control,
permite dirigir la información digital procedente de una de las diferentes
entradas de datos hacia la salida. Un multiplexor con salida triestato sigue
teniendo una única salida pero ésta puede presentar tres valores diferentes: ‘0’
lógico, ‘1’ lógico, y un estado de Alta impedancia. Esto se consigue mediante el
uso de Buffers Triestado.
Buffers Triestado: Consisten en dispositivos que pueden presentar en su
salida 3 estados diferentes. Dos de éstos estados son los estados lógicos 0 y 1.
El tercer estado, denominado “estado de Alta Impedancia”, no es un estado
lógico como tal, sino que se trata de un modo de funcionamiento en el cual la
salida del dispositivo queda flotante, es decir, presenta una impedancia
suficientemente grande (idealmente infinita) como para considerar que la salida
está desconectada del resto del circuito.
Un Multiplexor triestado se construye mediante el uso de un
decodificador y buffers triestado. En nuestro ejemplo, contamos con la ayuda
de 4 buffers triestado. Estas puertas poseen una entrada de desinhibición (EN)
del tercer estado de la salida y una salida sigue a la entrada D. Por el contrario,
cuando EN se encuentra a nivel cero, la salida se pone en Alta Impedancia.
También contamos con un decodificador de 2 a 4 con enable activo a nivel
bajo. Siguiendo el funcionamiento del decodificador, poniendo una combinación
binaria en las patillas de entrada, sólo una de las salidas se activará. Cada
salida del decodificador se conectará a la alimentación de cada buffer triestado,
permitiendo el funcionamiento de un buffer para cada combinación de entrada.
Y como tenemos la absoluta certeza de que sólo un buffer se activará para
cada combinación binaria, podemos unir todas las salidas de los buffers,
teniendo una única salida. Hemos construido, por tanto, un multiplexor de 4
canales (las 4 entradas de los buffers triestado), con 2 entradas de selección
(las entradas del decodificador) y con enable a nivel bajo.
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
62 / 99
P3B-S2 Código VDHL de un buffer triestato.
library ieee; use.ieee.std_logic_1164.all; ENTITY buffer3e IS
PORT (d,t: IN std_logic;
s: OUT std_logic);
END buffer3e
ARCHITECTURE arq_ buffer3e OF buffer3e IS
BEGIN
PROCESS (d, t)
BEGIN
IF t=’1’ THEN s <= d;
ELSE s<= ‘Z’;
END IF;
END PROCESS;
END arq_ buffer3e;
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
63 / 99
P3B-S3 Código VDHL de un decodificador 2 a 4 con enable activo a nivel bajo
(tomaremos también las salidas activas a nivel bajo):
library ieee; use.ieee.std_logic_1164.all; ENTITY deco2a4 IS
PORT (en: IN std_logic;
a: IN bit_vector(1 DOWNTO 0);
b: OUT bit_vector(3 DOWNTO 0);
END deco2a4
ARCHITECTURE arq_deco2a4 OF deco2a4 IS
BEGIN
PROCESS (en, a)
BEGIN
IF en=’0’ THEN
b<=”1111”;
ELSE
CASE a IS
WHEN “00” => b <=”1110”;
WHEN “01” => b <=”1101”;
WHEN “10” => b <=”1011”;
WHEN “11” => b <=”0111”;
WHEN OTHERS => b <=”1111”;
END CASE;
END IF;
END PROCESS;
END arq_deco2a4;
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
64 / 99
P3B-S4 Multiplexor:
Ahora describiremos el módulo del multiplexor empleando como
componentes los módulos antes descritos:
library ieee; use.ieee.std_logic_1164.all; ENTITY mux4tri IS
PORT (en: IN std_logic;
s: IN bit_vector(1 DOWNTO 0);
d: IN bit_vector(3 DOWNTO 0);
sal: OUT std_logic);
END mux4tri
ARCHITECTURE arq_ mux4tri OF mux4tri IS
COMPONENT buffer3e
PORT (d,t: IN std_logic;
s: OUT std_logic);
END COMPONENT;
COMPONENT deco2a4
PORT (en: IN std_logic;
a: IN bit_vector(1 DOWNTO 0);
b: OUT bit_vector(3 DOWNTO 0);
END COMPONENT;
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
65 / 99
SIGNAL c1,c2,c3,c4,sal1,sal2,sal3,sal4: std_logic;
BEGIN
U1: deco2a4 PORT MAP(en,s,b);
U2: buffer3e PORT MAP(d(1),b(1),sal1);
U3: buffer3e PORT MAP(d(2),b(2),sal2);
U4: buffer3e PORT MAP(d(2),b(3),sal3);
U5: buffer3e PORT MAP(d(2),b(4),sal4);
PROCESS (sal1,sal2,sal3,sal4)
IF sal1 /= ‘Z’ THEN sal <=sal1;
ELSE IF sal2 /= ‘Z’ THEN sal <=sal2;
ELSE IF sal3 /= ‘Z’ THEN sal <=sal4;
ELSE sal<=sal4;
END IF
END PROCESS
END arq_ mux4tri
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
66 / 99
PRÁCTICA 4: SIMULACIÓN VHDL
A)
1º) Describir en lenguaje VHDL un contador reversible de cuatro bits,
con entradas de habilitación a cuenta, reset y carga en paralelo todas de tipo
síncrono y activas a nivel bajo.
2º) Diseñar un testbench en VHDL que permita comprobar su correcto
funcionamiento dentro del simulador integrado en ISE.
3º) Ampliar el sistema con un bloque visualizador dinámico y sintetizar
de manera que permita comprobar experimentalmente en los visualizadores de
la tarjeta de desarrollo Spartan 3 el correcto funcionamiento del contador,
interactuando con los pulsadores y los switches para su operación.
B) Modificar el archivo final para que el reset y la carga paralelo sean de tipo
asíncrono
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
67 / 99
P4A1-S Código VHDL contador:
ENTITY contador4r IS
PORT (rst,en,load,up_down: IN std_logic;
d: IN std_logic _vector(3 DOWNTO 0);
q: OUT std_logic _vector(3 DOWNTO 0));
END contador4r
ARCHITECTURE arq_ contador4r OF contador4r IS
SIGNAL cuenta: std_logic_vector(3 DOWNTO 0);
BEGIN
PROCESS (clk)
BEGIN
IF clk’event AND clk=’1’ THEN
IF en=’0’ THEN
IF rst=’0’ THEN
cuenta<=”0000”;
ELSE IF load=’0’ THEN
g<=d;
ELSE IF up=’1’ THEN
cuenta<=cuenta+1;
ELSE cuenta<=cuenta-1;
END IF
END IF;
END IF;
END PROCESS;
q<=cuenta;
END cuenta;
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
68 / 99
P4A2-S Testbench en VHDL
A continuación se incluyen unas capturas de pantalla que muestran el
proceso para realizar la simulación en ISE.
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
69 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
70 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
71 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
72 / 99
Partimos de un modelo de código ya existente en el programa para un
contador, y lo modificamos según nuestras especificaciones de diseño.
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity practica4 is Port ( ce : in STD_LOGIC; rst : in STD_LOGIC; up_down : in STD_LOGIC; load : in STD_LOGIC; clk : in STD_LOGIC; d : in STD_LOGIC_VECTOR (3 downto 0); q : out STD_LOGIC_VECTOR (3 downto 0)); end practica4; architecture Behavioral of practica4 is signal CUENTA: STD_LOGIC_VECTOR (3 DOWNTO 0); begin process (<clk>) begin if clk='1' and <clk>'event then if rst='0' then CUENTA <= (others => '0'); elsif ce='1' then if load='0' then CUENTA <=d; else if up_down>='1' then CUENTA <= CUENTA + 1; else CUENTA <= CUENTA - 1; end if; end if; end if; end if; end process; Q<=CUENTA; end Behavioral;
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
73 / 99
A continuación el código VHDL utilizado para la simulación:
LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_unsigned.all; USE ieee.numeric_std.ALL; ENTITY tb_contador_vhd IS END tb_contador_vhd; ARCHITECTURE behavior OF tb_contador_vhd IS -- Component Declaration for the Unit Under Test (UUT) COMPONENT contador PORT( RST : IN std_logic; CLK : IN std_logic; CE : IN std_logic; UP_ND : IN std_logic; LOAD : IN std_logic; D : IN std_logic_vector(3 downto 0); Q : OUT std_logic_vector(3 downto 0) ); END COMPONENT; --Inputs SIGNAL RST : std_logic := '0'; SIGNAL CLK : std_logic := '0'; SIGNAL CE : std_logic := '0'; SIGNAL UP_ND : std_logic := '0'; SIGNAL LOAD : std_logic := '0'; SIGNAL D : std_logic_vector(3 downto 0) := (others=>'0'); --Outputs SIGNAL Q : std_logic_vector(3 downto 0); BEGIN -- Instantiate the Unit Under Test (UUT) uut: contador PORT MAP( RST => RST, CLK => CLK, CE => CE, UP_ND => UP_ND, LOAD => LOAD, D => D, Q => Q ); reloj : PROCESS constant periodo : time := 200 ns; BEGIN CLK <= '0';
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
74 / 99
wait for periodo / 2; CLK <= '1'; wait for periodo / 2; END PROCESS; control : PROCESS constant T20 : time := 4000 ns; constant T5 : time := 1000 ns; BEGIN D <= "1010"; CE <= '1'; RST <= '1'; LOAD <= '1'; UP_ND <= '1'; wait for T20; RST <= '0'; wait for T5; CE <= '0'; wait for T5; RST <= '1'; wait for T20; LOAD <= '0'; wait for T20; LOAD <= '1'; wait for T20; END PROCESS; END;
P4A3-S Visualizador dinámico:
No se llegó a realizar este apartado por falta de tiempo. A pesar de ello,
en clase se vieron las principales características de la tarjeta Spartan 3.
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
75 / 99
P4B-S Código VHDL contador reset y carga asíncronos
ENTITY contador4r IS
PORT (rst,en,load,up_down: IN std_logic;
d: IN std_logic _vector(3 DOWNTO 0);
q: OUT std_logic _vector(3 DOWNTO 0));
END contador4r
ARCHITECTURE arq_ contador4r OF contador4r IS
SIGNAL cuenta: std_logic_vector(3 DOWNTO 0);
BEGIN
PROCESS (clk,rst,load)
BEGIN
IF clk’event AND clk=’1’ THEN
IF en=’0’ THEN
IF rst=’0’ THEN
cuenta<=”0000”;
ELSE IF load=’0’ THEN
g<=d;
ELSE IF up=’1’ THEN
cuenta<=cuenta+1;
ELSE cuenta<=cuenta-1;
END IF
END IF;
ELSE IF rst=’0’ THEN cuenta<=”0000”;
ELSE IF load=’0’ THEN g<=d;
END IF;
END PROCESS;
q<=cuenta;
END cuenta;
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
76 / 99
PRÁCTICA 5: Microcontroladores PIC
P5.E1 Diseñar el programa para un PIC16F84A, para que realice lo siguiente:
a) Un programa que desplace de forma contínua el encendido de un
LED sobre ocho del puerto B, de derecha a izquierda y de izquierda a derecha,
a intervalos de 1 segundo. Este efecto será cíclico. La señal externa de
oscilación para utilizar con el sistema será de 400 Hz.
b) Realizar un programa similar que desplace simultáneamente el
encendido de los dos LED de los extremos, sobre 7 del puerto B, de izquierda a
derecha y de derecha a izquierda respectivamente, hasta el extremo opuesto.
El efecto será cíclico.
P5.E2 Modificar los programas que mediante un bit de entrada PA.0, se elija el
funcionamiento en el modo a) o en el modo b) descritos anteriormente.
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
77 / 99
P5.E3 Diseñar el código y simular su correcto funcionamiento para un
dispositivo PIC de gama media PIC16F876A, para que realice un programa que
utilize el contador interno y presente en un puerto de salidas (PB), el número de
pulsos que han llegado al micro a intervalos de 30 segundos procedentes de un
detector fotoeléctrico. El micro, cuando se le solicite mediante un uno lógico por
la patilla de entrada PA.0, deberá presentar por el puerto C, a intervalos de un
segundo, el histórico del número de pulsos que han llegado en los ochos
últimos minutos. (Nota: suponer que en 30 segundos, el detector nunca emite
más de 200 pulsos. Elegir la frecuencia externa para el oscilador del micro
considerando el tiempo invertido por ciclo máquina.)
P5A1-S Programa desp. Izd-dcha, dcha-izda
Primeramente, en www.microchip.com encontramos las caracterícticas
del microcontrolador PIC16F84A. A continuación se reproducen las
característica principales y necesarias para la realización de la práctica.
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
78 / 99
Del diagrama de patillas y la tabla con la descripción de las mismas nos
deberemos fijar de la disposición de los puertos, así como de sus
características. En este caso, tenemos dos puertos de entrada/salida, el
PORTA (5 bits) y el PORTB (8 bits). También se nos muestra las patillas para
conectar el PIC a corriente, al oscilador y la patilla reset.
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
79 / 99
En la Figura 2.1 se nos muestra la distribución de la memoria del
programa. En este caso nos fijaremos en las direcciones reservadas, la del
vector reset y la de vector de interrupción, y también en la capacidad disponible
(en nuestro caso desde 0000h hasta 3FFh.
En la figura 2.2 podemos apreciar las direcciones asignadas dentro de la
memoria de datos. Nos fijaremos principalmente en nuestro caso en las
direcciones de los puertos (PORTA ->05h y PORTB -> 06h ámbos en el banco
0) así como de los registros para configurar dichos puertos (TRISA ->85h y
TRISB ->86h ambos en el banco 1), y también de la dirección asignada al
registro STATUS (03h o 83 h para el banco 0 o el banco 1)
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
80 / 99
En la Tabla 2.1 se nos muestran las características de los registros
especiales dentro de la memoria de datos.
Por otro lado, en la Tabla 2.2 se nos muestran las instrucciones
disponibles a la hora de realizar el código de nuestro programa.
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
81 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
82 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
83 / 99
Nuestro programa debe poner a uno el primer bit del puerto “B”,
esperar un segundo y encender el siguiente bit, realizando una secuencia
cíclica de izquierda a derecha y de derecha a izquierda.
Puesto que nuestro oscilador interno es de 4MHz, las instrucciones se
ejecutarán en 1uS (1 cm=1/4f), exceptuando los saltos que tardarán 2 ciclos, es
decir 2uS. Para generar el retardo de 1 segundo deberemos crear una
subrutina que ejecutará una serie de instrucciones ocupando al
microcontrolador durante 1 segundo, para volver finalmente a la siguiente
instrucción desde dónde fue llamada. Para crear dicha subrutina podemos
realizar un código de la forma siguiente:
A la derecha de cada instrucción aparece el número de ciclos que
tomará cada una. Las primeras dos toman solamente 1 ciclo, la tecera decfsz
toma (N-1)+2, porque decrementará N-1 veces la variable N y en el último
decremento hará un salto, es por eso el +2. La instrucción goto se ejecuta en 2
ciclos y se ejecutará N-1 veces, es por eso que se toma como 2*(N-1). De esta
forma tenemos que el número de ciclos, y por lo tanto el tiempo que tendremos
de retardo está dado por la siguiente expresión: 1+1+(1)(N-1)+2+(2)(N-1) , ó
4+N-1+2N-2, o lo que es lo mismo 3N+1. Si queremos un retardo de 100uS
entonces tenemos que 3N+1=100, despejando tenemos N=(100-1)/3=33, asi
que para tener un retardo de 100uS el valor de la variable N debe ser 33.
Anidando ciclos como el anterior podemos llegar a conseguir retardos
de la magnitud deseada, aunque la precisión lo sea del 100%. En nuestro caso,
para un segundo de retardo tendríamos que emplear este código:
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
84 / 99
Aqui vemos que la variable P afecta a los dos retardos que ya habíamos
definido de modo que la expresión para calcular el nuevo retardo total seria
[(3N+1)M+3M+1]P+1+1+(1)(P-1)+2+(2)(P-1), y reduciendo terminos la
expresion seria [(3N+1)M+3M+1]P+3P+1. Queremos un retardo de 1 segundo,
esto son 1000000 ciclos, por lo que nuestra expresión del retardo debe ser
igual a un millón: [(3N+1)M+3M+1]P+3P+1=1000000. Sustituyendo N y M
tenemos 9995P+1=1000000, entonces tenemos que P=(999999)/9995 y P
entonces es aproximadamente igual a 100.
Otra opción, para lograr retardos exactos, puede ser emplear la
aplicación existente en http://www.piclist.com/techref/piclist/codegen/delay.htm.
Allí, indicando la frecuencia de reloj, el retardo deseado, los nombres de las
variables y de la subrutina, obtenemos el siguiente código:
; Delay = 1 seconds ; Clock frequency = 4 MHz ; Actual delay = 1 seconds = 1000000 cycles ; Error = 0 % cblock d1 d2 d3 endc retraso ;999990 cycles movlw 0x07
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
85 / 99
movwf d1 movlw 0x2F movwf d2 movlw 0x03 movwf d3 retraso_0 decfsz d1, f goto $+2 decfsz d2, f goto $+2 decfsz d3, f goto retraso_0 ;6 cycles goto $+1 goto $+1 goto $+1 ;4 cycles (including call) return
Otra opción puede ser utilizar una libreria que incluya una instrucción
para realizar retardos, incluyendo en el código INCLUDE<RETARDOS.INC> y por
ejemplo, call Retardo_10ms (llama al retardo de 10 mili segundos).
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
86 / 99
Finalmente, el código del programa seria el siguiente:
#include "P16F84.INC"
cont equ 0x0C ; para hacer el retardo cont2 equ 0x0D cont3 equ 0x0E reset org 0x00 ; origen del programa, aqu í ; comenzará ; siempre que ocurra un reset goto inicio ; salta a "inicio" INICIO bsf STATUS, RP0 ; Selecciona el banco1
movlw B'00000000' ; (W) <= '00000000' movwf TRISB ; PORT B como salida bcf STATUS, RP0 ; Selecciona el banco0 movlw B'00000001' ; (W) <= '00000001' movwf PORTB ; (PORTB) <= '00000001' call retardo ; llama a retardo IZDA rlf PORTB, F ; rota Portb izd y lo guarda en
; el mismo Portb call retardo ; llama a retardo
btfss PORTB, 0x07 ; comprueba bit 7 de PORTB goto IZDA ; si no ha llegado al final va a
; izda para seguir rotando. Si ; ultimo bit del Puerto b está ; encendido salta la siguiente ; linea y pasa a rotar a la dcha
DCHA rrf PORTB, F ; rota Portb dcha y lo guard a en
; el mismo Portb call retardo ; llama a retardo
btfss PORTB, 0x00 ;comprueba bit 0 de PORTB goto DCHA goto IZDA ;repite el ciclo entero ;subrutina retardo RETARDO movlw B'01100100'; (W) <= 100
movwf CONT3 CICLO 3 movlw B'01100001'; (W) <= 97
movwf CONT2 CICLO 2 movlw B'00100001'; (W) <= 33
movwf CONT CICLO decfsz CONT,f
goto CICLO decfsz CONT2,f goto CICLO2 decfsz CONT3,f goto CICLO3 return
end
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
87 / 99
P5B-S Programa desp. central.
Nuestro programa debe encender secuencialmente los bit 7-0, 6-1,5-2-4-
3,5-2,6-1,7-0.. del puerto b:
#include "P16F84.INC"
cont equ 0x0C ; para hacer el ret ardo cont2 equ 0x0D cont3 equ 0x0E
reset org 0x00 ; origen del programa, aquí ; comenzará ; siempre que ocurra un reset goto inicio ; salta a "inicio" INICIO bsf STATUS, RP0 ; Selecciona el banco1
movlw B'00000000' ; (W) <= '00000000' movwf TRISB ; PORT B como salida bcf STATUS, RP0 ; Selecciona el banco0 CICLO movlw 0x41 ; (W) <= '0100 0001' movwf PORTB ; (PORTB) <= '0100 0001' call retardo ; llama a retardo
movlw 0x22 ; (W) <= '0010 0010' movwf PORTB ; (PORTB) <= '0010 0010' call retardo ; llama a retardo
movlw 0x22 ; (W) <= '0001 0100' movwf PORTB ; (PORTB) <= '0001 0100' call retardo ; llama a retardo
movlw 0x22 ; (W) <= '0010 0010' movwf PORTB ; (PORTB) <= '0010 0010' call retardo ; llama a retardo goto ciclo
;subrutina retardo RETARDO movlw B'01100100'; (W) <= 100
movwf CONT3 CICLO 3 movlw B'01100001'; (W) <= 97
movwf CONT2 CICLO 2 movlw B'00100001'; (W) <= 33
movwf CONT CICLO decfsz CONT,f
goto CICLO decfsz CONT2,f goto CICLO2 decfsz CONT3,f goto CICLO3 return
end
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
88 / 99
P5-S.E.2 Incluir un selector de modo.
En este caso tendremos que emplear también el puerto A, configurarlo
como puerto de entrada y chequear el valor del primer dígito para ejecutar uno
u otro programa.
#include "P16F84.INC"
cont equ 0x0C ; para hacer el ret ardo cont2 equ 0x0D cont3 equ 0x0E
reset org 0x00 ; origen del programa, aquí ; comenzará ; siempre que ocurra un reset goto inicio ; salta a "inicio" INICIO bsf STATUS, RP0 ; Selecciona el banco1
movlw B'00000000' ; (W) <= '00000000' movwf TRISB ; PORT B como salida bcf STATUS, RP0 ; Selecciona el banco0
btfss PORTA, 0x00 ; comprueba bit 0 de PORTA goto MODO A ; si es 1 salta la línea
goto ciclo
MODO A movlw B'00000001' ; (W) <= '00000001' movwf PORTB ; (PORTB) <= '00000001' call retardo ; llama a retardo IZDA rlf PORTB, F ; rota Portb izd y lo guarda en
; el mismo Portb call retardo ; llama a retardo
btfss PORTB, 0x07 ; comprueba bit 7 de PORTB goto IZDA ; si no ha llegado al final va a
; izda para seguir rotando. Si ; ultimo bit del Puerto b está ; encendido salta la siguiente ; linea y pasa a rotar a la dcha
DCHA rrf PORTB, F ; rota Portb dcha y lo guarda en
; el mismo Portb call retardo ; llama a retardo
btfss PORTB, 0x00 ;comprueba bit 0 de PORTB goto DCHA goto IZDA
MODO B movlw 0x41 ; (W) <= '0100 0001' movwf PORTB ; (PORTB) <= '0100 0001' call retardo ; llama a retardo
movlw 0x22 ; (W) <= '0010 0010' movwf PORTB ; (PORTB) <= '0010 0010' call retardo ; llama a retardo
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
89 / 99
movlw 0x22 ; (W) <= '0001 0100' movwf PORTB ; (PORTB) <= '0001 0100' call retardo ; llama a retardo
movlw 0x22 ; (W) <= '0010 0010' movwf PORTB ; (PORTB) <= '0010 0010' call retardo ; llama a retardo goto MODO B
;subrutina retardo RETARDO movlw B'01100100'; (W) <= 100
movwf CONT3 CICLO 3 movlw B'01100001'; (W) <= 97
movwf CONT2 CICLO 2 movlw B'00100001'; (W) <= 33
movwf CONT CICLO decfsz CONT,f
goto CICLO decfsz CONT2,f goto CICLO2 decfsz CONT3,f goto CICLO3 return
end
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
90 / 99
P5-S.E.3 Detector Fotoeléctrico usando PIC16F876A.
Primeramente obtenemos de www.microchip.com las características
principales del PIC a emplear.
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
91 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
92 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
93 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
94 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
95 / 99
El Programa utilizará el timer del pic como contador para detectar el
número de pulsos que llega al puerto A. El puerto B lo tendremos que
configurar como salida, el puerto A como entrada, opción que viene por
defecto, específicamente emplearemos el pin nº6 “RA4/TOCK” para introducir
la señal de pulsos del detector fotoeléctrico, y el pin nº 2 “RA0” para indicar el
momento en el que queremos que se muestren los valores deseados en el
puerto B.
Utilizando direccionamiento indirecto iremos almacenando en una “tabla”
de 16 filas los valores que se almacenan en el Timer0 cada 30 s. Se utilizará un
método parecido para, en el caso de que PA.0 valga 1 (esto se comprobará
cada segundo) mostrar los valores en el puerto B con un periodo de 1s.
Elegimos una frecuencia externa para el oscilador del micro de 4 MHz.
Este dato lo tendremos en cuenta a la hora de realizar el código para el retardo
de 1s. El registro OPTION_REG tiene por defecto sus valores a uno (el Timer0
ya esta configurado como contador de pulsos). Debemos cambiar los tres
primeros dígitos a cero, para que el divisor de frecuencia sea de 1:1.
A continuación se realizará el diagrama de bloques del programa.
Posteriormente se indicará el código para el microcontrolador especificado.
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
96 / 99
INICIO
CONFIGURAR:
- TIMER
- PUERTOS
- VARIABLES
R:30
TMR0=0
CALL RETARDOA
Dec. R
R=0
W<-TMR0
FSR 0x20h
MOVEWF INDF
INC FSR
FSR.4=1
FSR 0x20h
NO
SI
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
97 / 99
TABLA
PORTB=FSR
CALL RETARDO1
FSR= 0X20h
FSR=0x30h
SI
DEC FSR
T=16
T=0
SI RETURN
DEC T
RETARDOA
PA0=0
RETURN
CALL RETARDO1
NO
CALL TABLA
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
98 / 99
#include " PIC16F876A.INC"
cont equ 0x30h ; para hacer el ret ardo 1s cont2 equ 0x31h cont3 equ 0x32h cont30 equ 0x33h ; para hacer el retard o 30s tab equ 0x34h ; para hacer recorrido ta bla reset org 0x00 ; origen del programa, aquí ; comenzará ; siempre que ocurra un reset goto inicio ; salta a "inicio" INICIO movlw B'00100000' ;(W) <= '00100000'
movwf FSR ; (FSR) <= 20h bsf STATUS, RP0 ; Selecciona el banco1 movlw B'00000000' ; (W) <= '00000000'
movwf TRISB ; PORT B como salida
bsf OPCION-REG, RP0 ; divisor frecuencia 1:1 bsf OPCION-REG, RP1; bsf OPCION-REG, RP2;
BUCLE movlw B'00011110' ;(W) <= 30decimal movwf cont30 ; (cont30) <= 30d clrf TMR0 ; ponemos contador a 0
RET30 CALL RETARDOA DECFSZ cont30,1 ;decrementa y salta si es0 GOTO RET30 movf TMR0 ; muevo nº pulsos a w movwf INDF ; muevo w a FSR incf FSR,1 ; incremento FSR y guardo en FSR btfss FSR,4 ;si FSR.4 es 1 salta línea goto BUCLE movlw B'00100000' ;(W) <= '00100000' movwf FSR ; (FSR) <= 20h goto BUCLE
;subrutina retardoA RETARDOA call RETARDO1
btfsc PA,0 ;si PA.0 es 0 salta línea call TABLA return
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA
99 / 99
;subrutina Tabla TABLA movlw B'00010000' ;(W) <= 16decimal
movwf tab ; (tab) <= 16d BUCLE2 DECFSZ tab,1 ;decrementa y salta si es0
goto BUCLE3 return
BUCLE3 btfsc FSR,4 ;si FSR.4 es 0 salta línea GOTO BUCLE 4
btfsc FSR,3 ;si FSR.3 es 0 salta línea GOTO BUCLE 4
btfsc FSR,2 ;si FSR.2 es 0 salta línea GOTO BUCLE 4
btfsc FSR,1 ;si FSR.1 es 0 salta línea GOTO BUCLE 4
btfsc FSR,0 ;si FSR.0 es 0 salta línea GOTO BUCLE 4 movlw B'00110000' ;(W) <= '00110000'
movwf FSR ; (FSR) <= '00110000'
BUCLE 4 decf fsr,1 ; decremento FSR y guardo en FSR movf FSR ; muevo a w el contenido de FSR movwf PORTB ; muevo w a PORTB call retardo1 ; mantengo 1 segundo. goto BUBLE 2
;subrutina retardo1
RETARDO1 movlw B'01100100'; (W) <= 100
movwf CONT3 CICLO 3 movlw B'01100001'; (W) <= 97
movwf CONT2 CICLO 2 movlw B'00100001'; (W) <= 33
movwf CONT CICLO decfsz CONT,f
goto CICLO decfsz CONT2,f goto CICLO2 decfsz CONT3,f goto CICLO3 return
end