Examen – 23 de Febrero de 2007
Instrucciones•Indique su nombre completo y número de cédula en cada hoja.
•Numere todas las hojas e indique la cantidad total de hojas que entrega en la primera.
•Escriba las hojas de un solo lado.
•Empiece cada ejercicio en una hoja nueva.
•Sólo se contestarán dudas de letra. No se aceptarán dudas los últimos 30 minutos del examen.
•Duración: 3 horas.
•Requisito para Aprobación: 1 problema y medio correctamente resueltos
Problema 1
Se desea implementar las rutinas necesarias para controlar un equipo dedicado únicamente a dispensar agua para sanitarios (como los instalados en algunos baños de facultad).
Dichos equipos disponen de un sensor de proximidad y una llave de paso de agua (controlada
electrónicamente). El estado de estos dispositivos se encuentra mapeado en los 2 bits de bajo orden de un puerto de escritura y lectura de 8 bits, ubicado en la dirección CONTROLADOR ( bit1-sensor proximidad, bit0-llave de agua, el bit0 es el menos significativo, 0 significa que no se está sensando y que la llave no va a dejar pasar agua respectivamente).
Además el dispositivo tiene un sensor que detecta un próximo desbordamiento del agua que genera una interrupción que invoca a la rutina desbordamiento(). También dispone de un timer con frecuencia de 5Hz el cual interrumpe invocando a la rutina tiempo().
Se debe monitorear el sensor de proximidad de forma que cuando se detecte un usuario del sanitario más de 4 segundos consecutivos, se active una espera que aguarde que el usuario se retire y luego de pasados 8 segundos adicionales (luego que se dejó de detectar), se debe habilitar el paso del agua mediante la llave controlada electrónicamente. El agua debe correr durante 15 segundos y luego se debe detener el flujo. Durante el tiempo que la llave de agua esté abierta se deberá controlar la posibilidad de desbordamiento, de forma que si se detecta desbordamiento se cierre la llave durante 6 segundos y luego se vuelve a abrir (si aún no terminaron los 15 segundos).
También se debe tener en cuenta el sensor de proximidad de forma que si un usuario se acercara cuando la llave de agua esta abierta, esta debe ser cerrada inmediatamente. Si el usuario se retira antes de los 4 segundos, la llave se abre nuevamente y continúa la cuenta desde que se detecto la proximidad del usuario hasta los 15 segundos, en caso de que el usuario se retire después de los 4 segundos se comenzará
nuevamente de cero, como que no hubiera existido el sensado anterior. También se debe proceder de forma similar cuando se detecte proximidad dentro de los 8 segundos antes de abrir la llave, en este caso si el usuario esta menos de 4 segundos se deberá reanudar la espera de 8 segundos, sino se comenzará también de cero. Se debe tratar de reaccionar al sensor de proximidad lo más rápidamente posible.
Cuando se halla detectado desbordamiento no se le deberá prestar atención al sensor de proximidad.
Se pide:
Implementar en un lenguaje de alto nivel todas las rutinas necesarias para implementar el dispositivo descrito en base a un procesador dedicado.
// ( 5Hz, 5 veces por segundo ) #define CUATRO_SEG 5*4 #define SEIS_SEG 5*6 #define OCHO_SEG 5*8 #define QUINCE_SEG 5*15
enum ESTADOS { INICIO, ESP4s, DETECTO, ESP8s, ESP4sDETECTO, AGUA_PRENDIDA, ESP6s, AGUA_PRENDIDA_ESP4s };
ESTADOS estado; int tics, tics2; void timer(){
if ( estado == ESP6s ){
tics2 ++;
tics1 ++;
} else if ( estado != INCIO && estado != DETECTO )
tics ++;
}
void desbordamiento(){
if ( estado == AGUA_PRENDIDA ){
estado = ESP6s;
//apago el agua, ~ es la negación bit a bit
OUT (CONTROLADOR, IN(CONTROLADOR) & ~1 );
tics2 = 0; } } void main(){ estado = INICIO; tics = 0; tics2 = 0;
OUT (CONTROLADOR, IN(CONTROLADOR) & ~1 ); // instalar interrupciones // hablilitar interrupciones switch ( estado ){ case INICIO: if ( IN (CONTROLADOR) & 2 == 2 ){ estado = ESP4s; tics = 0; } break; case ESP4s: if ( IN (CONTROLADOR) & 2 == 0 ){ estado = INICIO;
} else if ( tics >= CUATRO_SEG ){ estado = DETECTO; } break; case DETECTO: if ( IN (CONTROLADOR) & 2 == 0 ){ estado = ESP8s; tics = 0;
} break; case ESP8s: if ( IN (CONTROLADOR) & 2 == 2 ){ estado = ESP4sDETECTO; tics = 0;
} else if ( tics >= OCHO_SEG ){ estado = AGUA_PRENDIDA; tics = 0;
OUT( CONTROLADOR, IN ( CONTROLADOR ) | 1); } break; case ESP4sDETECTO: if ( IN (CONTROLADOR) & 2 == 0 ){ estado = ESP8s; tics = 0;
} else if ( tics >= CUATRO_SEG ){ estado = DETECTO; } break; case AGUA_PRENDIDA: if ( IN (CONTROLADOR) & 2 == 2 ){ estado = AGUA_PRENDIDA_ESP4s ; tics = 0;
OUT( CONTROLADOR, IN ( CONTROLADOR ) & ~1); } else if ( tics >= QUINCE_SEG ){
estado = INICIO;
OUT( CONTROLADOR, IN ( CONTROLADOR ) & ~1); } break; case AGUA_PRENDIDA_ESP4s: if ( IN (CONTROLADOR) & 2 == 0 ){ estado = AGUA_PRENDIDA; tics = 0;
OUT( CONTROLADOR, IN ( CONTROLADOR ) | 1); } else if ( tics >= CUATRO_SEG ){
estado = DETECTO; } break; case DESBORDAMIENTO: if ( tics2 >= SEIS_SEG ){ if ( tics1 >= QUINCE_SEG ){ estado = INICIO; } else { estado = AGUA_PRENDIDA;
OUT( CONTROLADOR, IN ( CONTROLADOR ) | 1); }
} } }
Problema 2
Se desea construir un circuito para operar una maquina dispensadora de chicles. La misma permite recibir monedas de $1 y $2 hasta acumular exactamente $3, momento en el cual se enciende la salida que entrega el chicle al usuario y el sistema vuelve a esperar el ingreso de nuevas monedas.
En caso de que el usuario coloque monedas por un monto mayor a $3, la maquina deberá pasar a un estado de Error del cual solo se puede salir presionando el botón de Cancelar. Cuando se presiona el botón de Cancelar el circuito debe encender la salida Devolución, para quedar a la espera del ingreso de nuevas monedas.
La maquina dispensadora tiene una entrada E de 2 bits codificada de la siguiente manera:
• 00: no se ha insertado moneda ni se ha apretado el botón Cancelar
• 01: se ha insertado una moneda de $1
• 10: se ha insertado una moneda de $2
• 11: se ha apretado el botón de Cancelar
Asimismo se dispone de 2 salidas (Chicle,Devolución) que se detallan a continuación:
• Chicle que se activa cuando el sistema debe entregar el chicle.
• Devolución que se activa cuando se presiona el botón de Cancelar. Consideraciones:
• Al presionar el botón Cancelar se devuelven todas las monedas que el usuario haya ingresado desde la ultima vez que se habia apretado Cancelar o se haya entregado un chicle.
Se pide diseñar un circuito en base a Flip-Flops JK y compuertas lógicas, utilizando la metodología de máquinas de estado vista en el curso.
Solución:
Primero realizamos la maquina de estados que modela el sistema:
Para la misma vamos a considerar como como entradas X de 2 bits y como salidas CD, donde C es la salida Chicle y D la salida Devolución
$1
$0
$2
err
00/00 11/01 11/01 11/01 01/10 00/00 00/00 0X/00 10/00 11/01 10/00 10/00 10/10 01/00 01/00Ahora escribimos la funcion de transición. Para ello vamos a considerar la siguiente codificacion de estados:
$0 00 $1 01 $2 10 err 11
Estado Actual Entradas Prox. Estado Chicle Devolucion
00 00 00 0 0 00 01 01 0 0 00 10 10 0 0 00 11 00 0 1 01 00 01 0 0 01 01 10 0 0 01 10 00 1 0 01 11 00 0 1 10 00 10 0 0 10 01 00 1 0 10 10 11 0 0 10 11 00 0 1 11 00 11 0 0 11 01 11 0 0 11 10 11 0 0 11 11 00 0 1
Ahora escribimos la tabla de transición para flip flops JK: Estados X=00 X=01 X=10 X=11 Q1Q0 J1K1 J0K0 J1K1 J0K0 J1K1 J0K0 J1K1 J0K0 00 0X 0X 0X 1X 1X 0X 0X 0X 01 0X X0 1X X1 0X X1 0X X1 10 X0 0X X1 1X X0 1X X1 0X 11 X0 X0 X0 X0 X0 X0 X1 X1
Realizamos los Karnaugh asociados:
Q1Q0\X1X0 00 01 11 10 Q1Q0\X1X0 00 01 11 10 00 0 0 0 1 01 0 1 0 0 11 X X X X 10 X X X X 00 X X X X 01 X X X X 11 0 0 1 0 10 0 1 1 0 J1 = Q0.!X1.X0 + !Q0.X1.!X0 K1 = !Q0.X0 + X1.X0 Q1Q0\X1X0 00 01 11 10 00 X X X X 01 0 1 1 1 11 0 0 1 0 10 X X X X Q1Q0\X1X0 00 01 11 10 00 0 1 0 0 01 X X X X 11 X X X X 10 0 0 0 1 J0 = !Q1.!X1.X0 + Q1.X1.!X0 K0 = !Q1.X0 + !Q1.X1 + X1.X0 Q1Q0\X1X0 00 01 11 10 00 0 0 0 0 01 0 0 0 1 11 0 0 0 0 10 0 1 0 0 Q1Q0\X1X0 00 01 11 10 00 0 0 1 0 01 0 0 1 0 11 0 0 1 0 10 0 0 1 0 Chicle= Q1.!Q0.!X1.X0 + !Q1.Q0.X1.!X0 Devolucion= X1.X0
Problema 3
Se desea construir un conversor de números enteros con signo de ocho bits utilizando para esto una ROM. Las conversiones necesarias entre las diferentes representaciones son las siguientes:
• De Valor Entero y Signo a Complemento a 1.
• De Complemento a 1 a Valor Entero y Signo.
• De Desplazamiento a Complemento a 2.
• De Complemento a 2 a Desplazamiento.
El conversor tendrá como entrada el número a convertir y un selector de que conversión se quiere realizar y como salida el resultado de ocho bits calculado. Considere el desplazamiento de 2N-1.
El selector de conversión de 2 bits se codificada de la siguiente manera:
• 00: de Valor Entero y Signo a Complemento a 1.
• 01: de Complemento a 1 a Valor Entero y Signo.
• 10: de Desplazamiento a Complemento a 2.
• 11: de Complemento a 2 a Desplazamiento. Para ello se dispone de las siguientes ROM:
• 1 ROM de 256 x 16
• 1 ROM de 1K x 2
• 1 ROM de 512 x 4
Se pide:
a) Especificar el tamaño y la organización de la ROM necesaria para implementar dicho conversor. Construirla utilizando todas las ROMs disponibles.
Solución:
a)
La ROM a construir necesita 10 entradas (8 para el número a convertir y 2 para el selector) y 8 salidas para el resultado de la conversión Î 1K x 8.
1. 1 ROM de 256 x 16 Î 1K x 4.
3. De la ROM de 1K x 2, de 2 y 1 armo ROM Î 1K x 8.
b)
void cargarROM() {
int i, result, selector, entrada, bit7; for (i=0; i<2^10; i++) {
entrada = i & 0x0FF; selector = i & 0x300; selector >>= 8;
bit7 = entrada & 0x80;
if (selector < 2) { // selector es 00 ó es 01 if (bit7 == 0x80) // el número es negativo.
result = ((~entrada) | 0x80); else // el número es positivo
result = entrada; }
else { // selector es 10 ó es 11 if (bit7 == 0x80)
result = (entrada & 0x7F); else result = (entrada | 0x80); } ROM[i] = result; } }