Está en la página 1de 99

“PRÁ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

Í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

2 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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

3 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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

4 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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.

5 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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.

6 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

Entradas   Salidas  

IZD MI0

DCH MI1
Sistema
ADE Combinacional MI1

ATR MD0
   
MD1

MD2

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.

7 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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

8 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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:

9 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

2  1,2,4,5,6,9,10  3,7,11,12,13,14,15  !"  #$%  # &


 

1 X 1

1 1 X 1

X X X X

1 X 1

2  7,15  0,1,2,3,4,8,12  !"  #$%  # &


 

X X X X

X 0

X 0

10 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

''''''
1  2,4,6,10  0,3,7,8,11,12,13,14,15  #$%
 

X X 1

1 X 1

X X X X

X X 1

''''''
1  6,10,14  0,1,2,3,4,7,8,12,15  #$%
 

X X X X

X X 0

X X 0

X 0

11 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

'''''
0  1,2,4,5,6  0,3,7,8,11,12,13,14,15  
 

X 1 X 1

1 1 X 1

X X X X

X X

'''''
0  5,6  0,1,2,3,4,7,8,12,15  
 

X X X X

X 0 X 0

X X

12 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

 2  1,2,5,6,8,9,10  3,7,11,12,13,14,15    #$%  # &


 

1 X 1

1 X 1

X X X X

1 1 X 1

 2  11,15  0,1,2,3,4,8,12    #$%  # &


 

X X X X

X 0

X 0

13 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

''''''
 1  2,6,8,10  0,3,4,7,11,12,13,14,15  #$%
 

X X 1

X X 1

X X X X

1 X 1

 1  6,10,14  0,1,2,3,4,8,11,12,15  ''''''


#$% 
 

X X X X

X 0

X X 0

X X 0

14 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

 0  1,2,8,9,10  0,3,4,7,11,12,13,14,15  ''''''


!"
 

X 1 X 1

X X

X X X X

1 1 X 1

 0  9,10  0,1,2,3,4,8,11,12,15  ''''''


!"
 

X X X X

X X

X 0 X 0

15 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

P1A1-S7 Esquema digital:

2  !"  #$%  # &


''''''
1  #$%
0  '''''

 2    #$%  # &
''''''
 1  #$%
 0  ''''''
!"

IZD DCH ADE ATR

≥1

MI2

1 MI1

MD1

1 MI0

≥1

MD2

1 MD0

16 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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:

17 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

Teniendo en cuenta el pedido mínimo (en este caso de 2500 unidades)


el coste total sería aproximadamente de 0.32 €.

18 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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 €.

19 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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

IZD 1 0 1 1 0 1 MI2
1 1 1 1 1 1

DCHA 0 0 0 0 0 0 MI1
1 1 1 0 0 0
ADE 1 0 1 1 0 0 MI0
1 1 1 1 1 0
ATR 0 0 0 0 0 0 MD2
0 0 0 1 1 1
1 0 0 1 0 1 MD1
1 1 0 1 1 1
0 0 0 0 0 0 MD0
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

20 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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

21 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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.

22 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

23 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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).

24 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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.

25 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

- 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.

Entradas   Salidas  

S1 P1
Sistema
S2 Combinacional P2

S3 P3
   

S4 A

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.

26 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

P1B1-S5 Tabla de verdad:

Tomamos S1 como el bit de mayor peso y S4 como el bit de menor peso.

Entradas 
 Salidas  
S1 S2 S3 S4 P1 P2 P3
П Σ envase etiqu lleno tapón defec incom 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

27 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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
1 13 15 14

10 8
1 9 11 10

28 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

'''  )3
(1  0,1,3,4,5,7,8,9,10,11,12,13,14,15  )1 * )1 ''' * )1
'''  )4 


 )1 * '''
)1  )1 * ''' '''  )4  )1 * '''
)3 * )1 )1  )1 * '''
)3 * ''' )3 * )4
 )1 * '''
)3 * )4

0 0 0
0 0 0
0 0 0 0
0 0 0 0

(2  8,10,11,12,14  )1 * '''


)4  )1 * ''' '''  )2
)2 * )3  )1 * )4 ''' * )3


1 1
1 1 1

29 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

'''  )2
(2  0,2,6,8,9,10,11,12,13,14,15  )1 * )1 '''  )4
''' * )3  )4
'''


0 0
0
0 0 0 0
0 0 0 0

(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

30 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

''' * )2  )1


#  1,2,3,4,5,6,7  )1 ''' * )4  )1
''' * )3  )1
''' * )2  )3  )4


1 1 1

1 1 1 1

''' * )2  )3  )4


#  0,1,2,3,4,5,6,7,15  )1


0 0 0 0
0 0 0 0
0

31 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

P1B1-S7 Esquema digital:

(1  )1 * '''
)3 * )4
'''  )2
(2  )1 * )4 ''' * )3
(3  )1 * )2 * )3 * )4
''' * )2  )3  )4
#  )1

S1 S2 S3 S4

&
1
P1

& ≥1 &

P2
1

&
P3

≥1 &

A
1

32 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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

S1 0 0 0 1 P1
0 0 0 1
0 0 0 1 P2
S2
0 0 0 1
0 0 0 1 P3
S3
0 0 0 1
0 1 0 0 A
S4
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

33 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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

34 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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

35 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

segmentos “a, b, g, f “ respectivamente. En el modo de medio paso, los


segmentos “g, c, d, e” respectivamente.

36 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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.

Entradas   Salidas  

Sistema
A
Secuencial
S
Tipo Moore B

E C
  +, -.
D

37 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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

ES
Ex
ABCD

38 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

1X 1X

01
E0 E1
1001 1010
00

01 00 00 01

00
E3 E2
0101 0110
01

1X 1X

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

39 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

P2-S1.7 Tabla de excitación y de salida del sistema:

Est. interno Est. interno


Entradas 
 Salidas  
(t) (t+1)
Σ 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
 

40 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

Ahora simplificaremos las funciones obtenidas:

/1-  1  0,2,5,7,10,11,14,15  &' . )2. /0


''''  &' . ). /0  &. /1


1 1

1 1

1 1

1 1

/0-  1  ∑2,3,4,5,9,11,13,15  &' . )2. /1  &' . ). /1


''''  &. /0

1 1

1 1

1 1

1 1

41 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

''''
#  0,1,4,5,8,9,12,13  /1


1 1

1 1

1 1

1 1

0  2,3,6,7,10,11,14,15  /1


1 1

1 1

1 1

1 1

42 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

!  1,3,5,7,9,11,13,15  /0


1 1

1 1

1 1

1 1

''''
 0,2,4,6,8,10,12,14  /0


1 1

1 1

1 1

1 1

43 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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 S

1 &

1 & ≥1

&

&
&

&

& ≥1

&

Bies. D
/1 Q1(t+1)

''''
/1

Bies. D
/0 Q0(t+1)

''''
/0
CLK

44 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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

E Q1(t+1)
Combinacional II

1 A
Sistema

S
B

Q0(t+1)
1 C

45 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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 ECUACIONES--------
---
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

46 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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

47 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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";

48 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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)); --segmentos
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;

49 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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;

50 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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.

51 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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.

Entradas   Salidas  

a S
Sistema
b Combinacional
   
Ci Co

52 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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
5 5

)  1,2,4,7  1,2,4,7
5 5

53 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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. 8


5

1 1 1

)  1,2,4,7  !6. 8'. 7'  !9 : . 8. 7'  8. 7. !6  7'. !9


: . 8'. 7  !6. 8. 7  !9 :
5

: +7'. !6  7. !9
 8. '''''''''
: .  8. +7 ; !9.  8'. 7 ; !6  8 ; 7 ; !6

1 1

1 1

54 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

!4  3,5,6,7  !6  7. 8  7. !6  8


5

 !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

0 0 0

'''. !9
)  1,2,4,7  +!6  8'  7 ''''  8'  7.. !6  8  7. !9 ''' 
:  8  7
5
'''''''''
 8. +7 ; !9.  8'. 7 ; !6  8 ; 7 ; !6

0 0

0 0

55 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

P3A1-S7 Esquema digital:

)  8 ; 7 ; !6
!4  !6. 7  8. 7  !6. 8

Ci a b

&

≥1

& Co

&

=1
S

56 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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;

57 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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:

58 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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;

59 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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;

60 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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.

61 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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;

62 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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;

63 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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;

64 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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

65 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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

66 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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;

67 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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.

68 / 99
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

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;

72 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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';

73 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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.

74 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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;

75 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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.

76 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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.

77 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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.

78 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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)

79 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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.

80 / 99
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

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:

83 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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

84 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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).

85 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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 guarda 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

86 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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 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

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

87 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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 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

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

88 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

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

89 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

P5-S.E.3 Detector Fotoeléctrico usando PIC16F876A.

Primeramente obtenemos de www.microchip.com las características


principales del PIC a emplear.

90 / 99
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

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.

95 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

INICIO

CONFIGURAR:

- TIMER
- PUERTOS
- VARIABLES FSR 0x20h

R:30

TMR0=0

CALL RETARDOA

Dec. R

NO
R=0

W<-TMR0

MOVEWF INDF

INC FSR

SI
FSR.4=1

FSR 0x20h

96 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

TABLA

T=16

SI
RETURN
T=0

DEC T

SI
FSR=
0X20h
FSR=0x30h

DEC FSR

PORTB=FSR

CALL RETARDO1

RETARDOA

CALL RETARDO1

NO
PA0=0

CALL TABLA

RETURN

97 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

#include " PIC16F876A.INC"

cont equ 0x30h ; para hacer el retardo 1s


cont2 equ 0x31h
cont3 equ 0x32h
cont30 equ 0x33h ; para hacer el retardo 30s
tab equ 0x34h ; para hacer recorrido tabla

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

98 / 99
PRÁCTICAS C.I.S.E MARCOS ILLERA CUEVA

;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

99 / 99