Arduino mega2560 maison : bootloader + avrdude timeout

Bonjour à tous,

Je suis en train de me faire un petit Arduino mega maison, je suis donc parti du ATMEGA2560 8Mhz, car je veux l'utiliser en 3.3Volts. Un peu comme avait fait SparkFun avec son mega pro 3.3V, mais qui n'est plus commercialisé.

En ajoutant cette URL dans la case permettant de charger des cartes supplémentaire dans l'IDE, je peux utiliser le meg2560 en version 3.3v / 8Mhz : https://raw.githubusercontent.com/sparkfun/Arduino_Boards/master/IDE_Board_Manager/package_sparkfun_index.json

Deux choses que j'aimerai éclaircir :

Fichier de conf hardware + bootloader
Sur le site de Sparkfun il y a les "Board définitions files" Mega Pro Mini - 3.3V - DEV-10743 - SparkFun Electronics, j'ai tenté de mettre le dossier dans Mes Doc > Arduino > hardware mais j'ai une erreur car d'après mes recherches la structure du dossier a un peu évoluer et par exemple il n'y a pas le fichier "programmers.txt" dans ce que l'on peut télécharger sur Sparkfun, bref, c'est pour ça que je suis passé par l'URL donnée plus haut.
Par contre du coup je ne sais pas ce que je met comme version lorsque je met le bootloader dans l'ATmega et j'aimerai bien disposer des fichiers, car je n'aimerai pas me retrouver comme un c** le jour où SparkFun fait le ménage dans ses fichiers.
Vous savez où je peux récupérer ces fichiers ?

stk500v2_ReceiveMessage(): timeout
Après avoir flashé le bootloader, j'ai envoyé le programme blink, tout semble fonctionner, puis j'ai essayé avec "DigitalReadSerial", il envoi le programme et au moment du check :

avrdude: verifying ...
avrdude: 2706 bytes of flash verified
avrdude: stk500v2_recv(): checksum error
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_getsync(): timeout communicating with programmer
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_getsync(): timeout communicating with programmer
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_getsync(): timeout communicating with programmer
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_getsync(): timeout communicating with programmer
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_getsync(): timeout communicating with programmer
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_getsync(): timeout communicating with programmer
avrdude: stk500v2_command(): failed miserably to execute command 0x11
avrdude: stk500v2_disable(): failed to leave programming mode

avrdude done.  Thank you.

Après moults essais, le fait de rajouter un delay(2000); au tout début du setup permet de ne plus avoir ce soucis. J'ai pu reproduire la même situation avec le programme de démo "ReadAnalogVoltage".
A noter que le programme est bien envoyé à la carte, car j'ai ouvert le port série et j'avais bien les infos qui défilaient.

Savez-vous ce qu'il se passe ??

Merci pour votre aide.

Bon, j'ai fait un test en mettant le bootloader du mega2560 intégré à l'IDE arduino, et dans le boards.txt, j'ai gardé les paramètres Sparkfun mais en modifiant les fuses par ceux d'Arduino

################################################################################
################################### Mega Pro ###################################
################################################################################
megapro.name=Mega Pro 2560

megapro.upload.tool=arduino:avrdude
megapro.upload.protocol=wiring
megapro.upload.maximum_data_size=8192

megapro.bootloader.tool=avrdude
megapro.bootloader.unlock_bits=0x3F
megapro.bootloader.lock_bits=0x0F

megapro.build.board=AVR_MEGA2560
megapro.build.core=arduino:arduino
megapro.build.variant=arduino:mega
megapro.build.mcu=atmega2560

################################# Mega Pro 3.3V ################################
megapro.menu.cpu.atmega25603V3=ATmega2560 (3.3V / 8 MHz)

megapro.menu.cpu.atmega25603V3.upload.maximum_size=258048
megapro.menu.cpu.atmega25603V3.upload.speed=57600

megapro.menu.cpu.atmega25603V3.bootloader.low_fuses=0xFF
megapro.menu.cpu.atmega25603V3.bootloader.high_fuses=0xD8
megapro.menu.cpu.atmega25603V3.bootloader.extended_fuses=0xFD
megapro.menu.cpu.atmega25603V3.bootloader.file=mega/stk500boot_v2_mega2560.hex

megapro.menu.cpu.atmega25603V3.build.f_cpu=8000000L

Je n'ai plus de soucis d'upload sur les quelques essais que j'ai pu faire.
Par contre petite question : est-ce que le bootloader embarque des notions de vitesse d'horloge ?
Car dans mon cas je passe de 16Mhz à 8Mhz, j'ai bien modifié le boards.txt en spécifiant la nouvelle fréquence.

En gros : avec la manip que j'ai fait, vais-je avoir des soucis de timing sur certaine fonction, ou tout va fonctionner parfaitement ?

Merci :slight_smile:

JE vois mal comment votre boat ladder, qui reçoit ce qu'il doit mettre en place via une liason série asynchrone, pourrait ignorer la vitesse d'horloge (comment gérerait-il son port série)

Je ne comprend pas bien ta remarque, si le bootloader est configuré pour dialoguer à, admettons, 9600bps, et que c'est pareil dans l'IDE Arduino, où est le problème ? Que l'ATmega soit cadencé à 16Mhz ou 8Mhz, on saura dans les deux cas dialoguer à 9600bps sur le port série.

Je ne sais pas comment tout ça est articulé, mais force est de constater que j'arrive bien à uploader un sketch via le port série.

LE boat loader recoit sur la jonction série un programme (sauf s'il ne ... reçoit rien: alors, il saute au code existant).
Pour recevoir sur une jonction série asynchrone, il faut connaître la cadence de l'emetteur (ou que l'émetteur adapte sa cadence....) sinon, je vous laisse imaginer les dégâts.

La cadence de la jonction série est programmée par division de la fréquence du quartz/résonateur (donc, si on est à 8 Mhz et que le bootloader croît qu'on est à 16 Mhz, il devra recevoir deux fois plus lentement ... ou interprètera ce qu'il recevra comme des horreurs)

Le bootloader stk500boot_v2_mega2560.hex est prévu pour une fréquence de 16MHz.

Comme le baudrate normalement utilisé est de 115200, à 8MHz il va descendre à 115200 / 2 = 57600.

Comme megapro.menu.cpu.atmega25603V3.upload.speed=57600 dans ton cas vaut 57600, ça roule.

C'est une pirouette :wink:

Si tu voulais le charger à 115200, il faudrait recompiler un bootloader.

J'ose à peine imaginer ce que ça donnerait avec un quartz à 10 ou 12 Mhz (reste dans la gamme d'alimentation 3.3v) : je parie que les cadences de Baud sont préfixées (des multiples de 1200, disons)

Il faut recompiler le bootloader en changeant la vitesse d'horloge dans le Makefile.

arduino-1.8.5/hardware/arduino/avr/bootloaders/stk500v2 :

Makefile :

mega2560: F_CPU = 16000000

Ensuite le code recalcule : stk500boot.c

#define BAUDRATE 115200
UART_BAUD_RATE_LOW = UART_BAUD_SELECT(BAUDRATE,F_CPU);

Salut,

Ok, merci pour ces explications, je comprends mieux pourquoi j'arrivait à balancer un sketch donc. :smiley:

Du coup je peux laisser tel quel où il y d'autres choses gérées par le bootloader qui vont poser problème ?

Laisse comme ça. Cela ne pose pas de problème.