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:
- habilita la interrupción de cambio de pin en los 6 pines que necesitas
- habilitar interrupciones globales
- 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