Arduino / ATmega : programmation ISP

Aujourd’hui on va voir comment programmer une puce ATmel qui ne dispose pas de connexion USB intégrée, en utilisant un Arduino qui lui, a un USB. Cette méthode fonctionne (à ma connaissance) avec tous les micro-processeurs de la famille ATmega/ATtiny qui disposent du SPI, ainsi que les différents Arduinos.

Pourquoi faire ?
Dans ma conception des choses, un Arduino est un élément de prototypage, exactement au même titre qu’une breadboard. Il sert à simplifier le développement. Une fois cette étape effectuée, on bascule la partie électronique de l’Arduino qui nous intéresse sur un circuit dédié, et l’Arduino peut resservir au prototype suivant. Et ainsi de suite. J’y vois plusieurs avantages :
– C’est économique : la puce ATmega328 qui compose la plupart des Arduinos coute une fraction de l’Arduino,
– c’est relativement facile et rapide une fois compris la méthode,
– ça permet d’apprendre énormément sur l’électronique en général.

On va voir en détail comment programmer un ATmega328P-PU (sur son oscillateur interne pour réduire le nombre de composants) et un Arduino Pro Mini 3.3v 8MHz. Cette méthode est reproductible avec n’importe quel chip Atmel qui dispose du SPI (ATtiny84 par exemple).

Composants nécessaires :
– un Arduino (Uno dans notre exemple)
– une puce ATmega / ATiny / un Arduino Pro Mini
– une breadboard
– du câble de prototypage

  • Etape 1 : Préparer la partie logicielle

Pour la partie logicielle, vous aurez besoin :
– de l’IDE Arduino (1.0.5 fonctionne très bien)
– du bootloader correspondant au chip que vous voulez programmer (pas nécessaire pour un Arduino pro mini, ou un ATmega déja bootloadé)
– d’un sketch arduino un peu spécial pour utiliser l’Arduino comme un programmeur.

Le bootloader
Qu’est-ce que le bootloader ?
Le bootloader est un genre de BIOS pour microcontrôleur. Il gère les paramètres bas-niveau de la puce, comme sa fréquence, son voltage, etc. Chaque microcontrôleur a sa propre version du bootloader : le bootloader d’un ATmega8 ne sera pas compatible avec un ATmega328, par exemple.
Donc, quand vous voudrez programmer une puce, commencez par vous assurer d’avoir le bootloader requis, et l’ajuster selon vos besoins.

Cette fois, les bootloaders que nous allons utiliser font partie de l’Arduino IDE. Nous avons juste à ajouter une nouvelle entrée à la liste existante, pour notre ATmega328P-PU 3.3v 8MHz. D’autres types de puces peuvent nécessiter quelques étapes supplémentaires, mais nous verrons cela dans un prochain article.

Ouvrez le fichier boards.txt situé dans le dossier %ARDUINO PROGRAM%\hardware\arduino\ avec un éditeur texte, et rajoutez cette entrée au début ou à la fin du fichier :

##############################################################
atmega328_8.name=ATmega328 (3.3v, 8MHz)
atmega328_8.upload.protocol=arduino
atmega328_8.upload.maximum_size=32256
atmega328_8.upload.speed=38400
atmega328_8.bootloader.low_fuses=0xE2
atmega328_8.bootloader.high_fuses=0xde
atmega328_8.bootloader.extended_fuses=0x05
atmega328_8.bootloader.path=optiboot
atmega328_8.bootloader.file=optiboot_atmega328.hex
atmega328_8.bootloader.unlock_bits=0x3F
atmega328_8.bootloader.lock_bits=0x0F
atmega328_8.build.mcu=atmega328p
atmega328_8.build.f_cpu=8000000L
atmega328_8.build.core=arduino
atmega328_8.build.variant=standard

Après le redémarrage de l’IDE Arduino, vous devriez voir votre nouvelle « board » dans la liste : ATmega328 (3.3v, 8MHz)
L’Arduino Pro Mini est quant à lui déjà dans la liste : Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328

Le sketch Arduino
Notre Arduino a besoin d’un sketch spécial pour être capable d’agir comme un programmeur. Cependant, le sketch ArduinoISP livré avec l’Arduino IDE semble ne pas fonctionner. Il en existe un autre, meilleur, et qui fonctionne : mega-isp
Téléchargez ce sketch, et uploadez le dans votre Arduino de la manière habituelle.

La partie logicielle est maintenant prête.

  • Etape 2 : les cablages

Il n’y a vraiment rien de compliqué ici, on se contente de relier l’Arduino au microcontrôleur cible via la connexion SPI :

Programmeur Arduino ATmega328P Arduino Pro Mini
10 PC6 (RESET) RESET
11 (MOSI) PB3 (MOSI) 11 (MOSI)
12 (MISO) PB4 (MISO) 12 (MISO)
13 (SCK) PB5 (SCK) 13 (SCK)

Ce qui devrait vous donner ce résultat :
atmega328_ISPpro_mini_ISP
Vous devriez choisir le bon voltage d’entrée pour votre puce : 3-5V pour un ATmega328P-PU, 3-12V pour l’Arduino Pro Mini 3.3v). La masse (GND) doit être commune.

Dans le sketch ArduinoISP, vous pouvez remarquer que quelques composants peuvent être ajoutés au circuit pour faire du débogage, mais ils ne sont pas nécessaires.

Votre branchement est prêt, passons à la dernière partie.

  • Etape 3 : Programmer le microcontrôleur

Maintenant que le logiciel et le matériel sont prêts, branchez votre Arduino programmeur dans l’ordinateur, et lancez l’IDE Arduino. Vous devriez voir votre Arduino apparaitre dans la liste des ports COM comme d’habitude. Si ce n’est pas le cas, débranchez l’Arduino, quittez toutes les fenêtre IDE ouvertes, rebranchez l’Arduino, et redémarrez l’IDE.

Vous devez maintenant choisir le bon microcontrôleur et le bon programmeur dans le menu outils. Donc, si vous voulez programmer un ATmega328, choisissez notre nouveau ATmega328 (3.3v, 8MHz), et si vous voulez programmer un Arduino Pro Mini, choisissez Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328 (ou la version 5v si vous utilisez un Pro Mini 5v, bien sûr…)

Ensuite, dans le menu programmateur, choisissez Arduino as ISP.

Maintenant, vous pouvez uploader le bootloader : cliquez simplement sur le bouton « graver la séquence d’initialisation » dans le menu Outils. Après quelques secondes d’activité sur l’Arduino, l’IDE devrait vous afficher un joli :

avrdude: verifying ...
avrdude: 1 bytes of lock verified
avrdude: Send: Q [51]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 

avrdude done.  Thank you.

C’est terminé pour le bootloader.

Maintenant, vous pouvez uploader votre sketch de la manière habituelle, en utilisant le bouton « Téléverser avec un programmateur » présent dans le menu Fichiers. Si vous tentez d’utiliser le bouton « téléverser » habituel, vous obtiendriez une erreur de type « not in sync: resp=0×00« 

Si tout s’est bien passé, vous devriez obtenir :

avrdude: verifying ...
avrdude: 1108 bytes of flash verified
avrdude: Send: Q [51]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 

avrdude done.  Thank you.

Félicitations, c’est terminé, et vous êtes maintenant capable de construire vos propres clones d’Arduino sur des perfboard, des breadboards, et créer vos propres circuits…

Pour ma part, j’ai même créé un shield arduino sur un bout de perfboard. Plus besoin de passer par l’étape câblage à chaque nouvelle programmation 🙂

20140204_145543

About Captain Stouf

Spécialiste en systèmes informatiques, Développeur matériel et logiciel, Inventeur, Maker : électronique, Systems on Chip, micro-controlleurs, Internet of Things, Modélisation / Scan / Impression 3D, Imagerie...

68 thoughts on “Arduino / ATmega : programmation ISP

  1. Morgan
    22/03/2014 at 9 h 53 min

    Bonjour,
    Que me conseilleriez-vous pour programmer une atmega128(seule) avec une UNO rev3 smd ?
    Merci d’avance.

    1. Captain Stouf
      22/03/2014 at 17 h 06 min

      Bonjour,
      Je suppose que vous parlez de la version TQFP du 128 ?
      J’imagine que vous avez prévu de designer un circuit correspondant (dur dur de travailler du TQFP sur une perfoboard ^^).
      Dans ce cas, le mieux à mon sens serait d’inclure directement un header ISP sur le circuit (donc VCC, GND, MISO, MOSI, CLK et RESET), et de le programmer une fois monté, via le Uno, comme dans le tuto.
      Je suppose que vous l’avez déja, mais voici un diagramme qui peut servir : http://www.rlocman.ru/i/Image/2010/02/10/1.gif (http://www.radiolocman.com/op/device.html?di=63108&/AVR-H128)
      Le fait que le Uno soit SMD ne change rien à la méthode (le mien est un SMD aussi).
      En ce qui concerne la compatibilité avec l’IDE arduino (il faut un bootloader), je pense que cette librairie devrait faire l’affaire : http://download.chip45.com/chip45-arduino-extension.zip

      1. Morgan
        22/03/2014 at 19 h 00 min

        Bonjour,
        Merci pour votre réactivité ce que vous m’avez répondu me sera utile mais je me suis mal exprimé.
        Enfaite je cherche à programmer des atmega 128 en dip pour faire mes tests et je débute sur arduino.
        Je ne sais pas comment faire pour les programmer avec ma carte SMD. Si j’avais eu la version DIp, un simple changement d’atmega aurai suffit.
        Merci encore.

        1. Morgan
          23/03/2014 at 1 h 23 min

          Je viens de m’apercevoir d’une bêtise, je voulais bien sur parler de l’atmega 328 et non 128.
          Merci à vous.

          1. Captain Stouf
            25/03/2014 at 15 h 38 min

            Ah, je me disais aussi, le 128 n’existe qu’en CMS… 🙂
            Donc c’est plus simple, que le Uno soit SMD ne change strictement rien au tuto :

            Uno  | Atmega328
            5V   | 5V
            GND  | GND
            MISO | MISO
            MOSI | MOSI
            SCK  | SCK
            D10  | RESET

            C’est peut-être pas clair dans le tuto, mais avec la méthode présentée ici, il n’y a pas besoin d’enlever le 328 du Uno. Il reste à sa place. Il y a juste 5 fils à tirer du Uno à l’ATmega. Donc Uno SMD ou DIP, c’est pareil (j’utilise les 2 modèles pour programmer mes ATmega, sans aucune différence)

  2. Barnay
    12/05/2014 at 9 h 01 min

    Moi j’ai besoin de programmer un atmega 328 en smd, je dois donc créer des pistes jusqu’à un connecteur pour le programmer ? Pour qu’il fonctionne de façon autonome je met 2 condo et un quartz ?

    1. Captain Stouf
      12/05/2014 at 14 h 46 min

      Bonjour,
      Oui, c’est exactement ça.
      Une autre possibilité est d’utiliser un adaptateur de ce genre là : . Il permettrait de programmer le chip avant de l’installer sur sa board finale.
      En ce qui concerne les 2 condos et le quartz, ils ne sont obligatoires que si on désire une clock ultra-stable et supérieure à 8MHz (la limite constructeur pour un 328 en 3.3v). Pour réaliser un clone de Uno (5v-16MHz) par contre, alors effectivement les condos et le quartz sont obligatoires.
      Sur un circuit final, j’aurai tendance à vous conseiller de rajouter un condo de découplage (100nF par exemple) à l’entrée VIN-GND du 328.

      1. Barnay
        13/05/2014 at 0 h 18 min

        En fait en cours j’ai développé un truc tout con sur arduino et je dois maintenant le miniaturiser.. C’est quoi le truc d’adapteur dont tu parles pour programmer ?

        1. Captain Stouf
          13/05/2014 at 2 h 18 min

          L’adaptateur permet de brancher temporairement un composant SMD sur une breadboard, pour le programmer et ensuite le souder sur une board dépourvue de port de programmation. Ou encore, d’utiliser simplement un composant SMD sur breadboard comme un composant traversant. Ce n’est peut-être pas ce qu’il te faut, si tu ne refais jamais de SMD, il ne te servira plus à rien.
          Si tu as la place sur la board, le mieux je pense c’est de prévoir la connection SPI directement dessus.

          Sinon, je ne sais pas si tu as besoin de beaucoup de pins / beaucoup de mémoire, mais tu as la série des ATtiny (ATtiny84 par exemple, 8k de mémoire, j’aime beaucoup) qui sont petits, et traversants…

          1. 20/06/2014 at 11 h 06 min

            Bonjour,

            A quoi cela sert-il d’acheter un Atmega sans bootloader sachant que c’est le même prix qu’avec ? (à quelques centimes près)

          2. Captain Stouf
            21/06/2014 at 3 h 32 min

            Bonjour ! Certes, la plupart des Atmega qu’on trouve sur eBay ou dans des boutiques en petites quantités sont souvent bootloadés Uno. Par contre quand on les achète en « gros », chez des distributeurs genre farnell etc, ils sont le plus souvent vierges et configurés en 8Mhz interne, 3.3v et clock/8 (de mémoire).
            La procédure pour « bootloader » en ISP sert surtout ici à reconfigurer l’Atmega (on change les « fuses »).

  3. Yann
    30/06/2014 at 15 h 47 min

    Bonjour,
    Je me lance dans la programmation d’un ATmega 328p j’ai bien lu votre tutoriel et il différent d’autres que j’ai déjà lu concernant le bootloadage (je sais pas si ce terme existe mais boin :p) , dans d’autres tutoriels il dise cela : »La broche 9 et 10 doivent être reliés à la 16Mhz quartz et les deux condensateurs en céramique.  » J’aurai voulu donc etre sur de pouvoir acheter un ATmega328p de le bootloader sans passer par un crystal 16Mhz ainsi que les deux condos

    Merci de ta réponse 😉

    1. Captain Stouf
      30/06/2014 at 15 h 56 min

      Bonjour,
      Je confirme, l’atmega328p-pu fonctionne tres bien sur son oscillateur interne, a 8mhz et en 3,3v. Donc, sans le quartz 16mhz ni les 2 condos.
      Le bootloader sert dans ce cas uniquement à régler les fuses de l’atmega (on lui dit de fonctionner sur son oscillateur interne réglé a 8mhz).
      D’apres la datasheet on doit meme pouvoir monter a 12mhz en 3,3v.
      Au besoin n’hesites pas a demander 😉
      A bientot !

      1. Yann
        30/06/2014 at 18 h 41 min

        Merci pour tes réponses rapides tu m’évites des achats inutiles 😉 Je vais donc appliquer ton tutoriel a la lettre et continue comme ça c’est abordable pour tous les niveaux ( comme pour moi étant débutant 😉

        1. Yann
          12/07/2014 at 22 h 10 min

          Bonsoir, j’ai bien essayer de bootloader mon atmega328p mais lorsque je lance la séquence d’initialisation ma led TX s’allume puis plus rien ne se passe. Quel est le probléme ? Pourrais tu m’aider ?

        2. Yann
          12/07/2014 at 22 h 56 min

          En fait je pense que mon probleme vient du sketch arduinoISP puisque que lorsque que j’essaye de le téléverser il m’indique qu’il y a une eurreur de compilation

  4. Yann
    14/07/2014 at 19 h 44 min

    Bonsoir,
    Lorsque j’essaye de téléverser le sketch ArduinoiSP sur ma arduino Uno celui-ci m’indique une erreur de compilation . Je ne sais plus quoi faire , pourrais tu m’aider ?

    1. Captain Stouf
      14/07/2014 at 20 h 05 min

      Salut,
      – pourrais tu m’indiquer tes branchements ?
      – si je comprends bien, tu n’arrives pas à uploader le sketch ArduinoISP sur ton Uno. Quel script utilises tu, et sous quelle version de l’IDE Arduino ?
      – tu as bien la board ‘Uno’ sélectionnée dans l’IDE ?
      – tu utilises bien le bouton d’upload normal, et pas la fonction ‘Téléverser avec un programmateur’ ?

      Pour être sûr de ne pas créer de conflit (ça ne devrait pas être necessaire), essaies de faire cet upload sans brancher l’ATmega328 au UNO.

      1. Yann
        14/07/2014 at 21 h 13 min

        Au niveau des branchages j’ai réalisé exactement les mêmes que ceux que tu indiques, j’utilise le script que tu mets a notre disposition ‘mega-ISP’
        Je suis sur la version 1.0.5-R2 de l’IDE arduino sous windows 8.1, j’ai bien la carte UNO sélectionner dans Board, et effectivement j’utilise bien le bon bouton : l’erreur de compilation que j’ai est la suivante :
        In file included from C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino/Arduino.h:213,
        from ArduinoISP.ino:56:
        C:\Program Files (x86)\Arduino\hardware\arduino\variants\standard/pins_arduino.h:41: error: expected unqualified-id before numeric constant
        C:\Program Files (x86)\Arduino\hardware\arduino\variants\standard/pins_arduino.h:42: error: expected unqualified-id before numeric constant
        C:\Program Files (x86)\Arduino\hardware\arduino\variants\standard/pins_arduino.h:43: error: expected unqualified-id before numeric constant

        Merci de ton aide 🙂

        1. Captain Stouf
          16/07/2014 at 13 h 41 min

          Je viens de t’uploader 2 scripts sur mon github :
          – le script Arduino ISP que j’utilise, copié directement de mon dossier sketchbook, donc il fonctionne (des fois que le script linké ait été modifié entre temps ??)
          – un script ATmegaBoardDetector qui permet de détecter le modèle d’ATmega branché en SPI, sa configuration de fuses etc. Très pratique pour déterminer une erreur de branchement, une erreur de signature du chip, une erreur de fuses, un chip grillé, etc…
          Dis moi si ça fonctionne avec ce script ArduinoISP.

          Certains modèles de Uno semblent assez mal gérer l’autoreset pendant l’upload. Tu pourrais essayer de rajouter une résistance de 120 ohms (ou une résistance de 100 ohms + 2×10 ohms) entre le +5v (ou +3.3v) et la pin reset. Cela devrait empêcher l’Arduino de faire son reset à chaque connection série (http://playground.arduino.cc/Main/DisablingAutoResetOnSerialConnection).

          Tu as déja essayé d’uploader un sketch lambda dans le Uno (genre l’exemple blink) ? Ca se passe correctement ?

  5. Yann
    16/07/2014 at 15 h 22 min

    J’ai bien essayer avec ton sketch arduino ISP une erreur s’affiche (encore^^):
    avrdude: Yikes! Invalid device signature.
    Double check connections and try again, or use -F to override
    this check.

    Du côté de ATmegaBoardDetector
    celui me revoie des caractéres aléatoire en voie série ( j’ai garder les memes branchages que ceux indiquer ci-dessus)

    Et au niveau de la résistance de 120Ohms
    je n’en dispose pas actuellement, j’ai lu autre part qu’il est possible de mettre un condo de 10microF ?

    Merci de ton aide 🙂

  6. Yann
    16/07/2014 at 15 h 36 min

    Nouvelle essai avec ton sketch ArduinoISP, nouvelle erreur :
    avrdude: stk500_program_enable(): protocol error, expect=0x14, resp=0x50
    avrdude: initialization failed, rc=-1
    Double check connections and try again, or use -F to override
    this check.

    avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51

    Je commence a ne plus rien comprendre

    1. Yann
      16/07/2014 at 16 h 35 min

      J’ai brancher les leds comme indiquer sur la Pin 8 dema arduino (celle qui indique normalement une erreur ) en branchant la cathode sur mon 5V, et l’anodesur la pin8, et celle-ci demeure toujours allumer . Cela aurait-il un rapoort avec mon probléme ?

      1. Captain Stouf
        16/07/2014 at 18 h 48 min

        Les leds sont optionnelles (perso, je ne les mets pas quand je programme sur breadboard). De plus, généralement, une Led se câble comme ceci (au plus simple) : GPIO – LED – Resistance – GND.
        Ensuite, au sujet de l’erreur particulière expect=0x14, resp=0x51 (je ne l’avais jamais vue), j’ai trouvé cette page avec quelques réponses : http://winwiki.org/avrdude-stk500_disable-protocol-error-expect0x14-resp0x51/
        En particulier :

        Most Avrdude: Stk500_disable(): Protocol Error Expect=0×14 Resp=0×51 errors are due to damaged files in a Windows operating system
        […]
        Numerous events may trigger system file errors. Most common examples include: 1) incomplete software installation; 2) incomplete software uninstallation; 3) improperly deleted hardware drivers, and 4) improperly deleted software applications. Also, Avrdude: Stk500_disable(): Protocol Error Expect=0×14 Resp=0×51 errors are very common during PC restarts that immediately follow a previous improper shutdown and recent virus or malware infection recovery.

        Donc en gros, cela serait dû à un Windows endommagé ou vérolé. Encore une bonne raison de passer sous Linux :p

        1. Yann
          16/07/2014 at 19 h 15 min

          Ok merci de ton aide, je pense essayer avec un autre pc ,pour linux je me tate depuis un bon moment :p c’est juste qu’en dual boot avec Windows 8.1, la derniere fois que j’ai tenter il me l’as pas reconnu et j’ai pas trop envie de prendre de risques avec le partitionnement de mon DD 😉

          1. Captain Stouf
            16/07/2014 at 19 h 21 min

            Normalement, une bonne distrib Linux (debian, Ubuntu) est capable de te repartitionner ton disque très proprement, en te faisant un menu de boot automatiquement, le tout pendant l’install.
            Après, les PC récents avec bios UEFI peuvent être super difficiles à faire démarrer sur autre chose que windows 8 (le numéro de série de windows 8 est taggé directement dans le bios machine, pour empêcher théoriquement d’installer un autre OS ou une version piratée).
            Sinon, tu pourrais tenter d’installer Arduino ERW, c’est un mod de l’IDE Arduino poru windows, basé sur la 1.0.5, et vraiment sympa. Il réinstalle certaines librairies, alors avec un peu de chance… http://forum.arduino.cc/index.php?topic=118440.0
            Sinon, tu as un Raspberry Pi sous la main ? L’IDE Arduino tourne très bien dessus, même si il est lent…

  7. Yann
    16/07/2014 at 19 h 54 min

    Non je n’ai pas de rasperry Pi sous disponible par contre je vais essayer Arduino ERW sa m’a l’air sympa

    1. Yann
      16/07/2014 at 19 h 57 min

      Juste au niveau de L’atmegaDetectBoard comment fonctionne-il ? et quels sont les branchements a faire ?

      1. Captain Stouf
        16/07/2014 at 20 h 00 min

        Ce sont les memes branchements que arduinoISP (spi-spi). Si l’atmega fonctionne, il sera détecté via la console serie.

        1. Yann
          16/07/2014 at 21 h 23 min

          j’imagine qu’il faut qu’il soir bootloader dans ce cas ?

          1. Captain Stouf
            16/07/2014 at 21 h 46 min

            Non, jusqu’a aujourd’hui il m’a toujours bien detecté mes atmega, a part si le chip est grillé

  8. Yann
    16/07/2014 at 21 h 58 min

    D’accord par contre la j’ai un gros doute, pour téléverser un programme sur ma carte il faut choisir un programmeur ?(AVRISP mkII, parallel programmer …)

    J’ai compris pourquoi AtmegaBoardDetector ne fonctionnait pas, j’avais pas mis le meme nombre de bauds (9600 au lie 115200 ^^)
    Par contre il m’affiche seulement :
    Atmega chip detector.
    C’est une bonne ou mauvaise nouvelle ?

    1. Captain Stouf
      16/07/2014 at 22 h 07 min

      Pour téléverser un sketch dans l’arduino directement :
      – programmateur : AVRISP
      – bouton upload (la petite fleche)
      Pour téléverser un sketch dans un ATmega connecté en SPI à un Arduino :
      – programmateur : Arduino as ISP
      – fichier – « téléverser avec un programmateur »

      Ah oui, un petit détail : les menus de l’IDE Arduino ne reflettent pas forcément bien la configuration qui est appliquée réellement. Tu peux avoir AVRISP coché, mais l’IDE tente quand même d’utiliser « Arduino as ISP », par exemple. Tu choisis autre chose et re-choisis AVRISP, ca résoud le problème. J’ai souvent ce souci dès que j’ai plusieurs fenêtres Arduino ouvertes avec plusieurs configs différentes (voire plusieurs Arduino branchés en simultanés).
      Il y a un « bug » similaire avec la liaison série qui parfois se plante, et peut nécessiter un reboot.

      Si l’AtmegaChipDetector ne dit rien de plus, c’est qu’il ne voit pas le chip : soit le cablage est faux, soit l’ATmega est HS.

      1. Yann
        16/07/2014 at 22 h 18 min

        Ok je retenterai demain , et au niveau du ATmegaBoarddetector cela veut dire que mon Atmega328p est griller ? –‘

        1. Captain Stouf
          16/07/2014 at 22 h 27 min

          Ou que la connection est mauvaise.
          Si ce n’est pas déja fait, essaies d’alimenter l’ATmega en 5v le temps de l’upload. Il ne risque absolument rien, mais j’ai un atmega dans le tas qui fonctionne très bien en 3.3v mais ne s’upload qu’en 5v.

  9. zygmunt
    17/07/2014 at 0 h 07 min

    Bonjour, je vous remercie pour le tuto très bien détaillé !
    Mon probleme est que maintenant j ai ce message d erreur :
    avrdude: verification error, first mismatch at byte 0x0000
    0x0c != 0xff
    avrdude: verification error; content mismatch

    Comprends rien 🙁

    1. Captain Stouf
      17/07/2014 at 4 h 32 min

      Bonjour,
      Cette erreur, c’est généralement quand on n’a pas sélectionné la bonne board ou le bon programmateur. Cela te dit que avrdude (l’executable qui upload) a envoyé 0x0c à ton ATmega et a obtenu la réponse 0xFF (= -1), donc pas de réponse du tout. Donc, ATmega grillé ou mal branché. Si c’est un ATmega328P, as-tu essayé de l’alimenter en 5v plutôt que 3.3 ? (il ne craint rien mais ça peut aider à effectuer l’upload)
      C’est un peu normal de ne rien comprendre au départ, la chaine est quand même complexe et le moindre oubli/bug/erreur mène forcément à une erreur. Dans ce cas, le mieux c’est souvent de tout défaire, tout rebooter (le bonhomme y compris), et tout reprendre à zero un peu plus tard, au calme 🙂

  10. Yann
    17/07/2014 at 8 h 55 min

    J’ai passer un antivirus sur ma machine, maintenant je n’ai plus l’erreur la:
    avrdude: stk500_program_enable(): protocol error, expect=0×14, resp=0×50
    avrdude: initialization failed, rc=-1
    Double check connections and try again, or use -F to override
    this check.
    avrdude: stk500_disable(): protocol error, expect=0×14, resp=0×51

    Mais celle-ci:

    avrdude: Yikes! Invalid device signature.
    Double check connections and try again, or use -F to override
    this check.

    1. Captain Stouf
      17/07/2014 at 12 h 38 min

      Ca avance… l’atmega est bien un 328p-pu ?
      La config des fuses est differente selon les modeles de 328.

      1. Yann
        17/07/2014 at 13 h 51 min

        Oui , c’est bien un atmega 328p-pu

        1. Captain Stouf
          17/07/2014 at 13 h 53 min

          Tu as fait l’essai en 5v ?

          1. Yann
            17/07/2014 at 14 h 30 min

            J’ai essayer avec du 5V voila sa réponse:
            -Avec un condo de 10microF entre reset et GND
            ‘avrdude: Expected signature for ATMEGA328P is 1E 95 0F
            Double check chip, or use -F to override this check.’

            – sans condo :
            ‘avrdude: stk500_recv(): programmer is not responding’

          2. Captain Stouf
            17/07/2014 at 23 h 03 min

            C’est plutôt bon signe : tu sais maintenant que tu as besoin du condo, et que tu dois utiliser le 5V (je vais modifier l’article en conséquence).
            Si tu lances ATmegaBoardDetector, il détecte quelque chose maintenant ? Si oui, la signature du chip correspond à 1E 95 0F ?

  11. zygmunt
    17/07/2014 at 11 h 00 min

    Merci de ta réponse, je pense qu’il est grillé alors plus qu ‘a racheter 🙂
    Autres chose,
    J ai une autre arduino parfaitement fonctionnelle, j’y ai upload le sketch blink sur le pin 8, la led clignote tres bien. Mais mon probleme c’est que j ai retiré le microcontrolleur atmega 328p pour le mettre sur une breadborad mais impossible de refaire clignoter la led , pourtant j ai bien relié le pin 8.

    1. zygmunt
      17/07/2014 at 21 h 39 min

      Je pense que j ai compris mon probleme, vu que mon atmega est sur horloge externe donc 16mhz(ou un truc comme ca) et quand je retire mon atmega de l’uno pour mettre sur une breadboard il n y a pu les condo et tout ducoup rien de marche (si je me trompe pas)
      Ma question est peux ton mettre l atmega 328p sur l horloge interne depuis son shield uno et juste avec l ordi ?

      1. Captain Stouf
        17/07/2014 at 22 h 57 min

        Ah, effectivement le détail est d’importance.
        – Si tu appliques une configuration avec une horloge externe à un ATmega, il aura forcément besoin de cette horloge externe pour fonctionner
        – si tu le configures sur son horloge interne, il devrait pouvoir fonctionner avec une horloge externe présente ou pas (il tournera de toute facon sur son horloge interne)

        Donc effectivement, si tu configures un ATmega en 16MHz externe, il ne fonctionnera pas seul sur une breadboard.
        Pour le reprogrammer, tu as 3 solutions à ma connaissance :
        – lui ajouter un crystal le temps de le reconfigurer
        – si tu as un Uno non-SMD, tu devrais pouvoir remplacer l’ATmega du Uno par l’ATmega à programmer, et le reconfigurer comme ça
        – utiliser un second arduino/atmega qui jouera le rôle d’horloge externe, le temps de reprogrammer. Plus de détails ici : http://blog.louic.nl/?p=161

        C’est une erreur qu’on fait généralement tous avec le premier atmega ^^

        1. zygmunt
          20/07/2014 at 20 h 19 min

          Merci pour tes réponses Captain Stouf.

  12. Yann
    18/07/2014 at 21 h 33 min

    Non , malheureusement aucune réponse a part ‘atmega chip detector’ .

    1. Captain Stouf
      18/07/2014 at 22 h 08 min

      Vraiment étrange… Du coup je penche pour 3 possibilités :
      – ATmega grillé (je pense pas)
      – mauvaise configuration des fuses (comme pour zygmunt juste au dessus)
      – mauvais branchements, faux contact, etc…

      Sur le vif, je vois peut-être une solution :
      – si tu as un Uno non-SMD, tu peux remplacer l’ATmega du Uno par l’ATmega à programmer, et voir si il fonctionne…

  13. Yann
    18/07/2014 at 23 h 28 min

    Effectivement j’ai une arduino smd , si je comprends bien je remplace mon atmega de l’arduino par celui-ci et apres que dois-je faire ?

    1. Captain Stouf
      18/07/2014 at 23 h 46 min

      Tu remplaces l’ATmega du Uno par l’ATmega qui te pose problème, et tu essaies d’utiliser le Uno normalement (sketch blink pour tester).
      – Si ça ne fonctionne pas, essaies de forcer un upload du bootloader, en choisissant le Uno comme board et le programmateur normal.
      – Tu peux aussi essayer la methode pour empêcher l’auto-reset avant l’upload : un condo de 10uF entre la pin reset et le GND de l’arduino
      Ca ressemble quand même énormément à un problème d’horloge. Ton ATmega, tu sais si il était déja bootloadé ? Certains magasins vendent des ATmega pré-bootloadés Uno (ou autre), donc qui nécessitent un oscillateur externe.

      1. Yann
        19/07/2014 at 8 h 13 min

        La ou je l’ai acheter il n’etait pas mentionné qu’il était déjà bootloader , après cela reste possible je vais essayer ta technique

        1. Yann
          19/07/2014 at 10 h 24 min

          La même erreur zussi bien pour Blink que pour le bootloadage sur la Uno en AVR ISP, et avec la carte Uno de séectionner :
          avrdude: stk500_getsync(): not in sync: resp=0x00

  14. Jeremy
    23/07/2014 at 0 h 30 min

    Bonsoir, j ai un petit problème.
    Pour commencer je dispose d’une atmaga328p uno ( programmateur ISP) et un micro-contrôleur atmage328p-pu.
    Impossible de suivre votre tuto sans erreur, je n arrivais a faire marcher mon micro uniquement quand je mettais un crystal 16mHz. En cherchant j ai vu qu’il faillait changer les fuses, j ai donc mis 0x62(lowfuse) , 0xD9 (high fuse) et 0x07 (efuse) jusqu’à la pas trop de problème. J ai refait le tuto et la miracle le bootloader sans erreur, puis je charge le sketch blink, tout marche ! ( petit detail je ne pouvais upload uniquement en 5v, en 3v marchait pas). Puis en voulant charger un autre sketch  » invalid device signature »… je fais un avrdude(console) et la ma signature est 0xfffffff… Depuis plus rien ne marche.
    Donc si vous avez des idées 🙂
    Merci

  15. Pascal
    30/10/2014 at 3 h 12 min

    Super intéressant cette manip,
    moi, je cherche à modifier mon pro mini 5v 16mhz en 8mhz en fréquence interne.
    donc, petite question, c’est tu si c’est possible? et surtout en laissant le quartz 16mhz qui se trouve sur la carte.
    merci de ta réponse.

    1. Captain Stouf
      06/11/2014 at 16 h 21 min

      Oui, normalement c’est possible en le reprogrammant depuis un autre arduino, en SPI. A priori, les réglages des fuses devraient être les mêmes que pour l’ATmega328 8MHz sur breadboard.

  16. 08/11/2014 at 14 h 43 min

    Bonjour,

    J’ai une carte arduino uno et le firmware de l’atmel est mort. J’aimerai le reprogrammer, comment je peux faire ? Est-ce que l’on peut suivre ces étapes pour ?
    Comment voir les répertoire hardware sous mac ?

    Merci d’avance

    James

    1. Captain Stouf
      24/11/2014 at 19 h 10 min

      Bonjour,
      Oui, il est possible d’utiliser cette methode pour récupérer un Atmel avec un mauvais firmware, si la puce n’est pas grillée. Dans ce cas, il faudra à mon avis utiliser un oscillateur externe (et donc un bootloader arduino Uno, à priori).
      En revanche, je n’ai pas de Mac, donc je ne peux pas répondre à ta seconde question…

  17. Maxime
    10/11/2014 at 11 h 41 min

    Bonjour,

    Merci pour votre procédure qui est simple.

    J’ai essayé votre procédure, j’ai un Arduino mini 328 Pro 5V 16MHz, j’ai choisi le bon type de carte, programmateur Arduino as ISP, le bon port COM (avec le gestionnaire de périphériques), re-vérifié les connexions, et je n’ai pas de synchronisation.
    message :
    This report would have more information with
    « Show verbose output during compilation »
    enabled in File > Preferences.
    Arduino: 1.0.6 (Windows Vista), Board: « Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328 »
    avrdude: stk500_getsync(): not in sync: resp=0x00

    Pourtant avec mon Arduino Uno, je synchronise parfaitement tous les sketchs sur mes CI Atmega 328. qui sont déjà bootloader.

    Cela pourrait-il provenir de la puce 328 qui est HS ?

    1. Captain Stouf
      24/11/2014 at 19 h 13 min

      Bonjour,
      L’ATmega à programmer est bien accompagné d’un oscillateur externe ?
      « Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328 » requiert un oscillateur externe à 16MHz, la programmation ne fonctionnera pas sans ce dernier.
      Si c’est le cas, alors il est possible que la puce soit HS, effectivement…

      1. Maxime
        04/12/2014 at 12 h 03 min

        Bonjour,
        Il faut je suppose un broadbord pour ce faire, mais où connecter le quartz et les capa de 22pF ?
        Merci.
        Maxime

  18. 24/11/2014 at 23 h 58 min

    bonjour, je débute, et lorsque j’essaie de charger le sketch dans l’arduino, j’ai le message suivant:
    Arduino : 1.5.8 (Windows 8), Carte : « Arduino Uno »

    ArduinoISP.pde:36:14: error: expected unqualified-id before numeric constant
    K:\Programmes 2.0\Arduino\hardware\arduino\avr\variants\standard/pins_arduino.h:41:22: note: in expansion of macro ‘MOSI’
    static const uint8_t MOSI = 11;
    ^
    ArduinoISP.pde:35:14: error: expected unqualified-id before numeric constant
    K:\Programmes 2.0\Arduino\hardware\arduino\avr\variants\standard/pins_arduino.h:42:22: note: in expansion of macro ‘MISO’
    static const uint8_t MISO = 12;
    ^
    ArduinoISP.pde:34:13: error: expected unqualified-id before numeric constant
    K:\Programmes 2.0\Arduino\hardware\arduino\avr\variants\standard/pins_arduino.h:43:22: note: in expansion of macro ‘SCK’
    static const uint8_t SCK = 13;
    ^
    Erreur lors de la compilation.

    Ce rapport contiendrait plus d’informations si l’option
    « Montrer les informations de sortie pendant la compilation »
    était activée dans Fichier > Préférences.

    Aurais-je fais quelque chose de travers??

    Merci d’avance pour votre aide 🙂

    1. 25/11/2014 at 0 h 50 min

      Bon, j’ai réussi à trouver l’ISP sur votre Github, il est chaargé sur l’arduino. par contre lorsque je veux graver la séquence sur l’ATmega 328, j’ai ce message:
      This report would have more information with
      « Show verbose output during compilation »
      enabled in File > Preferences.
      Arduino: 1.0.6 (Windows NT (unknown)), Board: « ATmega328 (3.3v, 8MHz) »
      avrdude: Yikes! Invalid device signature.
      Double check connections and try again, or use -F to override
      this check.

      1. Captain Stouf
        25/11/2014 at 2 h 38 min

        Bonjour,
        Il semble que votre ATmega n’est pas « détecté » correctement, ou n’est pas du bon type. Ou est déja bootloadé en 5v/16Mhz (fréquent avec les chip provenant d’ebay)

        « Double check connections and try again »

        1. Pascal
          29/11/2014 at 2 h 50 min

          Bonjour,
          Je cherchais à modifier mon pro mini 5v 16mhz en 8mhz en fréquence interne. (voir plus haut)
          effectivement cela fonctionne, j’ai même réussi à diminuer la tension d’alimentation jusqu’à 2.5v et il tourne encore en désactivant le Brown-out .
          Mais je me pose une autre question, j’ai un pro mini 3.3v en 8mhz est-ce que je peux le programmer avec une tension de 5v (le chip des 3.3v ou 5v est le même)
          merci

          1. Captain Stouf
            01/12/2014 at 20 h 43 min

            Bonjour,
            Si on enlève le régulateur de l’équation, je ne vois rien qui l’empêche…

          2. Pascal
            02/12/2014 at 1 h 41 min

            Oui, effectivement j’ai testé et ça fonctionne sans dommage, si l’info peut servir!

  19. Maxime
    04/12/2014 at 13 h 00 min

    Bonjour,
    J’ai trouvé une méthode très simple et qui fonctionne, j’ai pu sauver deux Arduino Mini Pro V3 (doit fonctionner sur Arduino Nano en changeant peut être les connections) qui n’avait pas le bootloader, (il faut laisser le Arduino Atmega 328 sur le Arduino Uno) :

    Now you need to find a working arduino board, doesn’t matter if it is a nano or not, I have used my « real » uno r3 and worked perfectly. If you don’t already have one, try borrowing it from a friend.

    If you have any grab your female – male breadboard jumpers. These will make the process even faster and easier. BUT I didn’t have any so, instead of waiting 2 weeks for them to arrive online as well, I had to take some extreme measures!

    First we need to locate and get familiar with the ICSP pins. On mine just one of them was marked with a number, top right as 1. Here is what they look like in the schematics. So right under 1 had to be 2 and next to one was 3 and so on…

    Now that you are ready lets begin – do the following steps in order;

    STEP 1 – Upload ISP

    – Connect the working arduino Uno to your computer.

    – Open the arduino software on the computer

    – Go to Tools>Serial Port>COM (and make sure that the correct COM port is chosen – ask me if you don’t what this means)

    – Go to Tools>Board>Arduino Uno (in my case uno, this is the arduino that is already working not yet the other one)

    – Go to File>Examples>Arduino ISP (a new sketch screen will open with the ISP code written in it)

    – Verify then Upload (your board will start blinking for a bit, it means it is loading, wait until done uploading)

    – Unplug the arduino Uno. Now it has the ISP code in it, all we have left to do is connect them together and run a few commands again…

    STEP 2 – Connect 2 arduinos together

    – Now connect the two arduinos together, to do this without female-male jumper cables was time consuming, you have to be VERY CAREFUL and take your time bending the wires, other wise you may short your circuits. ask me first ! In the second picture you can see that first I put the ICSP pins through a piece of paper and then carefully wrapped around them the corresponding wires. Make sure they grab on very tightly, use a small flat head screw driver to bend them. Take your time, don’t be rough.

    – Connect them this way; (comme dans votre montage)

    pin 12 on Mini to D12 on working arduino

    pin VCC on Mini to 5V on working arduino

    pin 13 on Mini to D13 on working arduino

    pin 11 on Mini to D11 on working arduino

    pin Reset on Mini to D10 on working arduino

    pin GND on Mini to GND on working arduino

    STEP 3 – Burn Bootloader

    – Keeping all the wires intact and unmoved in step 2, connect the working arduino back to the computer with the USB

    – Go to Tools>Serial Port>COM (and make sure again that the correct COM port is chosen – ask me if you don’t what this means)

    – Go to Tools>Board>Arduino Nano w/Atmega 328 (this time we choose the non working arduino, in my case nano atmega 328)

    – Go to Tools>Programmer>Arduino as ISP

    – Go to Tools>Burn Bootloader (this is it, after the LEDs stop flashing your board is ready to use !!!)

    .

    Do all of the above steps in ORDER !!! no skipping steps

    Always make sure that the correct COMM port and correct board are chosen before uploading a sketch to avoid errors…

    if you want to learn more or get a second opinion you can check this post (it’s amazing) or just search on google  » how to install a bootloader to arduino clone  » and you will see many articles on this very topic.

Laisser un commentaire