- ¿Qué son los fusibles en AVR? Una explicación detallada
- Fusionar bits en Arduino
- Componentes necesarios para probar fusibles en AVR
- Esquema para probar los bits de fusible en AVR
- Prueba de los fusibles en AVR
En este tutorial, hablaremos de fusibles. Cuando estaba en la universidad y aprendiendo sobre todas las cosas interesantes de la electrónica, escuché el término fusionarse en AVR por primera vez, mi pensamiento inicial sobre el tema fue, ¡oh! hay algo dentro del AVR que explotará si hice algo mal. En ese entonces, no había muchos recursos disponibles en Internet para revisar. Busqué bastante para descubrir que estos fusibles se referían a algunos bits especiales dentro del microcontrolador AVR. Estos bits son como pequeños interruptores dentro del AVR y al encenderlos / apagarlos, podemos encender / apagar algunas características especiales del AVR. Encenderlo y apagarlo significa configurarlo y restablecerlo.
Vamos a aprovechar esta oportunidad para discutir todo lo que hay acerca de los bits Fuse en AVR. Para simplificar, tomaremos el ejemplo de una placa Arduino que alberga el popular microcontrolador ATmega328P. Aquí, aprenderá cómo configurar estos fusibles para activar y desactivar algunas de estas funciones, lo que resulta muy útil en aplicaciones de la vida real. Entonces, vayamos directo a eso.
En nuestras publicaciones anteriores, hemos creado muchos proyectos de microcontroladores AVR como el módulo GSM de interfaz con el microcontrolador AVR y el HC-05 de interfaz con el microcontrolador AVR. Puede consultarlos si desea obtener más información sobre esos proyectos.
¿Qué son los fusibles en AVR? Una explicación detallada
Como discutimos anteriormente, los fusibles en el microcontrolador son como pequeños interruptores que se pueden encender y apagar para habilitar y deshabilitar varias funciones en el microcontrolador AVR. Esta es la parte donde surge nuestra siguiente pregunta, entonces, ¿cómo configuramos o restablecemos estos fusibles? La respuesta a esta pregunta es simple: lo hacemos con la ayuda de registros de fusibles.
En el ATmega328P IC, hay un total de 19 bits de fusible y se dividen en tres bytes de fusible. Estos se definen como "Bytes de fusible extendidos", "Byte de fusible alto" y "Byte de fusible bajo".
Si observa la Tabla 27 de la hoja de datos ATmega328 / P Rev: 7810D – AVR – 01/15, puede encontrar todos los pequeños detalles sobre los bits de fusible. Pero la imagen de abajo le dará una mejor idea sobre la sección de bits de fusibles de la hoja de datos.
Ahora que ha aprendido un poco sobre los bits de fusible, revisemos la hoja de datos y descubramos todos los detalles necesarios sobre este IC.
Los bits de fusibles extendidos:
Una vez que haga clic en la pestaña Fuse Bits y se desplace un poco hacia abajo, encontrará la Tabla 27-5: que muestra la tabla para el "Byte de fusible extendido" comúnmente conocido como " EFUSE". La siguiente imagen muestra exactamente eso.
En esta tabla, solo hay tres bits utilizables y los otros tres están reservados. Estos tres bits se refieren al nivel de detección de caídas de tensión. Como puede ver en la Nota, si miramos la Tabla 28-5, podemos encontrar más detalles al respecto.
Como puede ver en la tabla anterior, tenemos la tabla para la detección de apagones. La detección de apagones es una característica que reinicia el microcontrolador cuando el voltaje de suministro cae por debajo de un cierto nivel de voltaje. En el ATmega328P IC, podemos deshabilitar completamente la detección de apagones o podemos configurarlo en los niveles que se muestran en la tabla anterior.
Bytes de fusible alto:
Como puede ver en la imagen a continuación, la tabla 27-6: de la hoja de datos muestra los bits de fusible superior del ATmega328P IC.
El fusible alto se ocupa de varias tareas dentro del microcontrolador ATmega328. En esta sección, hablaremos sobre los bits de fusibles superiores y su funcionamiento. Comencemos con los bits BOOTRST, BOOTSZ0 y BOOTSZ1. Estos tres bits son responsables de configurar el tamaño de arranque; El tamaño de arranque se refiere a la cantidad de memoria reservada para instalar el cargador de arranque.
Un cargador de arranque es una pieza especial de software que se ejecuta sobre el microcontrolador y gestiona diferentes tareas. Pero en el caso de Arduino, el gestor de arranque se usa para cargar el boceto de Arduino dentro del microcontrolador. En uno de nuestros artículos anteriores, le mostramos cómo grabar el cargador de arranque en ATmega328P usando Arduino. Puede comprobarlo si está interesado en el tema. Volviendo a nuestro tema, los propósitos de otros bits en el byte alto se aclaran razonablemente, el bit EESAVE es preservar la memoria EEPROM mientras se realiza un ciclo de borrado de chip. El bit WDTON sirve para habilitar o deshabilitar el temporizador de vigilancia.
El temporizador de vigilancia es un temporizador especial en el ATmega328P IC que tiene su reloj separado y funciona de forma independiente. Si el temporizador de vigilancia está habilitado, debe borrarlo con un período determinado; de lo contrario, el temporizador de vigilancia reiniciará el microcontrolador. Esta es una característica útil que viene con muchos microcontroladores si el procesador se atasca; el perro guardián lo restablecerá para evitar cualquier daño a la aplicación final.
El bit DWEN está ahí para habilitar el cable de depuración; este es un protocolo preparatorio que está integrado internamente en su hardware, que se utiliza para programar y depurar los procesadores. Con esta función habilitada, puede flashear y depurar el procesador con un solo cable conectado. Pero para usarlo, necesitará hardware especial que sea preparatorio para Atmel.
Los dos bits restantes son aquellos que debe evitar a menos que sepa exactamente lo que está haciendo. Estos son el bit-7 de RSTDISBL y el bit-5 de SPIEN. El RSTDISBL (Desactivación de reinicio externo), como su nombre lo indica, desactiva el pin de reinicio de hardware externo y el bit SPIEN se utiliza para desactivar la interfaz de programación SPI. Deshabilitar cualquiera de estos dos bits puede bloquear completamente su AVR; así que dejarlos solos es una buena idea.
Bytes de fusible bajo:
Como puede ver en la imagen a continuación, la tabla 27-7: de la hoja de datos muestra los bits del fusible inferior del ATmega328P IC.
Este byte fusible es responsable de configurar la fuente de reloj y algunos otros parámetros del reloj dentro del AVR. En esta sección, aprenderemos sobre todo eso.
El séptimo bit o el indicador CKDIV8 se puede configurar para dividir la fuente del reloj entre 8, esto es muy útil, lo que quizás ya sepa si ha intentado programar el AVR usted mismo. El siguiente bit es el bit CKOUT y es el sexto bit en el byte de fusible bajo. La programación generaría la señal del reloj interno en el PORTB0 del microcontrolador.
Los bits 5 y 4 SUT1 y SUT0 controlan el tiempo de inicio del microcontrolador. Esto evita cualquier acción de arranque que pueda o no tener lugar antes de que la tensión de alimentación pueda alcanzar un nivel de tensión umbral mínimo aceptable. Y los últimos cuatro CKSEL0 - 4 bits se utilizan para seleccionar la fuente de reloj del microcontrolador. La tabla que se muestra a continuación le brinda una mejor comprensión de estos cuatro bits que son responsables de configurar la fuente del reloj; puede encontrar esta tabla en la sección Fuente del reloj de la hoja de datos.
Ahora, antes de que avancemos, hay una cosa más que debería revisar es la tabla para el retardo de inicio del oscilador. Por retardo de arranque, nos referimos a los bits 4 y 5 del byte fusible inferior. Los retrasos deben configurarse según la condición en la que operará el circuito y el tipo de oscilador que esté utilizando. Los valores predeterminados están configurados para aumentar la potencia lentamente con 6 ciclos de reloj cuando se realiza una secuencia de encendido o apagado. A continuación, hay otro retraso de 14 ciclos de reloj con 65 Ms de retraso después de la puesta en marcha.
¡Uf! Esa fue mucha información para digerir. Pero antes de continuar, terminemos esta sección con una nota rápida.
Nota:
Si ha mirado la hoja de datos con cuidado, debe haberlo notado, programar un bit de fusible significa ponerlo bajo, es decir, 0 (cero), que es lo opuesto a lo que generalmente hacemos para hacer que un puerto sea alto o bajo. Debe tener esto en cuenta al configurar sus fusibles.
Fusionar bits en Arduino
Hemos hablado mucho sobre fusibles en la sección anterior, pero en esta sección, hablemos sobre cómo configurarlos y cómo escribirlos en un microcontrolador. Para eso, necesitaremos una herramienta llamada Avrdude. Es una herramienta que se puede utilizar para leer, escribir y modificar la memoria en microcontroladores AVR. Funciona con SPI y tiene una larga lista de soporte para diferentes tipos de programadores. puede descargar la herramienta desde el enlace que figura a continuación. Además, usaremos nuestro microcontrolador favorito Arduino.
- Descargar Avrdude Versión 6.3 Windows-ming32
Ahora que tiene Avrdude, debe extraerlo y abrir una ventana de comando en esa carpeta. Además, si planea usarlo más adelante, puede agregar la ruta de la carpeta a la sección de variables de entorno de Windows. Pero lo pondré en mi escritorio y abriré una ventana de comando allí. Una vez hecho esto, conectaremos el programador USBasp a nuestra PC y nos aseguraremos de tener el controlador adecuado para nuestro programador USBasp. Una vez que hagamos eso, estamos listos para comenzar y primero leeremos el valor de fusible predeterminado. Para hacer eso, necesita ejecutar el siguiente comando.
avrdude.exe -c usbasp -p m328p -U lfuse: r: low_fuse_val.txt: h -U hfuse: r: high_fuse_val.txt: h -U efuse: r: ext_fuse_val.txt: h
Si todo está bien, este comando leerá los bytes de fusión y los colocará en tres archivos de texto separados. La siguiente imagen le dará una mejor idea del proceso.
Como puede ver, el Avrdude leyó los bits de fusibles en el Arduino nano y los guardó en tres archivos de texto separados. Ahora, los abrimos y obtuvimos tres valores; para EFUSE: 0xFD, para HFUSE: 0XDA, para LFUSE: 0xFF. Este fue el valor de fusible predeterminado que obtuvimos para un Arduino nano. Ahora, convierta estos bits en binarios y compárelos con su valor predeterminado de la hoja de datos. La siguiente tabla muestra exactamente eso.
Por conveniencia, los bits de fusible están escritos en valores hexadecimales, pero si los convertimos a valores binarios y los comparamos con la hoja de datos, sabremos qué está sucediendo. Comencemos con el Byte de fusible inferior. Como puede ver en la cadena anterior, se establece en 0XFF y el valor binario sería 0B11111111.
Comparación de bytes de fusibles inferiores de stock con Arduino:
Byte de fusible bajo |
Bit No. |
Valor predeterminado en AVR |
Valor predeterminado de Arduino |
CKDIV8 |
7 |
0 (programado) |
1 (no programado) |
CKOUT |
6 |
1 (no programado) |
1 (no programado) |
SUT1 |
5 |
1 (no programado) |
1 (no programado) |
SUT0 |
4 |
0 (programado) |
1 (no programado) |
CKSEL3 |
3 |
0 (programado) |
1 (no programado) |
CKSEL2 |
2 |
0 (programado) |
1 (no programado) |
CKSEL1 |
1 |
1 (no programado) |
1 (no programado) |
CKSEL0 |
0 |
0 (programado) |
1 (no programado) |
El byte de fusible superior se establece en 0XDA en binario que es 0B11011010.
Byte de fusible más alto en binario:
Byte de fusible alto |
Bit No. |
Valor predeterminado en AVR |
Valor predeterminado de Arduino |
RSTDISBL |
7 |
1 (no programado) |
1 (no programado) |
DWEN |
6 |
1 (no programado) |
1 (no programado) |
SPIEN |
5 |
0 (programado) |
0 (programado) |
WDTON |
4 |
1 (no programado) |
1 (no programado) |
EESAVE |
3 |
1 (no programado) |
1 (no programado) |
BOOTSZ1 |
2 |
0 (programado) |
0 (programado) |
BOTASZ0 |
1 |
0 (programado) |
1 (no programado) |
BOOTRST |
0 |
1 (no programado) |
0 (programado)) |
La configuración para el byte de fusible extendido se establece en 0XFD, en binario es 0B11111101.
Byte de fusible extendido en binario:
Byte de fusible extendido |
Bit No. |
Valor predeterminado en AVR |
Valor predeterminado de Arduino |
- |
7 |
1 |
1 |
- |
6 |
1 |
1 |
- |
5 |
1 |
1 |
- |
4 |
1 |
1 |
- |
3 |
1 |
1 |
BODLEVEL2 |
2 |
1 (no programado) |
1 (no programado) |
BODLEVEL1 |
1 |
1 (no programado) |
0 (programado) |
BODLEVEL0 |
0 |
1 (no programado) |
1 (no programado) |
Ahora, esto marca el final de esta sección. A partir de ahora, hemos aprendido mucho sobre el microcontrolador AVR y sus bits de fusible. Entonces, terminemos este artículo poniendo a prueba nuestra teoría alterando y experimentando con algunos de los bits de fusibles en el Arduino Nano.
Componentes necesarios para probar fusibles en AVR
Hemos hablado mucho sobre los fusibles en la parte anterior. Pero para continuar en el artículo, necesitamos algunos componentes de hardware y algunas herramientas de software. En esta sección, hablaremos de ellos. A continuación se muestra una lista de componentes requeridos con imágenes.
- Protoboard - 1
- Arduino Nano - 1
- Programador AVR USBasp - 1
- Cable USB - 1
- Convertidor AVR de 10 pines a 6 pines - 1
- Avrdude (herramienta de software para programar AVR)
- LED - 1
- Resistencia 330R - 1
- Cables de salto
Esquema para probar los bits de fusible en AVR
La configuración de prueba de hardware se muestra a continuación en esta configuración. Hemos conectado el Arduino Nano a la PC con un cable USB, y también hemos conectado el programador USBasp a la PC. El objetivo de este artículo es programar los bits de fusible en AVR. Por ese motivo, hemos conectado el programador USBasp con el Arduino. La siguiente imagen le dará una mejor idea de la configuración.
Prueba de los fusibles en AVR
La configuración de prueba se muestra a continuación. Como puede ver, hemos conectado el programador Arduino y USBasp ambos al USB de mi portátil.
Ahora abramos el IDE de Arduino y carguemos un boceto de parpadeo básico. El contenido del boceto de parpadeo básico se explica por sí mismo, por lo que no puse ningún detalle al respecto.
Verás en el video que el led del pin no 13 parpadea como debería. Ahora modifiquemos la configuración del fusible y establezcamos sus valores predeterminados. Y como hemos visto anteriormente en la hoja de datos; el EFUSE es 0XFF; el HFUSE es D9; El LFUSE es: 62. Ahora configurémoslo con Avrdude, flasheémoslo y veamos qué sucede. El código que usaremos es-
avrdude -c usbasp -p m328P -U lfuse: w: 0x62: m -U hfuse: w: 0xd9: m -U efuse: w: 0xff: m
Una vez que haga esto, verá que el LED parpadeará extremadamente lento porque hemos calculado y programado el valor para un reloj de 16Mhz y ahora, después de quemar los fusibles, es solo un oscilador RC interno de 1Mhz. Por eso el LED parpadea tan lentamente. Ahora intentemos subir un boceto una vez más. Veremos que el Arduino da un error y el código no se carga. Porque al alterar los fusibles, también hemos estropeado la configuración del cargador de arranque. Puedes ver eso en la imagen de abajo.
Para solucionar este problema y volver a poner el Arduino como estaba antes, solo tenemos que volver a grabar el cargador de arranque para el Arduino. Para ello, vaya a Herramientas -> Programador- USBasp , y una vez que hagamos eso, podremos volver a ir a herramientas y podemos hacer clic en la opción de grabar bootloader. Esto volverá a quemar el gestor de arranque de stock en su Arduino y todo volverá a ser como antes.
Después de que el cargador de arranque se devolvió al Arduino, volvió a su estado original y la última imagen muestra un LED parpadeante después de que el cargador de arranque se quemó nuevamente.
Y esto marca el final de este artículo. Espero que hayas disfrutado del artículo y hayas aprendido algo nuevo. Si tiene alguna pregunta sobre el artículo, no dude en poner un comentario a continuación.