Beruflich Dokumente
Kultur Dokumente
DIGITALES II
EJERCICIOS TEMA 3
RESUELTOS
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
//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
}
Void Timer2_OVF (void) interrupt 14
{OVFs++;
TM2IR&=0x7F;
}
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
//Poner a 1 la salida
//Deshabilita deteccin de flanco para
//que no sea redisparable
CTCON=0x01;
TM2IR&=0xEF;
}
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:
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:
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.
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
/* 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;
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
10
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;
TCON|=0x40;
IEN0|=0x80;
//Arranca T1
//Hab Ints
Int de la UART
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
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
main ()
{
IT0=1;
IT1=1;
EX0=1;
EX1=0;
PX0=1;
PX1=0;
EA=1;
P1.0=0;
Retardo(1);
P1.0=1;
While(1)
{
While(ini_pulsos==0);
Retardo(100);
EX1=0;
EX0=0;
Ini_pulsos=0;
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.
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
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
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
While(1);
}
18
19
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
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.
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.
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
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
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;
IT1=0;
EX1=0;
PX1=1;
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;
PWMP=4;
//HABILITA INTERRUPCION T0
//INTERRUPCION T0 DE BAJA PRIORIDAD
26
PWM0=255;
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
}
}
//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
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
30