Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Los interruptores mecánicos son imperfectos ya que producen rebotes, estas variaciones
entre voltaje alto (cinco volts) y voltaje bajo (tierra) antes de estabilizarse en un valor.
Se ha introducido un capacitor entre las terminales del interruptor, el valor de este capacitor varia de 1 nf.
a 220 nf.
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRB |= 1 << PINB0;
DDRB &= ~(1 << PINB1);
PORTB |= 1 << PINB1;
while (1)
{
PORTB ^= 1 << PINB0;
if (bit_is_clear(PINB, 1))
{
_delay_ms(10); //rapido
}
else
{
_delay_ms(100); //lento respect al previo
}
}
}
Ahora un segundo circuito y programa para mostrar el efecto del
rebote y su amortiguamiento con el capacitor.
#include <avr/io.h>
int main(void)
{
DDRB |= 1 << PINB0; //salida en PINB0
PORTB ^= 1 << PINB0; //solo conmuta Pin 0 en el puerto b
DDRB |= 1 << PINB2; //salida en PINB2
DDRB &= ~(1 << PINB1); //entrada en PINB1
PORTB |= 1 << PINB1; //se pone a uno PINB1 para una lectura de alto
int Pressed = 0; //inicialización/declaración de la variable Pressed
while (1)
{
if (bit_is_clear(PINB, 1)) //verifica si el botón es presionado
{
//asegura que el botón ha sido liberado
if (Pressed == 0)
{
PORTB ^= 1 << PINB0; //conmuta LED en pin 0
PORTB ^= 1 << PINB2; // conmuta LED en pin 2
Pressed = 1;
}
}
else
{
//este codigo se ejecuta cuando el boton no es presionado.
Pressed = 0;
}
}
int main(void)
{
DDRB |= 1 << PINB0; //salida
PORTB ^= 1 << PINB0;
DDRB |= 1 << PINB2;
DDRB &= ~(1 << PINB1);
PORTB |= 1 << PINB1;
int Pressed = 0;
int Pressed_Confidence_Level = 0; //Medicion sobre la confianza en la presion de un
//boton
int Released_Confidence_Level = 0; // Medicion sobre la confianza en la liberacion de
//un boton
while (1)
{
if (bit_is_clear(PINB, 1))
{
Pressed_Confidence_Level ++; //Incrementa la confianza en presion
Released_Confidence_Level = 0; //Reset released button confidence since there is a
button press
if (Pressed_Confidence_Level >500) //Indicator Buena presion del boton
{
if (Pressed == 0)
{
PORTB ^= 1 << PINB0;
PORTB ^= 1 << PINB2;
Pressed = 1;
}
//cero es una condcion que puede ser evaluada
Pressed_Confidence_Level = 0;
}
}
else
{
Released_Confidence_Level ++; // Incrementa la confianza en presion
Pressed_Confidence_Level = 0; //resetea el valor de confianza
(Released_Confidence_Level >500
{
Pressed = 0;
Released_Confidence_Level = 0;
}
}
}
A continuación un juego
#include <avr/io.h>
#include <util/delay.h>
while (1)
{
if (bit_is_clear(PINB, 7))
{
ProcessPressedButton(0);
}
else
{
ProcessReleasedButton(0);
}
if (bit_is_clear(PIND, 7))
{
ProcessPressedButton(1);
}
else
{
ProcessReleasedButton(1);
}
}
}