Está en la página 1de 30

SISTEMAS

DIGITALES II

EJERCICIOS TEMA 3
RESUELTOS

Departamento de Sistemas Electrnicos y de Control


2005-2006
1

EJERCICIOS TEMA 3
DE SISTEMAS DIGITALES II (RESUELTOS)
EJERCICIO 1)
Configure el Timer 2 para medir el retardo entre dos seales externas de modo que si llega un
segundo flanco por la primera de ellas sin que se haya producido uno en la segunda este primero sea
ignorado
NOTA: Se supone que la frecuencia del reloj del sistema es de 11MHz.
a) Al no tener rango es necesario tener en cuenta OVFs. Adems para hacer ms sencilla la rutina
de atencin se conecta la seal de entrada a dos pines de captura del microcontrolador (CT0 y
CT1) que se configuran en flanco de subida. Para hacer ms sencilla la rutina de atencin se
conecta la seal de entrada a dos pines de captura del microcontrolador (CT0 y CT1)
main(){
Float Cuenta=0,OVFs=0;
Unsigned int valor1=0, valor2=0;
TM2CON = 0x00;
CTCON = 0x01;
STE=0x00;
RTE=0x00;
IEN1 |=0x03;
IP1 |= 0x03;
IEN0 |= 0x80;
TM2CON=0x81;
While (1);
}

//variables globales
//Reloj parado
//Captura CT0 en flanco subida
//Sin pines
//Int de CT0 y de CT1
//Alta prioridad
//Hab INTs
//Reloj interno y OVF de 16 bits

Void Timer2_Captura0 (void) interrupt 6


{Valor1= (((unsigned int)CTH0)<<8)|CTL0;
If (TM2IR&0x80)
{
if (Valor1 > 0xFF00)
OVFs++;
TM2IR&=0x7F;
}
IEN1|=0x80;
TM2IR&=0xFE;
CTCON=0x04;

//Ovf simultaneo
//Ovf posterior
//Flag OVF
//Hab INT OVF de 16 bits
//Borrar flag CT0
//Hab captura de CT1 y
//deshabilitar de CT0

}
Void Timer2_Captura1 (void) interrupt 7
{Valor2= (((unsigned int)CTH1)<<8)|CTL1;
If (TM2IR&0x80)
{
if (Valor2 < 0x00FF)
OVFs++;
3

//Ovf simultaneo
//Ovf anterior

TM2IR&=0x7F;
}
IEN1&=0x7F;
Cuenta=Valor2-Valor1+65536*OVFs;
OVFs=0;
TM2IR&=0xFD;
CTCON=0x01;

//Flag OVF
//Deshab INT OVF 16 bits

//Borrar flag CT1


//Hab captura de CT0 y
//deshabilitar de CT1

}
Void Timer2_OVF (void) interrupt 14
{OVFs++;
TM2IR&=0x7F;
}

//Borrar flag OVF

EJERCICIO 2)
NOTA: Se supone que la frecuencia del reloj del sistema es de 11MHz.
Programe el Timer 2 para generar a travs de uno de los pines del microcontrolador un monoestable
de 10 mseg de activacin cuando llegue un flanco de subida de una seal externa
La seal que lanza el monoestable se conecta al pin CT0 y la salida se genera a travs del pin P4.0.
Main()
{TM2CON = 0x00;
CTCON = 0x01;
STE=0x00;
RTE=0x00;
IEN1 | =0x01;
IP1 | = 0x01;
IEN0 | = 0x80;
TM2CON=0x01;
While (1);
}

//Reloj parado
//Captura CT0 en flanco subida
//Sin pines
//Int de CT0
//Alta prioridad
//Hab INTs
//Reloj interno sin prescaler

Void Timer2_Captura0 (void) interrupt 6


{Unsigned int Valor=0, Final=0;
P4=P4|0x01;
CTCON=0x00;

//Poner a 1 la salida
//Deshabilita deteccin de flanco para
//que no sea redisparable

Valor= (((unsigned int)CTH0)<<8)|CTL0;


Final =Valor + 9167;
CML1=final&0x00FF;
CMH1=(final&0xFF00)>>8;
RTE=0x01;
IEN1=0x10;
TM2IR&=0xFE;
}

//Clculo del comparador

//CM1 resetea el pin P4.0


//Habilita INT CM1 y deshabilita
//CT0
//Borrar el flag

Void Timer2_Comparacion1 (void) interrupt 12


{RTE=0;
IEN1=0x01;

//No se conmuta el pin


//Habilita int CT0 y desha
//CM1
//Habilitar deteccin CT0 en flanco sub.
//Borrar flag

CTCON=0x01;
TM2IR&=0xEF;
}

a) Valor mximo de tiempo que se puede generar en el monoestable


T=(8*12*65536)/11000000 = 571 mseg
b) Valor mnimo
Viene determinado por la latencia mxima y el tiempo de atencin a la rutina de
interrupcin de CT0
c) Precisin
El monoestable no se arranca cuando llega el flanco externo sino que tiene que esperar a
que esa interrupcin se atienda y ponga el pin de salida a 1. Este tiempo ser la latencia
mas la ejecucin de la primera instruccin (P4=P4|0x01; que seran dos ciclos
mquina=24CLKs). Por tanto este tiempo estara entre 60 CLKs (5CM) y 132 CLKs (11
CM). Lo que hara que el pulso fuera de 9167-5 (o 11).
Para 60 CLK
Para 132 CLK

tiempo=9162*12/11000000=9.994mseg
tiempo=9156*12/11000000=9.988 mseg

EJERCICIO 3)
Utilizando un 80c552 funcionando a una frecuencia de 12 Mhz., se quiere medir el ciclo de
trabajo de una seal digital con las siguientes caractersticas:
- Frecuencia comprendida entre 500 Hz. y 2 KHz.
- Ciclo de trabajo entre el 10% y el 90%.
El clculo del ciclo de trabajo deber realizarse cada vez que se active un pulsador
incorporado al circuito: P1. No se atender a P1 hasta que no se haya realizado el clculo del ciclo
de trabajo solicitado anteriormente.
Se pide:
a) Describir los recursos a utilizar del microcontrolador, as como la funcin de cada uno de ellos y
las conexiones hardware que tengan que realizarse, teniendo en cuenta que el microcontrolador no
se va a dedicar a realizar otras funciones.
La seal a medir puede tener la siguiente apariencia:

Los recursos a utilizar sern:

Interrupcin externa 0: hay que conectar el pulsador a dicha lnea y programar esta
interrupcin por flanco de bajada.

Timer 2: Hay que programarlo en modo captura y se conectar la seal a medir a las
lneas externas de captura CT0 y CT1 simultneamente. En CT0 se puede capturar el
flanco de subida y en CT1 se puede capturar el flanco de bajada. Por supuesto que hay
que programar y habilitar adecuadamente las interrupciones asociadas a estas lneas.
Una estimacin del tiempo que tiene el timer para contar en cada uno de los lmites de
las seales es:
Frecuencia

Periodo

Th=10%

Th=90%

500 hz.

2000 usg.

200 usg.

1800 usg

2 Khz.

500 usg.

50 usg.

450 usg

b) Indicar clara y brevemente las funciones que deber realizar el programa principal as como las
diferentes rutinas de atencin a las interrupciones utilizadas, si ha lugar, para el correcto
funcionamiento del circuito planteado en el apartado anterior (no incluya en ningn caso el cdigo
necesario para su realizacin).
Las funciones a realizar en el programa principal y en las rutinas sern:
Programa principal:

Programar timer 2 modo captura sin overflows


Programar interrupcin externa 1 en flanco de bajada
Habilitar interrupcin externa 0.
Arrancar el T2

Rutina de atencin a interrupcin externa 0.


Deshabilitar interrupcin externa 0.
Programar el timer 2:
o Modo captura sin prescalado
o Programar captura de CT0 en flanco de subida.
o Habilitar interrupcin timer 2 provocada por CT0.
o Arrancar T2

Rutina de atencin a interrupcin CT0.


Borrar flag
Saber si es el primer flanco que se captura.
SI
o El siguiente ser el segundo flanco capturado
o Tomar el valor del contador del timer en la variable inicio.
o Programar el timer 2:
Habilitar captura CT1 en flanco de bajada
Habilitar interrupcin timer 2 de CT1.
NO
o El siguiente ser el primer flanco capturado
o Tomar el valor del contador del timer en la variable fin.
o Hacer cuentas con los valores de inicio, tintermedio y fin
o Programar el timer 2:
Parar timer.
Deshabilitar interrupcion timer 2.
Deshabilitar captura CT1
Habilitar interrupcin externa 0 asegurando que no est
habilitado el flag de esta interrupcin.
Rutina de atencin a interrupcin CT1.
Tomar el valor del contador del timer en la variable tintermedio.
Borrar flag

EJERCICIO 4)
Se dispone de un dispositivo sensor de temperatura MAX1618, al que se conecta un transistor
situado en el equipo a medir (por ejemplo un Pentium en un PC). Este dispositivo puede ser
programado va serie, para elegir uno de los dos modos de funcionamiento siguientes:
-

Conversin continua, donde el dispositivo toma muestras permanentemente.


Conversin bajo demanda del microcontrolador, que solicita la conversin, mediante la
escritura de un comando sobre el dispositivo.

Tambin se puede acceder al MAX1618 para:


-

Fijar la temperatura que active su salida /ALERT, que indica que se ha sobrepasado
dicho valor y permanece activada (a nivel bajo) hasta que la temperatura disminuya 5C
del valor de alarma.
Realizar la lectura de la temperatura medida.

El dispositivo se encuentra configurado para que las comunicaciones serie asncronas tengan los
siguientes parmetros: 9600 baudios, 1 bit de parada, sin paridad y 8 bits/dato.
El microcontrolador encargado de programar y comunicarse con el sensor de temperatura es un
82c552. En la figura siguiente se muestran los elementos mencionados.

a) Complete dicha figura, utilizando las lneas del microcontrolador que considere oportuno,
sabiendo que se necesita generar una interrupcin cuando se active la salida /ALERT, y responda
a las cuestiones siguientes:

TX
RX

TxDato
RxDato

82c552
(CLK = 12Mhz)

Con el fin de detectar tanto el flanco negativo como el positivo de la seal de alarma del MAX1618,
se utilizan las dos seales externas de interrupcin, una de forma directa y otra negada, y as
programando estas dos lneas sensibles al flanco de bajada, podremos tener acotados los instantes
para generar/parar la seal de PWM.
b) Indique la programacin de la UART, para conseguir el funcionamiento anterior. No genere
interrupcin cuando se lea un valor de temperatura.
Para poder enviar 8 datos + 1 bit de parada es necesario trabajar en modo 1 puesto que los
modos 2 y 3 solo permiten enviar tramas de 9 bits (+ 1 bit de stop)
Para ajustar la velocidad de Tx/Rx es necesario emplear el Timer 1 como generador de
reloj configurado en el modo 2 para posibilitar la recarga.
El valor de recarga se obtendr de la expresin
BAUD=(2SMOD*fosc)/(32*12*(256-TH1))
Seleccionando SMOD = 1 y despejando queda TH1=250032.
Como se emplea 250 (0xFA) no se obtienen 9600 baudios sino 9548.
Unsigned char DatoRecibido, DatoEnviado; /* Variables globales */
TCON &= 0xB0;

/* Parar el T1 */
8

TMOD &= 0x2F;


TMOD |= 0x20;
TH1 = 0xFA;
PCON |= 0x80;
S0CON = 0x50;

/* Gate=0, CT=0 */
/* Modo 2 */
/* Ajuste de la velocidad */
/* Se activa el bit SMOD */
/* Modo 1 con 1 bit de stop y 8 */
/* de datos. Se activa REN */
/* Arranca el T1 */
/* Deshah. Int.de la UART */

TCON |= 0x40;
IEN0 & = 0xEF;

c) Escriba el cdigo necesario para leer la temperatura (en modo continuo de conversin) del
MAX1618.
while (1)
{
while (!RI);
DatoRecibido = S0BUF;
RI = 0;
}
}
d) Escriba el cdigo necesario, para cambiar el modo de funcionamiento del dispositivo a
conversiones bajo demanda (para ello es necesario escribir sobre l el dato 0xF0) y adems leer el
valor de la temperatura.
while (!TI);
TI=0;
S0BUF = 0xF0;
while (!RI);
DatoRecibido = S0BUF;
RI=0;

//Espera por si se estuviera enviando un dato


//Borra flag
//Enva dato
//Espera recepcin de un nuevo dato
//Lectura dato recibido
//Borrar flag

e) Incluya el cdigo de la rutina de atencin a la seal de alarma, de modo que se genere una seal
PWM para controlar el motor de un ventilador. En este ltimo caso, la duracin de la seal a nivel
alto ser del 95% del periodo, con una frecuencia de 1KHz, hasta que se desactive la condicin de
alarma.
Para generar la seal que active el ventilador se utilizar el mdulo de PWM del
microcontrolador, al cual se accede mediante los registros PWMP y PWM0.
void AtencionINT0(void) interrupt 0
{
PWMP = 23; /* Periodo de 1Khz. Aprox. */
PWM0= 1; /* ciclo de trabajo del 95 % aprox. */
}
void AtencionINT1(void) interrupt 2
{
PWM0= 255; /* Para PWM */
}

EJERCICIO 5)
Se desea emplear un microcontrolador 80c552 para controlar remotamente un invernadero que se
modelar como un sistema analgico que recibe una seal analgica (Vin) que permite regular la
humedad. Adems el Invernadero dispone de un sensor de temperatura que genera una tensin
analgica (Vout) que se encuentra entre 0 y 1 voltio.

Vin

Invernadero

Entrada para
Controlar
humedad

Vout

Salida para
Medir la
Temperatura

El funcionamiento del sistema es el siguiente: el microcontrolador recibe a travs de la lnea serie


valores de humedad que debe enviar hacia el invernadero. Una vez que se enva un dato al
invernadero, y para evitar que la temperatura se eleve en exceso, se debe tomar una muestra de la
misma por si fuera necesario lanzar una alarma.
a) Comunicaciones Serie
El cdigo digital que permite generar Vin se recibe va serie a travs de un conector DB9
empleando la norma RS-232 sin lneas de protocolo. Realice sobre la figura el conexionado de los
elementos que se emplean para recibir los datos.
En la figura final
b) Generacin de las seales del invernadero
El microcontrolador debe generar la seal de entrada al invernadero y leer la temperatura
empleando un canal de su conversor analgico digital.
Dado que el 80c552 no incluye un convertidor digital-analgico se dispone de uno externo que
habr que conectar al microcontrolador. Simplificando el convertidor se puede indicar que genera
una tensin analgica proporcional al dato de 8 bits que recibe (D7...D0).
Realice sobre la figura, y empleando etiquetas, el conexionado entre el microcontrolador, el
convertidor y el invernadero.
En la figura final
c) Programacin
La secuencia de funcionamiento del sistema es la siguiente. Cuando se recibe un dato por el puerto
serie a 9600 baudios con 8 bits de datos, uno de parada y sin paridad deben realizarse las siguientes
tareas:

10

el dato debe ser enviado al convertidor digital-analgico.


debe ordenarse una lectura del sensor de temperatura a travs del canal del ADC del
microcontrolador.

Una vez que se haya realizado la conversin, los 8 bits mas significativos (se desprecian los 2 de
menor peso) deben guardarse en la posicin de memoria 0xFFFF.
c1) Codifique el programa principal necesario para configurar el sistema y cumplir las
especificaciones planteadas teniendo en cuenta que todos los perifricos deben ser atendidos por
interrupcin. Comente el cdigo.
Para recibir datos es necesario programar la UART tal y como se indica empleando el modo 1 y
ajustando la velocidad con T1.
TH1=256- (2SMOD fosc/(32*12*9600))
Para SMOD=0
TH1=253.5555 (254)
Para SMOD=1
TH1=251.1111 (251)
Se emplea el segundo valor por ser ms prximo al valor exacto obteniendo una velocidad de 9375.
TCON&=0xBF;
TMOD&=0x2F;
TMOD|=0x20;
TH1=0xFB;

//Parar el T1
//Gate=0 CT=0
//Modo 1
//9600 baudios

PCON|=0x80
SCON=0x50;

//SMOD=1
//Modo 1 con 1 bit de stop y habilitada la Rx

IEN0|=0x10;
IP0|=0x10;

//Interrupcin de UART
//Interrupcin de UART a nivel alto de prioridad

ADCON=0x00;
IEN0|=0x40;
IP0|=0x40;

//Canal 0 de conversin y hab por SW.


//Interrupcin de ADC
//Interrupcin de ADC a nivel alto de prioridad

TCON|=0x40;
IEN0|=0x80;

//Arranca T1
//Hab Ints

c2) Realice el organigrama de la/s interrupcin/es que haya empleado

Int de la UART

Int del ADC

Leer SBUF

Leer ADCH

Escribirlo en P1

Guardarlo en
0xFFFF

Lanzar
Conversin ADC

Flag de ADC

Flag de UART

11

5
9
4
8
3
7
2
6
1

13
8
11
10
Rx
1
3
4
5
2
6

CONNECTOR DB9

R1IN
R2IN
T1IN
T2IN

R1OUT
R2OUT
T1OUT
T2OUT

C+
C1C2+
C2V+
VMAX232

U7
VCC
58
57
56
55
54
53
52
51
38
39
40
41
42
45
46
47
80
1
2
4
5
6
7
8
1V
GND

60
59

12MHz

32

GND

50
77
9
74

P0.0/AD0
P0.1/AD1
P0.2/AD2
P0.3/AD3
P0.4/AD4
P0.5/AD5
P0.6/AD6
P0.7/AD7

P1.0/CT0I
P1.1/CT1I
P1.2/CT2I
P1.3/CT3I
P1.4/T2
P1.5/RT2
P1.6/SCL
P1.7/SDA

P2.0/A08
P2.1/A09
P2.2/A10
P2.3/A11
P2.4/A12
P2.5/A13
P2.6/A14
P2.7/A15

P3.0/RXD
P3.1/TXD
P3.2/INT0
P3.3/INT1
P3.4/T0
P3.5/T1
P3.6/WR
P3.7/RD

P4.0/CMSR0
P4.1/CMSR1
P4.2/CMSR2
P4.3/CMSR3
P4.4/CMSR4
P4.5/CMSR5
P4.6/CMT0
P4.7/CMT1
AVREF+
AVREFXTAL1
EA
EW
RST
STADC

P5.0/ADC0
P5.1/ADC1
P5.2/ADC2
P5.3/ADC3
P5.4/ADC4
P5.5/ADC5
P5.6/ADC6
P5.7/ADC7
ALE
PSEN
PWM0
PWM1
XTAL2

10
11
12
13
14
15
16
17

DAC08

18
19
20
23
24
25
26
27

D0

INVERNADERO

D1
D2
Vout
D3

71
70
69
68
67
66
65
64

D4
D5
D5
D7

49
48
75
76
31

80C552/FP

Figura
12

Vin

Vout

12
9
14
7

EJERCICIO 6)
Se va a desarrollar un sistema complejo empleando un microcontrolador de la familia
MSC51 de modo que uno de los elementos que es necesario gestionar por parte del
micro es un convertidor tensin-frecuencia (V-F) de alta precisin.
El funcionamiento del convertidor es el siguiente: cuando se le solicita una conversin
(activacin de la seal SOC) ste realiza la misma y una vez que la tiene disponible
genera a travs del terminal frec_out un tren de pulsos digital cuya frecuencia es
proporcional al valor analgico (Vin) de la entrada. Para que el microcontrolador
conozca el momento en el que se comienza a generar la seal frec_out el conversor
activa su seal de salida EOC. A partir de ese preciso instante se genera durante
exactamente 100 mseg la seal de salida frec_out. Una vez pasados los 100 mseg esta
lnea queda en estado indefinido hasta que se realice una nueva peticin de conversin.
Para aclarar un poco ms el funcionamiento de este dispositivo se muestra en la
siguiente figura un cronograma de su temporizacin.

Tmin=1mseg

SOC
EOC
Frec
_out
100mseg

El objetivo de este problema es emplear este convertidor V/F como ADC de alta
resolucin ya que si se mide la frecuencia que genera y se conocen los rangos de la
tensin de entrada y su relacin con la frecuencia es sencillo calcular la tensin de
entrada que se est aplicando.
A continuacin se proponen diversas alternativas para poder realizar las medidas cuya
principal diferencia se encuentra en la resolucin de las mismas.
NOTA: Los apartados que se proponen en este problema son independientes entre
si por lo que puede abordar cada uno de ellos sin haber resuelto los anteriores.

13

A) Gestionar el convertidor V-F empleando un 8051 con interrupciones externas


Se desea realizar la medida de la tensin de entrada del convertidor V-F empleando un
80C51 del que tan solo estn disponibles sus dos seales de interrupcin externas y los
pines de los puertos de entrada salida.
NOTA: Tenga en cuenta que si le resulta necesario dispone de la funcin
retardo(miliseg).

A1) Indique cmo piensa hacer la medida y realice el conexionado oportuno en el


siguiente esquema
U2
31
12MHz

19
18
9

EA/VP
X1
X2

P0.0
P0.1
P0.2
P0.3
P0.4
P0.5
P0.6
P0.7

RESET
P2.0
P2.1
P2.2
P2.3
P2.4
P2.5
P2.6
P2.7

8051

P1.7
P1.6
P1.5
P1.4
P1.3
P1.2
P1.1
P1.0
INT1
INT0

39
38
37
36
35
34
33
32

CONVERTIDOR V-F
SOC

Vin

frec_out

21
22
23
24
25
26
27
28

EOC

8
7
6
5
4
3
2
1
13
12

A1) Se generar el pulso de comienzo de conversin empleando un pin de entradasalida y aprovechndose de la existencia de la funcin de retardo que permite realizar
su temporizacin. Una vez finalizada la temporizacin de esta seal se entra en un
bucle esperando a que se reciba la seal de final de conversin. A partir de ese instante
se entra en una funcin de retardo de 100mseg esperando a que se acabe el tren de
pulsos.
Cuando el perifrico finalice la conversin se generar una interrupcin a travs e
INT0. Dentro de esta interrupcin se activar la atencin de la INT1 por la que irn
llegando los pulsos de la seal Frec_out. Cada pulso genera una interrupcin en la que
se incrementa por SW el valor de pulsos.

14

U2
31
12MHz

19
18
9

EA/VP
X1
X2

P0.0
P0.1
P0.2
P0.3
P0.4
P0.5
P0.6
P0.7

RESET
P2.0
P2.1
P2.2
P2.3
P2.4
P2.5
P2.6
P2.7

8051

P1.7
P1.6
P1.5
P1.4
P1.3
P1.2
P1.1
P1.0
INT1
INT0

39
38
37
36
35
34
33
32

CONVERTIDOR V-F
SOC
FREC

21
22
23
24
25
26
27
28
8
7
6
5
4
3
2
1
13
12

EOC

SOC

Vin

frec_out
EOC

SOC
FREC
EOC

A2) Codifique el programa principal y las rutinas de atencin a las interrupciones


necesarias teniendo en cuenta que la frecuencia que se genera vara en un rango entre
1KHz y 10 KHz cuando la tensin vara entre 0 y 10V. El programa debe realizar una
nica conversin guardando el valor de la tensin calculada en una variable global.
Unsigned char ini_pulsos=0;//Flag de comienzo de conversin bastara con ser bool
Unsigned int pulsos=0;
//Basta con un unsigned int para el rango especificado
Float tension=0;
//Es posible que sea decimal por lo que hay que asignar
//un flotante

main ()
{
IT0=1;
IT1=1;
EX0=1;
EX1=0;
PX0=1;
PX1=0;
EA=1;
P1.0=0;
Retardo(1);
P1.0=1;

//atencin por flanco de INT0


//atencin por flanco de INT1
//habilitacin de la interrupcin externa 0
//deshabilitacin de la interrupcin externa 1
//interrupcin INT0 de alta prioridad
//interrupcin INT1 de baja prioridad
//habilitacin de las interrupciones
//Generacin del pulso de SOC. Hay que tener en cuenta
//que tras un reset P1=0xFF

While(1)
{
While(ini_pulsos==0);
Retardo(100);
EX1=0;
EX0=0;
Ini_pulsos=0;

//espera a que llegue el EOC


//espera mientras se hace la medida
//deshabilita las interrupciones
//deshabilita las interrupciones
//fin de medida

15

Tension=(float)pulsos/90+10.0/9;
//clculo de la tensin
}

void interrupcion_externa0 () interrupt 0


{
EX1=1;
//Habilita interrupcin de cuenta de pulsos
EX0=0;
//Deshabilita interrupcin de nueva conversin
Pulsos=0;
//Inicializa la variable de cuenta
Ini_pulsos=1;
//Indica comienzo de los 100ms
}

void interrupcion_externa1 () interrupt 2


{
pulsos++;
//incremento de pulsos
}

A3) Indique las posibles fuentes de error que tiene sus sistema a la hora de realizar la
medida de la frecuencia.
La solucin propuesta posee varias fuentes de error:
1. La latencia de la INT0 hace que desde que llegue el EOC hasta que se active la
interrupcin INT1 que realiza la cuenta pase un tiempo en el que no se cuentan
los pulsos de entrada (FREC). Este error se podra estimar en
Latmax+2instrucciones=11CM = 11useg. Con esto se perdera 1 pulso si la
frecuencia de entrada fuera de 90KHz. Al ser menos solo se pierde 1 pulso.
2. El retardo SW hace que en realidad no se midan 100mseg por lo que la ventana
en la que se realiza la medida no es exacta. Esto lleva a que se puedan contar
pulsos de mas. Esto es difcil de cuantificar al no darse informacin de la
precisin en el retardo de milisegundos. Si se supone una precisin de 1CM el
error vendra dado por el tiempo de ejecucin de la instruccin que prohbe las
interrupciones. Dado que esto requiere 1CM, en el peor caso se perdera 1
pulso.
3. Al no estar sincronizada la seal de frecuencia que genera el conversor con el
momento en el que se comienza a atender a la INT1 es posible que se pierda un
pulso
El error ser por tanto de 4 pulsos lo que a 10KHz supone un error de 0.06%
A4) Indique razonadamente si la aplicacin funcionara en el caso en el que la
frecuencia que genera el conversor estuviera entre 1Hz y 500KHz.
El sistema no funcionara puesto que el tiempo mximo que puede haber entre pulsos
viene condicionado por el tiempo que se tarda en contar cada uno de ellos. Este
tiempo se calcula como el tiempo de latencia mximo mas el tiempo de atencin a la
interrupcin. Este segundo tiempo es el resultado de la suma de un dato unsigned long
(aproximadamente 4CM) + la instruccin de IRET (1CM).

16

Por tanto se tardara 9+4+1 = 14CM = 14 useg lo que llevara 71.4KHz como
frecuencia mxima. Por tanto el funcionamiento de esta aplicacin no sera correcto.
B) Gestionar el convertidor empleando un 8051 con interrupciones y timers
Con el fin de ampliar el rango de frecuencia a medir se propone utilizar un 80C51 en el
que se pueden emplear todos los perifricos que posee.
B1) Indique cmo piensa hacer la medida y realice el conexionado oportuno en el
siguiente esquema
U2
31
12MHz

19
18
9
12
13
14
15

EA/VP
X1
X2

P0.0
P0.1
P0.2
P0.3
P0.4
P0.5
P0.6
P0.7

RESET
INT0
INT1
T0
T1

8051

P2.0
P2.1
P2.2
P2.3
P2.4
P2.5
P2.6
P2.7
P1.7
P1.6
P1.5
P1.4
P1.3
P1.2
P1.1
P1.0

39
38
37
36
35
34
33
32

CONVERTIDOR V-F
SOC

Vin

frec_out

21
22
23
24
25
26
27
28

EOC

8
7
6
5
4
3
2
1

Se generar el pulso de comienzo de conversin empleando un pin de entrada-salida y


aprovechndose de la existencia de la funcin de retardo que permite realizar su
temporizacin.
Para esperar a la llegada de la seal EOC se emplear la INT0 de modo que cuando
esta se reciba se habilitar la cuenta del Timer 0 que se emplea para medir los 100
msegundos de la ventana y del Timer 1 que cuenta el nmero de pulsos.
Una vez vencidos los 100mseg se realizan las cuentas.

17

U2
31
12MHz

19
18
9

EOC

FREC

12
13
14
15

EA/VP
X1
X2

P0.0
P0.1
P0.2
P0.3
P0.4
P0.5
P0.6
P0.7

RESET
INT0
INT1
T0
T1

8051

P2.0
P2.1
P2.2
P2.3
P2.4
P2.5
P2.6
P2.7
P1.7
P1.6
P1.5
P1.4
P1.3
P1.2
P1.1
P1.0

39
38
37
36
35
34
33
32

CONVERTIDOR V-F
SOC
FREC
EOC

21
22
23
24
25
26
27
28
8
7
6
5
4
3
2
1

SOC

Vin

frec_out
EOC

SOC

B2) Codifique el programa principal y las rutinas de atencin a las interrupciones


necesarias teniendo en cuenta que la frecuencia que se genera vara en un rango entre
1KHz y 500 KHz cuando la tensin vara entre 0 y 10V. El programa debe realizar una
nica conversin guardando el valor de la tensin calculada en una variable global.
Unsigned int OVFs=0;
Unsigned int pulsos=0;
Float tension=0;
main ()
{
IT0=1;
EX0=1;
PX0=1;

//atencin por flanco de INT0


//habilitacin de la interrupcin externa 0
//interrupcin INT0 de alta prioridad

TR0=TR1=0;
TMOD=0x52;

//Timers parados
//Timer 0 como temporizador en modo 2 para recargar
//Timer 1 como contador en modo 1 ya que su valor
//mximo de cuenta es 50.000 (500KHz)
//Interrupcin del Timer 0
//Valor de recarga de T0 para interrupciones peridicas
//cada 250useg
//Inicializa el contador de pulsos

ET0=1;
TH0=5;
TH1=TL1=0;
EA=1;
P1.0=0;
Retardo(1);
P1.0=1

//habilitacin de las interrupciones


//Generacin del pulso de SOC

While(1);
}

18

void interrupcion_externa0 () interrupt 0


{
TR1=1;
//Arranca la cuenta de pulsos
TR0=1;
//Arranca la cuenta de 100mseg
}

void interrupcion_Timer0 () interrupt 1


{
OVFs++;
If(OVFs==400)
//400 * 250useg = 100mseg
{
TR0=TR1=0;
//Parar las cuentas de tiempo y de pulsos
OVFs=0;
Pulsos=((unsigned long)TH1)<<8 | TL1; //leer cuenta Timer1
Tension=(float)pulsos/4990+10.0/499;
//clculo de la tensin
}
}
B3) Indique las posibles fuentes de error que tiene sus sistema a la hora de realizar la
medida de la frecuencia.
La solucin propuesta posee varias fuentes de error:
La latencia de la INT0 hace que desde que llegue el EOC hasta que se activen
los contadores pase un tiempo en el que no se cuentan los pulsos de entrada
(FREC). Este error se podra estimar en Latmax+1instruccin=10CM =
10useg. Con esto se perdera 1 pulso si la frecuencia de entrada fuera de
100KHz. Dado que la frecuencia de entrada puede llegar a ser de 500KHz se
perderan hasta 5 pulsos.
La medida de los 100 mseg es exacta al realizarse por HW, sin embargo, desde
que llega el flanco de EOC hasta que se arranca el timer 0 pasan 11 CM
(reduccin de 11useg de la ventana de medida) y desde que se vencen los
100mseg hasta que se para el timer1 pasa el tiempo de latencia mas las
instrucciones de la rutina del Timer0 que se ejecutan hasta llegar a TR1=0.
Estas instrucciones las podemos estimar en unos 10CM. Por lo tanto se amplia
la ventana en 19 CM (19useg muy aproximadamente). Esto provoca la perdida
de 10 pulsos en el peor caso.
Al no estar sincronizada la seal de frecuencia que genera el conversor con el
momento en el que comienza a contar el Timer 1 se produce la perdida de 1
pulso.
El error ser por tanto de 16 pulsos lo que a 500KHz supone un error de 0.032%
B4) Justifique si en este caso el sistema funcionara correctamente cuando la frecuencia
de entrada se encontrara en el rango comprendido entre 1KHz y 500KHz.
El funcionamiento sera correcto dado que el periodo mnimo que requiere la seal de
entrada para que el Timer1 la cuente correctamente es de 1CM, por lo que, a esta
frecuencia de reloj, se podra llegar a medir hasta 1MHz.

19

B5) Calcule la resolucin de la medida que realiza el convertidor expresada en V para


un rango de frecuencias entre 1KHz y 500KHz. Compare la resolucin de este
convertidor con la del convertidor analgico digital que incorpora el 80x552.
Calcule la resolucin de la medida que realiza el convertidor expresada en V para un
rango de frecuencias entre 1KHz y 500KHz. Compare la resolucin de este convertidor
con la del convertidor analgico digital que incorpora el 80x552.
La resolucin de la medida viene dada por el paso de cuantificacin de la seal a
medir. En este caso, si se usa el convertidor AD del propio microcontrolador se tiene
que
1LSB = Rango_de_tensin_de_entrada / 2 numero de bits = 10/1024 = 0,009765625 V
En el caso del conversor V/F este rango se caracteriza por
1LSB Rango de tensin de entrada / Rango_de_frecuencia = 10/499000 =
2,004e-5 V
C) Gestionar el convertidor empleando un 80552
Indique si se le ocurre algn procedimiento para eliminar las fuentes de error que ha
analizado en los apartados anteriores empleando el Timer 2 del 80c552. En caso
afirmativo describa detalladamente su propuesta (no es necesario que realice ningn
programa)
De los errores que se producen en las dos medidas anteriores se puede intentar
eliminar el del instante en el que comienza la medida y el del instante en que acaba la
cuenta de los pulsos. Para ello se debe generar una ventana de exactamente 100 mseg
que comience cuando se reciba la seal EOC.
La generacin de esa ventana se puede realizar con el Timer 2 empleando los
comparadores y haciendo que estos conmuten uno de los pines del P4. Esta seal que
se genera se conecta a la habilitacin HW de cuenta del Timer 1 de modo que este slo
contar durante el tiempo en el que se est generando la seal por parte del
convertidor V/F.
Al realizar de este modo la medida se elimina completamente el error.

EJERCICIO 7)
Se desea desarrollar un sistema basado en el 80C552 funcionando a 12KHz para
controlar una mquina tragaperras sencilla. Para ello se dispone, adems del
microcontrolador, de los componentes que aparecen en el siguiente esquema. De dichos
componentes hay que indicar que los etiquetados como displays se corresponden con
dispositivos pticos que representan un smbolo en funcin del dato de 4 bits que se
encuentre en cada momento en su entrada (dispone por tanto de 16 posibles smbolos).
El funcionamiento detallado del sistema se va a ir describiendo en cada uno de los
apartados posteriores, pero a grandes rasgos se podra decir que cuando se presiona el

20

Pulsador1 comienza una nueva partida, con lo que los smbolos del primer display
empiezan a cambiar cclicamente a ritmo de 10 veces por segundo.
Seguidamente, y cuando se presiona el Pulsador2 o pasan 2 segundos, se para el
primero de los displays y arranca el segundo. Este proceso se repite para el segundo y
tercer display. Finalmente se comprueba si se trata de una combinacin ganadora y si es
necesario se activa la alarma.
Cada uno de los pulsadores tiene por tanto una misin diferente. El pulsador 1 sirve
para inicial una nueva partida mientras que el Pulsador 2 tiene como misin parar el
smbolo que se encuentre en ese preciso instante en el display correspondiente. Cada
vez que se produce una pulsacin se genera un pulso a nivel bajo de 10 mseg sin
rebotes.
A) CONEXIONADO
A1) Se trata de realizar el conexionado de los displays al microcontrolador de modo que
el acceso a cada uno de ellos se realice mediante escrituras en direcciones del mapa de
datos del microcontrolador. Ms concretamente se desea que el display 1 ocupe
exclusivamente la posicin 0xFF00, el 2 la 0xFF01 y el 3 la 0xFF02.
Una vez realizado el conexionado genere las ecuaciones lgicas de todas las seales de
seleccin que haya empleado.
NOTA: Realice el conexionado por etiquetas
58
57
56
55
54
53
52
51
38
39
40
41
42
45
46
47
80
1
2
4
5
6
7
8
60
59

12KHz

32

GND

50
77
9
74

P0.0/AD0
P0.1/AD1
P0.2/AD2
P0.3/AD3
P0.4/AD4
P0.5/AD5
P0.6/AD6
P0.7/AD7

P1.0/CT0I
P1.1/CT1I
P1.2/CT2I
P1.3/CT3I
P1.4/T2
P1.5/RT2
P1.6/SCL
P1.7/SDA

P2.0/A08
P2.1/A09
P2.2/A10
P2.3/A11
P2.4/A12
P2.5/A13
P2.6/A14
P2.7/A15

P3.0/RXD
P3.1/TXD
P3.2/INT0
P3.3/INT1
P3.4/T0
P3.5/T1
P3.6/WR
P3.7/RD

P4.0/CMSR0
P4.1/CMSR1
P4.2/CMSR2
P4.3/CMSR3
P4.4/CMSR4
P4.5/CMSR5
P4.6/CMT0
P4.7/CMT1
AVREF+
AVREFXTAL1
EA
EW
RST
STADC

P5.0/ADC0
P5.1/ADC1
P5.2/ADC2
P5.3/ADC3
P5.4/ADC4
P5.5/ADC5
P5.6/ADC6
P5.7/ADC7
ALE
PSEN
PWM0
PWM1
XTAL2

10
11
12
13
14
15
16
17

3
4
7
8
13
14
17
18

18
19
20
23
24
25
26
27

11
1

2
5
6
9
12
15
16
19

3
4
7
8
13
14
17
18
11
1

LE
OE

U12A
2
3
1

A
B

Q0
Q1
Q2
Q3

1D
2D
3D
4D
5D
6D
7D
8D

1Q
2Q
3Q
4Q
5Q
6Q
7Q
8Q

2
5
6
9
12
15
16
19

D0
D1
D2
D3

DISPLAY1

LE
OE

74HC373
U6

74HC373
U5

71
70
69
68
67
66
65
64
49
48
75
76

1Q
2Q
3Q
4Q
5Q
6Q
7Q
8Q

1D
2D
3D
4D
5D
6D
7D
8D

4
5
6
7

DECODIFICADOR 2x4

3
4
7
8
13
14
17
18
11
1

PULSADOR1

1D
2D
3D
4D
5D
6D
7D
8D

1Q
2Q
3Q
4Q
5Q
6Q
7Q
8Q

2
5
6
9
12
15
16
19

D0
D1
D2
D3

DISPLAY2

LE
OE

74HC373
U7

31
3
4
7
8
13
14
17
18

PULSADOR2

80C552/FP

ALARMA
11
1

1D
2D
3D
4D
5D
6D
7D
8D
LE
OE

74HC373
U8

SEALES DE CS GENERADAS:

21

1Q
2Q
3Q
4Q
5Q
6Q
7Q
8Q

2
5
6
9
12
15
16
19

D0
D1
D2
D3

DISPLAY3

U6
AD0
AD1
AD2
AD3
AD4
AD5
AD6
AD7

58
57
56
55
54
53
52
51

A8
A9
A10
A11
A12
A13
A14
A15

38
39
40
41
42
45
46
47
80
1
2
4
5
6
7
8
60
59

12KHz

32

GND

50
77
9
74

P0.0/AD0
P0.1/AD1
P0.2/AD2
P0.3/AD3
P0.4/AD4
P0.5/AD5
P0.6/AD6
P0.7/AD7

P1.0/CT0I
P1.1/CT1I
P1.2/CT2I
P1.3/CT3I
P1.4/T2
P1.5/RT2
P1.6/SCL
P1.7/SDA

P2.0/A08
P2.1/A09
P2.2/A10
P2.3/A11
P2.4/A12
P2.5/A13
P2.6/A14
P2.7/A15

P3.0/RXD
P3.1/TXD
P3.2/INT0
P3.3/INT1
P3.4/T0
P3.5/T1
P3.6/WR
P3.7/RD

P4.0/CMSR0
P4.1/CMSR1
P4.2/CMSR2
P4.3/CMSR3
P4.4/CMSR4
P4.5/CMSR5
P4.6/CMT0
P4.7/CMT1
AVREF+
AVREFXTAL1
EA
EW
RST
STADC

P5.0/ADC0
P5.1/ADC1
P5.2/ADC2
P5.3/ADC3
P5.4/ADC4
P5.5/ADC5
P5.6/ADC6
P5.7/ADC7
ALE
PSEN
PWM0
PWM1
XTAL2

10
11
12
13
14
15
16
17
18
19
20
23
24
25
26
27

INT0

INT1

ALE11
GND1
INT0
INT1

Vcc20

/WR

71
70
69
68
67
66
65
64
49
48
75
76

AD0 3
AD1 4
AD2 7
AD3 8
AD413
AD514
AD617
AD718

1D
2D
3D
4D
5D
6D
7D
8D

1Q
2Q
3Q
4Q
5Q
6Q
7Q
8Q

2
5
6
9
12
15
16
19

A0
A1
A2
A3
A4
A5
A6
A7

LE
OE

AD0
AD1
AD2
AD3

3
4
7
8
13
14
17
18

CS0
GND

11
1

CS

2
5
6
9
12
15
16
19

D0
D1
D2
D3

DISPLAY1

LE
OE

74HC373
U6

U12A
2
3

1Q
2Q
3Q
4Q
5Q
6Q
7Q
8Q

VCC
74HC373

A0
A1

1D
2D
3D
4D
5D
6D
7D
8D

A
B

Q0
Q1
Q2
Q3

4 CS0
5 CS1
6 CS2
7

AD0
AD1
AD2
AD3

3
4
7
8
13
14
17
18

CS1
GND

11
1

DECODIFICADOR 2x4

PULSADOR1

1D
2D
3D
4D
5D
6D
7D
8D

1Q
2Q
3Q
4Q
5Q
6Q
7Q
8Q

2
5
6
9
12
15
16
19

D0
D1
D2
D3

DISPLAY2

LE
OE

PWM
INT0
74HC373
U7

31

PULSADOR2
INT1

AD0
AD1
AD2
AD3

3
4
7
8
13
14
17
18

CS2
GND

11
1

80C552/FP

ALARMA
PWM

1D
2D
3D
4D
5D
6D
7D
8D

1Q
2Q
3Q
4Q
5Q
6Q
7Q
8Q

2
5
6
9
12
15
16
19

D0
D1
D2
D3

DISPLAY3

LE
OE

74HC373
U8

SEALES DE CS GENERADAS:
CS=/A15+/A14+/A13+/A12+/A11+/A10+/A9+/A8+A7+A6+A5+A4+A3+A2+/WR

A2) Justifique la necesidad de los lacthes U6, U7 y U8 que aparecen en el esquema.


Indique cual cree que sera el comportamiento del sistema en el caso de que no
existieran.
Los displays estn directamente conectados al bus de datos por lo que necesitan
almacenar de algn modo el valor que deben representar en cada momento. Si no
existieran estos buffers el valor que se representara en cada display ira variando
dependiendo del valor que hubiera en cada momento en el Bus de Datos.
A3) Justifique la necesidad del decodificador 2x4 que aparecen en el esquema. Indique
si se podra realizar un conexionado alternativo en el que no se empleara este
dispositivo.
El decodificador simplifica el proceso de generar los CS de los diferentes displays ya
que a partir de las dos lneas ms bajas de direcciones es capaz de seleccionar el
display al que se desea acceder. De este modo, y dado que cada display slo se mapea
en una direccin de memoria, no es necesario crear un CS que incluya las 16 lneas de
direcciones para cada display ya que basta con hacerlo una vez para el decoder. Por
tanto, en el caso de que no hubiera un decoder, sera necesario generar 3 CSs con
todos los bits del bus de direcciones.

22

A4) Cuando se produce una combinacin ganadora se debe activar una alarma. La
alarma funciona con una seal de entrada digital de frecuencia constante
(aproximadamente 5 Hz) y ciclo de trabajo variable en escalones de 1%. Justifique
cmo piensa gestionar esta alarma y realice su conexionado al microcontrolador sobre el
esquema anterior.
Para generar una seal cuadrada de periodo constante y ciclo de trabajo variable se
puede emplear uno de los generadores de PWM que posee el microcontrolador. Estos
generadores permiten que la frecuencia se ajuste segn la expresin
Frec=fosc/(2*255*(1+PWMP))
Despejando se obtiene que PWMP=3.7 por lo que se ajusta a 4. Con este valor se
obtiene una frecuencia real de 4.7Hz
A5) Indique si la solucin aportada sera vlida en el caso de que la frecuencia requerida
por la alarma fuera de 50 Hz. En el caso de que no fuera vlido indique si sera posible
resolver el problema de algn otro modo sin cambiar el reloj del microcontrolador.
La frecuencia mxima que se puede generar se obtendr cuando en PWMP se cargue
un 0. Con este valor queda que Frecmax=23.5Hz por lo que no es posible generar la
frecuencia obtenida con el PWM
La solucin que se podra emplear es la de usar el Timer 2 y sus mdulos de
comparacin para generar una seal externa. Con uno de los comparadores
conmutara la salida cuando venciera el ciclo de trabajo y con otro cuando venciera el
periodo.

B) TEMPORIZACION DE CADA UNO DE LOS SIMBOLOS.


En este apartado se pretende controlar el funcionamiento del pulsador 1 y del primer
display. Para ello se propone realizar un programa (programa principal y rutina/s de
interrupcin/es) que, cuando se presione el pulsador1, haga que el smbolo que se
represente en el display 1 cambie de forma cclica 10 veces por segundo.
NOTA: Para desarrollar este apartado debe emplear la menor cantidad de recursos
posibles y en ningn caso una rutina de retardo.
B1) Realice sobre el esquema su conexionado del Pulsador 1 e indique cmo piensa
gestionarlo.
Se conecta a la interrupcin externa 0 y se gestiona por interrupcin por flanco de
bajada. Cuando se produzca su pulsacin se arrancar la temporizacin de los
displays.
B2) Indique los recursos que va a emplear y los clculos que sean necesarios para
justificar la viabilidad de la solucin propuesta.
Como ya se ha indicado se emplear la interrupcin 0 para arrancar la temporizacin.
Para sta se va a emplear el T0 en modo 2 para que el periodo sea lo mas preciso

23

posible gracias a la recarga HW. Para ello hay que ver si el rango de valores es
suficiente o si por el contrario hay que realizar una cuenta de interrupciones.
Dado que el periodo del T0 es 12 veces el del reloj del sistema tenemos que el T0
funciona con un periodo de 1mseg. Por tanto, y dado que necesitamos interrupciones
peridicas cada 100mseg podemos emplear este modo sin necesidad de contar
interrupciones.

B3) Codifique el programa (programa principal y rutina/s de interrupcin/es) que


cumpla las anteriores especificaciones comentando el cdigo realizado.
Void main(){
IT0=0;
EX0=1;
PX0=1;

//FLACO DE BAJADA PARA INT0


//HABILITA LA INTERRUPCION EXT0
//INTERRUPCION EXT0 DE ALTA PRIORIDAD

TR0=0;
TH0=255-100;
TL0=255-100;
TMOD&=0XF2;
TMOD|=0X02;
ET0=1;
PT0=0;

//ASEGURARSE DE PARAR EL T0
//VALOR PROPORCIONAL A 100mseg
//INICIO DE CUENTA
//Modo=2, GATE=0, C/T=0

IE=1;
While (1);
}

//HABILITA INTERRUPCIONES
//BUCLE INFINITO

//HABILITA INTERRUPCION T0
//INTERRUPCION T0 DE BAJA PRIORIDAD

Void ISR_EXT0(void) interrupt 0


{
TR0=1;
//ARRANCA EL T1
EX0=0;
//DESHABILITA LA INTERRUPCION EXTERNA
}
Void ISR_T0(void) interrupt 1
{
static unsigned char barrido=0;
xdata unsigned char *Display1=0xFF00;
*Display1=barrido++;
if (barrido==0x0F) barrido=0;
}

C) APLICACIN COMPLETA
Se pretende en este apartado aadir a la aplicacin anterior el resto de funcionalidad del
sistema. Para ello deben procesarse las pulsaciones del pulsador2 y las temporizaciones
de dos segundos del siguiente modo:

24

al activar el Pulsador2 se parar el valor del display activo en ese momento y se


parar al siguiente. Si el display activo es el tercero se finalizar la jugada.
Adems al pasar al siguiente display se reiniciar la temporizacin de los 2
segundos.
al cumplirse los dos segundos se parar el display activo, se pasar al siguiente y
se comenzar una nueva temporizacin.

Finalmente, y tras comprobar si se ha obtenido una combinacin ganadora, se deber


activar la alarma.
Para facilitar el desarrollo del programa debe tener en cuenta las siguientes
observaciones:
Los dos segundos deben medirse de la forma ms precisa posible por lo que se
recomienda emplear el Timer 2 para su gestin.
Para comprobar si se ha obtenido una combinacin ganadora se dispone de una
funcin ya desarrollada que recibe como parmetros los tres dgitos
correspondientes a los tres displays y devuelve el ciclo de trabajo con el que
debe generarse la seal que ataque a la alarma expresada en % (un ciclo=0
indica que no debe activarse).
Unsigned char Calcula_premio (unsigned char display1, unsigned char display2,
unsigned char display3);

Una vez que se comienza una jugada con el pulsador1, ste no va a volver a
activarse hasta que no finalice dicha jugada. As mismo, si no se ha comenzado
una partida, las pulsaciones del pulsador 2 no sern tenidas en cuenta.
La alarma queda activada hasta que se finalice una nueva jugada.

C1) Realice sobre el esquema el conexionado del Pulsador 2 e indique cmo piensa
gestionarlo.
El pulsador 2 se conectar a la interrupcin 1 para que dentro de esa interrupcin,
gestionada por flanco, se lleve a cabo el paso al siguiente display. Adems se conectara
al pin de reset del t2 para que inicialice la cuenta de los dos segundos de forma
hardware empleando para detectar el final uno de los comparadores
C2) Indique los recursos que va a emplear y los clculos que sean necesarios para
justificar la viabilidad de la solucin propuesta. En el caso de que necesite realizar
alguna modificacin sobre el conexionado indquelo de forma justificada.
Para desarrollar el sistema se emplearan los mismos recursos que en el apartado
anterior aadiendo el timer2 para temporizar los dos segundos. Dado que se pide
precisin lo que se har es temporizar los dos segundos empleando un comparador y
recargando valores proporcionales a los dos segundos.
Queda un problema por resolver y es cmo temporizar los dos primeros segundos
despus de arrancar una partida. Para ello se modificar el conexionado para que
cuando se pulse el pulsador1, adems de generar la interrupcin correspondiente, se
capture el valor de t2 y se recargue con un valor equivalente a 2 segundos mas el valor
capturado

25

C3) Indique la prioridad entre las interrupciones que va a emplear de forma justificada.
Hay que tener en cuenta que no todas las interrupciones van a estar activadas de forma
continua.
Inicialmente slo est activa la int ext0 por lo que su prioridad no es importante. Una
vez atendida esta interrupcin se deshabilita a si misma y habilita las otras 3 (int1,
comp0 y T0).
De ellas las ms prioritarias son la int1 y la comp0 puesto que es en ellas donde se
produce la lectura del valor en el display y por tanto no se debe esperar mucho tiempo.
Ambas se atienden con alta prioridad. Queda la interrupcin del T0 que se conectar a
baja prioridad.
C4) Codifique el programa (programa principal y rutinas de interrupcin) que cumpla
las anteriores especificaciones comentando el cdigo realizado.
Void main(){
unsigned char Display_activo=1;
unsigned char Valores_Displays[3]={0,0,0};
unsigned char barrido=0;
static unsigned int cuenta2seg=2000;
IT0=0;
EX0=1;
PX0=0;

//FLACO DE BAJADA PARA INT0


//HABILITA LA INTERRUPCION EXT0
//INTERRUPCION EXT0 DE BAJA PRIORIDAD

IT1=0;
EX1=0;
PX1=1;

//FLACO DE BAJADA PARA INT1


//DESHABILITA LA INTERRUPCION EXT1
//INTERRUPCION EXT1 DE ALTA PRIORIDAD

TR=0;
TH0=255-100;
TL0=255-100;
TMOD&=0XF2;
TMOD|=0X02;
ET0=1;
PT0=0;

//ASEGURARSE DE PARAR EL T0
//VALOR PROPORCIONAL A 100mseg
//INICIO DE CUENTA
//MODO=2, GATE=0, C/T=0

ECM0=0;
PCM0=1;
TM2COM=0x20;
STE=RTE=0;
CTCON=1;
T2COM|=0x01;

//INTERRUPCION DEL COMP_0 DESHABILITADA


//INT DEL COMPARADOR 0 DE ALTA PRIORIDAD
//TIMER 2 PARADO, SIN PRESCALER, SIN OVF
//CON RESET HW EN EL FLANCO DE SUBIDA
//SIN PINES
//CAPTURA POR FLANCO SUBIDA EN EL REG0
//ARRANCA T2

PWMP=4;

//FRECUENCIA DEL PWM DE 4.7Hz

//HABILITA INTERRUPCION T0
//INTERRUPCION T0 DE BAJA PRIORIDAD

26

PWM0=255;

//DE MOMENTO SIN SONAR

IE=1;
While(1);

//HABILITA INTERRUPCIONES

}
Void ISR_EXT0(void) interrupt 0
//INT EXTERNA 0
{
TR0=1;
//ARRANCA EL T0
EX0=0;
//DESHABILITA LA INTERRUPCION EXTERNA0
EX1=1;
//HABILITA LA INTERRUPCION EXTERNA1
Cuenta2segundos=(((unsigned int)CTH0)<<8+CTH1)+2000;
//CALCULAR VALOR DE RECARGA DEL COMP0
CML0= Cuenta2segundos & 0x00FF;
CMH0= (Cuenta2segundos & 0xFF00)>>8;
ECM0=1;
//INTERRUPCION DEL COMP0 HABILITADA
Display_activo=1; //PRIMER DISPLAY
}
Void ISR_T0(void) interrupt 1
//INT TIMER 0
{
xdata unsigned char *Display1=0xFF00, *Display2=0xFF01,
*Display3=0xFF02;
switch (Display_activo)
{
case 1:
*Display1=barrido++;
break;
case 2:
*Display2=barrido++;
break;
case 3:
*Display3=barrido++;
break;
default:
Display_activo=1;
break;
}
if (barrido==0x0F) barrido=0;
}
Void ISR_EXT1(void) interrupt 2
{
unsigned char ciclo=0;

//INT EXTERNA 1

Valores_Displays[Display_activo-1]=barrido;//GUARDA VALOR
Display_activo++;
//PASAR AL SIGUIENTE
CMH0=0x07;
//CARGA DEL VALOR INICIAL
//DE CUENTA
CML0=0xD0;
//2000d=0x07D0
cuenta2segundos=2000;
//REINICIA COMPARADOR 0

27

If (Display_activo==4)
{
TR0=0;
//PARAR T0
TL0=255-100;
//INICIO DE CUENTA
Ciclo=calcula_premio(Valores_Displays[0],
Valores_Displays[1],
Valores_Displays[2]);
PWM0=255-(255*(unsigned long)ciclo)/100;
//CALCULAR VALOR PWM
ECM0=0;
//INT DEL COMPARADOR 0
//DESHABILITADA
EX1=0;
//INT EXT1 DESHABILITADA
EX0=1;
//INT EXT0 HABILITADA
}
}

Void ISR_COMP0(void) interrupt 12


{
unsigned char ciclo=0;

//COMPARADOR 0

Valores_Displays[Display_activo-1]=barrido;//GUARDAR VALOR
Display_activo++;
//PASAR AL SIGUIENTE
If (Display_activo==4)
{
TR0=0;
//PARAR T0
TL0=255-100;
//INICIO DE CUENTA
Ciclo=calcula_premio(Valores_Displays[0],
Valores_Displays[1],
Valores_Displays[2]);
PWM0=255-(255*(unsigned long)ciclo)/100;
ECM0=0;
//INT COMP0 DESHABILITADA
EX1=0;
//INT EXTERNA1 DESHABILITADA
EX0=1;
//INT EXTERNA0 HABILITADA
}
cuenta2segundos+=2000;
//CALCULA VALOR CARGA
CMH0=(cuenta2segundos&0xFF00)>>8; //RECARGA COMPARADOR 0
CML0=cuenta2segundos&0x00FF;
CMI0=0;
//FLAG COMPARADOR 0
}

EJERCICIO 8)
En un sistema digital basado en el 80C552 que trabaja con un reloj de frecuencia 120
KHz. se necesita realizar la medida del desfase entre dos seales digitales de periodo
200 ms e igual ciclo de trabajo. Dicho valor debe guardarse, expresado en radianes, en
la variable: float desfase.

28

Indique, justificadamente, que elementos del microcontrolador usara, con qu valores


deben trabajar dichos elementos y realice en cdigo C (comentando las instrucciones)
toda la programacin necesaria (iniciacin de perifricos y rutina/s de interrupcin/es de
los mismos) para esta aplicacin.
NOTA: Tenga en cuenta que no es posible que lleguen dos flancos de la seal 1 sin que
haya llegado alguno de la seal 2.

Seal 1
t
Seal 2
t
t1
Para calcular el desfase habr que medir el tiempo t1 y relacionarlo con el periodo:

= (t1 x 2) / Tseal
Para medir t1 usaremos el timer 2 y dos de sus entradas de captura conectadas una a la
seal 1 (CT0I) y la otra a la seal 2 (CT1I). Ambas activas por flanco de subida. Al
capturar la segunda se producir interrupcin y se realizar el clculo del desfase.
Veamos si puede haber overflows:
El desfase ser menor de 200 msg lo que implica un nmero de cuentas:
Sin prescaler:
Tcuenta = TCLK x 12 = 12/(120 x 103) = 10-4 = 0,1 msg
n de cuentas mximo: 200 / 0,1 = 2.000 < 65.536
Luego no necesitamos contar los overflows.
float desfase,cuenta;
unsigned int valor1, valor2, ovf = 0;
main (void)
{
EA = 0;
TM2CON = 0x00;
CTCON = 0x05;
IP1 = 0x02;
IEN1 = 0x02;
EA = 1;
TM2CON = 0x01;
While(1);

/* se prohben interrupciones */
/* timer 2 parado */
/* CT0I y CT1I activas por flanco de subida*/
/* prioridad alta para la int. de CT1I */
/* se habilita la int. de CT1I */
/* se habilitan interrupciones */
/* selecciona fuente de reloj para timer 2*/

29

void timer2() interrupt 7


{
valor1 = (CTH0 << 8) | CTL0;
/* obtengo n de cuentas primera captura */
valor2 = (CTH1 << 8) | CTL1;
/* obtengo n de cuentas segunda captura*/
if (valor1 > valor2) ovf = 1;
/* si ha habido overflow entre las captura*/
cuenta = 65536 * ovf + valor2 valor1; /* valor de t1 en n de cuentas */
ovf = 0;
desfase = ((24 * 3.14 * cuenta)/ (200.0 * 120);
/* calculo el desfase */
TM2IR &= 0xFD;
/* bajo bandera de captura */
}

30