Quizás sea un asunto simple, pero causa algunos problemas.
¿Tiene formas efectivas y sencillas de cambiar las eliminaciones por rebote? Estoy realizando un experimento y conecté el microinterruptor a una E / S digital en el AVR y el LED para las pruebas, y estoy luchando con ello. Necesito un método que funcione en segundo plano (no demora ()) y no muy sofisticado. Solo una manera simple.
Hasta ahora he intentado esas formas:
1.
#include <avr/io.h>
#define LED (1<<PB5)
#define BUTTON (1<<PD0)
uint8_t key_lock = 0;
int main()
{
DDRB |= (1<<LED);
DDRD &= ~(1<<BUTTON);
PORTD |= (1<<BUTTON);
while(1)
{
if (!key_lock && !(PIND & BUTTON))
{
key_lock = 1;
PORTB ^= LED;
}
else if (key_lock && (PIND && BUTTON))
{
key_lock++;
}
}
}
2.
#include <avr/io.h>
#include <avr/interrupt.h>
#define LED (1<<PB5)
#define BUTTON (1<<PD0)
volatile bool state_but = false;
int main()
{
DDRB |= (1<<LED);
DDRD &= ~(1<<BUTTON);
PORTD |= (1<<BUTTON);
// Timera0 overflow
//F_CPU = 16MHz. time interrupt 16 ms
TCCR0B |= (1<<CS02) | (1<<CS00);
TIMSK0 |= (1<<TOIE0);
sei();
while(1)
{
if (state_but == 1)
PORTB ^= LED;
}
}
ISR (TIMER0_OVF_vect)
{
static uint8_t state_last = 0, state_new;
//1- ON, 0 - OFF
state_new = (~PIND & BUTTON);
if (state_last == state_new)
state_but = state_new;
state_last = state_new;
}
3.
#include <avr/io.h>
#include <avr/interrupt.h>
#define LED (1<<PB5)
#define BUTTON (1<<PD0)
volatile uint8_t counter;
int main()
{
DDRB |= (1<<LED);
DDRD &= ~(1<<BUTTON);
PORTD |= (1<<BUTTON);
// Timera0 overflow
//F_CPU = 16MHz. time interrupt 16ms
TCCR0B |= (1<<CS02) | (1<<CS00);
TIMSK0 |= (1<<TOIE0);
sei();
while(1)
{
if (counter == 2)
PORTB ^= LED;
}
}
ISR (TIMER0_OVF_vect)
{
if (!(PIND & BUTTON))
{
counter++;
}
else
{
counter = 0;
}
if (counter > 2) counter = 0;
}
Y ninguno de esos funciona tan bien. A veces, cuando presiono el botón aparece estados aleatorios y el LED parpadea sin control.
Necesito agregar que estoy usando ATmega 2560 (Arduino MEGA) pero programando solo en C, como puedes ver.
¿Alguna idea?