Tabla de contenido:

Configuración de bits de fusibles del microcontrolador AVR. Creación y carga en la memoria flash del microcontrolador el programa de parpadeo de LED: 5 pasos
Configuración de bits de fusibles del microcontrolador AVR. Creación y carga en la memoria flash del microcontrolador el programa de parpadeo de LED: 5 pasos

Video: Configuración de bits de fusibles del microcontrolador AVR. Creación y carga en la memoria flash del microcontrolador el programa de parpadeo de LED: 5 pasos

Video: Configuración de bits de fusibles del microcontrolador AVR. Creación y carga en la memoria flash del microcontrolador el programa de parpadeo de LED: 5 pasos
Video: CURSO AVR - GPIO 01 2024, Noviembre
Anonim
Image
Image

En este caso crearemos un programa simple en código C y lo grabaremos en la memoria del microcontrolador. Escribiremos nuestro propio programa y compilaremos el archivo hexadecimal, utilizando Atmel Studio como plataforma de desarrollo integrada. Configuraremos los bits de fusible y cargaremos el archivo hexadecimal en la memoria del microcontrolador AVR ATMega328P, utilizando nuestro propio programador y software AVRDUDE.

AVRDUDE: es un programa para descargar y cargar las memorias en chip de los microcontroladores AVR de Atmel. Puede programar la memoria flash y la EEPROM y, cuando sea compatible con el protocolo de programación en serie, puede programar fusibles y bits de bloqueo.

Paso 1: Programa de escritura y compilación del archivo hexadecimal, usando Atmel Studio

Programa de escritura y compilación del archivo hexadecimal, utilizando Atmel Studio
Programa de escritura y compilación del archivo hexadecimal, utilizando Atmel Studio
Programa de escritura y compilación del archivo hexadecimal, utilizando Atmel Studio
Programa de escritura y compilación del archivo hexadecimal, utilizando Atmel Studio

Si no tiene Atmel Studio, debe descargarlo e instalarlo:

Este proyecto utilizará C, así que seleccione la opción Proyecto ejecutable GCC C de la lista de plantillas para generar un proyecto ejecutable básico.

A continuación, es necesario especificar para qué dispositivo se desarrollará el proyecto. Este proyecto se desarrollará para el microcontrolador AVR ATMega328P.

Escriba el código del programa en el área del Editor de fuentes principal de Atmel Studio. El editor principal de fuentes: esta ventana es el editor principal de los archivos fuente del proyecto actual. El editor tiene funciones de corrección ortográfica y de autocompletar.

1. Debemos decirle al compilador a qué velocidad se está ejecutando nuestro chip para que pueda calcular los retrasos correctamente.

#ifndef F_CPU

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

2. Incluimos el preámbulo, que es donde colocamos nuestra información de inclusión de otros archivos, que define variables y funciones globales.

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

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

3. Después del preámbulo viene la función main ().

int main (void) {

La función main () es única y está separada 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.

4. Configure el pin 0 del PORTB como salida.

DDRB = 0b00000001; // Establecer PORTB1 como salida

Hacemos esto escribiendo un número binario en el registro de dirección de datos B. El registro de dirección de datos B nos permite hacer que los bits del registro B sean de entrada o salida. Escribir un 1 los convierte en salida, mientras que un 0 los convierte en entrada. Dado que estamos conectando un LED para que actúe como salida, escribimos un número binario, haciendo que el pin 0 del PUERTO B sea la salida.

5. Bucle.

while (1) {

Esta declaración es un bucle, a menudo denominado bucle principal o bucle de eventos. Este código siempre es verdadero; por lo tanto, se ejecuta una y otra vez en un ciclo infinito. Nunca cesa. Por lo tanto, el LED parpadeará infinitamente, a menos que se apague la energía del microcontrolador o se borre el código de la memoria del programa.

6. Encienda el LED adjunto al puerto PB0

PORTB = 0b00000001; // enciende el LED adjunto al puerto PB0

Esta línea, le da un 1 al PB0 de PortB. PORTB es un registro de hardware en el chip AVR que contiene 8 pines, PB7-PB0, de izquierda a derecha. Poner un 1 al final da un 1 a PB0; esto establece PB0 alto, lo que lo enciende. Por lo tanto, el LED conectado al pin PB0 se encenderá y se iluminará.

7. Retraso

_delay_ms (1000); // crea un retraso de 1 segundo

Esta declaración crea un retraso de 1 segundo, de modo que el LED se enciende y permanece encendido durante exactamente 1 segundo.

8. Apague todos los pines B, incluido PB0

PORTB = 0b00000000; // Apaga todos los pines B, incluido PB0

Esta línea apaga los 8 pines del puerto B, de modo que incluso PB0 está apagado, por lo que el LED se apaga.

9. Otro retraso

_delay_ms (1000); // crea otro retraso de 1 segundo

Se apaga exactamente durante 1 segundo, antes de comenzar el ciclo de nuevo y encontrar la línea, que lo vuelve a encender, repitiendo el proceso por todas partes. Esto sucede infinitamente, por lo que el LED parpadea constantemente.

10. Declaración de devolución

}

return (0); // esta línea nunca se alcanza realmente}

La última línea de nuestro código es una declaración return (0). Aunque este código nunca se ejecuta, porque hay un bucle infinito que nunca termina, para nuestros programas que se ejecutan en computadoras de escritorio, es importante que el sistema operativo sepa si se ejecutaron correctamente o no. Por esa razón, GCC, nuestro compilador, quiere que cada main () termine con un código de retorno. Los códigos de retorno no son necesarios para el código AVR, que se ejecuta independientemente de cualquier sistema operativo compatible; sin embargo, el compilador generará una advertencia si no finaliza main con return ().

El paso final es la construcción del proyecto. Significa compilar y finalmente vincular todos los archivos objeto para generar el archivo ejecutable (.hex). Este archivo hexadecimal se genera dentro de la carpeta Debug que se encuentra dentro de la carpeta Proyecto. Este archivo hexadecimal está listo para cargarse en el chip del microcontrolador.

Paso 2: Cambio de la configuración predeterminada de los bits fusibles del microcontrolador

Cambio de la configuración predeterminada de los bits fusibles del microcontrolador
Cambio de la configuración predeterminada de los bits fusibles del microcontrolador
Cambio de la configuración predeterminada de los bits fusibles del microcontrolador
Cambio de la configuración predeterminada de los bits fusibles del microcontrolador
Cambio de la configuración predeterminada de los bits fusibles del microcontrolador
Cambio de la configuración predeterminada de los bits fusibles del microcontrolador

Es importante recordar que algunos de los bits de fusible se pueden usar para bloquear ciertos aspectos del chip y potencialmente pueden bloquearlo (hacerlo inutilizable)

Hay un total de 19 bits de fusible que se utilizan en el ATmega328P y están separados en tres bytes de fusible diferentes. Tres de los bits de fusible están contenidos en el "Byte de fusible extendido", ocho están contenidos en el "Byte de fusible alto" y ocho más están contenidos en el "Byte de fusible bajo". También hay un cuarto byte que se utiliza para programar los bits de bloqueo.

Cada byte es de 8 bits y cada bit es una configuración o bandera separada. Cuando hablamos de configurar, no configurar, programar, no programar fusibles, en realidad estamos usando binarios. 1 significa no configurado, no programado y cero significa configurado, programado. Al programar los fusibles, puede usar notación binaria o, más comúnmente, notación hexadecimal.

Los chips ATmega 328P tienen un oscilador RC integrado que tiene una frecuencia de 8 MHz. Se envían nuevos chips con este conjunto como fuente de reloj y el fusible CKDIV8 activo, lo que da como resultado un reloj del sistema de 1 MHz. El tiempo de inicio está configurado al máximo y el período de tiempo de espera habilitado.

Los nuevos chips ATMega 328P generalmente tienen las siguientes configuraciones de fusibles:

Fusible bajo = 0x62 (0b01100010)

Fusible alto = 0xD9 (0b11011001)

Fusible extendido = 0xFF (0b11111111)

Usaremos el chip ATmega 328 con un cristal externo de 16MHz. Por lo tanto, necesitamos programar bits de "Fusible de byte bajo" en consecuencia.

1. Los bits 3-0 controlan la elección del oscilador, y la configuración predeterminada de 0010 es usar el oscilador RC interno calibrado, que no queremos. Queremos la operación del oscilador de cristal de baja potencia de 8.0 a 16.0 MHz, por lo que los bits 3-1 (CKSEL [3: 1]) deben establecerse en 111.

Los bits 5 y 4 controlan el tiempo de inicio, y la configuración predeterminada de 10 es para un retraso de inicio de seis ciclos de reloj desde el apagado y el ahorro de energía, más un retraso de inicio adicional de 14 ciclos de reloj más 65 milisegundos desde el reinicio.

Para estar seguros para un oscilador de cristal de baja potencia, queremos el retraso máximo posible de 16.000 ciclos de reloj desde el apagado y el ahorro de energía, por lo que SUT [1] debe establecerse en 1, más un retraso de inicio adicional de 14 ciclos de reloj más 65 milisegundos desde el reinicio, por lo que SUT [0] debe establecerse en 1. Además, CKSEL [0] debe establecerse en 1.

3. El bit 6 controla la salida del reloj a PORTB0, que no nos importa. Por lo tanto, el bit 6 se puede dejar establecido en 1.

4. El bit 7 controla la operación de división por 8 y la configuración predeterminada de 0 tiene la función habilitada, lo que no queremos. Entonces, el bit 7 debe cambiarse de 0 a 1.

Por lo tanto, el nuevo Fuse Low Byte debería ser 11111111 que, en notación hexadecimal, es 0xFF

Para programar bits del "Fuse Low Byte" podemos utilizar nuestro programador (https://www.instructables.com/id/ISP-Programmer-fo…) y el software AVRDUDE. AVRDUDE es una utilidad de línea de comandos que se utiliza para descargar y cargar microcontroladores Atmel.

Descarga AVRDUDE:

Primero, debemos agregar describe nuestro programador al archivo de configuración de AVRDUDE. En Windows, el archivo de configuración generalmente se encuentra en la misma ubicación que el archivo ejecutable de AVRDUDE.

Pegue el texto en el archivo de configuración avrdude.conf:

# ISPProgv1

id del programador = "ISPProgv1"; desc = "puerto serial golpeando, reset = dtr sck = rts mosi = txd miso = cts"; tipo = "serbb"; tipo_conexión = serial; reiniciar = 4; sck = 7; mosi = 3; miso = 8;;

Antes de iniciar el AVRDUDE, debemos conectar el microcontrolador al programador, según el esquema

Abra la ventana del indicador de DOS.

1. Para ver la lista de programadores que admite avrdude, escriba el comando avrdude -c c. Si todo está bien, la lista debe tener la identificación del programador "ISPProgv1"

2. Para ver la lista de dispositivos Atmel compatibles con avrdude, escriba el comando avrdude -c ISPProgv1. La lista debe tener el dispositivo m328p para Atmel ATMega 328P.

A continuación, escriba avrdude -c ISPProgv1 –p m328p, el comando le dice a avrdude qué programador se está utilizando y qué microcontrolador Atmel está conectado. Presenta la firma ATmega328P en notación hexadecimal: 0x1e950f. Presenta la programación de bits de fusible actualmente en el ATmega328P también en notación hexadecimal; en este caso, los bytes de fusible se programan por defecto de fábrica.

A continuación, escriba avrdude -c ISPProgv1 –p m328p –U lfuse: w: 0xFF: m. Es un comando para decirle a avrdude qué programador se está utilizando y qué microcontrolador Atmel está conectado y para cambiar el byte bajo del fusible a 0xFF.

Ahora la señal del reloj debería provenir del oscilador de cristal de baja potencia.

Paso 3: Grabar el programa en la memoria del microcontrolador ATMega328P

Grabación del programa en la memoria del microcontrolador ATMega328P
Grabación del programa en la memoria del microcontrolador ATMega328P
Grabación del programa en la memoria del microcontrolador ATMega328P
Grabación del programa en la memoria del microcontrolador ATMega328P

Primero, copie el archivo hexadecimal del programa que hicimos al principio de la instrucción en el directorio AVRDUDE.

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

El comando escribe un archivo hexadecimal en la memoria del microcontrolador. Ahora, el microcontrolador funciona de acuerdo con las instrucciones de nuestro programa. ¡Vamos a ver!

Paso 4: Verifique que el microcontrolador funcione de acuerdo con las instrucciones de nuestro programa

Verifique que el microcontrolador funcione de acuerdo con las instrucciones de nuestro programa
Verifique que el microcontrolador funcione de acuerdo con las instrucciones de nuestro programa
Compruebe que el microcontrolador funciona de acuerdo con las instrucciones de nuestro programa
Compruebe que el microcontrolador funciona de acuerdo con las instrucciones de nuestro programa
Verifique que el microcontrolador funcione de acuerdo con las instrucciones de nuestro programa
Verifique que el microcontrolador funcione de acuerdo con las instrucciones de nuestro programa

Conecte los componentes de acuerdo con el diagrama esquemático del circuito LED parpadeante del AVR

Primero, necesitamos energía, como todos los circuitos AVR. Aproximadamente 5 voltios de potencia son suficientes para el funcionamiento del chip AVR. Puede obtener esto de las baterías o de una fuente de alimentación de CC. Conectamos + 5V de potencia al pin 7 y conectamos el pin 8 a tierra en la placa de pruebas. Entre ambos pines, colocamos un condensador cerámico de 0.1μF para suavizar la potencia de la fuente de alimentación para que el chip AVR obtenga una línea de alimentación suave.

La resistencia de 10 KΩ se utiliza para proporcionar Power On Reset (POR) al dispositivo. Cuando se enciende la energía, el voltaje a través del capacitor será cero, por lo que el dispositivo se reinicia (ya que el reinicio está activo bajo), luego el capacitor se carga a VCC y el reinicio se desactivará.

Conectamos el ánodo de nuestro LED al pin AVR PB0. Este es el pin 14 del ATMega328P. Dado que es un LED, queremos limitar la corriente que fluye hacia el LED para que no se queme. Es por eso que colocamos una resistencia de 330Ω en serie con el LED. El cátodo del LED se conecta a tierra.

El cristal de 16 MHz se utiliza para proporcionar reloj al microcontrolador Atmega328 y los condensadores de 22pF se utilizan para estabilizar el funcionamiento del cristal.

Estas son todas las conexiones necesarias para encender el LED. Fuente de alimentación.

Está bien. El LED parpadea con un segundo de retraso. El trabajo del microcontrolador corresponde a nuestras tareas

Paso 5: Conclusión

Es cierto que fue un proceso largo para simplemente hacer parpadear un LED, pero la verdad es que ha superado con éxito los principales obstáculos: crear una plataforma de hardware para programar un microcontrolador AVR, usar Atmel Studio como plataforma de desarrollo integrada, usar AVRDUDE como software para configurar y programar un microcontrolador AVR

Si quieres estar al día de mis proyectos de microcontroladores base, suscríbete a mi YouTube! Ver y compartir mis videos es una forma de apoyar lo que hago

Suscríbete al canal de YouTube FOG

Recomendado: