[problème] programmer bootloader sur breadboard

bonjour,
j'essaie de suivre la toute première étape de ce tutoriel :

Il est bien précisé que cela ne fonctionne pas avec une UNO. Je voudrais simplement une précision:

  • Est-ce qu'on ne peut pas utiliser une UNO pour programmer un bootloader?
    OU
  • Est-ce qu'on ne peut pas programmer un bootloader de UNO?

Je pense que c'est la première mais je préfère demander. Je n'ai qu'une UNO et un ATMEGA328 à programmer. Y'aurait-il un moyen?

D'autre part, j'ai quelques doutes sur le bon état de mon 328 à programmer. Si je fais le test avec la UNO pour essayer j'ai ça comme message
avrdude: stk500_paged_write(): (a) protocol error, expect=0x14, resp=0x11
avrdude: stk500_cmd(): programmer is out of sync

Si je retire l'ATMEGA de la breadboard, le message est différent:
avrdude: Yikes! Invalid device signature.
Double check connections and try again, or use -F to override
this check.

C'est bon signe non?

Bonjour

Si je comprend, tu as une UNO avec sont Atmega329P dessus + un ATmega328P vierge supplémentaire.
Tu veux flasher le bootloader UNO sur ton ATmega328P vierge.

Pour utiliser l'Arduino UNO comme programmateur il faut lire ici d'abord : http://arduino.cc/en/Tutorial/ArduinoISP

Le point 5 est important :

  1. Wire your Arduino board to the target as shown in the diagram below. (Note for the Arduino Uno: you'll need to add a 10 uF capacitor between reset and ground.)

Oui c'est ce que je veux faire.
J'ai pas de 10uF sous la main, j'ai mis un 47uF.

Si j'essaie de programmer, j'obtient:
avrdude: stk500_paged_write(): (a) protocol error, expect=0x14, resp=0x11
avrdude: stk500_cmd(): programmer is out of sync

A qu'elle étape ?

Il y a plusieurs étapes pour flasher le bootloader dans un ATmega vierge :

Etapes 1 à 4 de http://arduino.cc/en/Tutorial/ArduinoISP
--> pour charger le programma ArduinoISP dans la UNO comme n'importe quel sketch

  1. Mettre la capa

  2. Si tu utilises une UNO comme programmateur tu veux probablement flasher un bootloader UNO dans ton ATmega vierge, donc rien a changer sur l'étape 6)

  3. Flasher le bootloader avec le menu "Burn bootloader -> ArduinoISP"

Si tu as les messages d'erreur d'AVRdude ci-dessus lors de l'étape 4 c'est que tu as mis la capa trop tot.

non j'ai ce message à l'étape 7.
Je pense avoir fait le reste comme il faut.

Mais pourquoi alors est-il écrit :

Note that these techniques only work with the Arduino Duemilanove w/ an ATmega328, not the Arduino Uno (or older Arduino boards w/ an ATmega168).

donc voilà où j'en suis;
Je n'ai pas réussi à programmer le bootloader de mon Atmega328p avec le sketch ArduinoISP sur mon UNO.

Par contre, j'ai essayé avec le sketch Optiloader comme décrit ici 3guys1laser.com et là ça a marché.

Donc :

  • chip OK
  • câblage OK

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).

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?

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)

OK donc il n'y aurait que ces 5 valeurs à changer? Plus qu'à trouver les bonnes :smiley:

Ensuite comment se passe la programmation du sketch pour une board 8MHz interne?
J'ai créé le dossier "breadboard" dans sketchbook/hardware comme indiqué dans le tuto. Faut-il choisir la nouvelle board pour compiler/uploader?
J'ai essayé de compiler blink mais c'est pas top

 fatal error: pins_arduino.h : Aucun fichier ou dossier de ce type
compilation terminated.

Effectivement je n'avais pas vu cette partie du Tuto
Les valeurs des fusibles sont déjà là :

atmega328bb.bootloader.low_fuses=0xE2
atmega328bb.bootloader.high_fuses=0xDA
atmega328bb.bootloader.extended_fuses=0x05

et le .hex c'est bien ATmegaBOOT_168_atmega328_pro_8MHz.hex ?

Comment faire pour compiler? Quelle board choisir?
Quelqu'un a déjà réalisé un circuit avec un atmega328 sans oscillateur externe?

Le HEX est déjà dans OptiLoader

Tu veux dire celui pour Atmega328p?

Alors pourquoi dans le boards.txt fourni dans le tutoriel, il y a :

atmega328bb.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex

Celui-ci n'est pas dans le Optiloader... il y a un truc qui m'échappe.

Voici ce que j'ai fait aujourd'hui:

1/ Programmation avec Optiloader d'origine

0x3F,0xFF,0xDE,0x05,0

Compilation et envoi de blink par cette méthode : OK

2/ Programmation avec Optiloader modifié

0x3F,0xE2,0xDE,0xFD,0

Je retire Oscillateur, capas et resistance
Compilation et envoi de blink par cette méthode : NON OK

Erreur : avrdude: stk500_recv(): programmer is not responding

Je ne sais pas ce que ça veut dire mais la led en D13 clignote 3 fois à la mise sous tension...