Estoy intentando sondear 3 botones diferentes de una interrupción de temporizador de vigilancia, en un ATtiny13.
Mi código funciona perfectamente para botones individuales, sin embargo, parece que no puedo sondear los 3 en un bucle. Todos los botones están asociados a un número arbitrario para identificación en 0x01,0x02 y 0x04.
Por ejemplo, este código sondea el botón 0x02 y funciona bien:
ISR (WDT_vect){
if (debounce(0x02)==1){
PORTB ^= _BV(PB1);//flip led 1
}}
Sin embargo, si intento sondear los 3 en un bucle, no se produce ninguna detección. En este ejemplo, simplemente alterno el mismo led para los 3 botones:
ISR (WDT_vect){
for (int d=0x01;d<0x04;d<<1){
if (debounce(d)==1){
PORTB ^= _BV(PB1);//flip led 1
}}}
Apilado si-si no funciona tampoco:
ISR (WDT_vect){
if (debounce(0x02)==1){
PORTB ^= _BV(PB1);//flip led 1
} else if (debounce(0x04)==1){
PORTB ^= _BV(PB3);//flip led 2
}
}
El resto del código relevante abreviado para mayor claridad:
/***
* curbtn: one of 0x01,0x02,0x04, matches mute, vol+,vol-
* returns 1 if the button is considered pressed
*/
uint8_t debounce(uint8_t curbtn){
static uint8_t button_history = 0;
uint8_t pressed = 0;
button_history = button_history << 1;
button_history |= read_btn(curbtn);
if ((button_history & 0b11000111) == 0b00000111) {
pressed = 1;
button_history = 0b11111111;
}
return pressed;
}
/**
* sets up ports to read a specific button
* returns 1 if the selected button is pressed
*/
uint8_t read_btn(uint8_t curbtn){
uint8_t ret=0x00;
if (curbtn==0x01){
DDRB &=~_BV(PB2);//PB2 en entree
PORTB |=_BV(PB2);//pull-up actif
ret= ( (PINB & _BV(PB2)) == 0 );
} else if (curbtn==0x02){
DDRB |=_BV(PB2);//PB2 en sortie
PORTB &=~_BV(PB2);//PB2 a 0
DDRB &=~_BV(PB0);//PB0 en entree
PORTB |=_BV(PB0);//pull up sur PB0
ret= ( (PINB & _BV(PB0)) == 0 );
} else if (curbtn==0x04){
DDRB |=_BV(PB0);//PB0 en sortie
PORTB &=~_BV(PB0);//PB0 a 0
DDRB &=~_BV(PB4);//PB4 en entree
PORTB |=_BV(PB4);//pull up sur PB4
ret= ((PINB & (1<<PB4)) == 0);//lecture de PB0
}
return ret;
}
Este es el diseño del circuito:
Me gustaría saber si voy en la dirección correcta y de qué manera debería corregirse mi código de sondeo.