Una razón más para no usar las bibliotecas de Arduino, primero debes averiguar qué sucede en el fondo. Eso, junto con la capacidad de depuración limitada.
Aparentemente, la biblioteca de Arduino realiza la comunicación real en la llamada endTransmission. Lo hace utilizando el hardware TWI (incluso utilizando interrupciones) pero también utiliza un bucle infinito para esperar esa interrupción (concepto extraño, pero está bien ...).
Por lo tanto, parece que la comunicación I2C no funciona (se me vienen a la mente las flexiones en las líneas I2C) o que, mientras tanto, se deshabilitan las interrupciones, por lo tanto, cuando se produce la interrupción, qué señales finalizan su transmisión I2C. , lo has desactivado antes.
Entonces, ¿cómo podríamos evitar eso?
- Intente, si su comunicación I2C funciona con un nuevo programa predeterminado (no hay modos de suspensión, solo la configuración predeterminada de arduino).
- ¿Tienes alguna forma de ver si estás atrapado en un bucle infinito? Tal vez usted pueda alternar un LED rápidamente en su bucle principal y verificarlo con un alcance. Si ya no ve que el LED cambia, probablemente esté atrapado dentro del bucle I2C.
-
No sé qué tan bien su microprocesador maneja las interrupciones apiladas (cuando una interrupción ocurre durante otra), supongo que no lo hace en absoluto. De todos modos, los manejadores de interrupciones DEBEN mantenerse en todo momento muy cortos, hacer tareas que consumen mucho tiempo dentro de un manejador de interrupciones es casi siempre un No-Go. Así que construirá algún tipo de máquina de estado simple para manejar su ubicación "correctamente". Esta también podría ser una posible razón por la que su programa ingresa al Nirvana. Voy a describir cómo haces esto correctamente.
-
Su interrupción para despertarse ocurre cuando está en espera, esto está bien, ahora establezca una marca "global" para indicar que necesita hacer algo en su ciclo principal, llamémoslo "do_communication = true". Su interrupción no hace nada más que establecer esta bandera. NO lo envíe al modo de suspensión en este momento.
- En cada iteración de su bucle principal, verifique si este indicador específico está establecido. Si es así, realice su comunicación I2C aquí: ahora está fuera de cualquier interrupción. Una vez que haya realizado su comunicación, establezca esa marca en do_communication = false y envíe su microcontrolador a suspensión.
- Espere a que ocurra la próxima interrupción de activación, luego vuelva a realizar lo anterior
Por lo general, todo lo que hace su interrupción es establecer una bandera, manejar las tareas que consumen mucho tiempo en la pantalla principal cuando el principal "ve" que la bandera está establecida. Esto asegurará que no tengas problemas con las interrupciones apiladas.