[problème] programmer bootloader sur breadboard

etimou:
Si j'ai bien compris, ici le "hex" du bootloader est contenu dans le sketch et est envoyé directement sur un nouvel atmega connecté (pas besoin du PC).

C'est çà en effet.

etimou:
Maintenant, ce que je voudrais faire c'est simplifier mon montage sur breadboard et supprimer l'oscillateur pour utiliser l'oscillateur interne à 8MHz.
A votre avis, est-ce que je peux toujours utiliser le même sketch Optiloader et remplacer le hex par celui qui m'intéresse, je crois que c'est ATmegaBOOT_168_atmega328_pro_8MHz?

Le choix d'utiliser l'oscillateur interne ou externe se fait pas par le bootloader mais par les fusibles.
A la fin de OptiLoader.pde tu as donc les informations de programmation de chaque processeur.
il s'agit d'une structure définie dans OptiLoader.h :

typedef struct image {
    char image_name[30];	       /* Ie "optiboot_diecimila.hex" */
    char image_chipname[12];	       /* ie "atmega168" */
    uint16_t image_chipsig;	       /* Low two bytes of signature */
    uint8_t image_progfuses[5];	       /* fuses to set during programming */
    uint8_t image_normfuses[5];	       /* fuses to set after programming */
    uint8_t image_pagesize;	       /* page size for flash programming */
    char image_hexcode[1500];	       /* intel hex format image (text) */
} image_t;

Il y a dans cette structure 2 série de valeurs de fusibles :

  • l'une utilisée durant la programmation
  • l'autre celle a remettre après la programmation -> c'est celle là qui t'interesse

Pour le ATmega328P, la structure commence par :

image_t PROGMEM image_328p = {
  {
    "optiboot_atmega328.hex"    }   // ---> image_name
  ,
  {
    "atmega328P"  }   // --------------------> image_chipname
  ,
  0x950F,				/* Signature bytes for 328P */ --> image_chipsig
  {
    0x3F,0xFF,0xDE,0x05,0   } // ---------> image_progfuses
  ,
  {
    0x2F,0,0,0,0  } // -----------------------> image_normfuses 
  ,
  128, // -------------------------------------> image_pagesize
  {
    ":107E0000112484B714BE81FFF0D085E080938100F7\n"
      ":107E100082E08093C00088E18093C10086E0809377\n"

C'est cette ligne là qu'il va falloir changer

    0x3F,0xFF,0xDE,0x05,0   } // ---------> image_progfuses

Je comprend que :

  • 1er octet = lockBits
  • 2eme octet = Low Fuses
  • 3eme octet = High Fuses
  • 4eme octet = Extended Fuses

Je n'ai pas encore regardé en détail les valeurs qu'il faudrait mettre mais c'est documenté dans le manuel du ATmega328P téléchargeable sur le site Atmel

EDIT !!!
Je viens de trouver un Wizard pour calculer les fusibles : AVR® Fuse Calculator – The Engbedded Blog

Les fusibles standards pour une UNO sont (fichier boards.txt):

uno.bootloader.low_fuses=0xff
uno.bootloader.high_fuses=0xde
uno.bootloader.extended_fuses=0x05

Après avoir sélectionné le chip ATmega328P, il suffit de rentrer ces valeurs dans les champs en bas de la page et de cliquer sur "Apply values" pour mettre à jour les autres parties de la page.
Ensuite on remonte sur la première partie et on change la ligne "Ext Crystal 8MHz..." par "Int RC Osc 8MHz .... default value" puis "Apply features settings"
Et on lit le résultat en bas : 0xE2 0xDE 0xFD (note que 0xFD ou 0x05 pour le Extended reviens au même, il s'agit de bits inutilisés positionnés à 1 ou à 0)