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