Detector de firma de chip y cargador de bootloader

Unos amigos me regalaron un atmega328p y me advirtieron que ya tenía bootloader grabado. Pero no estaban seguro de a que frecuencia de cristal, ni si usaba oscilador interno o externo. Para colmo de males yo no tengo en estos momentos cristales compatibles para usar. Por lo que tendría que usar mi breadboard y probar unas cuantas combinaciones con distintos cristales para hacerlo funcionar. Este tuto lo escribí porque pase tremendo trabajo para lograr que funcionara como quería y quiero mostrarle como lo hice. Primero que todo agradecer enormemente a Andy Abreus Reyes (AKA @AAR96) por mostrarme cómo hacerlo.
Como ya señalé no poseo cristales para mi proyecto (ardutester) por lo que mi prioridad será grabar un bootloader al Atmega328p para que use su oscilador interno. Ante todo, probé grabar un código suponiendo que mi Atmega estaba usando un oscilador interno y que tenía un bootloader. Como la tarea fue infructuosa entonces decidí grabarle un nuevo bootloader. Para lograrlo usaremos unas herramientas creadas por Nick Gammon que podemos encontrar en su github.

Atmega Board Detector: Esto usa un board de Arduino para detectar la firma, los fusibles y el cargador de arranque de otro. Solo algunos Arduinos son compatibles para ejecutar el código. Ha sido probado en Arduino Uno, Mega2560 y Leonardo.

Atmega_Board_Programmer: Esto volverá a flashear el bootloader en los chips seleccionados. Solo algunos Arduinos son compatibles para ejecutar el código. Ha sido probado en Arduino Uno, Mega2560 y Leonardo.

Existen más herramientas en su github pero nos centraremos en estas dos solamente. Lo primero que haremos será revisar por curiosidad y por salir de dudas si nuestro atmega328p realmente tiene un bootloader. ¿Pero cómo lograremos esto sino poseemos ningún cristal para que nuestro Atmega funcione?

Aquí es donde entra el primer TIP de este tutorial, según la web de Nick Gammon debemos usar un reloj alterno. Como alternativa a un cristal o resonador, el código del Atmega Board Detector también genera un reloj de 8 MHz en el pin D9 de la placa de programación del Arduino (usando el temporizador 1). Por lo tanto, solo necesita conectar D9 en la placa de programación de Arduino a XTAL1 de la placa de destino (Atmega328p) y esto proporcionará una señal de reloj, lo que permitirá que se ejecute este código.

Con este reloj generado por nuestro Arduino UNO/MEGA que funcionara como programador podemos ya trabajar sin la necesidad de usar un cristal con el Atmega328p. Ahora les muestro como deben de quedar nuestras conexiones para lograrlo.

En la siguiente foto conectaremos el oscilador que genera nuestro Arduino programador para ya terminar la configuración que usaremos.

Para tener una mejor idea les dejo el pinout del Atmega328p

Descargamos del github las herramientas de Nick Gammon.

La descomprimimos y abrimos la carpeta Atmega_Board_Detector una vez allí damos doble click sobre Atmega_Board_Detector.ino y nos cargara el código en nuestro IDE

Previamente ya hemos fijado las opciones para nuestra placa de Arduino en mi caso un Arduino UNO por el COM4 y subimos el código. El código funciona usando el monitor serie a 115200 baud por lo que lo abrimos y fijamos esa velocidad. Enseguida veremos toda la información de nuestro chip.

Atmega chip detector.
Written by Nick Gammon.
Version 1.20
Compiled on Aug 19 2020 at 22:31:00 with Arduino IDE 10812.
Attempting to enter ICSP programming mode ...
Entered programming mode OK.
Signature = 0x1E 0x95 0x0F 
Processor = ATmega328P
Flash memory size = 32768 bytes.
LFuse = 0xFF 
HFuse = 0xDE 
EFuse = 0xFD 
Lock byte = 0xFF 
Clock calibration = 0x8C 
Bootloader in use: Yes
EEPROM preserved through erase: No
Watchdog timer always on: No
Bootloader is 512 bytes starting at 7E00

Bootloader:

7E00: 0x11 0x24 0x84 0xB7 0x14 0xBE 0x81 0xFF 0xF0 0xD0 0x85 0xE0 0x80 0x93 0x81 0x00 
7E10: 0x82 0xE0 0x80 0x93 0xC0 0x00 0x88 0xE1 0x80 0x93 0xC1 0x00 0x86 0xE0 0x80 0x93 
7E20: 0xC2 0x00 0x80 0xE1 0x80 0x93 0xC4 0x00 0x8E 0xE0 0xC9 0xD0 0x25 0x9A 0x86 0xE0 
7E30: 0x20 0xE3 0x3C 0xEF 0x91 0xE0 0x30 0x93 0x85 0x00 0x20 0x93 0x84 0x00 0x96 0xBB 
7E40: 0xB0 0x9B 0xFE 0xCF 0x1D 0x9A 0xA8 0x95 0x81 0x50 0xA9 0xF7 0xCC 0x24 0xDD 0x24 
7E50: 0x88 0x24 0x83 0x94 0xB5 0xE0 0xAB 0x2E 0xA1 0xE1 0x9A 0x2E 0xF3 0xE0 0xBF 0x2E 
7E60: 0xA2 0xD0 0x81 0x34 0x61 0xF4 0x9F 0xD0 0x08 0x2F 0xAF 0xD0 0x02 0x38 0x11 0xF0 
7E70: 0x01 0x38 0x11 0xF4 0x84 0xE0 0x01 0xC0 0x83 0xE0 0x8D 0xD0 0x89 0xC0 0x82 0x34 
7E80: 0x11 0xF4 0x84 0xE1 0x03 0xC0 0x85 0x34 0x19 0xF4 0x85 0xE0 0xA6 0xD0 0x80 0xC0 
7E90: 0x85 0x35 0x79 0xF4 0x88 0xD0 0xE8 0x2E 0xFF 0x24 0x85 0xD0 0x08 0x2F 0x10 0xE0 
7EA0: 0x10 0x2F 0x00 0x27 0x0E 0x29 0x1F 0x29 0x00 0x0F 0x11 0x1F 0x8E 0xD0 0x68 0x01 
7EB0: 0x6F 0xC0 0x86 0x35 0x21 0xF4 0x84 0xE0 0x90 0xD0 0x80 0xE0 0xDE 0xCF 0x84 0x36 
7EC0: 0x09 0xF0 0x40 0xC0 0x70 0xD0 0x6F 0xD0 0x08 0x2F 0x6D 0xD0 0x80 0xE0 0xC8 0x16 
7ED0: 0x80 0xE7 0xD8 0x06 0x18 0xF4 0xF6 0x01 0xB7 0xBE 0xE8 0x95 0xC0 0xE0 0xD1 0xE0 
7EE0: 0x62 0xD0 0x89 0x93 0x0C 0x17 0xE1 0xF7 0xF0 0xE0 0xCF 0x16 0xF0 0xE7 0xDF 0x06 
7EF0: 0x18 0xF0 0xF6 0x01 0xB7 0xBE 0xE8 0x95 0x68 0xD0 0x07 0xB6 0x00 0xFC 0xFD 0xCF 
7F00: 0xA6 0x01 0xA0 0xE0 0xB1 0xE0 0x2C 0x91 0x30 0xE0 0x11 0x96 0x8C 0x91 0x11 0x97 
7F10: 0x90 0xE0 0x98 0x2F 0x88 0x27 0x82 0x2B 0x93 0x2B 0x12 0x96 0xFA 0x01 0x0C 0x01 
7F20: 0x87 0xBE 0xE8 0x95 0x11 0x24 0x4E 0x5F 0x5F 0x4F 0xF1 0xE0 0xA0 0x38 0xBF 0x07 
7F30: 0x51 0xF7 0xF6 0x01 0xA7 0xBE 0xE8 0x95 0x07 0xB6 0x00 0xFC 0xFD 0xCF 0x97 0xBE 
7F40: 0xE8 0x95 0x26 0xC0 0x84 0x37 0xB1 0xF4 0x2E 0xD0 0x2D 0xD0 0xF8 0x2E 0x2B 0xD0 
7F50: 0x3C 0xD0 0xF6 0x01 0xEF 0x2C 0x8F 0x01 0x0F 0x5F 0x1F 0x4F 0x84 0x91 0x1B 0xD0 
7F60: 0xEA 0x94 0xF8 0x01 0xC1 0xF7 0x08 0x94 0xC1 0x1C 0xD1 0x1C 0xFA 0x94 0xCF 0x0C 
7F70: 0xD1 0x1C 0x0E 0xC0 0x85 0x37 0x39 0xF4 0x28 0xD0 0x8E 0xE1 0x0C 0xD0 0x85 0xE9 
7F80: 0x0A 0xD0 0x8F 0xE0 0x7A 0xCF 0x81 0x35 0x11 0xF4 0x88 0xE0 0x18 0xD0 0x1D 0xD0 
7F90: 0x80 0xE1 0x01 0xD0 0x65 0xCF 0x98 0x2F 0x80 0x91 0xC0 0x00 0x85 0xFF 0xFC 0xCF 
7FA0: 0x90 0x93 0xC6 0x00 0x08 0x95 0x80 0x91 0xC0 0x00 0x87 0xFF 0xFC 0xCF 0x80 0x91 
7FB0: 0xC0 0x00 0x84 0xFD 0x01 0xC0 0xA8 0x95 0x80 0x91 0xC6 0x00 0x08 0x95 0xE0 0xE6 
7FC0: 0xF0 0xE0 0x98 0xE1 0x90 0x83 0x80 0x83 0x08 0x95 0xED 0xDF 0x80 0x32 0x19 0xF0 
7FD0: 0x88 0xE0 0xF5 0xDF 0xFF 0xCF 0x84 0xE1 0xDE 0xCF 0x1F 0x93 0x18 0x2F 0xE3 0xDF 
7FE0: 0x11 0x50 0xE9 0xF7 0xF2 0xDF 0x1F 0x91 0x08 0x95 0x80 0xE0 0xE8 0xDF 0xEE 0x27 
7FF0: 0xFF 0x27 0x09 0x94 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x04 0x04 

MD5 sum of bootloader = 0xFB 0xF4 0x9B 0x7B 0x59 0x73 0x7F 0x65 0xE8 0xD0 0xF8 0xA5 0x08 0x12 0xE7 0x9F 
Bootloader name: optiboot_atmega328

First 256 bytes of program memory:

00: 0x0C 0x94 0x61 0x00 0x0C 0x94 0x7E 0x00 0x0C 0x94 0x7E 0x00 0x0C 0x94 0x7E 0x00 
10: 0x0C 0x94 0x7E 0x00 0x0C 0x94 0x7E 0x00 0x0C 0x94 0x7E 0x00 0x0C 0x94 0x7E 0x00 
20: 0x0C 0x94 0x7E 0x00 0x0C 0x94 0x7E 0x00 0x0C 0x94 0x7E 0x00 0x0C 0x94 0x7E 0x00 
30: 0x0C 0x94 0x7E 0x00 0x0C 0x94 0x7E 0x00 0x0C 0x94 0x7E 0x00 0x0C 0x94 0x7E 0x00 
40: 0x0C 0x94 0x9D 0x00 0x0C 0x94 0x7E 0x00 0x0C 0x94 0x7E 0x00 0x0C 0x94 0x7E 0x00 
50: 0x0C 0x94 0x7E 0x00 0x0C 0x94 0x7E 0x00 0x0C 0x94 0x7E 0x00 0x0C 0x94 0x7E 0x00 
60: 0x0C 0x94 0x7E 0x00 0x0C 0x94 0x7E 0x00 0x00 0x00 0x00 0x00 0x24 0x00 0x27 0x00 
70: 0x2A 0x00 0x00 0x00 0x00 0x00 0x25 0x00 0x28 0x00 0x2B 0x00 0x00 0x00 0x00 0x00 
80: 0x23 0x00 0x26 0x00 0x29 0x00 0x04 0x04 0x04 0x04 0x04 0x04 0x04 0x04 0x02 0x02 
90: 0x02 0x02 0x02 0x02 0x03 0x03 0x03 0x03 0x03 0x03 0x01 0x02 0x04 0x08 0x10 0x20 
A0: 0x40 0x80 0x01 0x02 0x04 0x08 0x10 0x20 0x01 0x02 0x04 0x08 0x10 0x20 0x00 0x00 
B0: 0x00 0x07 0x00 0x02 0x01 0x00 0x00 0x03 0x04 0x06 0x00 0x00 0x00 0x00 0x00 0x00 
C0: 0x00 0x00 0x11 0x24 0x1F 0xBE 0xCF 0xEF 0xD8 0xE0 0xDE 0xBF 0xCD 0xBF 0x11 0xE0 
D0: 0xA0 0xE0 0xB1 0xE0 0xEA 0xE3 0xF4 0xE0 0x02 0xC0 0x05 0x90 0x0D 0x92 0xA2 0x30 
E0: 0xB1 0x07 0xD9 0xF7 0x11 0xE0 0xA2 0xE0 0xB1 0xE0 0x01 0xC0 0x1D 0x92 0xAB 0x30 
F0: 0xB1 0x07 0xE1 0xF7 0x0E 0x94 0x0C 0x02 0x0C 0x94 0x1B 0x02 0x0C 0x94 0x00 0x00 

Programming mode off.

Como se ve en la salida el Atmega328p que me regalaron si tenía un bootloader grabado como me especificaron. Ya aclarada la duda procedemos a grabarle un bootloader al Atmega328p. Abrimos la carpeta Atmega_Board_Programmer una vez allí damos doble clic sobre Atmega_Board_Programmer.ino y nos cargara el código en nuestro IDE.

Previamente ya hemos fijado las opciones para nuestra placa de Arduino en mi caso un Arduino UNO por el COM4 y subimos el código. El código funciona usando el monitor serie a 115200 baud por lo que lo abrimos y fijamos esa velocidad. Abrimos el monitor serie y nos mostrara la información de nuestro Atmega328p pero más resumida y se quedara esperando por nuestra respuesta a que bootloader le programaremos al Atemga.

LilyPad usando 8 Mhz de reloj interno (L) o usando 16 Mhz de reloj externo (U)

A lo que responderemos escribiendo la letra L en el monitor serie y le damos al botón de Enviar. Acto seguido se grabará el bootloader LilyPad en nuestro Atmega. La salida luce así:

Atmega chip programmer.
Written by Nick Gammon.
Version 1.38
Compiled on Aug 19 2020 at 22:44:36 with Arduino IDE 10812.
Attempting to enter ICSP programming mode ...
Entered programming mode OK.
Signature = 0x1E 0x95 0x0F 
Processor = ATmega328P
Flash memory size = 32768 bytes.
LFuse = 0xFF 
HFuse = 0xDE 
EFuse = 0xFD 
Lock byte = 0xFF 
Clock calibration = 0x8C 
Type 'L' to use Lilypad (8 MHz) loader, or 'U' for Uno (16 MHz) loader ...
Using Lilypad 8 MHz loader.
Bootloader address = 0x7800
Bootloader length = 1932 bytes.
Type 'Q' to quit, 'V' to verify, or 'G' to program the chip with the bootloader ...
Fixing low fuse setting ...
Programming mode off.
Attempting to enter ICSP programming mode ...
Entered programming mode OK.
Erasing chip ...
Writing bootloader ...
Committing page starting at 0x7800
Committing page starting at 0x7880
Committing page starting at 0x7900
Committing page starting at 0x7980
Committing page starting at 0x7A00
Committing page starting at 0x7A80
Committing page starting at 0x7B00
Committing page starting at 0x7B80
Committing page starting at 0x7C00
Committing page starting at 0x7C80
Committing page starting at 0x7D00
Committing page starting at 0x7D80
Committing page starting at 0x7E00
Committing page starting at 0x7E80
Committing page starting at 0x7F00
Committing page starting at 0x7F80
Written.
Verifying ...
No errors found.
Writing fuses ...
LFuse = 0xE2 
HFuse = 0xDA 
EFuse = 0xFD 
Lock byte = 0xEF 
Clock calibration = 0x8C 
Done.
Programming mode off.
Type 'C' when ready to continue with another chip ...

Bueno ya tenemos listo nuestro Atmega328p para usarlo y como plus sin un cristal externo. Ahora solo queda subirle el código del proyecto que queramos en mi caso (ardutester). Ahora viene el segundo TIP del tutorial, para subirle un codigo a nuestro Atmega lo podemos hacer de varias formas.

Usando un FTDI Serial TTL-232 USB Cable como se explica en la web de Nick Gammon en el punto Programming a sketch. Método que no usare porque no poseo el conversor de TTL a USB. Así que usaremos el método que ya está explicado en este blog. Solo tendremos que hacer unos cambios en el cableado. Eliminamos el cable que va de D9 del Arduino UNO al pin 9 (clock) del Atmega328p puesto que ya no lo necesitamos pues nuestro Atmega ahora trabaja con su oscilador interno. Subimos a nuestra placa Arduino UNO el codigo de usarlo como programador ISP que viene como ejemplo (Archivo/Ejemplos/11.Arduino ISP). Previamente ya hemos fijado las opciones para nuestra placa de Arduino en mi caso un Arduino UNO por el COM4 y subimos el código. Ahora como nuestro Arduino UNO es el programador y queremos programar el Atmega328p que ahora tiene un bootloader LilyPad debemos cambiar en el IDE nuestro tipo de placa, que ahora es LilyPAD. Seleccionar el tipo de Atmega y el puerto que en este caso es el COM 4 donde esta nuestro Arduino UNO en modo programador.

Cargamos en el IDE el código del Ardutester y usaremos la opción de subir usando programador para cargar nuestro código al LilyPad.

Como se observa en la figura el código subió correctamente y ya nuestro Atmega328p con bootloader Lilypad tiene cargado el código de Ardutester y listo para ser usado. Finalmente los dejo con una foto del Ardutester funcionando con el Atemga328p y 8 resistencias solamente.

Espero les sirva de ayuda y lo saque de apuros.

Alex out

¿De cuánta utilidad te ha parecido este contenido?

¡Haz clic en una estrella para puntuar!

Promedio de puntuación 4.2 / 5. Recuento de votos: 5

Hasta ahora, ¡no hay votos!. Sé el primero en puntuar este contenido.

Sobre Alexander Rivas Alpizar 61 artículos
Administrador de Redes EMPRESTUR Cienfuegos

Sé el primero en comentar

Dejar una contestacion

Tu dirección de correo electrónico no será publicada.


*