Interrupciones en AVR

1

Estoy usando un atmega328 en AVR. No he hecho ninguna codificación todavía, pero estoy planeando. Cómo lo haré en mi cabeza. Así que quiero poder despertar el ATmega328 presionando un botón y ponerme en reposo después de presionar el mismo botón. ¿Cómo voy a hacer eso?

En mi cabeza, es similar a esto .

Pondré el código de reposo en la función principal, y también un bucle while en la función ISR. Cuando detecta una pulsación de botón, saldrá del bucle while y volverá al modo de reposo.

¿Funcionará esto? ¿Cómo se presiona un botón de control de ATmega mientras está en la función de rutina de servicio de interrupción? O, ¿cómo se distingue entre presionar un botón para interrumpir el sueño y presionar un botón para ir a dormir?

    
pregunta Shang Lin Chua

1 respuesta

1

Las interrupciones y las pulsaciones de los botones no se mezclan en absoluto. Los botones tienen un fenómeno que sabe un rebote. Justo antes de que los contactos se cierran, "rebotan" haciendo y rompiendo el contacto. Si, por ejemplo, utiliza un interruptor de cambio de pin con un botón, puede entrar y salir del modo de suspensión un montón de veces antes de que el botón se estabilice. Los botones deben ser objeto de rebote, una técnica que garantiza que el estado del botón sea estable antes de leerlo.

La mejor manera de deshacer un botón es leer el estado del botón en intervalos regulares, por ejemplo, 1 ms. Si el estado del botón permanece constante durante al menos 50 ms, el botón puede considerarse estable.

La forma en que normalmente escribo tal rutina es verificando el botón cada 1 ms. Si un evento de rebote no está en progreso y el estado actual del botón no coincide con el estado anterior del botón, inicie un evento de rebote. Continúe marcando el botón cada 1 ms, pero aumente el contador cada vez que se produzca la lectura de un botón. Normalmente comenzaré a los 50. Si el botón está en niveles bajos, disminuiré y si el botón está alto, aumentaré. Si llegas a 100, entonces el botón es alto y si llegas a 0, el botón es bajo. Restablece la variable de inicio a 50 y establece el evento de rebote en falso.

En su caso, usaría la interrupción de cambio de pin para activar el micro, pero luego impongo un rebote obligatorio. Si pasa el rebote, quédate despierto. Si se produce un error en el proceso, significa que no se presionó un botón y luego se vuelve a dormir.

    
respondido por el vini_i

Lea otras preguntas en las etiquetas