PRÁCTICO 7, EJERCICIO 2

PRÁCTICO 7, EJERCICIO 2

de Juan Carlos Sosa Gómez -
Número de respuestas: 8

Hola, que tal?

1) LED y BOMBA, lo tomamos como registros de un byte?.

2) activarBomba() y desactivarBomba() tiene que estar implementadas dentro del int main()? o lo tomamos como funciones auxiliares y la implementamos como tal?.

En respuesta a Juan Carlos Sosa Gómez

Re: PRÁCTICO 7, EJERCICIO 2

de Maria Soledad Techera Gomez -
Buenas, me surgio la segunda duda de arriba y ademas si hay que deshabilitar las interrupciones en los procedimientos o si de eso se encarga el main. 
Gracias
En respuesta a Maria Soledad Techera Gomez

Re: PRÁCTICO 7, EJERCICIO 2

de Gustavo Brown -
Maria,
  Respondí la duda de arriba.
Sobre tu otra duda, este ejercicio es de entrada/salida mediante la técnica de polling (no utiliza interrupciones). 
No hay que deshabilitar las interrupciones en los procedimientos auxiliares. El main tampoco lo hará automáticamente y no es necesario que lo haga.

Saludos,
  Gustavo
En respuesta a Juan Carlos Sosa Gómez

Re: PRÁCTICO 7, EJERCICIO 2

de Gustavo Brown -
Hola,
  BOMBA es la dirección del puerto asociado tanto a la Bomba como al LED. Pueden suponer que ese puerto es de 8 bits.
Las rutinas activarBomba y desactivarBomba las deberían implementar como funciones auxiliares que serán llamadas desde el programa principal (main) cuando corresponda.

Saludos,
  Gustavo
En respuesta a Gustavo Brown

Re: PRÁCTICO 7, EJERCICIO 2

de Maria Soledad Techera Gomez -
Gracias por su respuesta.
Para encender el LED hay que manipular su puerto o unicamente el bit 4 del puerto BOMBA? La letra no deja clara la existencia del puerto LED.

Saludos
En respuesta a Maria Soledad Techera Gomez

Re: PRÁCTICO 7, EJERCICIO 2

de Gustavo Brown -
Perdón, ahí cambié la respuesta con los datos correctos.
Efectivamente hay un único puerto llamado BOMBA que comanda tanto la Bomba como el LED cuando se escribe en él y al leerlo se puede saber el estado real de la Bomba.
Para prender o apagar el LED hay que activar/desactivar el bit 4 del puerto de E/S BOMBA.
Recordar que en este caso (supusimos puerto de 8 bits) al puerto se le envía de a un byte completo (que ya le indica si prender la bomba y si activa el LED).

Saludos,
Gustavo
En respuesta a Gustavo Brown

Re: PRÁCTICO 7, EJERCICIO 2

de Santiago Roberto Cancela Cardona -
Yo no entiendo bien el funcionamiento del sensor. Como es externo no lo tiene porque manipular los procedimientos o como funciona?
De igual forma comparto lo que hice y agradezco comentarios ya que no estoy seguro si está bien:
void activarBomba(){
char act = BOMBA | 0x15; // prende el bit 0 del sensor, 2 del encendido y 4 del led
OUT(BOMBA, act);
}
En respuesta a Santiago Roberto Cancela Cardona

Re: PRÁCTICO 7, EJERCICIO 2

de Gustavo Brown -
Santiago,
El sensor te da información sobre el estado real de la bomba.
La idea es que lo uses en los procedimientos activarBomba y desactivarBomba para determinar cuando efectivamente se ha activado/desactivado la bomba para luego prender/apagar el LED si corresponde. La letra dice que la activación/desactivación de la bomba no es inmediata.
La bomba se manda a activar poniendo un 1 en el bit 2 (no el 0) del puerto BOMBA y se manda desactivar poniendo un 0 en dicho bit.

Entonces por ejemplo el procedimiento de activar bomba podría ser así:

void activarBomba()
{
  OUT(BOMBA, IN(BOMBA) | 0x4);  // prende el bit 2 de puerto BOMBA y deja los demás como estaban
  while(IN(SENSOR) & 1 == 0)  { }  // espero a que el sensor detecte que la bomba está prendida
  OUT(BOMBA, IN(BOMBA) | 0x14); 
}

Puede haber alguna variación sobre este código dependiendo de cómo entiendas la frase " Cuando la bomba se activa se debe activar un LED conectado al bit 4 del puerto BOMBA, en otro caso se debe desactivar el LED.". O sea, podrías complicar un poco el código leyendo previamente el valor de SENSOR para ver si la bomba ya estaba activada. Y también podrías entender que si la bomba ya está activa entonces no es necesario mandarla a activar nuevamente.

Algo tipo:
void activarBomba()
{
if(IN(SENSOR) & 1 == 0)
{ // la bomba estaba desactivada
OUT(BOMBA, (IN(BOMBA) | 0x4) &~0x10); // prende el bit 2 y apaga bit 4
while(IN(SENSOR) & 1 == 0) { } // espero a que el sensor detecte que la bomba está prendida
}
OUT(BOMBA, IN(BOMBA) | 0x14);
}
Saludos,
  Gustavo