Tabla de contenido:

Microcontrolador AVR. Cambie los LED con un interruptor de botón. Desactivación del botón pulsador: 4 pasos
Microcontrolador AVR. Cambie los LED con un interruptor de botón. Desactivación del botón pulsador: 4 pasos

Video: Microcontrolador AVR. Cambie los LED con un interruptor de botón. Desactivación del botón pulsador: 4 pasos

Video: Microcontrolador AVR. Cambie los LED con un interruptor de botón. Desactivación del botón pulsador: 4 pasos
Video: CLASE 1 - ENCENDIDO Y APAGADO DE UN LED CON UN PULSADOR / BOTON - TINKERCAD | ARDUINO 2024, Mes de julio
Anonim
Image
Image

En esta sección, aprenderemos cómo hacer que el código C del programa para ATMega328PU cambie el estado de los tres LED de acuerdo con la entrada de un interruptor de botón. Además, hemos explorado una solución al problema de "Switch Bounce". Como es habitual, montaremos el circuito eléctrico en la base del AVR ATmega328 para comprobar el funcionamiento del código del programa.

Paso 1: escribir y construir la aplicación del microcontrolador AVR en código C usando la plataforma de desarrollo integrada Atmel Studio 7

Escritura y creación de una aplicación de microcontrolador AVR en código C utilizando la plataforma de desarrollo integrada Atmel Studio 7
Escritura y creación de una aplicación de microcontrolador AVR en código C utilizando la plataforma de desarrollo integrada Atmel Studio 7
Escritura y creación de una aplicación de microcontrolador AVR en código C utilizando la plataforma de desarrollo integrada Atmel Studio 7
Escritura y creación de una aplicación de microcontrolador AVR en código C utilizando la plataforma de desarrollo integrada Atmel Studio 7
Escritura y creación de una aplicación de microcontrolador AVR en código C utilizando la plataforma de desarrollo integrada Atmel Studio 7
Escritura y creación de una aplicación de microcontrolador AVR en código C utilizando la plataforma de desarrollo integrada Atmel Studio 7

Si no tiene Atmel Studio, debe descargarlo e instalarlo.

www.microchip.com/mplab/avr-support/atmel-studio-7

Las primeras líneas tenemos algunas definiciones de compilador.

F_CPU define la frecuencia de reloj en hercios y es común en programas que usan la biblioteca avr-libc. En este caso, las rutinas de retardo lo utilizan para determinar cómo calcular los retardos de tiempo.

#ifndef F_CPU

#define F_CPU 16000000UL // indicando la frecuencia del cristal del controlador (16 MHz AVR ATMega328P) #endif

#include // encabezado para permitir el control del flujo de datos sobre los pines. Define pines, puertos, etc.

El primer archivo de inclusión es parte de avr-libc y se utilizará en prácticamente cualquier proyecto AVR en el que trabaje. io.h determinará la CPU que estás usando (por eso especificas la parte al compilar) y, a su vez, incluirá el encabezado de definición de E / S apropiado para el chip que estamos usando. Simplemente define las constantes para todos sus pines, puertos, registros especiales, etc.

#include // encabezado para habilitar la función de retardo en el programa

La biblioteca util / delay.h contiene algunas rutinas para retrasos breves. La función que usaremos es _delay_ms ().

Usamos define para declarar nuestro botón y los puertos y pines de los LED. El uso de declaraciones define como esta nos permite solo necesitar modificar 3 líneas fáciles de encontrar si movemos el LED a un pin de E / S diferente o usamos un AVR diferente.

#define BUTTON1 1 // interruptor de botón conectado al puerto B pin 1

#define LED1 0 // Led1 conectado al puerto B pin 0 #define LED2 1 // Led2 conectado al puerto C pin 1 #define LED3 2 // Led3 conectado al puerto D pin 2

Las dos últimas declaraciones definen los tiempos de configuración, en milisegundos, para eliminar el rebote del interruptor y el tiempo de espera antes de permitir otra pulsación del botón. El tiempo de supresión de rebotes debe ajustarse al tiempo que tarda el interruptor en pasar de un nivel digital alto a un nivel bajo digital después de todo el rebote. El comportamiento de rebote será diferente de un interruptor a otro, pero entre 20 y 30 milisegundos suele ser suficiente.

#define DEBOUNCE_TIME 25 // tiempo de espera mientras el botón "elimina el rebote"

#define LOCK_INPUT_TIME 300 // tiempo de espera después de presionar un botón

vacío init_ports_mcu ()

{

Esta función se llama solo una vez al comienzo de nuestro programa para inicializar los pines de entrada y salida que usaremos.

Para el botón, usaremos los registros PORT y PIN para escritura y lectura. Con los AVR, leemos un pin usando su registro PINx y escribimos en un pin usando su registro PORTx. Necesitamos escribir en el registro de botones para habilitar los pull-ups.

Para el LED solo necesitamos usar el registro PORT para escribir, sin embargo, también necesitamos el registro de dirección de datos (DDR) ya que los pines de E / S están configurados como entradas por defecto.

Primero, estamos configurando los pines de E / S del LED como una salida usando su registro de dirección de datos.

DDRB = 0xFFu; // Establecer todos los pines del PORTB como salida.

A continuación, establezca explícitamente el pin del botón como entrada.

DDRB y = ~ (1 <

A continuación, los pines PORTB se establecen en alto (+5 voltios) para encenderlo. Los pines de salida son inicialmente altos, y dado que nuestro LED está cableado activo-alto, se encenderá a menos que lo apaguemos explícitamente.

Y finalmente, habilitamos la resistencia pull-up interna en el pin de entrada que estamos usando para nuestro botón. Esto se hace simplemente enviando uno al puerto. Cuando se configura como una entrada, hacerlo da como resultado la habilitación de pull-ups y cuando se configura como una salida, hacerlo simplemente generaría un alto voltaje.

PORTB = 0xFF; // Establecer todos los pines del PORTB como ALTO. El led está encendido

// también se habilita la resistencia Pull Up interna del primer pin PORTB. DDRC = 0xFFu; // Establecer todos los pines del PORTC como salida. PORTC = 0x00u; // Establece todos los pines de PORTC bajo, lo que lo apaga. DDRD = 0xFFu; // Establecer todos los pines del PORTD como salida. PORTD = 0x00u; // Establece todos los pines de PORTD bajo, lo que lo apaga. }

char sin firmar button_state ()

{

Esta función devuelve un valor booleano que indica si se presionó el botón o no. Este es el bloque de código que se ejecuta continuamente en el bucle infinito y, por lo tanto, se consulta el estado del botón. Aquí es también donde eliminamos el rebote del interruptor.

Ahora, recuerde que cuando presionamos el interruptor, el pin de salida de entrada se tira a tierra. Por lo tanto, estamos esperando que el pin baje.

/ * el botón se presiona cuando el bit BUTTON1 está borrado * /

si (! (PINB & (1 <

Lo hacemos comprobando si el bit está claro. Si el bit está limpio, lo que indica que el botón está presionado, primero demoramos la cantidad de tiempo definida por DEBOUNCE_TIME que es 25ms y luego verificamos el estado del botón nuevamente. Si se presiona el botón después de los 25ms, se considera que el interruptor está sin rebotes y listo para disparar un evento, por lo que regresamos 1 a nuestra rutina de llamada. Si el botón no está presionado, regresamos 0 a nuestra rutina de llamada.

_delay_ms (DEBOUNCE_TIME);

si (! (PINB & (1 <

int main (vacío)

{

Nuestra principal rutina. La función principal es única y se distingue de todas las demás funciones. Cada programa en C debe tener exactamente una función main (). main es donde el AVR comienza a ejecutar su código cuando se enciende por primera vez, por lo que es el punto de entrada del programa.

carácter sin firmar n_led = 1; // inicialmente el número de LED está encendido ahora

Llamada de la función para inicializar los pines de E / S que se están utilizando:

init_ports_mcu ();

bucle infinito donde se ejecuta nuestro programa:

mientras (1)

{

Cuando button_state devuelve uno que indica que el botón fue presionado y antirrebote, luego alternando el estado actual de los LED a su vez de acuerdo con el parámetro n_led.

if (button_state ()) // Si se presiona el botón, alternar el estado del LED y demorar 300ms (#define LOCK_INPUT_TIME)

{switch (n_led) {caso 1: PORTB ^ = (1 << LED1); PORTC ^ = (1 << LED2); rotura;

Estas declaraciones utilizan operadores C bit a bit. Esta vez está usando el operador OR exclusivo. Cuando XOR el PORT con el valor de bit del bit que desea alternar, ese bit se cambia sin afectar a los otros bits.

caso 2:

PORTC ^ = (1 << LED2); PORTD ^ = (1 << LED3); rotura; caso 3: PORTD ^ = (1 << LED3); PORTB ^ = (1 << LED1); n_led = 0; // restablecer la interrupción del número de LED; } n_led ++; // el siguiente LED se enciende _delay_ms (LOCK_INPUT_TIME); }} return (0); }

Así que ahora, cuando ejecute este programa, debería poder presionar el botón para que los LED estén cambiando. Debido a nuestro retraso definido por LOCK_INPUT_TIME, puede presionar y mantener presionado el botón que hará que los LED se apaguen y enciendan a una velocidad constante (poco más de cada 275 ms).

La programación está completa.

El siguiente paso es compilar el proyecto y programar el archivo hexadecimal en el microcontrolador utilizando el programa avrdude.

Puede descargar el archivo main.c con el programa en código c:

Paso 2: Transferencia del archivo HEX del programa a la memoria flash del chip

Transferencia del archivo HEX del programa a la memoria flash del chip
Transferencia del archivo HEX del programa a la memoria flash del chip
Transferencia del archivo HEX del programa a la memoria flash del chip
Transferencia del archivo HEX del programa a la memoria flash del chip

Descargue e instale AVRDUDE. La última versión disponible es 6.3: Descargue el archivo zip

Primero, copie el archivo hexadecimal del programa en el directorio AVRDUDE. En mi caso es ButtonAVR.hex

Luego, escriba en la ventana del indicador de DOS el comando: avrdude –c [nombre del programador] –p m328p –u –U flash: w: [nombre de su archivo hexadecimal].

En mi caso es: avrdude –c ISPProgv1 –p m328p –u –U flash: w: ButtonAVR.hex

Este comando escribe un archivo hexadecimal en la memoria del microcontrolador.

Vea el video con una descripción detallada de la grabación de la memoria flash del microcontrolador:

Grabación de memoria flash del microcontrolador …

¡OK! Ahora, el microcontrolador funciona de acuerdo con las instrucciones de nuestro programa. ¡Vamos a ver!

Paso 3: eliminación de rebotes del conmutador de hardware

Eliminación de rebotes del interruptor de hardware
Eliminación de rebotes del interruptor de hardware

Además de la eliminación de rebotes de interruptores de software, podemos usar la técnica de eliminación de rebotes de interruptores de hardware. La idea básica detrás de esta técnica es utilizar un condensador para filtrar los cambios rápidos en la señal del interruptor.

¿Qué valor de condensador se debe seleccionar? En última instancia, esto dependerá de qué tan mal se desempeñe el botón con respecto a este problema en particular. Algunos botones pueden mostrar un comportamiento de rebote tremendo, pero otros tendrán muy poco. Un valor de condensador bajo como 1.0 nanofaradios reaccionará muy rápidamente, con poco o ningún efecto en el rebote. Por el contrario, un valor de condensador más alto, como 220 nanofaradios (que todavía es bastante pequeño en términos de condensadores) proporcionará una transición lenta desde el voltaje inicial al final (5 voltios a 0 voltios). Sin embargo, la transición que se ve con una capacidad de 220 nanofaradios sigue siendo bastante rápida en un sentido del mundo real y, por lo tanto, se puede usar en botones de bajo rendimiento.

Paso 4: circuito eléctrico

Circuito eléctrico
Circuito eléctrico
Circuito eléctrico
Circuito eléctrico
Circuito eléctrico
Circuito eléctrico

Conecte los componentes de acuerdo con el diagrama esquemático.

Recomendado: