Está en la página 1de 5

Agregar un push button o interruptor al circuito permite que el microcontrolador reciba

instrucciones humanas. Otras formas de entrada al microcontrolador incluyen –pero no


limitan- un teclado, un ratón, interruptores, audio – a través de micrófono- , displays sensible
al tacto o digitalizadores. Desde luego existen muchos otros elementos o formas de entrada
al microcontrolador, pero estas no son activadas por la voluntad del humano. Estas
entradas caen en la categoría de sensores, esos dispositivos típicamente convierten alguna
variable física en una variable eléctrica. Algunos ejemplos son los acelerómetros, los
detectores de energía infrarroja o monitores de temperatura.

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.

El programa para este circuito es:

#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;
}
}

A continuación se presenta una solución en software pare evitar los rebotes

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>

void ProcessPressedButton(int ButtonPressed);


void ProcessReleasedButton(int ButtonReleased);
int Pressed_Confidence_Level[2];
int Released_Confidence_Level[2];
int Pressed[2];
int LEDNumber[2];
int main(void)
{
DDRB = 0b01111111;
DDRD = 0b01111111;
PORTB = 0b10000000;
PORTD = 0b10000000;

while (1)
{
if (bit_is_clear(PINB, 7))
{
ProcessPressedButton(0);
}
else
{
ProcessReleasedButton(0);
}
if (bit_is_clear(PIND, 7))
{
ProcessPressedButton(1);
}
else
{
ProcessReleasedButton(1);
}
}
}

void ProcessPressedButton(int ButtonPressed)


{
Pressed_Confidence_Level[ButtonPressed] ++;
if (Pressed_Confidence_Level[ButtonPressed] > 500)
{
if (Pressed[ButtonPressed] == 0)
{
Pressed[ButtonPressed] = 1;
if (ButtonPressed == 0) PORTB |= 1 << LEDNumber[ButtonPressed];
if (ButtonPressed == 1) PORTD |= 1 << LEDNumber[ButtonPressed];
LEDNumber[ButtonPressed] ++;
if (LEDNumber[ButtonPressed] >6)
{
for(int i=0;i < 10;i++)
{
if (ButtonPressed == 0) PORTB = 0b11111111;
if (ButtonPressed == 1) PORTD = 0b11111111;
_delay_ms(10);
if (ButtonPressed == 0) PORTB = 0b10000000;
if (ButtonPressed == 1) PORTD = 0b10000000;
_delay_ms(10);
}
LEDNumber[0] = 0;
LEDNumber[1] = 0;
PORTB = 0b10000000;
PORTD = 0b10000000;
}
}
Pressed_Confidence_Level[ButtonPressed] = 0;
}
}

void ProcessReleasedButton(int ButtonReleased)


{
Released_Confidence_Level[ButtonReleased] ++;
if (Released_Confidence_Level[ButtonReleased] > 500)
{
Pressed[ButtonReleased] = 0;
Released_Confidence_Level[ButtonReleased] = 0;
}
}

También podría gustarte