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 ratn, interruptores, audio a travs de micrfono- , 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 categora de sensores, esos dispositivos tpicamente convierten alguna
variable fsica en una variable elctrica. Algunos ejemplos son los acelermetros, los
detectores de energa infrarroja o monitores de temperatura.

Los interruptores mecnicos 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; //inicializacin/declaracin de la variable Pressed

while (1)
{
if (bit_is_clear(PINB, 1)) //verifica si el botn es presionado
{
//asegura que el botn 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 continuacin se presenta una solucin 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 continuacin 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;
}
}