Ejercicio 7 Practico 7

Ejercicio 7 Practico 7

de Rafael Agustin Castelli Ottati -
Número de respuestas: 2

Buenas, estaba viendo el video de este ejercicio y me quedo una solucion bastante distinta a la planteada por el docente, principalmente porque la logica la hice toda en la rutina de interrupcion, y me queda la duda de si esta bien. Agradeceria si me pueden indicar si es correcta o incorrecta la solucion. La adjunto a continuacion:

#define threshold 300
#define byte unsigned char
#define SENSOR ...
#define ACCESORIO ...

short tics;

void interrupt tiempo() {
    byte estado_sensor = IN(SENSOR);
    if (estado_sensor & 0x01 == 0x01) { // Si hay peligro
        tics++;
        estado_accesorio = IN(ACCESORIO);
        estado_accesorio |= 0x01; // Prender extractor
        if (tics == threshold)  // Si paso el tiempo necesario, cerrar valvula
            estado_accesorio &= 0xFD;
        OUT(ACCESORIO, estado_accesorio); // Efectivizar cambios en accesorios
    }
    else
        tics = -1; // Resetear contador de ciclos
}

void main() {
    disable();
    tics = -1;
    // Instalar rutinas
    enable();
    while (true);
}

En respuesta a Rafael Agustin Castelli Ottati

Re: Ejercicio 7 Practico 7

de Gustavo Brown -

Rafael, 

 Este tipo de ejercicios en general admite un montón de soluciones distintas.

Tu solución funciona bien (ver siguiente mensaje por corrección) siempre y cuando el muestreo en el sensor, que se produce cada 100ms, es suficiente como para que no haya problemas en el sistema. El punto de comparación sería con la cantidad de tics que requerís para activar la emergencia y cerrar la válvula que es de 300 tics. Parece razonable.

Con unas pequeñas modificaciones podrías mover la parte de sensado al main y ya no tendrías problemas de muestreo.

Saludos,
   Gustavo


En respuesta a Gustavo Brown

Re: Ejercicio 7 Practico 7

de Gustavo Brown -

Perdón,

   Se me pasó por alto un problema en tu solución que es que prendés el extractor cuando hay escape de gas pero no lo apagás cuando ya no hay más escape.

Eso se arreglaría así (similar a como se resuelve en la solución del ejercicio 3 de práctico 10):

(en negrita los cambios)

void interrupt tiempo() {
    char estado_sensor = IN(SENSOR) & 1;
    char estado_accesorio = (IN(ACCESORIO) & 0xFE ) | estado_sensor;   // Prende o apaga extractor
    if (estado_sensor) { // Si hay peligro
        tics++;
        if (tics == threshold)  // Si paso el tiempo necesario, cerrar valvula
            estado_accesorio &= 0xFD;
    } else tics = -1; // Resetear contador de ciclos
    OUT(ACCESORIO, estado_accesorio); // Efectivizar cambios en accesorios
}

Saludos,
  Gustavo