Professional Documents
Culture Documents
DIGITALES II
EJERCICIOS TEMA 3
RESUELTOS
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
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);
}
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);
}
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
}
b) Valor mnimo
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).
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:
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.
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:
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).
Programa principal:
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.
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:
- 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.
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.
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)
BAUD=(2SMOD*fosc)/(32*12*(256-TH1))
c) Escriba el cdigo necesario para leer la temperatura (en modo continuo de conversin) del
MAX1618.
while (1)
{
while (!RI);
DatoRecibido = S0BUF;
RI = 0;
}
}
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.
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
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
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).
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.
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
TCON|=0x40; //Arranca T1
IEN0|=0x80; //Hab Ints
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.
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).
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
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
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
}
A3) Indique las posibles fuentes de error que tiene sus sistema a la hora de realizar la
medida de la frecuencia.
El error ser por tanto de 4 pulsos lo que a 10KHz supone un error de 0.06%
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.
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
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
main ()
{
IT0=1; //atencin por flanco de INT0
EX0=1; //habilitacin de la interrupcin externa 0
PX0=1; //interrupcin INT0 de alta prioridad
While(1);
}
18
void interrupcion_externa0 () interrupt 0
{
TR1=1; //Arranca la cuenta de pulsos
TR0=1; //Arranca la cuenta de 100mseg
}
B3) Indique las posibles fuentes de error que tiene sus sistema a la hora de realizar la
medida de la frecuencia.
El error ser por tanto de 16 pulsos lo que a 500KHz supone un error de 0.032%
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.
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.
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).
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.
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
Una vez realizado el conexionado genere las ecuaciones lgicas de todas las seales de
seleccin que haya empleado.
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
74HC373
U8
SEALES DE CS GENERADAS:
CS=/A15+/A14+/A13+/A12+/A11+/A10+/A9+/A8+A7+A6+A5+A4+A3+A2+/WR
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.
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.
B1) Realice sobre el esquema su conexionado del Pulsador 1 e indique cmo piensa
gestionarlo.
B2) Indique los recursos que va a emplear y los clculos que sean necesarios para
justificar la viabilidad de la solucin propuesta.
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.
Void main(){
IT0=0; //FLACO DE BAJADA PARA INT0
EX0=1; //HABILITA LA INTERRUPCION EXT0
PX0=1; //INTERRUPCION EXT0 DE ALTA PRIORIDAD
C) APLICACIN COMPLETA
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.
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).
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.
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.
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.
Void main(){
unsigned char Display_activo=1;
unsigned char Valores_Displays[3]={0,0,0};
unsigned char barrido=0;
static unsigned int cuenta2seg=2000;
26
PWM0=255; //DE MOMENTO SIN SONAR
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
}
}
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.
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*/
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