sistemas digitales ii ejercicios tema 3 resueltos

30
1 SISTEMAS DIGITALES II Departamento de Sistemas Electrónicos y de Control 2005-2006 EJERCICIOS TEMA 3 RESUELTOS

Upload: vudan

Post on 06-Jan-2017

262 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: SISTEMAS DIGITALES II EJERCICIOS TEMA 3 RESUELTOS

1

SISTEMAS DIGITALES II

Departamento de Sistemas Electrónicos y de Control 2005-2006

EJERCICIOS TEMA 3 RESUELTOS

Page 2: SISTEMAS DIGITALES II EJERCICIOS TEMA 3 RESUELTOS

2

Page 3: SISTEMAS DIGITALES II EJERCICIOS TEMA 3 RESUELTOS

3

EJERCICIOS TEMA 3 DE SISTEMAS DIGITALES II (RESUELTOS)

EJERCICIO 1) Configure el Timer 2 para medir el retardo entre dos señales 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. Además para hacer más sencilla la rutina de atención se conecta la señal de entrada a dos pines de captura del microcontrolador (CT0 y CT1) que se configuran en flanco de subida. Para hacer más sencilla la rutina de atención se conecta la señal 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++;

Page 4: SISTEMAS DIGITALES II EJERCICIOS TEMA 3 RESUELTOS

4

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 través de uno de los pines del microcontrolador un monoestable de 10 mseg de activación cuando llegue un flanco de subida de una señal externa La señal que lanza el monoestable se conecta al pin CT0 y la salida se genera a través 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 detección de flanco para

//que no sea redisparable Valor= (((unsigned int)CTH0)<<8)|CTL0; Final =Valor + 9167; //Cálculo 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

}

Page 5: SISTEMAS DIGITALES II EJERCICIOS TEMA 3 RESUELTOS

5

Void Timer2_Comparacion1 (void) interrupt 12 {RTE=0; //No se conmuta el pin IEN1=0x01; //Habilita int CT0 y desha

//CM1 CTCON=0x01; //Habilitar detección CT0 en flanco sub. TM2IR&=0xEF; //Borrar flag

} a) Valor máximo de tiempo que se puede generar en el monoestable

T=(8*12*65536)/11000000 = 571 mseg b) Valor mínimo

Viene determinado por la latencia máxima y el tiempo de atención a la rutina de interrupción de CT0

c) Precisión

El monoestable no se “arranca” cuando llega el flanco externo sino que tiene que esperar a que esa interrupción se atienda y ponga el pin de salida a “1”. Este tiempo será la latencia mas la ejecución de la primera instrucción (P4=P4|0x01; que serían dos ciclos máquina=24CLKs). Por tanto este tiempo estaría entre 60 CLKs (5CM) y 132 CLKs (11 CM). Lo que haría 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 señal digital con las siguientes características: - Frecuencia comprendida entre 500 Hz. y 2 KHz.

- Ciclo de trabajo entre el 10% y el 90%.

El cálculo 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 cálculo del ciclo de trabajo solicitado anteriormente. Se pide: a) Describir los recursos a utilizar del microcontrolador, así como la función 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 señal a medir puede tener la siguiente apariencia:

Page 6: SISTEMAS DIGITALES II EJERCICIOS TEMA 3 RESUELTOS

6

Los recursos a utilizar serán: • Interrupción externa 0: hay que conectar el pulsador a dicha línea y programar esta

interrupción por flanco de bajada. • Timer 2: Hay que programarlo en modo captura y se conectará la señal a medir a las

líneas externas de captura CT0 y CT1 simultáneamente. 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 líneas. Una estimación del tiempo que tiene el timer para contar en cada uno de los límites de las señales es:

b) Indicar clara y brevemente las funciones que deberá realizar el programa principal así como las diferentes rutinas de atención a las interrupciones utilizadas, si ha lugar, para el correcto funcionamiento del circuito planteado en el apartado anterior (no incluya en ningún caso el código necesario para su realización).

Las funciones a realizar en el programa principal y en las rutinas serán:

Programa principal:

Programar timer 2 modo captura sin overflows Programar interrupción externa 1 en flanco de bajada Habilitar interrupción externa 0. Arrancar el T2

Rutina de atención a interrupción externa 0.

Deshabilitar interrupción externa 0. Programar el timer 2:

o Modo captura sin prescalado o Programar captura de CT0 en flanco de subida. o Habilitar interrupción timer 2 provocada por CT0. o Arrancar T2

Frecuencia Periodo Th=10% Th=90%

500 hz. 2000 usg. 200 usg. 1800 usg

2 Khz. 500 usg. 50 usg. 450 usg

Page 7: SISTEMAS DIGITALES II EJERCICIOS TEMA 3 RESUELTOS

7

Rutina de atención a interrupción 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 interrupción 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 interrupción externa 0 asegurando que no está

habilitado el flag de esta interrupción.

Rutina de atención a interrupción 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 vía serie, para elegir uno de los dos modos de funcionamiento siguientes:

- Conversión continua, donde el dispositivo toma muestras permanentemente. - Conversión bajo demanda del microcontrolador, que solicita la conversión, mediante la

escritura de un comando sobre el dispositivo.

También 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 5ºC del valor de alarma.

- Realizar la lectura de la temperatura medida.

El dispositivo se encuentra configurado para que las comunicaciones serie asíncronas tengan los siguientes parámetros: 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.

Page 8: SISTEMAS DIGITALES II EJERCICIOS TEMA 3 RESUELTOS

8

a) Complete dicha figura, utilizando las líneas del microcontrolador que considere oportuno, sabiendo que se necesita generar una interrupción cuando se active la salida “/ALERT”, y responda a las cuestiones siguientes:

Con el fin de detectar tanto el flanco negativo como el positivo de la señal de alarma del MAX1618, se utilizan las dos señales externas de interrupción, una de forma directa y otra negada, y así programando estas dos líneas sensibles al flanco de bajada, podremos tener acotados los instantes para generar/parar la señal de PWM.

b) Indique la programación de la UART, para conseguir el funcionamiento anterior. No genere interrupción 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 expresión

BAUD=(2SMOD*fosc)/(32*12*(256-TH1))

Seleccionando SMOD = 1 y despejando queda TH1=250’032. Como se emplea 250 (0xFA) no se obtienen 9600 baudios sino 9548. Unsigned char DatoRecibido, DatoEnviado; /* Variables globales */ TCON &= 0xB0; /* Parar el T1 */

TX RX

TxDato RxDato

82c552

(CLK = 12Mhz)

Page 9: SISTEMAS DIGITALES II EJERCICIOS TEMA 3 RESUELTOS

9

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 código necesario para leer la temperatura (en modo continuo de conversión) del

MAX1618.

while (1) { while (!RI); DatoRecibido = S0BUF; RI = 0; } }

d) Escriba el código necesario, para cambiar el modo de funcionamiento del dispositivo a conversiones bajo demanda (para ello es necesario escribir sobre él el dato 0xF0) y además leer el valor de la temperatura.

while (!TI); //Espera por si se estuviera enviando un dato TI=0; //Borra flag S0BUF = 0xF0; //Envía dato while (!RI); //Espera recepción de un nuevo dato DatoRecibido = S0BUF; //Lectura dato recibido RI=0; //Borrar flag

e) Incluya el código de la rutina de atención a la señal de alarma, de modo que se genere una señal PWM para controlar el motor de un ventilador. En este último caso, la duración de la señal a nivel alto será del 95% del periodo, con una frecuencia de 1KHz, hasta que se desactive la condición de alarma.

Para generar la señal que active el ventilador se utilizará el módulo 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 */ }

Page 10: SISTEMAS DIGITALES II EJERCICIOS TEMA 3 RESUELTOS

10

EJERCICIO 5) Se desea emplear un microcontrolador 80c552 para controlar remotamente un invernadero que se modelará como un sistema analógico que recibe una señal analógica (Vin) que permite regular la humedad. Además el Invernadero dispone de un sensor de temperatura que genera una tensión analógica (Vout) que se encuentra entre 0 y 1 voltio.

InvernaderoVin Vout

Entrada paraControlar humedad

Salida paraMedir la

Temperatura

InvernaderoVin Vout

Entrada paraControlar humedad

Salida paraMedir la

Temperatura

El funcionamiento del sistema es el siguiente: el microcontrolador recibe a través de la línea serie valores de humedad que debe enviar hacia el invernadero. Una vez que se envía 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 código digital que permite generar Vin se recibe vía serie a través de un conector DB9 empleando la norma RS-232 sin líneas de protocolo. Realice sobre la figura el conexionado de los elementos que se emplean para recibir los datos. En la figura final b) Generación de las señales del invernadero El microcontrolador debe generar la señal de entrada al invernadero y leer la temperatura empleando un canal de su conversor analógico digital. Dado que el 80c552 no incluye un convertidor digital-analógico se dispone de uno externo que habrá que conectar al microcontrolador. Simplificando el convertidor se puede indicar que genera una tensión analógica 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) Programación 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:

Page 11: SISTEMAS DIGITALES II EJERCICIOS TEMA 3 RESUELTOS

11

• el dato debe ser enviado al convertidor digital-analógico. • debe ordenarse una lectura del sensor de temperatura a través del canal del ADC del

microcontrolador. Una vez que se haya realizado la conversión, los 8 bits mas significativos (se desprecian los 2 de menor peso) deben guardarse en la posición de memoria 0xFFFF. c1) Codifique el programa principal necesario para configurar el sistema y cumplir las especificaciones planteadas teniendo en cuenta que todos los periféricos deben ser atendidos por interrupción. Comente el código. 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 más próximo 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; //Interrupción de UART IP0|=0x10; //Interrupción de UART a nivel alto de prioridad ADCON=0x00; //Canal 0 de conversión y hab por SW. IEN0|=0x40; //Interrupción de ADC IP0|=0x40; //Interrupción de ADC a nivel alto de prioridad TCON|=0x40; //Arranca T1 IEN0|=0x80; //Hab Ints

c2) Realice el organigrama de la/s interrupción/es que haya empleado

Leer SBUF

Escribirlo en P1

Lanzar Conversión ADC

Flag de UART

Leer ADCH

Guardarlo en 0xFFFF

Flag de ADC

Int de la UART Int del ADC

Page 12: SISTEMAS DIGITALES II EJERCICIOS TEMA 3 RESUELTOS

12

VCC

1VGND

12MHz

GND

U7

80C552/FP

5857565554535251

7170696867666564

31

32

6059

50779

74

49487576

1011121314151617

3839404142454647

1819202324252627

801245678

P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7

P5.0/ADC0P5.1/ADC1P5.2/ADC2P5.3/ADC3P5.4/ADC4P5.5/ADC5P5.6/ADC6P5.7/ADC7

XTAL2

XTAL1

AVREF+AVREF-

EAEWRSTSTADC

ALEPSENPWM0PWM1

P1.0/CT0IP1.1/CT1IP1.2/CT2IP1.3/CT3I

P1.4/T2P1.5/RT2P1.6/SCLP1.7/SDA

P2.0/A08P2.1/A09P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15

P3.0/RXDP3.1/TXD

P3.2/INT0P3.3/INT1

P3.4/T0P3.5/T1

P3.6/WRP3.7/RD

P4.0/CMSR0P4.1/CMSR1P4.2/CMSR2P4.3/CMSR3P4.4/CMSR4P4.5/CMSR5P4.6/CMT0P4.7/CMT1

MAX232

138

1110

134526

129147

R1INR2INT1INT2IN

C+C1-C2+C2-V+V-

R1OUTR2OUTT1OUTT2OUT

CONNECTOR DB9

594837261

INVERNADERO

Vin VoutVout

DAC08D0

D1

D2

D3

D4

D5

D5

D7

Rx

Figura

Page 13: SISTEMAS DIGITALES II EJERCICIOS TEMA 3 RESUELTOS

13

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 tensión-frecuencia (V-F) de alta precisión. El funcionamiento del convertidor es el siguiente: cuando se le solicita una conversión (activación de la señal SOC) éste realiza la misma y una vez que la tiene disponible genera a través del terminal frec_out un tren de pulsos digital cuya frecuencia es proporcional al valor analógico (Vin) de la entrada. Para que el microcontrolador conozca el momento en el que se comienza a generar la señal frec_out el conversor activa su señal de salida EOC. A partir de ese preciso instante se genera durante exactamente 100 mseg la señal de salida frec_out. Una vez pasados los 100 mseg esta línea queda en estado indefinido hasta que se realice una nueva petición de conversión. Para aclarar un poco más el funcionamiento de este dispositivo se muestra en la siguiente figura un cronograma de su temporización.

EOC

SOC

Frec_out

100mseg

Tmin=1mseg

EOC

SOC

Frec_out

100mseg

Tmin=1mseg

El objetivo de este problema es emplear este convertidor V/F como ADC de alta resolución ya que si se mide la frecuencia que genera y se conocen los rangos de la tensión de entrada y su relación con la frecuencia es sencillo calcular la tensión de entrada que se está aplicando. A continuación se proponen diversas alternativas para poder realizar las medidas cuya principal diferencia se encuentra en la resolución 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.

Page 14: SISTEMAS DIGITALES II EJERCICIOS TEMA 3 RESUELTOS

14

A) Gestionar el convertidor V-F empleando un 8051 con interrupciones externas Se desea realizar la medida de la tensión de entrada del convertidor V-F empleando un 80C51 del que tan solo están disponibles sus dos señales de interrupción externas y los pines de los puertos de entrada salida. NOTA: Tenga en cuenta que si le resulta necesario dispone de la función retardo(miliseg). A1) Indique cómo piensa hacer la medida y realice el conexionado oportuno en el siguiente esquema

12MHz

U2

8051

31

19

18

9

1213

12345678

3938373635343332

2122232425262728

EA/VP

X1

X2

RESET

INT0INT1

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

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

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

EOC

frec_out

SOC

CONVERTIDOR V-F

Vin

12MHz

U2

8051

31

19

18

9

1213

12345678

3938373635343332

2122232425262728

EA/VP

X1

X2

RESET

INT0INT1

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

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

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

EOC

frec_out

SOC

CONVERTIDOR V-F

Vin

A1) Se generará el pulso de comienzo de conversión empleando un pin de entrada-salida y aprovechándose de la existencia de la función de retardo que permite realizar su temporización. Una vez finalizada la temporización de esta señal se entra en un bucle esperando a que se reciba la señal de final de conversión. A partir de ese instante se entra en una función de retardo de 100mseg esperando a que se acabe el tren de pulsos. Cuando el periférico finalice la conversión se generará una interrupción a través e INT0. Dentro de esta interrupción se activará la atención de la INT1 por la que irán llegando los pulsos de la señal Frec_out. Cada pulso genera una interrupción en la que se incrementa por SW el valor de pulsos.

Page 15: SISTEMAS DIGITALES II EJERCICIOS TEMA 3 RESUELTOS

15

12MHz

U2

8051

31

19

18

9

1213

12345678

3938373635343332

2122232425262728

EA/VP

X1

X2

RESET

INT0INT1

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

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

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

EOC

frec_out

SOC

CONVERTIDOR V-F

Vin

12MHz

U2

8051

31

19

18

9

1213

12345678

3938373635343332

2122232425262728

EA/VP

X1

X2

RESET

INT0INT1

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

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

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

EOC

frec_out

SOC

CONVERTIDOR V-F

VinSOC

FREC

EOC

SOC

FRECEOC

A2) Codifique el programa principal y las rutinas de atención a las interrupciones necesarias teniendo en cuenta que la frecuencia que se genera varía en un rango entre 1KHz y 10 KHz cuando la tensión varía entre 0 y 10V. El programa debe realizar una única conversión guardando el valor de la tensión calculada en una variable global. Unsigned char ini_pulsos=0; //Flag de comienzo de conversión bastaría 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; //atención por flanco de INT0 IT1=1; //atención por flanco de INT1 EX0=1; //habilitación de la interrupción externa 0 EX1=0; //deshabilitación de la interrupción externa 1 PX0=1; //interrupción INT0 de alta prioridad PX1=0; //interrupción INT1 de baja prioridad EA=1; //habilitación de las interrupciones P1.0=0; //Generación 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

Page 16: SISTEMAS DIGITALES II EJERCICIOS TEMA 3 RESUELTOS

16

Tension=(float)pulsos/90+10.0/9; //cálculo de la tensión

} void interrupcion_externa0 () interrupt 0 { EX1=1; //Habilita interrupción de cuenta de pulsos EX0=0; //Deshabilita interrupción de nueva conversión 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 solución propuesta posee varias fuentes de error:

1. La latencia de la INT0 hace que desde que llegue el EOC hasta que se active la interrupción INT1 que realiza la cuenta pase un tiempo en el que no se cuentan los pulsos de entrada (FREC). Este error se podría estimar en Latmax+2instrucciones=11CM = 11useg. Con esto se perdería 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 difícil de cuantificar al no darse información de la precisión en el retardo de milisegundos. Si se supone una precisión de 1CM el error vendría dado por el tiempo de ejecución de la instrucción que prohíbe las interrupciones. Dado que esto requiere 1CM, en el peor caso se perdería 1 pulso.

3. Al no estar sincronizada la señal 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 aplicación funcionaría en el caso en el que la frecuencia que genera el conversor estuviera entre 1Hz y 500KHz. El sistema no funcionaría puesto que el tiempo máximo 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 máximo mas el tiempo de atención a la interrupción. Este segundo tiempo es el resultado de la suma de un dato unsigned long (aproximadamente 4CM) + la instrucción de IRET (1CM).

Page 17: SISTEMAS DIGITALES II EJERCICIOS TEMA 3 RESUELTOS

17

Por tanto se tardaría 9+4+1 = 14CM = 14 useg lo que llevaría 71.4KHz como frecuencia máxima. Por tanto el funcionamiento de esta aplicación no sería 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 periféricos que posee. B1) Indique cómo piensa hacer la medida y realice el conexionado oportuno en el siguiente esquema

12MHz

U2

8051

31

19

18

9

1213

1415

12345678

3938373635343332

2122232425262728

EA/VP

X1

X2

RESET

INT0INT1

T0T1

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

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

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

EOC

SOC

CONVERTIDOR V-F

frec_out

Vin

Se generará el pulso de comienzo de conversión empleando un pin de entrada-salida y aprovechándose de la existencia de la función de retardo que permite realizar su temporización. Para esperar a la llegada de la señal 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 número de pulsos. Una vez vencidos los 100mseg se realizan las cuentas.

Page 18: SISTEMAS DIGITALES II EJERCICIOS TEMA 3 RESUELTOS

18

12MHz

U2

8051

31

19

18

9

1213

1415

12345678

3938373635343332

2122232425262728

EA/VP

X1

X2

RESET

INT0INT1

T0T1

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

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

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

EOC

SOC

CONVERTIDOR V-F

frec_out

SOC

FREC

EOC

SOC

FREC

EOC

Vin

B2) Codifique el programa principal y las rutinas de atención a las interrupciones necesarias teniendo en cuenta que la frecuencia que se genera varía en un rango entre 1KHz y 500 KHz cuando la tensión varía entre 0 y 10V. El programa debe realizar una única conversión guardando el valor de la tensión calculada en una variable global.

Unsigned int OVFs=0; Unsigned int pulsos=0; Float tension=0; main () { IT0=1; //atención por flanco de INT0 EX0=1; //habilitación de la interrupción externa 0 PX0=1; //interrupción 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 //máximo de cuenta es 50.000 (500KHz) ET0=1; //Interrupción del Timer 0 TH0=5; //Valor de recarga de T0 para interrupciones periódicas //cada 250useg TH1=TL1=0; //Inicializa el contador de pulsos EA=1; //habilitación de las interrupciones P1.0=0; //Generación del pulso de SOC Retardo(1); P1.0=1 While(1); }

Page 19: SISTEMAS DIGITALES II EJERCICIOS TEMA 3 RESUELTOS

19

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; //cálculo de la tensión } }

B3) Indique las posibles fuentes de error que tiene sus sistema a la hora de realizar la medida de la frecuencia.

La solución 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 podría estimar en Latmax+1instrucción=10CM = 10useg. Con esto se perdería 1 pulso si la frecuencia de entrada fuera de 100KHz. Dado que la frecuencia de entrada puede llegar a ser de 500KHz se perderían 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 (reducción 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 señal 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 funcionaría correctamente cuando la frecuencia de entrada se encontrara en el rango comprendido entre 1KHz y 500KHz. El funcionamiento sería correcto dado que el periodo mínimo que requiere la señal de entrada para que el Timer1 la cuente correctamente es de 1CM, por lo que, a esta frecuencia de reloj, se podría llegar a medir hasta 1MHz.

Page 20: SISTEMAS DIGITALES II EJERCICIOS TEMA 3 RESUELTOS

20

B5) Calcule la resolución de la medida que realiza el convertidor expresada en V para un rango de frecuencias entre 1KHz y 500KHz. Compare la resolución de este convertidor con la del convertidor analógico digital que incorpora el 80x552. Calcule la resolución de la medida que realiza el convertidor expresada en V para un rango de frecuencias entre 1KHz y 500KHz. Compare la resolución de este convertidor con la del convertidor analógico digital que incorpora el 80x552. La resolución de la medida viene dada por el paso de cuantificación de la señal a medir. En este caso, si se usa el convertidor AD del propio microcontrolador se tiene que 1LSB = Rango_de_tensión_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 tensión de entrada / Rango_de_frecuencia = 10/499000 = 2,004e-5 V

C) Gestionar el convertidor empleando un 80552 Indique si se le ocurre algún 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 ningún 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 señal EOC. La generación 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 señal que se genera se conecta a la habilitación HW de cuenta del Timer 1 de modo que este sólo contará durante el tiempo en el que se está generando la señal 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 máquina tragaperras sencilla. Para ello se dispone, además 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 símbolo en función del dato de 4 bits que se encuentre en cada momento en su entrada (dispone por tanto de 16 posibles símbolos). El funcionamiento detallado del sistema se va a ir describiendo en cada uno de los apartados posteriores, pero a grandes rasgos se podría decir que cuando se presiona el

Page 21: SISTEMAS DIGITALES II EJERCICIOS TEMA 3 RESUELTOS

21

Pulsador1 comienza una nueva partida, con lo que los símbolos del primer display empiezan a cambiar cíclicamente 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 combinación ganadora y si es necesario se activa la alarma. Cada uno de los pulsadores tiene por tanto una misión diferente. El pulsador 1 sirve para inicial una nueva partida mientras que el Pulsador 2 tiene como misión parar el símbolo que se encuentre en ese preciso instante en el display correspondiente. Cada vez que se produce una pulsación 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. Más concretamente se desea que el display 1 ocupe exclusivamente la posición 0xFF00, el 2 la 0xFF01 y el 3 la 0xFF02. Una vez realizado el conexionado genere las ecuaciones lógicas de todas las señales de selección que haya empleado. NOTA: Realice el conexionado por etiquetas

12KHzGND

U12A

DECODIFICADOR 2x4

23

1

4567

AB

E

Q0Q1Q2Q3

74HC373U5

111

256912151619

3478

13141718

OELE

1Q2Q3Q4Q5Q6Q7Q8Q

1D2D3D4D5D6D7D8D

80C552/FP

5857565554535251

7170696867666564

31

32

6059

50779

74

49487576

1011121314151617

3839404142454647

1819202324252627

801245678

P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7

P5.0/ADC0P5.1/ADC1P5.2/ADC2P5.3/ADC3P5.4/ADC4P5.5/ADC5P5.6/ADC6P5.7/ADC7

XTAL2

XTAL1

AVREF+AVREF-

EAEWRSTSTADC

ALEPSENPWM0PWM1

P1.0/CT0IP1.1/CT1IP1.2/CT2IP1.3/CT3I

P1.4/T2P1.5/RT2P1.6/SCLP1.7/SDA

P2.0/A08P2.1/A09P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15

P3.0/RXDP3.1/TXD

P3.2/INT0P3.3/INT1

P3.4/T0P3.5/T1

P3.6/WRP3.7/RD

P4.0/CMSR0P4.1/CMSR1P4.2/CMSR2P4.3/CMSR3P4.4/CMSR4P4.5/CMSR5P4.6/CMT0P4.7/CMT1

74HC373U6

111

256912151619

3478

13141718

OELE

1Q2Q3Q4Q5Q6Q7Q8Q

1D2D3D4D5D6D7D8D

74HC373U7

111

256912151619

3478

13141718

OELE

1Q2Q3Q4Q5Q6Q7Q8Q

1D2D3D4D5D6D7D8D

74HC373U8

111

256912151619

3478

13141718

OELE

1Q2Q3Q4Q5Q6Q7Q8Q

1D2D3D4D5D6D7D8D

D1

D3

DISPLAY1

D2

D0

D0

D2

DISPLAY2

D3

D1

D0

D2

DISPLAY3

D3

D1

PULSADOR1

PULSADOR2

ALARMA

SEÑALES DE CS GENERADAS:

Page 22: SISTEMAS DIGITALES II EJERCICIOS TEMA 3 RESUELTOS

22

12KHz INT0

INT1

PWM

A8

A10A11

A14

A9

A15

A13

AD7

AD4AD5

AD2AD1AD0

AD3

A12

AD6 A6A7

A5

A1

A4A3

A0

A2

GND

AD7

Vcc

AD2

AD5AD6

AD4

AD1

AD3

AD0

GNDALE

CS0CS1CS2

AD3

AD0AD1AD2

AD2AD1

AD3

AD0

AD2AD1

AD3

AD0

INT0INT1

CS0

CS1

CS2

CS

A1A0

PWM

GND

GND

GND

INT1

INT0

/WR

U12A

DECODIFICADOR 2x4

23

1

4567

AB

E

Q0Q1Q2Q3

74HC373U8

111

256912151619

3478

13141718

OELE

1Q2Q3Q4Q5Q6Q7Q8Q

1D2D3D4D5D6D7D8D

74HC373U7

111

256912151619

3478

13141718

OELE

1Q2Q3Q4Q5Q6Q7Q8Q

1D2D3D4D5D6D7D8D

74HC373U6

111

256912151619

3478

13141718

OELE

1Q2Q3Q4Q5Q6Q7Q8Q

1D2D3D4D5D6D7D8D

80C552/FP

5857565554535251

7170696867666564

31

32

6059

50779

74

49487576

1011121314151617

3839404142454647

1819202324252627

801245678

P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7

P5.0/ADC0P5.1/ADC1P5.2/ADC2P5.3/ADC3P5.4/ADC4P5.5/ADC5P5.6/ADC6P5.7/ADC7

XTAL2

XTAL1

AVREF+AVREF-

EAEWRSTSTADC

ALEPSENPWM0PWM1

P1.0/CT0IP1.1/CT1IP1.2/CT2IP1.3/CT3I

P1.4/T2P1.5/RT2P1.6/SCLP1.7/SDA

P2.0/A08P2.1/A09P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15

P3.0/RXDP3.1/TXD

P3.2/INT0P3.3/INT1

P3.4/T0P3.5/T1

P3.6/WRP3.7/RD

P4.0/CMSR0P4.1/CMSR1P4.2/CMSR2P4.3/CMSR3P4.4/CMSR4P4.5/CMSR5P4.6/CMT0P4.7/CMT1

U6

74HC373

111

20

256912151619

3478

13141718

OELE

VCC

1Q2Q3Q4Q5Q6Q7Q8Q

1D2D3D4D5D6D7D8D

D0

D2

DISPLAY2

D3

D1

D0

D2

DISPLAY3

D3

D1

PULSADOR1

PULSADOR2

ALARMA

D0

D3

D1

DISPLAY1

D2

SEÑALES 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 sería el comportamiento del sistema en el caso de que no existieran. Los displays están directamente conectados al bus de datos por lo que necesitan almacenar de algún modo el valor que deben representar en cada momento. Si no existieran estos buffers el valor que se representaría en cada display iría 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 podría 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 líneas más bajas de direcciones es capaz de seleccionar el display al que se desea acceder. De este modo, y dado que cada display sólo se mapea en una dirección de memoria, no es necesario crear un CS que incluya las 16 líneas 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, sería necesario generar 3 CSs con todos los bits del bus de direcciones.

Page 23: SISTEMAS DIGITALES II EJERCICIOS TEMA 3 RESUELTOS

23

A4) Cuando se produce una combinación ganadora se debe activar una alarma. La alarma funciona con una señal de entrada digital de frecuencia constante (aproximadamente 5 Hz) y ciclo de trabajo variable en escalones de 1%. Justifique cómo piensa gestionar esta alarma y realice su conexionado al microcontrolador sobre el esquema anterior. Para generar una señal 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 según la expresión

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 solución aportada sería válida en el caso de que la frecuencia requerida por la alarma fuera de 50 Hz. En el caso de que no fuera válido indique si sería posible resolver el problema de algún otro modo sin cambiar el reloj del microcontrolador. La frecuencia máxima 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 solución que se podría emplear es la de usar el Timer 2 y sus módulos de comparación para generar una señal externa. Con uno de los comparadores conmutaría 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 interrupción/es) que, cuando se presione el pulsador1, haga que el símbolo que se represente en el display 1 cambie de forma cíclica 10 veces por segundo. NOTA: Para desarrollar este apartado debe emplear la menor cantidad de recursos posibles y en ningún caso una rutina de retardo. B1) Realice sobre el esquema su conexionado del Pulsador 1 e indique cómo piensa gestionarlo. Se conecta a la interrupción externa 0 y se gestiona por interrupción por flanco de bajada. Cuando se produzca su pulsación se arrancará la temporización de los displays. B2) Indique los recursos que va a emplear y los cálculos que sean necesarios para justificar la viabilidad de la solución propuesta. Como ya se ha indicado se empleará la interrupción 0 para arrancar la temporización. Para ésta se va a emplear el T0 en modo 2 para que el periodo sea lo mas preciso

Page 24: SISTEMAS DIGITALES II EJERCICIOS TEMA 3 RESUELTOS

24

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 periódicas cada 100mseg podemos emplear este modo sin necesidad de contar interrupciones. B3) Codifique el programa (programa principal y rutina/s de interrupción/es) que cumpla las anteriores especificaciones comentando el código 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) APLICACIÓN COMPLETA Se pretende en este apartado añadir a la aplicación anterior el resto de funcionalidad del sistema. Para ello deben procesarse las pulsaciones del pulsador2 y las temporizaciones de dos segundos del siguiente modo:

Page 25: SISTEMAS DIGITALES II EJERCICIOS TEMA 3 RESUELTOS

25

• 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. Además al pasar al siguiente display se reiniciará la temporización de los 2 segundos.

• al cumplirse los dos segundos se parará el display activo, se pasará al siguiente y se comenzará una nueva temporización.

Finalmente, y tras comprobar si se ha obtenido una combinación 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 más precisa posible por lo que se recomienda emplear el Timer 2 para su gestión.

• Para comprobar si se ha obtenido una combinación ganadora se dispone de una función ya desarrollada que recibe como parámetros los tres dígitos correspondientes a los tres displays y devuelve el ciclo de trabajo con el que debe generarse la señal 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 serán 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 cómo piensa gestionarlo. El pulsador 2 se conectará a la interrupción 1 para que dentro de esa interrupción, gestionada por flanco, se lleve a cabo el paso al siguiente display. Además 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 cálculos que sean necesarios para justificar la viabilidad de la solución propuesta. En el caso de que necesite realizar alguna modificación sobre el conexionado indíquelo de forma justificada. Para desarrollar el sistema se emplearan los mismos recursos que en el apartado anterior añadiendo el timer2 para temporizar los dos segundos. Dado que se pide precisión 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 cómo temporizar los dos primeros segundos después de arrancar una partida. Para ello se modificará el conexionado para que cuando se pulse el pulsador1, además de generar la interrupción correspondiente, se capture el valor de t2 y se recargue con un valor equivalente a 2 segundos mas el valor capturado

Page 26: SISTEMAS DIGITALES II EJERCICIOS TEMA 3 RESUELTOS

26

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 sólo está activa la int ext0 por lo que su prioridad no es importante. Una vez atendida esta interrupción se deshabilita a si misma y habilita las otras 3 (int1, comp0 y T0). De ellas las más 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 interrupción del T0 que se conectará a baja prioridad. C4) Codifique el programa (programa principal y rutinas de interrupción) que cumpla las anteriores especificaciones comentando el código 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

Page 27: SISTEMAS DIGITALES II EJERCICIOS TEMA 3 RESUELTOS

27

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

Page 28: SISTEMAS DIGITALES II EJERCICIOS TEMA 3 RESUELTOS

28

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 señales digitales de periodo 200 ms e igual ciclo de trabajo. Dicho valor debe guardarse, expresado en radianes, en la variable: float desfase.

Page 29: SISTEMAS DIGITALES II EJERCICIOS TEMA 3 RESUELTOS

29

Indique, justificadamente, que elementos del microcontrolador usaría, con qué valores deben trabajar dichos elementos y realice en código C (comentando las instrucciones) toda la programación necesaria (iniciación de periféricos y rutina/s de interrupción/es de los mismos) para esta aplicación. NOTA: Tenga en cuenta que no es posible que lleguen dos flancos de la señal 1 sin que haya llegado alguno de la señal 2.

t

t

Señal 1

Señal 2

t1

Para calcular el desfase habrá que medir el tiempo t1 y relacionarlo con el periodo: φ = (t1 x 2π) / Tseñal Para medir t1 usaremos el timer 2 y dos de sus entradas de captura conectadas una a la señal 1 (CT0I) y la otra a la señal 2 (CT1I). Ambas activas por flanco de subida. Al capturar la segunda se producirá interrupción y se realizará el cálculo del desfase. Veamos si puede haber overflows: El desfase será menor de 200 msg lo que implica un número de cuentas: Sin prescaler: Tcuenta = TCLK x 12 = 12/(120 x 103) = 10-4 = 0,1 msg nº de cuentas máximo: 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 prohíben 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); }

Page 30: SISTEMAS DIGITALES II EJERCICIOS TEMA 3 RESUELTOS

30

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 */ }