17.01.2015 Views

Informática Industrial - Examen ... - PoliformaT - UPV

Informática Industrial - Examen ... - PoliformaT - UPV

Informática Industrial - Examen ... - PoliformaT - UPV

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Informática <strong>Industrial</strong> - <strong>Examen</strong> microcontroladores junio 2011<br />

Nombre y apellidos:<br />

• En la mesa sólo puede tenerse:<br />

• Identificación Personal (Tarjeta Identidad <strong>UPV</strong>/DNI/Carnet de Conducir)<br />

• Lápiz/Bolígrafo<br />

• Este enunciado<br />

• Tablas resumen publicadas en <strong>PoliformaT</strong><br />

• Hojas de respuesta<br />

• Antes de nada, poner el nombre en: el enunciado, en cada hoja de respuesta y en las<br />

• tablas resumen.<br />

• Resolver cada problema en una hoja aparte.<br />

Problema 1 (3,0 puntos).<br />

Se desea implementar un dado electrónico con un microcontrolador de la familia<br />

8051.<br />

Para realizar el dado, se emplea una placa donde se montan 7 LEDs que representan<br />

los posibles valores del dado. Para encender cada LED, el pin correspondiente del<br />

microcontrolador al que se conecta el LED debe ponerse a “0”.<br />

Un pulsador conectado al pin P0.7 se emplea para realizar la tirada, de manera que,<br />

cada vez que se pulsa, debe aparecer un nuevo valor aleatorio en el dado.<br />

+Vcc<br />

P0.7<br />

P0.6<br />

P0.5<br />

P0.4<br />

P0.3<br />

P0.2<br />

P0.1<br />

P0.0<br />

Se pide: Desarrollar el código en C que implementa la funcionalidad del dado con las<br />

siguientes restricciones:<br />

• Emplear máscaras para actualizar la salida del puerto P0 de manera que el bit<br />

P0.7 no se vea afectado. No usar operaciones bit a bit en esta parte.<br />

• Emplear operaciones bit a bit para la lectura del pulsador.<br />

• Definir los sfr y sbit necesarios.<br />

Sugerencia: una manera sencilla de generar un valor aparentemente aleatorio consiste<br />

en ir incrementando un contador mientras el pulsador de tirada se mantiene pulsado.


Problema 2 (3,0 puntos).<br />

Se desea utilizar un microcontrolador de la familia 8051 para realizar un convertidor<br />

de códigos de tres bits.<br />

La tabla de conversión es la siguiente:<br />

Código de<br />

entrada<br />

Código de<br />

salida<br />

000 010<br />

001 011<br />

010 100<br />

011 000<br />

100 101<br />

101 111<br />

110 001<br />

111 110<br />

Los códigos de entrada se reciben por los bits P0.2, P0.1 y P0.0 del microcontrolador<br />

(siendo P0.0 el bit menos significativo del código de entrada)<br />

Los códigos de salida se envían por los bits P1.2, P1.1 y P1.0 (siendo P1.0 el bit<br />

menos significativo del código de salida)<br />

La conversión debe realizarse cada vez que se recibe un flanco de bajada a través del<br />

pin de interrupción externa INT1.<br />

Se pide: Escribir un programa en lenguaje C que atienda la petición de interrupción<br />

externa, leyendo el código de entrada y enviando el código de salida. Definir los sfr y<br />

sbit necesarios.


Problema 3 (4,0 puntos).<br />

Se desea diseñar un sistema basado en un microcontrolador de la familia 8051 para<br />

controlar la alarma un vehículo.<br />

El funcionamiento de la alarma es el siguiente. La alarma se activa o desactiva<br />

mediante un flanco de bajada en el pin P3.2. Cuando la alarma se activa, debe hacerse<br />

un retardo de 10s y, seguidamente, a través del pin P0.1 debe generarse una onda<br />

cuadrada de 2 segundos de periodo como indica la figura. En cualquier momento, un<br />

nuevo flanco en P3.2 (desactivar alarma) detendrá el ciclo, dejando P0.1 a nivel bajo<br />

y el sistema listo para una nueva activación.<br />

Se pide: Diseñar un programa en C que cumpla el requisito de funcionamiento de la<br />

alarma.<br />

MCS-51<br />

P3.2<br />

P0.1<br />

retardo= 10s<br />

T= 2 s<br />

Para ello, declarar todos registros involucrados (“sfr”), los bits necesarios, así como<br />

la utilización de las variables más adecuadas (0,5 ptos).<br />

También, se deberá implementar usar el temporizador C/T0, en ambos casos en el<br />

modo de 16 bits, tanto el retardo, como la salida periódica suponiendo un reloj de 6<br />

MHz. Para ello, se habrá de tener en cuenta que el desborde de C/T0 se deberá<br />

encuestar en ambos casos. (3,5 ptos)


Solución problema 1:<br />

/* dado examen infi juny 2011 */<br />

sfr P0= 0x80;<br />

sbit pulsador = P0^7;<br />

unsigned char<br />

tabla_combinaciones[]={0x3F,0x5B,0x1B,0x52,0x12,0x40};<br />

void main(void) {<br />

unsigned char puntuacion;<br />

puntuacion = 3;<br />

// un valor inicial a ojo<br />

}<br />

while(1) {<br />

while(pulsador == 1) {}; // esperar pulsacion<br />

// mientras está oprimido el pulsador ir contando<br />

while(pulsador == 0) {<br />

puntuacion = (puntuacion + 1) % 6;<br />

}<br />

// actualizar puntos<br />

P0 &= 0x80;<br />

P0 |= tabla_combinaciones[puntuacion];<br />

}<br />

Solución problema 2:<br />

unsigned char tabla_conversion [8] = {2,3,4,0,5,7,1,6};<br />

sfr P0 = 0x80;<br />

sfr P1 = 0x90;<br />

sfr TCON = 0x88;<br />

sfr IE = 0xA8;<br />

sbit IT1 = TCON^2;<br />

sbit EX1 = IE^2;<br />

sbit EA = IE^7;<br />

void convertir (void) interrupt 2 {<br />

P1 = tabla_conversion [ P0 & 0x07 ]; }<br />

void main (void) {<br />

IT1 = 1;


EX1 = 1;<br />

EA = 1;<br />

while (1) { } }<br />

Solución problema 3:<br />

sfr P0 = 0x80;<br />

sfr P3 = 0xB0;<br />

sfr TH0 = 0x8C;<br />

sfr TL0 = 0x8A;<br />

sfr TMOD = 0x89;<br />

sfr TCON = 0x88;<br />

sbit TR0 = TCON^4;<br />

sbit TF0 = TCON^5;<br />

sbit entrada = P3^2;<br />

sbit salida = P0^1;<br />

data bit alarma;<br />

#define alarma_ON 1<br />

#define alarma_OFF 0<br />

#define desbordes_retardo_10_s 100 // 1 CM = 12/6MHz = 2us; 10s<br />

= 5 000 000 CM, suponiendo temporización de 50000 CM<br />

#define desbordes_semiperiodo_1_s 10 // 1s = 500 000 CM duración<br />

de cada semiperiodo, suponiendo temporización de 50000 CM<br />

void main(void){<br />

unsigned char recarga_TH0;<br />

unsigned char recarga_TL0;<br />

bit entrada_activada; // para almacenar si se ha activado<br />

la entrada<br />

unsigned char desbordes;<br />

// preparar timer<br />

TR0 = 0;<br />

TF0 = 0;<br />

TMOD &= 0xF1;<br />

TMOD |= 0x01; // modo 1, timer, gate=0<br />

recarga_TH0 = (65536-50000)/256;<br />

registro TH0 del C/T0<br />

recarga_TL0 = (65536-50000)%256;<br />

registro TL0 del C/T0<br />

// Inicialización del<br />

// Inicialización del<br />

alarma = alarma_OFF;<br />

// bucle infinito<br />

while (1){


salida = 1;<br />

// valor inicial de la salida<br />

// esparar pulso<br />

while(entrada) {} // espera mientras la entrada sea un<br />

nivel alto (=1)<br />

while(entrada==0) {} // espera termacion pulso<br />

nuevo<br />

entrada_activada = 0;<br />

// supones que no ha llega pulso<br />

// temporizar 10 s<br />

salida = 0;<br />

desbordes = desbordes_retardo_10_s;<br />

while ((entrada_activada == 0) && (desbordes > 0)) {<br />

TR0 = 0; TF0 = 0;<br />

TH0 = recarga_TH0; // Inicialización del registro<br />

TH0 del C/T0<br />

TL0 = recarga_TL0; // Inicialización del registro<br />

TL0 del C/T0<br />

TR0 = 1;<br />

while ((entrada_activada == 0) && (TF0 == 0)) {<br />

if (entrada == 0) {<br />

entrada_activada =1; // se ha<br />

detectado pulso<br />

};<br />

}<br />

desbordes--;<br />

}<br />

// temporizar 1 s a nivel alto<br />

salida = 1;<br />

desbordes = desbordes_semiperiodo_1_s;<br />

while ((entrada_activada == 0) && (desbordes > 0)) {<br />

TR0 = 0; TF0 = 0;<br />

TH0 = recarga_TH0; // Inicialización del registro<br />

TH0 del C/T0<br />

TL0 = recarga_TL0; // Inicialización del registro<br />

TL0 del C/T0<br />

TR0 = 1;<br />

while ((entrada_activada == 0) && (TF0 == 0)) {<br />

if (entrada == 0) {<br />

entrada_activada =1; // se ha<br />

detectado pulso<br />

};<br />

}<br />

desbordes--;<br />

}<br />

// temporizar 1 s a nivel alto


salida = 0;<br />

desbordes = desbordes_semiperiodo_1_s;<br />

while ((entrada_activada == 0) && (desbordes > 0)) {<br />

TR0 = 0; TF0 = 0;<br />

TH0 = recarga_TH0; // Inicialización del registro<br />

TH0 del C/T0<br />

TL0 = recarga_TL0; // Inicialización del registro<br />

TL0 del C/T0<br />

TR0 = 1;<br />

while ((entrada_activada == 0) && (TF0 == 0)) {<br />

if (entrada == 0) {<br />

entrada_activada =1; // se ha<br />

detectado pulso<br />

};<br />

}<br />

desbordes--;<br />

}<br />

}<br />

}

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!