Una manera muy simple y fácil para proporcionar para la interacción humana con el microcontrolador es insertar un botón en el circuito. Comunicarse con equipos mediante dos principales dispositivos de entrada: el ratón y el teclado. Un teclado no es más que un montón de botones puso-hacia fuera para permitir que al usuario entrados caracteres (ASCII) al ordenador. Si te estás rascando la cabeza en la parte de ASCII, no te preocupes, sólo representa el código para cada carácter.
En este punto en nuestro recorrido, debe ya ha configurado su computadora con WINAVR (o AVR-GCC para Linux) y ser capaces de programar el microcontrolador. También debe tener un circuito con un LED conectado en el microcontrolador. También hiciste el parpadeo del LED en el tutorial anterior.
Agregar un botón o un interruptor en el circuito permite que el microcontrolador recibir la señal humana. Otras formas de entrada para microcontroladores incluyen (pero no están limitados a) un teclado o un ratón, botones, interruptores, toque audio (a través de los micrófonos), pantallas y digitalizadores. Por supuesto hay muchos otros dispositivos que pueden aportar a un microcontrolador, pero estos pueden no activarse por la acción humana voluntaria. Colocar estos dispositivos en la categoría "detección", como estos dispositivos típicamente sensación condiciones o eventos y reaccionar en consecuencia. Tales ejemplos incluyen sensores de inclinación (acelerómetros), detectando la energía infrarroja o control de temperatura.
Así que, aquí está el flaco en los botones y conmutadores mecánicos: son imperfectos! Las dos familias de mecánica y electrónica van juntos como los Montescos y Capuletos. Es decir, que no! Cuando se pulsa un botón, se puede esperar una respuesta limpia electrónicamente. Bueno, siento ser portador de malas noticias, pero la señal a menudo rebota un poco antes de que se instala a su nivel de tensión correcta. En esta imagen muestro este fenómeno. Si la tensión se fija en 5 voltios antes de que el botón es presionado y entonces va a cero voltios cuando se presiona el botón, habrá un efecto "rebote" de la tensión entre estos dos valores. Entonces ¿por qué no todos nuestros aparatos de cocina o nuestros coches exhiben este problema?
Como podrá ver en la imagen, he insertado un condensador entre las dos clavijas. Esto suavizará la señal. El efecto de este condensador puede verse en un osciloscopio, como se muestra en el video. Pero si no tienes un osciloscopio de los tuyos, entonces sólo deberás confiar en mí. Otra manera podríamos aliviar este problema es agregar un tiempo de retraso en el programa, justo después de que el microcontrolador detecta el primer evento de prensa botón. Sin embargo, añadir un componente discreto a un circuito para solucionar un problema electrónica es a menudo una mejor manera que agregar código a retrasar, ya que ese código introducirá otra fuente potencial de un error en el programa, también requerirá más tiempo de procesador para ejecutar. En adicional, este código también puede resultar en el desarrollo de otros problemas como continúa el resto del código a ejecutar.
Pero, ¿qué valores del condensador debemos seleccionar? En última instancia, dependerá de cómo mal el botón realiza con respecto a este problema en particular. Algunos botones pueden mostrar un comportamiento de rebote tremendo, sin embargo, otras tendrán muy poco. Un valor de condensador baja como 1.0nF (nanofarads) reacciona muy rápidamente, con poco o ningún efecto en el rebote. Por el contrario, un condensador de mayor valor como 220nF (que todavía es bastante pequeño en términos de condensadores) proporcionará una transición lenta desde el arranque a la tensión final (es decir de 5v a 0v). La transición considerada una capacidad de 220nF todavía es bastante rápida en el sentido de un mundo real sin embargo y así se puede utilizar en el bajo rendimiento de botones.
Usted puede haber notado por ahora que la placa ha cambiado algo, para darle el circuito un aspecto más limpio. Los cables anteriores eran demasiado largos, y el entorno de compilación comenzó a recibir desordenado como he añadido más componentes al circuito. Por lo tanto, un rediseño de la placa estaba en orden, por lo que espetó un segundo tablero al final de la primera. Pero usted puede preguntar--¿por qué hago esto si había suficientes lazos restantes en el otro extremo? Bueno, lo hice por la pulcritud, y también me ha gustado donde fue colocado el microcontrolador. Usted puede ser capaz de decir que he alineado con los números así que no necesito contar pasadores todo el tiempo, simplemente dejo la numeración de la placa me dicen que es cada pin en el MCU. También atados del todo de las barras de positivo (+) en ambas tarjetas y lo mismo a todos los carriles de negativo (-), así. Esto me permitirá tener VCC o GND cerca, en cualquier lugar en el protoboard.
Entonces, ¿cómo programa el microcontrolador ATmega32 (u otro MCU que puede aplicar a este experimento) para hacer uso del botón nuevo? Bueno es realmente muy sencillo! Sólo tenemos que añadir dos líneas de inicialización justo antes del bucle infinito y un bloque de una condición dentro del bucle. Las dos líneas de inicialización añadidas antes de que el bucle de incluir una declaración para establecer PINB1 para entrada asignando un "0" como esta:
DDRB &= ~(1 << PINB1);
También estableceremos pin B1 "alto", lo que significa que el pin va a leer 5 voltios hasta que se presiona el botón; momento en el que el perno leerá cero voltios. Para configurar el pin a una alta tensión de 5 voltios, añadimos esta línea de código:
PORTB |= 1 << PINB1;
Dentro del programa, debe ser una decisión: una decisión para ejecutar algún código cuando el botón es presionado, o ejecutar algún otro código si no se presiona el botón. Esta tarea en forma de una sentencia condicional se llama un "si lo" declaración. Hace exactamente lo que dice. Al igual que el equivalente en inglés... Si (la tecla), saltar hacia arriba y hacia abajo, más soporte sobre su cabeza. la acción "saltar arriba y abajo" sucederá mientras el botón esté presionado. Pero mientras no se presiona el botón, volverá a ocurrir otra acción "soporte en la cabeza". El if código de declaración:
if (bit_is_clear(PINB, 1))
especifica una prueba de una condición especificada dentro de los paréntesis. El nombre "bit_is_clear" representa una función que toma dos argumentos. En este caso el primer argumento es PINB, que describe el conjunto de pines que estamos especificando. El segundo argumento representa que pin que estamos comprobando, y en este caso estamos preocupados con el pin #1 en el conjunto.
¿Tal vez se pregunte qué tipo de cosas podemos poner en el bloque de código controlado por la condición "si"? Que todo depende de lo que usted quiere su programa (como el circuito) hacer. En este caso, como una manera de mostrar que este botón haga algo y funciona, tengo la LED parpadea lentamente (cada 100 ms), mientras que el botón no está pulsado y parpadea más rápido (cada 10ms) mientras presiona.
Aquí están los cambios realizados en el anterior programa parpadeo de LED:
#include < avr/io.h > < util/delay.h > del #include int Main {DDRB | = 1 << PINB0; DDRB & = ~ (1 << PINB1); PORTB | = 1 << PINB1; mientras que (1) {PORTB ^ = 1 << PINB0; #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); //Fast} else { _delay_ms(100); //Slow, from previous } }}
Eso es todo! Hay muy poca programación necesaria para utilizar un botón, parpadean LED y hace las cosas!