DIY Programmateur USB FT232R BitBang pour Standalone

Ce topic n'est pas vraiment original, mais il rassemble divers éléments épars pour la réalisation à peu de frais d'un programmateur USB ultra simple sur base du FT232R. Ceux qui possèdent un Arduino avec chip FT232 savent probablement déjà qu'ils peuvent se servir de leur Arduino comme programmateur USB d'un Atmega standalone. Ceux qui ont un Arduino Uno ou autre Arduino de type "raccordement série" peuvent facilement se construire le programmateur ci-dessous, rendant ainsi leur platine comparable au Duemilanove.

Poursuivant la voie commencée ici USB et standalone - #11 by Jean-Marie - Français - Arduino Forum j'ai monté le FT232R sur une breadboard.

Pour le raccordement à l'USB, j'ai monté un petit connecteur USB B sur un petit morceau de plaque pré-perforée.

Pour rappel, le programmateur consiste simplement en un circuit intégré, le FT232RL :

Celui-ci est soudé sur une platine d’adaptation au format DIP :

J'ai travaillé à la loupe binoculaire. La platine est achetée car je ne suis pas du tout certain de pouvoir réussir un circuit imprimé au format SSOP. J'ai d'abord étamé chaque piste, puis j'ai étamé chaque patte mais pour les pattes, je me demande si elles ne possédaient pas déjà de la soudure. Un ami m’a signalé qu’il valait mieux étamer les pistes à la pâte d’étain pour éviter les « bourrelets » de soudure. Ensuite, je positionne le mieux possible la patte N°1 en tenant la puce à la main et je la touche une seconde de la pointe du fer à souder. Je fais la même chose avec la patte N°15. Ensuite il n'y a plus qu'à toucher successivement les autres pattes. Enfin, je vérifie à l'ohmmètre que chaque patte est en contact avec la pin DIP et qu'aucune patte n'est en court-circuit avec ses voisines. Il n'y a plus qu'à prier pour que la puce n'ait pas cramé. Le même ami m’a dit qu’il était assez dangereux de tester les courts-circuits à l’ohmmètre car cela pourrait produire des dégâts dans le chip.

Le FT232R transforme le signal USB en signaux série. Pas seulement Tx et Rx, mais aussi tous les autres signaux. J'ai juste ajouté 3 condensateurs et une petite platine pour adapter le connecteur USB à la breadboard. C'est l'USB qui alimente le tout. Quatre des pins du FT232R sont simplement raccordés à MOSI, MISO, SCK et RESET de l'Atmega8.

Le prix de revient du FT232R + la platine d'adaptation DIP + 28 pin est très exactement de 3€ (envoi du matériel compris). Il pourrait donc être inclus sur une platine .

Voici le Pinout du FT232R :

On reconnait les 8 signaux de la liaison série.

Voici comment m’est venue l’idée de cette expérimentation. J'étais tombé sur le site suivant:
http://www.geocities.jp/arduino_diecimila/bootloader/index_en.html

Ce site explique comment se servir d'un Arduino comme programmateur d'AVR.
Il faut donc implanter des pins en X3:

Puis raccorder ces pins au connecteur ICSP:

Le connecteur X3 peut être trouvé sur le schéma de l'Arduino Duemilanova:

On voit donc que les pins utilisées sont les suivantes:

•	Pin 11 (signal CTS) vers X3(1) à   ICSP1 (=MISO) 
•	Pin 9  (signal DSR) vers X3(2) à   ICSP3 (=SCK)
•	Pin 10 (signal DCD) vers X3(3) à   ICSP4 (=MOSI)
•	Pin 6  (signal RI)  vers X3(4) à   ICSP5 (=RESET)

Voici donc le schéma que j’ai adopté :

Lors du raccordement du programmateur à l’USB, il faut installer les drivers de FTDI. Ceux-ci ajoutent un port com.
On utilise une version modifiée de avrdude (avec ajout d'un programmateur supplémentaire: le FT232R Synchronous BitBang (diecimila). Pour éviter d'utiliser avrdude en ligne de commande, il s'utilise avec l'interface graphique suivante:

Le site http://www.geocities.jp/arduino_diecimila/bootloader/index_en.html est très bien fait et en suivant minutieusement toutes les étapes mentionnées, le montage sur la breadboard a fonctionné dès le premier branchement à l'USB, ce qui est suffisament rare pour être mentionné. Comme j'ai fait l'essai avec un Atmega déjà configuré à 16 MHz, j'ai directement pu le programmer sans passer par l'étape de la basse vitesse.

Trés bon travail Jean-Marie, juste un petit truc en plus pour les amis du manchot, la commande avrdude "brut" est la suivante :

avrdude -c ftdi -p m328p -P ft0 -U flash:w:blink.hex -B 1

Et si la version d'avrdude disponible dans les dépots APT n'est pas compilé avec la libftdi :

Je me suis permis d'ajouter ton topic à la liste des tutoriels arduino :wink:
(cf http://arduino.cc/forum/index.php/topic,67634.msg581086.html#msg581086)

Quelques questions :

Première question :
Le montage c'est pour un micro qui à déjà un bootloader du type arduino ?
Il ne convient pas pour un micro "brut".
Ai-je bien compris ?

Deuxième question :
Pour un micro "brut" il faut un programmeur ISP, que ce soit pour charger un bootloader ou même si on ne veut pas de bootloader pour charger un fichier *.hex produit par l'IDE arduino ?
Ai-je bien compris ?

Troisième question :
Avec un micro "brut" avant de charger tout programme il faut au préalable programmer les "fuses". Ne serait-ce que pour le faire travailler avec un quartz externe.
Ai-je bien compris ?

Quatrième question, ouf c'est la dernière mais pas la plus facile :
Sur quels documents compréhensibles à un neuneu se base-t-on pour déterminer les "fuses"?
Déjà je précise que je ne comprend rien au site : AVR® Fuse Calculator – The Engbedded Blog qui pourtant semble faire référence. Ils parleraient en chinois que je comprendrais pas moins

Merci de répondre niveau "neuneu" en microprocesseur et d'ajouter les autres informations nécessaires dont je n'aurais pas parlé parce que j'ignore leur existence.

skywodd:
la commande avrdude "brut" est la suivante :
avrdude -c ftdi -p m328p -P ft0 -U flash:w:blink.hex -B 1

Merci pour cette info judicieuse.

Et si la version d'avrdude disponible dans les dépots APT n'est pas compilé avec la libftdi :
http://doswa.com/2010/08/24/avrdude-5-10-with-ftdi-bitbang.html

2 x merci . Mais c'est quoi les dépôts APT ?

Je me suis permis d'ajouter ton topic à la liste des tutoriels arduino :wink:
(cf http://arduino.cc/forum/index.php/topic,67634.msg581086.html#msg581086)

3 x merci. C'est un "honneur" que je ne pense pas vraiment mériter.

Pour 68tjs

Rassure-toi, tes questions ne sont pas neuneu. D'ailleurs, je vais te demander un peu de temps avant d'y répondre car je ne veux pas raconter de bêtises. Je vais donc tourner ma langue 7 x avant de dire quelque chose. J'ai encore dans mes tiroirs l'un ou l'autre Atmega vierge (sans bootloader et avec les fuses d'origine). Donc, je vais faire des tests et prendre des notes. Ce sera une excellente manière de poursuivre ce "tutorial" (puisque Skywodd a décidé de l'appeler comme çà).

Merci

Jean-Marie:

Et si la version d'avrdude disponible dans les dépots APT n'est pas compilé avec la libftdi :
http://doswa.com/2010/08/24/avrdude-5-10-with-ftdi-bitbang.html

2 x merci . Mais c'est quoi les dépôts APT ?

C'est un gestionnaire d'archive sur lequel ce trouve tout (enfin une trés grande partie) des logiciels linux, chaque distribution à sa propre archive appelé "repository", par exemple voici le repository de la distribution ubuntu Ubuntu – Error

Jean-Marie:

Je me suis permis d'ajouter ton topic à la liste des tutoriels arduino :wink:
(cf http://arduino.cc/forum/index.php/topic,67634.msg581086.html#msg581086)

3 x merci. C'est un "honneur" que je ne pense pas vraiment mériter.

Un honneur faut peut être pas abuser :grin: je maintient juste une liste des tutoriels, astuces, etc pour faciliter la vie de ceux qui prenne le temps de regarder du coté du "guide arduino" :wink:

Jean-Marie:
Rassure-toi, tes questions ne sont pas neuneu. D'ailleurs, je vais te demander un peu de temps avant d'y répondre car je ne veux pas raconter de bêtises. Je vais donc tourner ma langue 7 x avant de dire quelque chose. J'ai encore dans mes tiroirs l'un ou l'autre Atmega vierge (sans bootloader et avec les fuses d'origine). Donc, je vais faire des tests et prendre des notes. Ce sera une excellente manière de poursuivre ce "tutoriel" (puisque Skywodd a décidé de l'appeler comme çà).

Appelle le comme tu veut c'est pas moi qui vais te forcer :wink:

Pour répondre à 68tjs,

  1. Le mode "bit bang" FTDI consiste à transformer un ftdi FT232 en un "simple" périphérique d'éntrée/sortie usb.
    FTDI a eu la bonne idée de permettre d'utiliser certaine broche comme des sorties logique "classique".
    Il faut savoir que dans un micro-contrôleur se trouve un petit circuit nommé ISP (ou ISCP) permettant de programmer le micro-contrôleur.
    Celui ci utilise le bus SPI pour recevoir et communiquer avec le programmateur suivant un protocole bien définie documenté par atmel.
    Avec la méthode du "bit bang" il est possible de faire un port SPI "software" en émulant les timing de chaque signaux (miso, mosi, clk et ss) mais à une vitesse bien plus basse que du "vrai" SPI.
    De ce faite il est possible de communiquer par spi avec le µc et par extension de le programmer via ISP.
    Avec la méthode de "bit bang" il est possible de programmé un µc vierge (sans bootloader) et par extension de bootloader un µc, pour ensuite utiliser ce même bootloader pour envoyer les programmes futur, cette étape s'appelle le "bootstrapping".

  2. Il ne faut pas forcément un "vrai" programmateur, une carte arduino, un module FT232, ou n'importe quelle périphérique capable de communiquer en SPI peut être utilisé pour faire du ISP et donc programmer un µc AVR.
    Cependant il faut effectivement utilisé l'ISP pour envoyer un .hex sur un µc vierge.

  3. Tout as fait, même le meilleur des programmes serait inutilisable si les fusibles ("fuses") ne sont pas correctement programmé.
    Petite remarque, si les fusibles ne sont pas correctement calculé, cela peut, au mieux, empêcher le programme de tourner, au pire, empêcher le port SPI de fonctionner et par conséquent bloquer tout reprogrammation même par ISP.
    Mais si ce genre de chose se produit (c'est si vite arrivé de cocher "ISP disable" ou "Reset disable" sur un calculateur de fusibles ;)) alors le µc n'est pas HS !
    En l'état il n'est plus utilisable certes, mais via un programmateur HVSP (High Voltage Serial Programming, Programmation série à haut voltage) il est possible d'éffacer les fusibles et donc de "sauver" le µc.

  4. Effectivement ce site est LA référence :sweat_smile:
    Voici (en gros) les fusibles d'un ATmega328p :
    Tout d'abord l'horloge, il existe deux types d'horloge, interne (int) et externe (ext), de base tout µc AVR possède un oscillateur RC à 8MHz ou 128KHz (d'ou l'appellation RC OSC. sur le calculateur ;)).
    Il existe ensuite plusieurs type d'horloge externe, les crystal (quartz) qui peuvent être à basse fréquence (low-freq, exemple les quartz 32KHz pour horloge RTC), full-wing (résonateur céramique <4MHz) et normal (crystal OSC.).
    Pour les oscillateur "crystal" (crystal OSC.) il faut régler les fusibles suivant la plage de fréquence du quartz.

Une fois le choix de l'oscillateur, et si besoin de sa fréquence, effectué il faut réglé le "startup timer", ou temps de démarrage, le "power up time" représente le temps que va mettre le µc avant de démarrer le programme, contrairement à ce que l'on pourrai penser, la valeur la plus basse n'est pas la meilleur !
Il faut choisir le temps suivant la qualité de son quartz, les condensateurs qui lui sont lié et la précision de l'horloge requise au début du programme, pour une application ou le respect des timing est critique même aux 1er instructions du programmes ont choisira un temps long pour laisser le temps au quartz de se stabiliser.
Le temps de démarrage est précisé en nombre de cycle d'horloge (CK) plus un temps de "reset" en ms (la durée du signal qui doit être appliqué sur la broche RST pour déclencher un redémarrage du µc).

Bien nous avons désormais configuré notre horloge, maintenant plusieurs options s'offre à nous :
Clock output on PORTB0 -> le signal d'horloge sera présent sur la broche PB0, utile par exemple pour synchroniser deux µc sur un seul quartz.
Divide clock by 8 internally -> signal d'horloge sera diviser en interne par 8, c'est une option que l'on peut cocher dans le cas d'un résonateur céramique "low cost" dont la précision est incertaine, sinon en temps normal avec un quartz de qualité il est inutile de cocher cette option.
Boot Reset vector Enabled -> cette option modifie l'adresse mémoire ou ce trouve le vecteur de "reset", utile uniquement dans des applications spécifique.
Boot Flash Section size=xxx words -> spécifie la taille de la zone mémoire réservé à l'usage d'un bootloader, cette zone sera protégé par la suite pour évité de "bricker" le bootloader.
Preserve EEPROM memory through the Chip Erase cycle -> la mémoire EEprom n'est pas effacer lors d'un "formatage" total du µc (via avrdude par exemple).
Watch-dog Timer always on -> attention cette option peut bloquer votre programme, elle active le "chien de garde", celui ci estime le temps que doit mettre une série d'instructions pour s'exécuter et si leurs exécutions prend plus de temps que prévu (boucle infini par exemple) le µc redémarrera de lui même.
Serial program downloading (SPI) enabled -> attention décocher cette case et vous pourrez dire byebye à votre µc ! Sauf si vous êtes sur est certain que votre programme est dénué de tout bug et que vous voulez empêcher quiconque d'effacer/modifier le programme qui contient ne la décocher pas ! (Utile pour les fabricants de matériel pour protéger le circuit du "reverse engineering").
Debug Wire enable -> si vous avez un debuggeur d'AVR (avr dragon, mkII, ...) cocher cette case et vous pourrez utiliser le protocole SWD (single wire debug) présent sur la broche "rst" (reset) pour débugger en temps réel votre programme.
Reset Disabled -> attention case à ne pas décocher ! Si vous la décocher votre µc ne pourra plus utiliser la broche "reset", comme celle ci est obligatoire pour rentrer en mode debug SWD ou en programmation ISP, vous ne pourrez plus reprogrammer votre µc (sauf avec un programmateur HVSP), c'est l'erreur classique du débutant sur les ATtiny45/85, pour avoir un broche en plus on désactive le reset -> erreur fatale !
Brown-out detection -> il arrive que pour certaine application il soit judicieux de redémarrer le programme en cas d'un défaut de l'alimentation (micro coupure, pile faible, ...), c'est possible via ce fusible avec comme tension de seuil : 4.3v, 2.7v ou 1.8v.

(La partie "manual fuse bit", permet aux utilisateurs avancé de modifier une configuration obtenu sous forme d'un "dump" avrdude, elle ne nous intéresse pas dans notre cas)
Un fois les fusibles judicieusement sélectionné on obtient trois valeurs en hexa :
le "low fuse" (lfuse), le "high fuse" (hfuse)et le "extended fuse" (efuse), c'est trois valeurs correspondent à la configuration choisi et devront être "brulé" dans le µc via avrdude.

Edit: J'espère que c'était suffisamment clair, parce que quand on sait, on sait, mais quand on sait pas ... :~

C'est un gestionnaire d'archive sur lequel ce trouve tout (enfin une trés grande partie) des logiciels linux, chaque distribution à sa propre archive appelé "repository", par exemple voici le repository de la distribution ubuntu Ubuntu – Error

Ouf ! Là, je suis complètement nul (mais il faudra que je m'y mette un jour).

Merci Skywodd pour toutes ces explications.

De mon côté, j'ai commencé les premières expériences. Je vais lentement car l'environnement Arduino est assez nouveau pour moi (je viens du monde de l'Atmega nu), et par ailleurs, je rédige en même temps le compte-rendu des expériences dans un document Word.

Je vais donc transmettre au fur et à mesure.

Suite du "tutoriel"

Mise en place d’un Atmega328P-PU vierge sur la breadboard.

Essai de défloraison lecture des fuses sans modification de vitesse :

Une fenêtre d’erreur d’avrdude-GUI s’ouvre et montre ft baud 115200.
Comme l’Atmega est vierge, la configuration d’usine correspond à une fréquence lente avec l’oscillateur interne. Pour que le programmateur établisse le contact , il faut limiter sa vitesse.

Dans la fenêtre « Command line Option », il faut ajouter –B 4800 pour ralentir le programmateur à 4800 Baud.

Cette fois, on peut cliquer sur Read Fuse et Read Lock Bit et on obtient :

Les Fuses sont donc :
• High Fuse : D9 hexadécimal
• Low Fuse : 62 hexadécimal
• Extended Fuse : 07 hexadécimal

Le Lock Bit vaut : 3F hexadécimal

Si on consulte le site http://www.engbedded.com/fusecalc on voit que ces Fuses correspondent aux Valeurs par défaut de l’Atmega328P :

Voici le sens de ces fuses :

On voit que l’Atmega fonctionne avec l’oscillateur RC interne à 8 MHz et que cette fréquence est divisée par 8 de manière interne. La fréquence est donc finalement de 1 MHz. Voilà pourquoi il a fallu baisser le Baud Rate.
On voit aussi que le bit qui autorise le vecteur de Boot Reset n’est pas coché. Ceci signifie que lors l’un Reset, le programme ne sera pas envoyé vers un Bootloader. Actuellement, l’Atmega fonctionne donc sans bootloader.
ATTENTION
• La case ”Serial program downloading (SPI) enabled” doit toujours rester cochée, sans quoi il n’est plus possible de programmer l’Atmega par SPI.
• La case « Reset Disabled » ne doit jamais être cochée, sans quoi le Reset est impossible alors qu’il est nécessaire pour programmer.

Pour aujourd'hui, ce sera tout.

Hello 68tjs,

Skywodd a déjà donné pas mal de réponses à tes questions. Mais je sais par expérience que quand on se pose des questions, il n'y a jamais trop de réponses. Je les reprends donc une par une avant le poursuive le petit tuto.

68tjs:
Première question :
Le montage c'est pour un micro qui à déjà un bootloader du type arduino ?
Il ne convient pas pour un micro "brut".
Ai-je bien compris ?

Je crois que tu as maintenant bien compris que le bitbanging avec le FT232R peut lire et écrire les fuses, les Bootloaders, les programmes et l'EEPROM des Atmega et Attiny d'à peu près tout bord, qu'ils aient déjà ou non un bootloader.

Deuxième question :
Pour un micro "brut" il faut un programmeur ISP, que ce soit pour charger un bootloader ou même si on ne veut pas de bootloader pour charger un fichier *.hex produit par l'IDE arduino ?
Ai-je bien compris ?

Tout d'abord, un fichier *.hex est égal à un fichier *.hex, quel que soit l'outil avec lequel on l'a produit. Donc que tu produises ton fichier .hex avec l'Ide Arduino, Winavr, Avr-gcc Linux, Studio, Bascom ou autre, une fois produit, plus rien ne permet de distinguer l'outil qui l'a produit. Donc, n'importe quel programmateur peut charger le programme. A part les programmateurs à haut voltage, tous les autres programmateurs sont des programmateurs ISP, c'est à dire des programmateurs qui utilisent le "In System Programming" et qui se branchent par le port SPI (MISO, MOSI, SCK). Le programmateur BitBang FT232R en fait partie.

Troisième question :
Avec un micro "brut" avant de charger tout programme il faut au préalable programmer les "fuses". Ne serait-ce que pour le faire travailler avec un quartz externe.
Ai-je bien compris ?

Les fuses règlent un tas de paramètres comme l'explique Skywodd. Entre autres, la fréquence d'horloge du µC. Par défaut, les Atmegas sont livrés avec une fréquence réglée en interne sur 1 MHz. Rien ne t'empêche de conserver cette fréquence si tu travailles avec des Atmegas en-dehors de l'environnement Arduino. C'est toi qui choisis. Mais à l'intérieur de l'environnement Arduino, la modification des fuses risque fort de perturber le déroulement des programmes ou même d'empêcher le flashage des programmes.

Quatrième question, ouf c'est la dernière mais pas la plus facile :
Sur quels documents compréhensibles à un neuneu se base-t-on pour déterminer les "fuses"?
Déjà je précise que je ne comprend rien au site : http://www.engbedded.com/fusecalc qui pourtant semble faire référence. Ils parleraient en chinois que je comprendrais pas moins

Si le neuneu est irrémédiablement agrippé à son environnement Arduino, mieux vaut ne pas se lancer dans les fuses. Sinon, Skywodd a donné des indications concernant le choix des valeurs de fuses. Enfin, si le neuneu connaît l'anglais, la datasheet de l'Atmega convoité est une mine d'or.
Ceci dit, le site Engbedded.com est simple d'utilisation. Dans la moitié supérieure de la page, tu fixes les paramètres que tu désires appliquer. Eventuellement, tu peaufines les bits de la moitié inférieure de la page à l'aide de la Datasheet et enfin, tu lis en bas de la page les valeurs hexadécimales des fuses que tu dois appliquer. Tu as même une fenêtre te donnant directement la ligne de commande à envoyer à Avrdude. N'aies pas peur, Engbedded n'envoie rien dirctement à ton Atmega, même si celui-ci est raccordé au PC. Je dis çà car dans mes débuts, je prenais soin de débrancher l'Atmega de peur que le site ne modifie les fuses. J'avoue aussi que la première fois que je suis passé à la fréquence par quartz, j'ai sué des gouttes avant d'oser lancer la commande, de peur de perdre définitivement le contact avec mon Atmega.

Inversement, Engbedded peut servir à comprendre les fuses d'un Atmega inconnu ou d'une recommandation de fuses trouvés sur un site: on peut introduire directement les valeurs hexadécimales des fuses dans les cases en bas de page, cliquer sur "Apply Values" et examiner en haut de page la signification des valeurs introduites.

Enfin, En cliquant sur "Defaults", tu obtiens la valeur des fuses de ton Atmega à la sortie d'usine.

Bon, maintenant passons à la suite du tuto

L’expérience suivante consiste à essayer de charger le Bootloader dans l’Atmega depuis l’Ide Arduino.

En effet, non seulement le FT232R permet de flasher un Bootloader mais on peut le faire à partir de l'Ide Arduino !!!

Les explications en anglais se trouvent sur le site suivant :
http://www.geocities.jp/arduino_diecimila/bootloader/bitbang_w_ide_en.html
Il s’agit du même auteur que ci-dessus. Merci monsieur Kimio Kosaka !
Attention, les indications données sur le site concernent Arduino-0015. Certains répertoires ont changé. Je donne ci-dessous les renseignement pour Aduino-0022.

Voici comment cela va fonctionner. Lorsqu’on envoie un programme à l’Atmega, l’Ide Arduino transmet la commande à Avrdude et c’est Avrdude qui exécute l’ordre, de manière transparente pour l’utilisateur (Fig.1 ci-dessous).

Kimio Kosaka a écrit un programme qu’il appelle Avrdude-wrapper. Celui-ci va intercepter la commande de l’Ide Arduino et l’examiner. Si la commande concerne le chargement du Bootloader par la méthode du FT232R Bitbanging, la commande est déroutée vers l’Avrdude modifié, c’est-à-dire vers Ardude-serjtag, sinon la commande est envoyée à l’Avrdude ordinaire. Le schéma suivant ( Fig.2) explique ce fonctionnement :


http://www.geocities.jp/arduino_diecimila/bootloader/bitbang_w_ide_en.html

Voici ce qu’il faut faire pour mettre le système en place.

• Faire l’installation matérielle et logicielle comme expliqué dans le site http://www.geocities.jp/arduino_diecimila/bootloader/index_en.html et ci-dessus
• Déplacer le répertoire de l’Ide Arduino (arduino-0022 dans mon cas) dans le répertoire C:\Program Files
• Déplacement de avrdude.exe depuis C:\Program Files\arduino-0022\hardware\tools\avr\bin\ vers C:\Program Files\arduino-0022\hardware\tools\avr\etc
• Editer le fichier “programmers.txt” situé dans C:\Program Files\arduino-0022\hardware\Arduino\ et y ajouter ceci :

bitbang.name=FTDI Bitbang
bitbang.protocol=diecimila -Pft0 -B4800

• Télécharger avrdude_wrapper.zip à l’adresse suivante : http://www.geocities.jp/arduino_diecimila/bootloader/files/avrdude_wrapper.zip
• Décompresser le fichier zip dans un nouveau répertoire. Ce répertoire contient alors avrdude.exe et avrdude.c
• Copier avrdude.exe dans le répertoire C:\Program Files\arduino-0022\hardware\tools\avr\bin\

Tout est maintenant en place pour charger le Bootloader.

Il suffit d’ouvrir l’IDE, de choisir la plateforme (menu Tools / Board / Arduino Duemilanove ou Nano w/ Atmega328 dans mon cas) et de choisir le programmateur (menu Tools / Burn Bootloader / w/ FTDI Bitbang).

Le flashage du bootloader ayant lieu à très basse vitesse, il faut compter de 6 à 8 minutes pour arriver au bout. Lorsque c'est fini, on voit le message en rouge dans le bas de la fenêtre. Le même message, plus lisible:

avrdude.exe: BitBang OK
avrdude.exe: pin assign miso 3 sck 5 mosi 6 reset 7
avrdude.exe: drain OK
ft245r: bitclk 4800 -> ft baud 2400
ft245r: bitclk 4800 -> ft baud 2400
avrdude.exe: BitBang OK
avrdude.exe: pin assign miso 3 sck 5 mosi 6 reset 7
avrdude.exe: drain OK
ft245r: bitclk 4800 -> ft baud 2400
ft245r: bitclk 4800 -> ft baud 2400

C'est l'indication que l'opération a réussi.
Kosaka, hip hip hip, hourra !!!

Voici les fuses après avoir chargé le bootloader Arduino:

Et voici leur signification selon le site Engbedded:

... A demain, si vous le voulez bien !

Hello tout de monde,

Pour poursuivre et m'assurer que le Bootloader est bon, j'aimerais charger le programme BLINK dans le nouvel Atmega transformé en Arduino. Pour cela, je dois ajouter à ma breadboard les connections Tx / Rx entre le FT232R et l'Atmega et modifier la connection du Reset qui doit maintenant être relié aux signaux DTR et RTS. Je m'inspire pour cela du schéma du Duemilanove (voir ci-dessous).
Sur ce schéma , RTS est relié au Reset par l'intermédiaire de la résistance R2. Quelqu'un parmi vous pourrait-il m'aider à déchiffrer la valeur de cette résistance ? Elle est marquée "100_NM" mais j'ignore ce que cela veut dire.

Essaye de mettre une résistance 1mega ohm (voir 100K), je ne pense pas qu'il est mis une 100mega :fearful:
Et sur la UNO il y a juste un condensateur de 100nF.

Bonjour

_NM = Not Mounted
pas de résistanceR2 implantée sur les cartes 2009

R2 board.jpg

R2 Carte.jpg

Merci Skywodd et Al1fch.

En fait, j'ai fait des essais en laissant tomber ce raccordement. Je peux déjà vous dire que les résultats sont excellents, mais je suis en train de rédiger le rapport d'expériences et je le posterai dès qu'il sera fini.

Il est temps maintenant de tester la programmation ordinaire, aussi bien à partir de l’Ide Arduino (ce qui se nomme « Uploader un Sketch ») qu’en-dehors de l’Ide, c’est-à-dire à l’aide d’Avrdude-GUI et Avrdude-serjtag de notre ami japonais (ce qui se nomme « charger ou flasher un fichier HEX »).

A partir de l’Ide Arduino

Il faut d’abord compléter le montage hardware sur la breadboard car la programmation se fait par les signaux Tx et Rx que FT232R envoie au Bootloader de l’Atmega. Il faut également modifier le signal de RESET.

Voici le schéma de principe :

On reconnaît les liaison du mode BitBang (vert = MISO, bleu = SCK, rouge = MOSI et mauve = RESET).
Ces liaisons sont supprimées et on établit les nouveaux raccordements suivants :
• FT232 Tx ? Atmega Rx à travers une résistance de 1K (kaki)
• FT232 Rx ? Atmega Tx à travers une résistance de 1K (orange)
• FT232 DTR ? Atmega RESET à travers un condensateur de 100nF (brun)

Le schéma officiel du Duemilanove montre encore le raccordement du signal RTS au RESET à travers une résistance marquée « 100_NM ». Heureusement, al1fch nous éclaire en nous apprenant que NM signifie Not Mounted. La connection de RTS est donc abandonnée.

Afin de contrôler la programmation, une LED est encore raccordée à la Pin arduino 13 qui est en fait la Pin SCK.

J’ai alors la surprise de constater que cette LED clignote déjà, alors qu’aucun programme n’a été introduit. Quelqu’un a-t-il une explication ? Action du Bootloader si pas de programme en mémoire ? Petit programme de test primordial chargé avec le Bootloader ?

Depuis l’Ide Arduino, j’ouvre le programme Blink. Je vérifie la Board et le N° de la liaison COM et je clique sur « Upload »

……………..

Splendide. Quelques secondes plus tard, la LED se met à clignoter à la fréquence du programme : 1 seconde ON – 1 seconde OFF.

Pour être sûr du fonctionnement, je relance plusieurs fois le programme en modifiant la fréquence de la LED.

Ce premier test est donc réussi.

Pour le test suivant, je me décide à faire les mêmes essais mais en rebranchant les connections BitBang que j’avais enlevées ( MOSI, MISO,SCK et RESET), tout en conservant bien sûr les raccordements série (Tx, Rx et 2ème RESET).

Tout se déroule à nouveau comme la première fois. Donc, les connections BitBang ne gênent pas l’upload d’un sketch. Elles peuvent donc rester en place jusqu’à preuve du contraire.

Mais la programmation Bitbang fonctionne-t-elle encore ?
Je modifie le programme Blink avec une fréquence particulière. Puis, au lieu de faire un Upload, je choisi le menu « Sketch ? Verify / Compile » (Ctrl-R). Ceci crée le fichier Blink.ccp.hex dans le répertoire « C:\Documents and Settings\votre nom d’utilisateur\Local Settings\Temp\Build------------(une longe série de chiffres) ».
J’ouvre alors Avrdude-GUI dont j’ai parlé au-début de ce thread :

Dans le cadre Flash, il faut pointer sur le fichier hex puis cliquer sur Erase – Write – Verify.

A peine 2 secondes et ………. La LED reste allumée. DAWNED !

MAIS… il suffit de débrancher l’USB puis de le rebrancher et la LED clignote comme voulu. Comme si, après la programmation, l’Atmega restait bloqué jusqu’à ce que le FT232 reparte à zéro.

D’où l’idée de forcer un reset du FT232 en forçant sa pin 19 à zéro. Cela fonctionne. L’atmega se débloque et tourne le programme qui a été chargé.

Je crois que c’est gagné sur toute la ligne.

FIN de ce TUTO.

Ouverture aux discussions, suggestions et ... critiques bien sûr. :sweat_smile:

J’ai alors la surprise de constater que cette LED clignote déjà, alors qu’aucun programme n’a été introduit. Quelqu’un a-t-il une explication ? Action du Bootloader si pas de programme en mémoire ? Petit programme de test primordial chargé avec le Bootloader ?

Si c'est un ATmega328p tout juste bootloadé, il est toujours packagé avec l'exemple blink en plus du bootloader.
PS: pour la résistance je n'y avais même pas pensai :. NM - not mounted, c'est vrai que ça parait évident aprés coup ...

Ouverture aux discussions, suggestions et ... critiques bien sûr.

Tu n'aura aucune critiques de ma part, trés trés bon tutoriel, avec des explications clair et précise.
Pour le "bug" du reset à la fin de la méthode bitbang, je pense pas qu'il faille obligatoirement forcer le reset du FT232, juste fermer/(ré)ouvrir le port série devrai générer une impulsion sur DTR et donc reset l'ATmega328 (à tester) ?

skywodd:
Si c'est un ATmega328p tout juste bootloadé, il est toujours packagé avec l'exemple blink en plus du bootloader.

J'ai acheté cet Atmega328P nu. C'est moi qui ai chargé le bootloader Arduino Duemilanove avec mon FT232 BitBang (voir début du thread). C'est donc le fait de charger le Bootloader qui charge également une version de Blink dans la mémoire.

Tu n'aura aucune critiques de ma part, trés trés bon tutoriel

Merci

Pour le "bug" du reset à la fin de la méthode bitbang, je pense pas qu'il faille obligatoirement forcer le reset du FT232, juste fermer/(ré)ouvrir le port série devrai générer une impulsion sur DTR et donc reset l'ATmega328 (à tester) ?

Il était tard hier soir, mais je comptais bien faire quelques tests supplémentaires cet après-midi.

Les expérimentations de cet après-midi m'ont appris différentes choses.

  • Au sujet de la LED témoin qui reste allumée après la programmation BitBang. je n'ai pu obtenir le déblocage qu'en débranchant l'USB ou en connectant un instant la pin 19 du FT232R à la masse. Et encore, il faut une connexion directe. Si on interpose une résistance de 10 K ou 1K, çà ne marche pas. Pas moyen non plus en choisissant provisoirement un autre port COM ou en faisant un Reset manuel de l'Atmega de remettre les choses en place
  • Essai d'Upload dans l'Ide tant que ce Reset n'est pas fait
    Si on essaye de retourner dans l'Ide pour refaire un Upload, avrdude fait une erreur et on obtient le message suivant:
    Binary sketch size: 1018 bytes (of a 30720 byte maximum)
    avrdude.exe: stk500_getsync(): not in sync: resp=0x37
    avrdude.exe: stk500_disable(): protocol error, expect=0x14, resp=0x37
  • Essai d'Upload dans l'Ide après le Reset du FT232R
    Une tentative d'upload dans l'Ide après le Reset du FT232R donne également le message d'erreur suivant:
    Binary sketch size: 1018 bytes (of a 30720 byte maximum)
    avrdude.exe: stk500_getsync(): not in sync: resp=0x00
    avrdude.exe: stk500_disable(): protocol error, expect=0x14, resp=0x51

C'est plus gênant car cela signifie que le Bootloader ne fonctionne plus. Ceci est confirmé par les expériences suivantes.

  • Reflashage du Bootloader par BitBanging
    Dans Avrdude-GUI, on effectue les opération suivantes:
- Modification du hfuse de DA en DB. Ceci débloque la zone de protection 
  de mémoire du Bootloader (voir Engbedded.com)
- On pointe sur le Bootloader qui convient (C:\Program Files\arduino-0022\
  hardware\arduino\bootloaders\atmega\ATmegaBOOT_168_atmega328.hex) 
  et on fait un Erase - Write - Verify
  A noter que le chargement du Bootloader prend environ 25 sec car on n'est 
  plus obligé de réduire le Baud Rate puisque l'Atmega fonctionne vec le quartz externe.
- Remodification du hfuse de DB en DA pour rebloquer la mémoire du Bootloader
- Reset du FT232R et retour dans l'Ide où on constate que Blink peut à nouveau être uploadé
  • BitBang "Write" et "Erase"
    De multiples essais ont démontré que c'est la commande ERASE qui dédruit le Bootloader (soit en cliquant "Erase - Write - Verify", soit en cliquant "Chip Erase". Cependant la commande "Write" seule ne fonctionne que si la mémoire de l'Atmega est vide, par exemple si l'Atmega sort de l'usine, ou après un Erase ou encore après le chargement et la protection du Bootloader. Par contre, si la mémoire de l'Atméga contient déjà un programme, la commande "Write" entraîne une erreur de avrdude et échoue
  • En conclusion
    Pour ceux qui désirent travailler dans l'environnement de l'Ide Arduino, le mode BitBang est essentiellement utile pour charger ou réparer le Bootloader Arduino. Cela nécessite de disposer du FT232R, que celui-ci soit déjà installé sur une platine Arduino ou qu'il soit indépendant sur un adaptateur SSOP28 --> DIP28. Le flashage du Bootloader peut se faire depuis l'Ide (7 à 8 minutes), ou à l'aide de avrdude-GUI ou de la ligne de commande de avrdude-serjtag (25 secondes). Par contre, le flashage des programmes est à faire de la manière habituelle, à partir de l'Ide, par la voie de l'USART (Tx, Rx).

Pour ceux qui travaillent en-dehors de l'environnement Arduino, ils peuvent se passer du Bootloader Arduino et flasher les programmes avec l'avrdude-GUI ou la ligne de commande de avrdude-serjtag

Derniére (petite) question par pure curiosité.

Qu'elle est la méthode la plus rapide (au sens vitesse d'envoi du programme) pour toi, le bit-bang ou le bootloader ?

La programmation par ISP (avec un "vrai" programmateur d'AVR) est trés rapide (presque instantané) mais je n'est jamais comparé bitbang et bootloader, je serais curieux de savoir lequel va le plus vite.

Hello Skywodd,

Je vais faire le test. Mais le programme Blink est beaucoup trop court pour une mesure du temps. Comme j'ai un 328, l'idéal serait de charger un programme qui fait presque 28 K (car il faut réserver 2K pour le bootmloader). Aurais-tu par hasard un tel fichier hex ? Probablement que tous les exemples de l'Ide sont des programmes génériques et courts.

Je t'ai fait un hex de 21162 octets, ça devrait aller.

C'est le sketch Arduino PCM du playground que j'ai recompilé avec une musique plus grosse (20000 samples au lieu de 13000).

Par contre petit truc concernant le bootloader arduino, il ne prend physiquement que 2Ko mais il "verrouille" presque 3.2Ko, c'est un bug qui devrait être résolu dans les prochaines version de optiboot.
Pour la version patché : New optiboot; beta testers welcome... - Microcontrollers - Arduino Forum
Sinon le google code d'optiboot : http://code.google.com/p/optiboot/

Jean-Marie: J'utilise la version patché, mais comme je me suis dis que tu devais surement utiliser l'ancien bootloader fourni avec l'ide j'ai volontairement pas dépassé la barre de 29000 octets.

AudioPCM.hex (58.2 KB)

Merci Skywodd, J'essaye çà demain matin et je te tiens au courant.