Interrupción de suspensión AVR con teclado

0

Me gustaría activar mi AVR cada vez que se presiona cualquier botón del teclado. Estoy usando la biblioteca Keypad.h y un teclado 4x4 simple hecho de botones conectados directamente a los pines digitales AVR. El teclado en sí funciona perfectamente.

Una pregunta es: ¿Por qué hay extensiones conectadas a filas / cols en algunos esquemas? Cuando funciona sin ellos ...

Para activar el AVR, encontré que unir simplemente 4 columnas AND a las columnas de kepyad resolvería el problema. Antes de la suspensión, el AVR debe configurar todas las columnas en SALIDA (ALTA) y luego adjuntar la interrupción en la ENTRADA INT1 (pin 1) cuando esté BAJA. Por lo tanto, las entradas Y están ALTAS hasta que se presiona cualquier botón, luego se activa la salida Y BAJA, de modo que se activa la INT1. Pero luego vi la fuente de la biblioteca Keypad.h:

 void Keypad::scanKeys() {
 // Re-intialize the row pins. Allows sharing these pins with other hardware.
for (byte r=0; r<sizeKpd.rows; r++) {
    pin_mode(rowPins[r],INPUT_PULLUP);
}

// bitMap stores ALL the keys that are being pressed.
for (byte c=0; c<sizeKpd.columns; c++) {
    pin_mode(columnPins[c],OUTPUT);
    pin_write(columnPins[c], LOW);  // Begin column pulse output.
    for (byte r=0; r<sizeKpd.rows; r++) {
        bitWrite(bitMap[r], c, !pin_read(rowPins[r]));  // keypress is active low so invert to high.
    }
    // Set pin to high impedance input. Effectively ends column pulse.
    pin_write(columnPins[c],HIGH);
    pin_mode(columnPins[c],INPUT);
}}

No entiendo ¿por qué las columnas se configuran como ENTRADAS al final? ¿Podría ser omitido? Si es así, lo cambiaré a SALIDA y conectaré todas las columnas a las entradas 74HCT21 y adjuntaré la salida al pin INT1.

¿Se necesitan piezas adicionales para conectar el 74HCT21? ¿O se puede conectar directamente a la fuente de alimentación regulada de 3.3 V como esta?

Muchas gracias!

    
pregunta Herr Krum

2 respuestas

1

Cuando desee que su dispositivo entre en el modo de suspensión, puede cambiar todas las columnas a SALIDA y BAJA. Y habilitar la interrupción. Luego diodo-O todos ellos juntos y traiga esa salida para interrumpir el pin. Algo como esto:

simular este circuito : esquema creado usando CircuitLab

Cuando se presiona cualquiera de los botones, la salida de los diodos es BAJA (~ 0.6V).

El pin de la interrupción debe configurarse como entrada con un pull-up interno. En el ISR de esa interrupción, debe llevar todos los pines de la columna a la entrada de alta impedancia. Y deshabilite más interrupciones en este pin para fines de rebote.

    
respondido por el Golaž
0

¡Esta solución funcionó para mí! Gracias.

    
respondido por el Herr Krum

Lea otras preguntas en las etiquetas