You are on page 1of 30

SISTEMAS

DIGITALES II

EJERCICIOS TEMA 3
RESUELTOS

Departamento de Sistemas Electrnicos y de Control


2005-2006

1
2
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; //variables globales
Unsigned int valor1=0, valor2=0;
TM2CON = 0x00; //Reloj parado
CTCON = 0x01; //Captura CT0 en flanco subida
STE=0x00; //Sin pines
RTE=0x00;
IEN1 |=0x03; //Int de CT0 y de CT1
IP1 |= 0x03; //Alta prioridad
IEN0 |= 0x80; //Hab INTs
TM2CON=0x81; //Reloj interno y OVF de 16 bits
While (1);
}

Void Timer2_Captura0 (void) interrupt 6


{Valor1= (((unsigned int)CTH0)<<8)|CTL0;
If (TM2IR&0x80) //Ovf simultaneo
{
if (Valor1 > 0xFF00) //Ovf posterior
OVFs++;
TM2IR&=0x7F; //Flag OVF
}
IEN1|=0x80; //Hab INT OVF de 16 bits
TM2IR&=0xFE; //Borrar flag CT0
CTCON=0x04; //Hab captura de CT1 y
//deshabilitar de CT0
}

Void Timer2_Captura1 (void) interrupt 7


{Valor2= (((unsigned int)CTH1)<<8)|CTL1;
If (TM2IR&0x80) //Ovf simultaneo
{
if (Valor2 < 0x00FF) //Ovf anterior
OVFs++;
3
TM2IR&=0x7F; //Flag OVF
}
IEN1&=0x7F; //Deshab INT OVF 16 bits
Cuenta=Valor2-Valor1+65536*OVFs;
OVFs=0;
TM2IR&=0xFD; //Borrar flag CT1
CTCON=0x01; //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; //Reloj parado
CTCON = 0x01; //Captura CT0 en flanco subida
STE=0x00; //Sin pines
RTE=0x00;
IEN1 | =0x01; //Int de CT0
IP1 | = 0x01; //Alta prioridad
IEN0 | = 0x80; //Hab INTs
TM2CON=0x01; //Reloj interno sin prescaler
While (1);
}

Void Timer2_Captura0 (void) interrupt 6


{Unsigned int Valor=0, Final=0;
P4=P4|0x01; //Poner a 1 la salida
CTCON=0x00; //Deshabilita deteccin de flanco para
//que no sea redisparable
Valor= (((unsigned int)CTH0)<<8)|CTL0;
Final =Valor + 9167; //Clculo del comparador
CML1=final&0x00FF;
CMH1=(final&0xFF00)>>8;
RTE=0x01; //CM1 resetea el pin P4.0
IEN1=0x10; //Habilita INT CM1 y deshabilita
//CT0
TM2IR&=0xFE; //Borrar el flag
}

4
Void Timer2_Comparacion1 (void) interrupt 12
{RTE=0; //No se conmuta el pin
IEN1=0x01; //Habilita int CT0 y desha
//CM1
CTCON=0x01; //Habilitar deteccin CT0 en flanco sub.
TM2IR&=0xEF; //Borrar flag
}

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 tiempo=9162*12/11000000=9.994mseg


Para 132 CLK 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:

5
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

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

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

TxDato
TX
RxDato
RX

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; /* Gate=0, CT=0 */
TMOD |= 0x20; /* Modo 2 */
TH1 = 0xFA; /* Ajuste de la velocidad */
PCON |= 0x80; /* Se activa el bit SMOD */
S0CON = 0x50; /* Modo 1 con 1 bit de stop y 8 */
/* de datos. Se activa REN */
TCON |= 0x40; /* Arranca el T1 */
IEN0 & = 0xEF; /* Deshah. Int.de la UART */

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); //Espera por si se estuviera enviando un dato


TI=0; //Borra flag
S0BUF = 0xF0; //Enva dato
while (!RI); //Espera recepcin de un nuevo dato
DatoRecibido = S0BUF; //Lectura dato recibido
RI=0; //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 */
}

9
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 Vout
Invernadero

Entrada para Salida para


Controlar Medir la
humedad 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; //Parar el T1
TMOD&=0x2F; //Gate=0 CT=0
TMOD|=0x20; //Modo 1
TH1=0xFB; //9600 baudios

PCON|=0x80 //SMOD=1
SCON=0x50; //Modo 1 con 1 bit de stop y habilitada la Rx

IEN0|=0x10; //Interrupcin de UART


IP0|=0x10; //Interrupcin de UART a nivel alto de prioridad

ADCON=0x00; //Canal 0 de conversin y hab por SW.


IEN0|=0x40; //Interrupcin de ADC
IP0|=0x40; //Interrupcin de ADC a nivel alto de prioridad

TCON|=0x40; //Arranca T1
IEN0|=0x80; //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 13 12
9 8 R1IN R1OUT 9
4 11 R2IN R2OUT 14
8 10 T1IN T1OUT 7
3 Rx T2IN T2OUT
7 1
2 3 C+
6 4 C1-
1 5 C2+
2 C2-
6 V+
CONNECTOR DB9 V-
MAX232

U7
VCC
58 10
57 P0.0/AD0 P1.0/CT0I 11
56 P0.1/AD1 P1.1/CT1I 12
55 P0.2/AD2 P1.2/CT2I 13
54 P0.3/AD3 P1.3/CT3I 14
53 P0.4/AD4 P1.4/T2 15
52 P0.5/AD5 P1.5/RT2 16
51 P0.6/AD6 P1.6/SCL 17
P0.7/AD7 P1.7/SDA
38 18
DAC08
39 P2.0/A08 P3.0/RXD 19
40 P2.1/A09 P3.1/TXD 20 D0
41 P2.2/A10 P3.2/INT0 23
INVERNADERO
42 P2.3/A11 P3.3/INT1 24 D1
45 P2.4/A12 P3.4/T0 25
46 P2.5/A13 P3.5/T1 26 D2
47 P2.6/A14 P3.6/WR 27 Vout Vin Vout
P2.7/A15 P3.7/RD D3
80 71
1 P4.0/CMSR0 P5.0/ADC0 70 D4
2 P4.1/CMSR1 P5.1/ADC1 69
4 P4.2/CMSR2 P5.2/ADC2 68 D5
5 P4.3/CMSR3 P5.3/ADC3 67
6 P4.4/CMSR4 P5.4/ADC4 66 D5
7 P4.5/CMSR5 P5.5/ADC5 65
8 P4.6/CMT0 P5.6/ADC6 64 D7
P4.7/CMT1 P5.7/ADC7
1V 60 49
GND 59 AVREF+ ALE 48
AVREF- PSEN 75
12MHz 32 PWM0 76
XTAL1 PWM1
GND 50 31
77 EA XTAL2
9 EW
74 RST
STADC

80C552/FP

Figura

12
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 39
EA/VP P0.0 38
P0.1 CONVERTIDOR V-F
12MHz 19 37
X1 P0.2 36
P0.3 35
P0.4 SOC Vin
18 34
X2 P0.5 33
P0.6 32
P0.7 frec_out
9
RESET 21
P2.0 22
P2.1 EOC
23
P2.2 24
P2.3 25
P2.4 26
P2.5 27
P2.6 28
P2.7
8
P1.7 7
P1.6 6
P1.5 5
P1.4 4
P1.3 3
P1.2 2
P1.1 1
8051
P1.0
13
INT1 12
INT0

A1) 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. 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 39
EA/VP P0.0 38
P0.1 CONVERTIDOR V-F
12MHz 19 37
X1 P0.2 36
P0.3 35
SOC
P0.4 SOC Vin
18 34
X2 P0.5 33
P0.6 32
FREC
P0.7 frec_out
9
RESET 21
P2.0 22 EOC
P2.1 EOC
23
P2.2 24
P2.3 25
P2.4 26
P2.5 27
P2.6 28
P2.7
8
P1.7 7
P1.6 6
P1.5 5
P1.4 4
P1.3 3
P1.2 2
P1.1 1
8051 SOC
P1.0
13 FREC
INT1 12
INT0 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; //atencin por flanco de INT0
IT1=1; //atencin por flanco de INT1
EX0=1; //habilitacin de la interrupcin externa 0
EX1=0; //deshabilitacin de la interrupcin externa 1
PX0=1; //interrupcin INT0 de alta prioridad
PX1=0; //interrupcin INT1 de baja prioridad
EA=1; //habilitacin de las interrupciones
P1.0=0; //Generacin del pulso de SOC. Hay que tener en cuenta
Retardo(1); //que tras un reset P1=0xFF
P1.0=1;

While(1)
{
While(ini_pulsos==0); //espera a que llegue el EOC
Retardo(100); //espera mientras se hace la medida
EX1=0; //deshabilita las interrupciones
EX0=0; //deshabilita las interrupciones
Ini_pulsos=0; //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 39 CONVERTIDOR V-F
EA/VP P0.0 38
12MHz 19 P0.1 37
X1 P0.2
P0.3
36 SOC Vin
35
18 P0.4 34
X2 P0.5 33
P0.6 frec_out
32
9 P0.7
RESET 21
P2.0 EOC
22
12 P2.1 23
13 INT0 P2.2 24
INT1 P2.3 25
P2.4 26
14 P2.5 27
15 T0 P2.6 28
T1 P2.7
8
P1.7 7
P1.6 6
P1.5 5
P1.4 4
P1.3 3
P1.2 2
P1.1 1
8051
P1.0

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 39 CONVERTIDOR V-F
EA/VP P0.0 38
12MHz 19 P0.1 37
X1 P0.2 SOC
P0.3
36 SOC Vin
35
18 P0.4 34
X2 P0.5 FREC
33 frec_out
P0.6 32
9 P0.7
RESET 21 EOC
P2.0 EOC
22
12 P2.1 23
EOC INT0 P2.2
13 24
INT1 P2.3 25
P2.4 26
14 P2.5 27
15 T0 P2.6 28
FREC T1 P2.7
8
P1.7 7
P1.6 6
P1.5 5
P1.4 4
P1.3 3
P1.2 2
P1.1 SOC
8051 1
P1.0

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; //atencin por flanco de INT0
EX0=1; //habilitacin de la interrupcin externa 0
PX0=1; //interrupcin INT0 de alta prioridad

TR0=TR1=0; //Timers parados


TMOD=0x52; //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)
ET0=1; //Interrupcin del Timer 0
TH0=5; //Valor de recarga de T0 para interrupciones peridicas
//cada 250useg
TH1=TL1=0; //Inicializa el contador de pulsos

EA=1; //habilitacin de las interrupciones


P1.0=0; //Generacin del pulso de SOC
Retardo(1);
P1.0=1

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 10 3 2 D0
57 P0.0/AD0 P1.0/CT0I 11 3 2 4 1D 1Q 5 D1
56 P0.1/AD1 P1.1/CT1I 12 4 1D 1Q 5 7 2D 2Q 6 D2
55 P0.2/AD2 P1.2/CT2I 13 7 2D 2Q 6 8 3D 3Q 9 D3
54 P0.3/AD3 P1.3/CT3I 14 8 3D 3Q 9 13 4D 4Q 12
53 P0.4/AD4 P1.4/T2 15 13 4D 4Q 12 14 5D 5Q 15
52 P0.5/AD5 P1.5/RT2 16 14 5D 5Q 15 17 6D 6Q 16
51 P0.6/AD6 P1.6/SCL 17 17 6D 6Q 16 18 7D 7Q 19
P0.7/AD7 P1.7/SDA 18 7D 7Q 19 8D 8Q DISPLAY1
38 18 8D 8Q 11
39 P2.0/A08 P3.0/RXD 19 11 1 LE
40 P2.1/A09 P3.1/TXD 20 1 LE OE
41 P2.2/A10 P3.2/INT0 23 OE
42 P2.3/A11 P3.3/INT1 24
45 P2.4/A12 P3.4/T0 25 74HC373
46 P2.5/A13 P3.5/T1 26 74HC373 U6
47 P2.6/A14 P3.6/WR 27 U5
P2.7/A15 P3.7/RD 3 2 D0
80 71 4 1D 1Q 5 D1
U12A
1 P4.0/CMSR0 P5.0/ADC0 70 2 4 7 2D 2Q 6 D2
2 P4.1/CMSR1 P5.1/ADC1 69 3 A Q0 5 8 3D 3Q 9 D3
4 P4.2/CMSR2 P5.2/ADC2 68 B Q1 6 13 4D 4Q 12
5 P4.3/CMSR3 P5.3/ADC3 67 1 Q2 7 14 5D 5Q 15
6 P4.4/CMSR4 P5.4/ADC4 66 E Q3 17 6D 6Q 16
7 P4.5/CMSR5 P5.5/ADC5 65 DECODIFICADOR 2x4 18 7D 7Q 19
8 P4.6/CMT0 P5.6/ADC6 64 8D 8Q DISPLAY2
P4.7/CMT1 P5.7/ADC7 11
60 49 PULSADOR1 1 LE
59 AVREF+ ALE 48 OE
AVREF- PSEN 75
12KHz 32 PWM0 76
XTAL1 PWM1 74HC373
GND 50 31 U7
77 EA XTAL2
9 EW 3 2 D0
PULSADOR2
74 RST 4 1D 1Q 5 D1
STADC 7 2D 2Q 6 D2
8 3D 3Q 9 D3
80C552/FP 13 4D 4Q 12
14 5D 5Q 15
17 6D 6Q 16
18 7D 7Q 19
ALARMA 8D 8Q DISPLAY3
11
1 LE
OE

74HC373
U8

SEALES DE CS GENERADAS:

21
U6

AD0 58 10 INT0 AD0 3 2 A0 AD0 3 2 D0


AD1 57 P0.0/AD0 P1.0/CT0I 11 AD1 4 1D 1Q 5 A1 AD1 4 1D 1Q 5 D1
AD2 56 P0.1/AD1 P1.1/CT1I 12 AD2 7 2D 2Q 6 A2 AD2 7 2D 2Q 6 D2
AD3 55 P0.2/AD2 P1.2/CT2I 13 AD3 8 3D 3Q 9 A3 AD3 8 3D 3Q 9 D3
AD4 54 P0.3/AD3 P1.3/CT3I 14 AD413 4D 4Q 12 A4 13 4D 4Q 12
AD5 53 P0.4/AD4 P1.4/T2 15 INT1 AD514 5D 5Q 15 A5 14 5D 5Q 15
AD6 52 P0.5/AD5 P1.5/RT2 16 AD617 6D 6Q 16 A6 17 6D 6Q 16
AD7 51 P0.6/AD6 P1.6/SCL 17 AD718 7D 7Q 19 A7 18 7D 7Q 19
P0.7/AD7 P1.7/SDA 8D 8Q 8D 8Q DISPLAY1
A8 38 18 ALE11 CS0 11
A9 39 P2.0/A08 P3.0/RXD 19 GND1 LE GND 1 LE
A10 40 P2.1/A09 P3.1/TXD 20 INT0 OE OE
A11 41 P2.2/A10 P3.2/INT0 23 INT1 Vcc20
A12 42 P2.3/A11 P3.3/INT1 24 VCC
A13 45 P2.4/A12 P3.4/T0 25 74HC373
A14 46 P2.5/A13 P3.5/T1 26 /WR 74HC373 U6
A15 47 P2.6/A14 P3.6/WR 27
P2.7/A15 P3.7/RD AD0 3 2 D0
80 71 AD1 4 1D 1Q 5 D1
U12A
1 P4.0/CMSR0 P5.0/ADC0 70 A0 2 4 CS0 AD2 7 2D 2Q 6 D2
2 P4.1/CMSR1 P5.1/ADC1 69 A1 3 A Q0 5 CS1 AD3 8 3D 3Q 9 D3
4 P4.2/CMSR2 P5.2/ADC2 68 B Q1 6 CS2 13 4D 4Q 12
5 P4.3/CMSR3 P5.3/ADC3 67 CS 1 Q2 7 14 5D 5Q 15
6 P4.4/CMSR4 P5.4/ADC4 66 E Q3 17 6D 6Q 16
7 P4.5/CMSR5 P5.5/ADC5 65 DECODIFICADOR 2x4 18 7D 7Q 19
8 P4.6/CMT0 P5.6/ADC6 64 8D 8Q DISPLAY2
P4.7/CMT1 P5.7/ADC7 CS1 11
60 49 GND 1 LE
AVREF+ ALE
PULSADOR1 OE
59 48
AVREF- PSEN 75 PWM
12KHz 32 PWM0 76 INT0
XTAL1 PWM1 74HC373
GND 50 31 U7
77 EA XTAL2
9 EW AD0 3 2 D0
RST
PULSADOR2 1D 1Q
74 AD1 4 5 D1
STADC AD2 7 2D 2Q 6 D2
INT1 AD3 8 3D 3Q 9 D3
80C552/FP 13 4D 4Q 12
14 5D 5Q 15
17 6D 6Q 16
18 7D 7Q 19
ALARMA 8D 8Q DISPLAY3
CS2 11
GND 1 LE
PWM 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; //FLACO DE BAJADA PARA INT0
EX0=1; //HABILITA LA INTERRUPCION EXT0
PX0=1; //INTERRUPCION EXT0 DE ALTA PRIORIDAD

TR0=0; //ASEGURARSE DE PARAR EL T0


TH0=255-100; //VALOR PROPORCIONAL A 100mseg
TL0=255-100; //INICIO DE CUENTA
TMOD&=0XF2; //Modo=2, GATE=0, C/T=0
TMOD|=0X02;
ET0=1; //HABILITA INTERRUPCION T0
PT0=0; //INTERRUPCION T0 DE BAJA PRIORIDAD

IE=1; //HABILITA INTERRUPCIONES


While (1); //BUCLE INFINITO
}

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; //FLACO DE BAJADA PARA INT0


EX0=1; //HABILITA LA INTERRUPCION EXT0
PX0=0; //INTERRUPCION EXT0 DE BAJA PRIORIDAD

IT1=0; //FLACO DE BAJADA PARA INT1


EX1=0; //DESHABILITA LA INTERRUPCION EXT1
PX1=1; //INTERRUPCION EXT1 DE ALTA PRIORIDAD

TR=0; //ASEGURARSE DE PARAR EL T0


TH0=255-100; //VALOR PROPORCIONAL A 100mseg
TL0=255-100; //INICIO DE CUENTA
TMOD&=0XF2; //MODO=2, GATE=0, C/T=0
TMOD|=0X02;
ET0=1; //HABILITA INTERRUPCION T0
PT0=0; //INTERRUPCION T0 DE BAJA PRIORIDAD

ECM0=0; //INTERRUPCION DEL COMP_0 DESHABILITADA


PCM0=1; //INT DEL COMPARADOR 0 DE ALTA PRIORIDAD
TM2COM=0x20; //TIMER 2 PARADO, SIN PRESCALER, SIN OVF
//CON RESET HW EN EL FLANCO DE SUBIDA
STE=RTE=0; //SIN PINES
CTCON=1; //CAPTURA POR FLANCO SUBIDA EN EL REG0
T2COM|=0x01; //ARRANCA T2

PWMP=4; //FRECUENCIA DEL PWM DE 4.7Hz

26
PWM0=255; //DE MOMENTO SIN SONAR

IE=1; //HABILITA INTERRUPCIONES


While(1);
}

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 //INT EXTERNA 1


{ unsigned char ciclo=0;

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 //COMPARADOR 0


{
unsigned char ciclo=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; /* se prohben interrupciones */
TM2CON = 0x00; /* timer 2 parado */
CTCON = 0x05; /* CT0I y CT1I activas por flanco de subida*/

IP1 = 0x02; /* prioridad alta para la int. de CT1I */


IEN1 = 0x02; /* se habilita la int. de CT1I */
EA = 1; /* se habilitan interrupciones */
TM2CON = 0x01; /* selecciona fuente de reloj para timer 2*/
While(1);
}

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

You might also like