Arduino interrumpe para la entrada del botón

3

Tengo 6 botones en mi tablero impreso, y me gustaría usar interrupciones en todos ellos, pero no corresponden a las interrupciones enumeradas en las especificaciones.

¿Es cierto que no puede elegir pines arbitrarios para usar como interrupciones en las placas Arduino (específicamente la Mega 2560)? Si no, estoy un poco triste, ¿hay soluciones pragmáticas?

    
pregunta aaaidan

4 respuestas

4

Puedes hacer lo que Majenko sugirió, pero todo lo que necesitas es un diodo por botón para hacer la línea ORed. Supongo que los botones normalmente están abiertos y atados entre el suelo y una resistencia de pullup. La línea ORed es adicional a las líneas de botones individuales, que aún deben conectarse a los pines del procesador. Sin embargo, la ventaja es que la línea ORed bajará cuando se presione cualquiera de los botones. Esto se puede usar para activar el procesador o causar una interrupción, que luego tiene que mirar las otras líneas para ver qué botones se presionan realmente.

Otra forma es no usar las interrupciones de los botones. Solo escanea las líneas de botones cada pocos ms. La regla general es que 50 ms o menos se sienten instantáneos para un usuario humano. En otras palabras, si presiona un botón y lo que haga se retrasa 50 ms, todavía se siente instantáneo para usted.

Si el objetivo es ahorrar energía, puede conducir activamente el lado alto de los pullups. Manténgalos bajos la mayor parte del tiempo para que no haya corriente incluso si se presiona un botón. Encienda los pullups durante unos 10 µs antes de muestrear los botones, luego apáguelos nuevamente. Esto se puede hacer en una rutina corta, el procesador se activa cada 10 ms, por ejemplo, cuando de otra manera no sucede nada. La potencia promedio será baja, ya que solo estará encendida durante unos 10s de µs cada unos 10s de ms.

    
respondido por el Olin Lathrop
3

Espero no llegar tarde con esa solución de "magia negra" :)

En primer lugar, para dejar las cosas en claro, lo que necesita es posible y no es difícil de lograr, todavía hay algunas buenas y malas noticias. La mala noticia es que su elección no puede ser completamente arbitraria y la buena noticia es que puede elegir entre 24 pines adicionales (los que están marcados con PCINTx en la hoja de datos, PCINT0 hasta el final PCINT23)

La mala noticia también es que, al principio, algunas de las siguientes cosas pueden parecer un poco confusas (el caso es que no está tan experimentado con los microcontroladores), pero una buena noticia es que tendrá una mejor visión de Con qué tratas una vez que terminas el trabajo :)

Algunos conceptos básicos con respecto a este asunto, que probablemente ya conozca o haya escuchado: PCINTx significa "Cambio de Pin Introbrupto" y si está habilitado, en un pin determinado, provocará una interrupción cada vez que cambie el estado en ese pin (de alto a bajo / de bajo a alto).

En segundo lugar, su enfoque debería tener un aspecto similar al siguiente:

  1. habilita la interrupción de cambio de pin en los 6 pines que necesitas
  2. habilitar interrupciones globales
  3. cuando se llama a una interrupción, verifique el estado de su entrada para determinar el cambio y guarde el estado del botón

Necesitará la hoja de datos, así que aquí hay un acceso directo: enlace :)

para el paso 1: consulte el registro PCICR en la página 115, este es el registro de control de interrupción de cambio de pin y también registra PCMSK2, PCMSK1, PCMSK0 para especificar exactamente qué pines están habilitados para esta función especial

para el paso 2: Estoy bastante seguro de que sabes cómo hacerlo ya que publicaste esta pregunta :) - si no es así, llama: sei ()

para el paso 3: Esta es la parte difícil. Tiene 3 vectores de interrupción (o puede llamarlos retrollamadas) uno para cada puerto (cada puerto tiene 8 pines). Si se configuran varios pines del puerto sam como activadores (desde los registros de máscara PCMSKx, en el paso 1) se llamará al mismo retorno de llamada, por lo tanto, asegúrese de verificar el registro PINx para ver exactamente cuál ha cambiado.

Eso es todo :) aunque algunas cosas más: esto también es aplicable para ArduinoUno (atMega328p). Esta es una característica muy útil: si considera el consumo de energía, puede mantener el controlador en reposo y realizar la activación por interrupción. He usado esta función para la entrada de lectura de un receptor RC y puede obtener tiempos realmente buenos (impulsado por interrupciones, por lo tanto, d'oh: P)

Aquí hay un enlace con GRAN INFORMACIÓN SOBRE este asunto, probablemente debería haber comenzado desde aquí: enlace

Yo, yo mismo, siempre prefiero una solución de software en lugar de una solución de hardware, por lo general es más flexible y, en la mayoría de los casos, los resultados proporcionados son más baratos y rápidos que los cambios de hardware (también menos confusos) :). Pero tenga en cuenta que todo lo que es hardware es MUCHO MÁS más rápido (por lo tanto, justifica los costos y el desorden y la falta de flexibilidad). Sin embargo, en este caso aquí mismo, realmente no creo que necesites ese tipo de velocidad, así que ve por SW :)

Espero no llegar tarde, pero en caso de que lo sea, espero que sea útil algún otro día :) Puede encontrar una buena implementación para lo que creo que necesita en el segundo enlace (el de avrfreaks )

Este es un enlace que recogí de otro hilo en stackexchange, resume bastante bien la idea enlace

Saludos, Dan

    
respondido por el Dan
2

Usted podría conectar todos sus botones a través de una compuerta OR (para activo-alto) o AND (para activo-bajo) a un pin de interrupción, así como a los pines normales habilitados para no interrupción, de modo que cuando cualquier botón esté presionado se dispara la interrupción.

Una vez que se haya activado esa interrupción, puede examinar las otras entradas para determinar qué botón fue el que causó la interrupción.

Podría (si está ejecutando active-low) usar algunos diodos para la puerta OR (wired-OR) - (gracias Olin).

Enestecaso,laseñalCUALQUIERAbajacuandosecierracualquierinterruptor,juntoconlalíneaINdeeseinterruptor,ypermanecebajahastaquetodoslosinterruptoresestánabiertos.Esimposiblesabersiuninterruptorestácerradocuandounoyaestácerrado.

Sideseavolverseaúnmáscomplejoymejoraraúnmáslausabilidaddelsistema,puedeimplementaruna"notificación de cambio" en todos los conmutadores. Básicamente, esto es lo que está dentro del AVR para activar la interrupción, pero no hay razón para que no pueda implementarlo afuera y use un pin de interrupción como un pin de notificación de cambio.

Esto tendría la gran ventaja de que activaría un pulso en el pin de interrupción, y por lo tanto la interrupción, cuando cualquiera de las entradas cambia de estado, ya sea de alta a baja o baja a alto - para que pueda saber cuándo se ha pulsado o cualquiera de los botones - y también manejaría combinaciones de botones - presione uno y obtendrá un pulso; presiona un segundo y obtienes otro pulso; suelta el primero y obtendrás un tercer pulso.

La notificación de cambio toma 2 flip-flops tipo D y una puerta XOR por entrada, y todos están vinculados con una puerta OR grande. También necesita algún tipo de señal de reloj: cuanto más lento es el reloj, más amplios son los pulsos. Sí, es voluminoso si lo hace con chips individuales, pero podría valer la pena por los beneficios adicionales que le brinda.

Para un circuito de ejemplo, puede consultar el diagrama del circuito de notificación de cambios de entrada del PIC: página 7 de este documento :

Puede ignorar la puerta AND, que es solo para permitir la habilitación / inhabilitación de la notificación de cambio por pin. Las líneas ----|> C provienen del reloj que mencioné anteriormente.

No sé sobre el Mega, pero en la UNO obtienes 2 pines de interrupción: los pines 2 y 3. Todos los demás requieren sondeo.

    
respondido por el Majenko
0

Sí, eso es cierto. Estas son interrupciones de hardware y, como tales, están atadas a pines específicos. En el Mega 2560 estos son los pines 2, 3, 18, 19, 20 y 21 como se indica en las especificaciones.

Si desea guardar los pines de interrupción o tiene más botones, puede ir con Majenko's o Olin's adivce. Esos requieren que reconfigure su circuito, y en ese caso, también puede hacer la reconfiguración más simple de todas: solo coloque los cables de sus botones en los pines correctos.

    
respondido por el GummiV

Lea otras preguntas en las etiquetas