Tabla de contenido:
- Paso 1: Programa de escritura y compilación del archivo hexadecimal, usando Atmel Studio
- Paso 2: Cambio de la configuración predeterminada de los bits fusibles del microcontrolador
- Paso 3: Grabar el programa en la memoria del microcontrolador ATMega328P
- Paso 4: Verifique que el microcontrolador funcione de acuerdo con las instrucciones de nuestro programa
- Paso 5: Conclusión
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
2024 Autor: John Day | [email protected]. Última modificación: 2024-01-30 08:43
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
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
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
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
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:
Tutorial Python del acelerómetro digital Raspberry Pi MMA8452Q de 3 ejes de 12 bits / 8 bits: 4 pasos
Raspberry Pi MMA8452Q 3-Axis 12-bit / 8-bit Acelerómetro digital Python Tutorial: El MMA8452Q es un acelerómetro inteligente, de baja potencia, tres ejes, capacitivo, micromecanizado con 12 bits de resolución. Se proporcionan opciones flexibles programables por el usuario con la ayuda de funciones integradas en el acelerómetro, configurables para dos interrupciones
Tutorial de Arduino Uno n. ° 1 - Programa básico de parpadeo: 4 pasos
Tutorial # 1 de Arduino Uno - Programa Básico de Blink: ¡Hola a todos! ¡Me alegra publicar mi primer instructivo! Esta idea se me ocurrió cuando tuve problemas para que mi Arduino Uno funcionara, así que como tuve algunas dificultades, daré una explicación a todos los novatos por aquí que como yo no sé mucho
Temporizador NE555 - Configuración del temporizador NE555 en una configuración estable: 7 pasos
Temporizador NE555 | Configuración del temporizador NE555 en una configuración estable: El temporizador NE555 es uno de los circuitos integrados más utilizados en el mundo de la electrónica. Tiene la forma de DIP 8, lo que significa que cuenta con 8 pines
Interfaz del microcontrolador 8051 con pantalla LCD en modo de 4 bits: 5 pasos (con imágenes)
Interfaz del microcontrolador 8051 con Lcd en modo de 4 bits: En este tutorial, le contaremos cómo podemos interconectar el lcd con 8051 en modo de 4 bits
CAD 3D: configuración y creación de espacios de trabajo estándar: 14 pasos
CAD 3D - Configuración y creación de espacios de trabajo estándar: -Creación (a) Archivo de pieza estándar para mayor eficiencia Este tutorial trata sobre cómo crear un archivo de pieza predeterminado que pueda abrir en el futuro - sabiendo que los parámetros clave específicos ya están allí - minimizando la cantidad de trabajo repetitivo en el día