Practico 9 Ejercicio 6, duda sobre uso de variable global

Practico 9 Ejercicio 6, duda sobre uso de variable global

de Diego Eduardo Pisa Sanchez -
Número de respuestas: 3

.

Buenas, mi consulta seria si el uso de la variable global es correcta en este caso, donde la interrupcion boton() solo modifica esa variable, y asi cada vez que se toca el boton se marca encendida = 1, y en la logica del programa en el main, si esta apagada y encendida = 1 ahi se cambia el bit correspondiente de la direccionn 0x20. O si deberia cambiar dicho bit dentro de la rutina de interrupcion??

Otra duda que capaz no queda claro en la letra, cada vez que se toca el boton se reinicia la cuenta de los 45 segundos?


Desde ya muchas gracias

En respuesta a Diego Eduardo Pisa Sanchez

Re: Practico 9 Ejercicio 6, duda sobre uso de variable global

de Federico Rivero -
Hola Diego!

En general los ejercicios de interrupciones se pueden resolver con la lógica en las interrupciones, en el main, o una combinación de ambos. En ese sentido, la variable se podría usar como la escribiste ahí.

Ahora, ese código tiene algún que otro problema y está relacionado con cómo actualizás las banderas. Por ejemplo, si están las luces prendidas (estado ENCENDIDAS) y alguien presiona el botón, la variable encendida pasa a valer 1 y luego no se vuelve a setear en 0. El programa va a quedar ejecutando tics = 0 en cada iteración porque la variable encendida sigue valiendo 1. El código tendría que ser:

if (encendida){
tics = 0;
encendida = 0;
}

Este es un patrón bastante común cuando tenés la lógica en el main. Si lo que querés es que las interrupciones disparen la ejecución de cierto código una única vez, ese código debe apagar la bandera luego de ejecutar.

De forma similar, si estás en el estado APAGADAS y se presiona el botón, también deberías poner tics = 0 dentro del if (encendida) { }, ya que tics podría tener un valor grande (en particular mayor a 45), lo cual va a causar que al pasar al estado ENCENDIDAS, inmediatamente se ingrese a la condición if (tics > 45) y se vuelva al estado APAGADAS.

Por favor revisá esos dos puntos y avisame si algo no se entiende.

Saludos,
Federico
En respuesta a Federico Rivero

Re: Practico 9 Ejercicio 6, duda sobre uso de variable global

de Esteban Normey Rieta -
Buenas,
Quería saber si es válido lo que hice al plantear la solución usando lógica solo en las interrupciones.
O sea, a la rutina "botón" le encargué reiniciar el tiempo acumulado y encender las luces.
Y a la rutina "tiempo" le encargué acumular el tiempo (si están encendidas las luces) y, si el tiempo acumulado es igual a 45, también se encarga de apagar las luces. (tengo habilitadas las interrupciones en esta rutina para que podamos reiniciar con el botón)
Puedo hacerlo así? O tengo que pensar que la rutina "tiempo" se debería poder usar para otras cosas, por lo que no puedo encargarle el control de las luces...
En respuesta a Esteban Normey Rieta

Re: Practico 9 Ejercicio 6, duda sobre uso de variable global

de Gustavo Brown -

Este problema se puede resolver poniendo la lógica que lo resuelve en las interrupciones y en el main simplemente inicializando y dejando un bucle infinito que no hace nada.

Lo que no deberias habilitar las interrupciones en la interrupción. Si te entendi bien cada rutina ejecuta rápidamente y retorna el control por lo cual no hay que habilitarlas.

La rutina tiempo está dedicada a la lógica que tu quieras poner.

Saludos,
  Gustavo