Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Push Botton PDF
Push Botton PDF
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);
}
}
}