Quiero hacer un circuito simple para que al presionar un botón, un LED se ilumine y permanezca encendido hasta que se vuelva a presionar el botón. Todavía no he profundizado en interrupciones en AVR, y me preguntaba si es posible hacerlo en un bucle while
.
Este es mi código:
#include <avr/io.h>
#define INPUT (1 << PINB3)
#define OUTPUT (1 << PINB0)
int main(void)
{
DDRB = 0x00; //everything input
PORTB = 0x00; //no pud
DDRB |= 0x1; //PB0 is an output
PORTB = 0x00; //PB0 is low and PUD is off
uint8_t prev = PINB;
while(1)
{
if ((prev & INPUT) < (PINB & INPUT)) { //rise edge
if ((PORTB & OUTPUT) == 0x0) { //if output was low
PORTB |= OUTPUT; //make output high
} else {
PORTB &= ~OUTPUT; //make output low
}
}
prev = PINB;
}
}
El interruptor solo funciona parcialmente, supongo que debido a la naturaleza del bucle while y que almacena la entrada anterior muy rápido.
Creo que el problema radica en mi método para detectar un flanco ascendente del botón pulsador. ¿Cuál sería un método mejor?