Quiero alternar un led con un botón y un ATMega16a, pero por alguna razón el comportamiento de alternar parece un poco aleatorio.
#include <avr/io.h>
#include <avr/interrupt.h>
/* if true we toggle PB0 */
volatile uint8_t toggle = 0;
/* contains last value of PD2 */
volatile uint8_t newval = 0;
volatile uint8_t oldval = 0;
int main(void) {
/* set PB0 as output and PD2 as input */
DDRB |= (1 << PB0);
DDRD &= ~(1 << PD2);
/* enable timer such that we can pool every 16ms */
TIMSK |= (1 << TOIE0);
TCCR0 |= (1 << CS00) | (1 << CS01);
sei();
for (;;) {
if (toggle) {
PORTB ^= (1 << PB0);
}
}
return 0;
}
ISR (TIMER0_OVF_vect) {
/* get new input value */
newval = PIND & (1 << PD2);
/* only handles button presses */
if (newval && !oldval) {
if (toggle) {
toggle = 0;
} else {
toggle = 1;
}
}
oldval = newval;
}
¿Hay algún problema con el código o es un problema de hardware?