sam3x8e gpio interrupt no funciona como se esperaba

0

Estoy trabajando en el procesador sam3x8e con atmel studio 6.2.

He configurado dos gpios para interrumpir en el flanco descendente de la siguiente manera:

pio_handler_set(PIOB, ID_PIOB, PIO_PB3, (PIO_IT_FALL_EDGE ), keyPressHandler);
NVIC_EnableIRQ((IRQn_Type) ID_PIOB);
pio_enable_interrupt(PIOB, PIO_PB3);

pio_handler_set(PIOB, ID_PIOB, PIO_PA4, (PIO_IT_FALL_EDGE ), keyPressHandler);
NVIC_EnableIRQ((IRQn_Type) ID_PIOB);
pio_enable_interrupt(PIOB, PIO_PA4);

un gpio pertenece a PIOA, es decir, PA4 y el otro pertenece a PIOB, es decir, PB3.

Si presiono la tecla conectada al pin PB3, obtengo el evento de presionar una sola tecla.

Si presiono la tecla conectada al pin PA4 obtengo varios eventos de pulsación de tecla.

He usado todos los canales TC. En la hoja de datos adjunta hay algo de multiplexación. Dependencia para PA4 y TCLK1.
¿Alguien puede decirme qué inicialización se debe hacer para la sección de PA4 y TC para que PA4 funcione como se espera? También he usado temporizadores como abajo:

Timer0_100msTickTimer.tc = TC0;
Timer0_100msTickTimer.channel = 0;
Timer0_100msTickTimer.irq = TC0_IRQn;

Timer1_KeyboardTimer.tc = TC0;
Timer1_KeyboardTimer.channel = 1;
Timer1_KeyboardTimer.irq = TC1_IRQn;

Timer2_DisplayTimer.tc = TC0;
Timer2_DisplayTimer.channel = 2;
Timer2_DisplayTimer.irq = TC2_IRQn;

Por favor, dime si puedes encontrar alguna configuración incorrecta.

Gracias y Saludos, Mj

    
pregunta Milan Joshi

1 respuesta

1

Me pregunto si tu código funciona en absoluto:

pio_handler_set(PIOB, ID_PIOB, PIO_PA4, (PIO_IT_FALL_EDGE ), keyPressHandler);
NVIC_EnableIRQ((IRQn_Type) ID_PIOB);
pio_enable_interrupt(PIOB, PIO_PA4);

Supongo que deberías reemplazar PIOB con PIOA ya que tu GPIO está ubicado en PortA. También ID_PIOB no suena bien. Si publica constantes, debe publicar sus valores, de lo contrario no podremos comentarlos. Dado que esto suena como algo del marco ASF, supongo que esta constante es realmente correcta (o si ID_PIOA quizás sea mejor), pero no puedo asegurarlo.

Sin embargo, esto no explica por qué su código se dispara varias veces. Prefiero pensar que esto es en realidad un problema relacionado con el hardware que se llama rebote. Tendrá que rebotar sus llaves para obtener una solución sólida. Para obtener una descripción general de los algoritmos de eliminación de clave, puede consultar esto fuera.

¿Tiene la oportunidad de ver si esto es realmente un problema físico (rebote) o un problema de software? Es posible que desee supervisar el estado de la entrada utilizando un alcance para obtener una respuesta confiable para esto.

    
respondido por el Tom L.

Lea otras preguntas en las etiquetas