[Practico 8][Ejercicio 6]

[Practico 8][Ejercicio 6]

de Martin Pacheco -
Número de respuestas: 2

Letra:
Sea un sistema que controla las luces de iluminación de los pasillos de un edificio.
Este cuenta con un botón de encendido en cada piso y se desea que una vez transcurrido 45 segundos desde que fue presionado el botón de algún piso, estas se apaguen.

Para esto se sabe que:
● Cuando se aprieta un botón en cualquier piso, se invoca una rutina de interrupción llamada boton().
● El encendido de todas las luces se realiza poniendo en 1 el bit menos significativo del byte de la dirección 0x20 y se apagan colocando este mismo en 0.
● Además se cuenta con un timer que genera una interrupción cada un segundo la cual invoca a la rutina de interrupción tiempo().

Escribir en lenguaje de alto nivel las rutinas necesarias para implementar el controlador de luces.

Mi solución es la siguiente:

void interrupt boton(int &ticks){
    ticks=0; //reinicio el contador
    if (!(in(0x20)&=1)) //si no estan prendidas
        out(0x20,in(0x20)|=1)  //las prendo
}

void interrupt tiempo(int &ticks){
    if(in(0x20)&=1){ //si las luces estan prendidas
        ticks++;
        if(ticks==45)
            out(0x20,in(0x20)&=-2) //apaga las luces
    }
}


Se espera que la solucion sea un poco mas elaborada? O hay algun detalle que no haya tenido en cuenta?
Es necesario que considere los casos cuando se llama a una rutina mientras se está ejecutando la otra? O el hecho de que como yo reinicio el contador en 0 en la rutina boton, y que la rutina tiempo se llama cada un segundo, puede ser que en lugar de durar 45 segundos la luz prendida, dure 44,... porque el boton fue presionado entre un segundo y otro?
En respuesta a Martin Pacheco

Re: [Practico 8][Ejercicio 6]

de Gustavo Brown -

Lo que te estaría faltando es el programa principal y quitar el parámetro de las rutinas de interrupcion (éstas no reciben parámetros y no devuelven nada tampoco).

No se puede llamar a una interrupción mientras se está ejecutando la otra porque al iniciar la rutina de atención a la interrupción se deshabilitan las interrupciones. En este ejercicio o bien la luz queda prendida un tiempo T (44s,45s) o bien (45s, 46s) y no tenes manera de que quede prendida exactamente 45 segundos porque la resolución del reloj es de 1 segundo.

Comentario: la letra no indica si el puerto es de lectura/escritura o solamente de escritura, en tu caso decidiste que sea de lectura/escritura.

Saludos,
  Gustavo