Problema con "attachInterrupt()"

Buenas a todos.

Este es mi primer mensaje en el foro, y me gustaría agradecer a todos el trabajo que hace la comunidad Arduino.

Os comento, estoy implementando un proyecto personal donde tengo un LCD 16x2 conectado por I2C. Me gustaría que el apagado/encendido de la retroiluminacion se realizara mediante una interrupción externa, para que el usuario en cualquier momento pueda hacerlo. La interrupción se hará con un botón conectado al pin 3.

El caso, el vector de interrupción funciona, porque lo he probado con un led y con mensajes del Serial, pero cuando intento apagar la pantalla con lcd.noBacklight(), no funciona. Es que ni entra en la interrupción.

¿se os ocurre por qué?

gracias!

¿podrias poner el codigo ?

Hola gracias por contestar.

El código es muy largo como para ponerlo entero. Creo que la duda es muy concreta, si hiciera falta lo pongo pero es un tocho XD.

Sé que en la función de interrupcion no hay que poner parámetros ni debe devolver nada, así es, pero trabaja con el objeto lcd.noBacklight(), que es lo que da problema. Debe haber alguna forma de hacerlo.

Difícil saberlo sin conocer un poco más el código, pero tiro un par de ideas a ver si suena la flauta.
¿Has probado a encender un led en la interrupción antes del comando lcd.noBackLight ? Lo digo porque me extraña que no entre en la interrupción. Más bien creo que el problema es que no sale bien parado de ella. Ten en cuenta que las interrupciones son procesos críticos y que deberían retornar al flujo normal del programa con cierta rapidez. Una de las cosas que suele hacerse al atender una interrupción es inhabilitar las interrupciones, con lo las demás quedan dedesatendidas mientras tanto. Probablemente el propio método lcd.noBackLight necesite de las interrupciones para completarse, con lo que ya la tendríamos liada.

Noter, gracias por tu comentario.

Sí, probé lo que comentas, por eso digo que "ni entra" en la interrupción (entre comillas, imagino que no entra porque el led ni se inmuta).

He probado también con bucles y otras sentencias, pero las ejecuta bien, el problema es con llamadas a cualquier método del objeto lcd.

si cuando tienes que modificar variables definidas fuera de la funcion que ejecuta la interrupcion se deben declarar como volatile,alomejor no es posible acceder a un objeto (que al fin y al cabo es parecido a una variable) desde la funcion (y desconozco si se puede añadir el modificador volatile a un objeto que me da que no...) pero por probar....

Creo que en lugar de llamar desde la interrupción a la librería deberías simplemente modificar una variable (global y volatile) y que desde el flujo normal del programa se realice el apagado cuando detecte que se ha modificado dicha variable. Quizás el apagado sea menos instantáneo, pero al menos no tienes que estar leyendo el pin constantemente para detectar pulsación.

Prueba por separado.

Primero con la interrupcion, juega con ella, comprueba que enciendo o apaga un led, solo eso...

Luego prueba con la orden de apagar el display sola, con un simple interruptor o un delay mismo para comprobar que funciona el apagado (puedes emplear el ejemplo de blink y cambiar la orden de encender el led por la de encender el backligth y viceversa)

Cuando tengas funcionando suelto todo unelo y sustituyendo pero asi te aseguras que funciona la orden de apagado del display y que funciona tu funcion de interrupcion.

Ah, no uses delay dentro de una interrupcion y no pongas una funcion muy larga para la interrupcion, debe ser algo muy basico.

Compañeros tengo el siguiente problema, estoy en entrando en el uso de las interrupciones asi que me decidi probar primero encendiendo y pagando un led, luego de esto me doy cuenta que la funcion delay no funciona dentro de las interrupciones, asi que probe solo encendiendo el led pero sin apagarlo.

El asunto es que entra en la interrupcion sin que el evento suceda, como evento para activar la interrupcion tengo una señal en HIGH provenienientte de una salida digital de otro arduino. Para activar esta salida, leo la variacion en la entrada analogica 0 proveniente de un POT, este valor lo mapeo de 0 - 1023 a 10 - 40 y mediante un if (para determinar la variacion del valor) envio por serial el valor del POT y activo la salida digital para la interrupcion.

Por otro lado por mas que he cambiado el modo de la interrupcion esta sigue ejecutandose sin tener encuenta el cumplimiento del evento o condicion de interrupcion. pinMode (electroValvula, OUTPUT);
pinMode(7, OUTPUT);
//detachInterrupt(0);
attachInterrupt(0, fu, HIGH); ESTO ES LO QUE TENGO EN EL VOID SETUP
//volatile int estado=LOW;
}

y mi funcon
void fu ()
{
digitalWrite(7, HIGH);

}

gracias

Saludos
Primero que todo lee las normas del foro.
Segundo no actives post viejos. Cuando vas a escribir te sale un mensaje en rojo que te indica que el post tiene mas de 120 dias si ser actualizado.

Tercero usa los tags.
Cuarto si declaras una variable en setup el tiempo de vida de la variable es
hasta el final del setup. Tienes que declararla fuera de las funciones para que sea global.

Por ultimo si colocas la interrupcion en estado HIGH siempre que este en HIGH se activara, por lo que tendrias que colocar una resistencia pulldown. Te recomiendo coloques la condicion FALLING y coloques una resistencia PULLUP y en vez de enviar un HIGH desde el otro arduino envia un LOW. Y solo por una fraccion desegundo.