Arduino Bitbang mode programmer



Sources


Pourquoi ?

Si vous achetez un atmel, qui ne coute qu'environ 3€, vous pouvez le programmer aussi bien qu'un arduino, et c'est plus facile a integrer dans un montage
Seul problème: le programmeur coute une fortune, pas besoin de depenser d'argent si vous avez déja un arduino!
Materiel Necessaire:
  • Arduino
  • 1 Atmel, peu importe lequel (atmega8, atmega 16, atmega 32 ou atmega 168)
  • Des "pins" secables (4)
  • Quelques cables et si possibles une plaquette d'essai


Comment ?

On va utiliser la puce qui se trouve sur l'arduino pour communiquer en usb entre le pc et l'atmel.
Pour cela on soude les 4 pins secables dans les trous pres de la puce usb de l'arduino, puis on les relie a l'icsp de l'atmel.
On récupère l'alim de l'arduino pour alimenter le tout, et on utilise une version modifiée d'avrdude pour envoyer le tout en "bitbang mode".

Partie Materielle


Pins sur l'arduino

Il faut souder les 4 pins secables sur l'arduino, attention de ne pas faire cramer la puce! Si vous ne savez pas souder, ne le faites pas!
Pins a souder sur l'arduino Pins a souder sur l'arduino

Branchement de l'atmel

on va recuperer l'alimentation du port icsp de l'arduino, et le reste des 4 pins que l'on vient de souder.
Branchement Branchement fini
On a maintenant une prise icsp qui peut programmer n'importe quel atmel!


Du côté de l'atmel, justement nous avons deux choix qui s'offre a nous:
  • Raccorder chacun des pins de programmation avec des fils
  • Créer une plaquette de programmation d'atmel réutilisable

Pour la méthode qui consiste a uniquement raccorder les fils sur une plaque d'essai, il faut se référer à la doc de votre atmel pour le branchement

Exemple de documentation atmega16

Pour créer une plaque réutilisable, il suffit de faire la partie alimentation (+5V DCC), d'y mettre le support de l'atmel, le quartz et les condensateurs précisés dans le schéma correspondant à votre modèle d'atmel et enfin une prise icsp pour pouvoir y brancher facilement l'arduino que l'on a crée ci-dessus.
Cette prise est soit une prise IDP 2x3 pins, soit une IDP 2X5 (à vérifier).

Voici le schema de la connectique en 2x3 et 2x5 pins:
Prises ICSP

Le montage terminé ressemble a ceci:

Enfin, il faut avoir installé le driver FTDI pour la connexion avec la puce usb (ft232) de l'arduino, si vous pouvez déjà uploader du code dans votre arduino vous l'avez sinon, il est livré avec le logiciel arduino.

Partie logicielle

Pour programmer votre atmel, il faut compiler votre code avec avr-gcc, si vous avez windows, avr studio s'occupe de tout, il suffit de bien préciser le modele d'atmega que vous utilisez.
Sous linux, cela dépend de votre distribution, sous debian, un simple apt-get install avr-gcc avrdude devrait suffire ;)
La programmation d'un atmel fera l'objet d'un tuto séparé.

Envoi du programme dans l'atmel

C'est la que cela diffère de l'utilisation d'un programmateur traditionnel.
Nous allons utiliser une version modifiée d'avrdude, avrdude-serjtag et on va rajouter l'arduino comme programmateur.

Téléchargement d'avrdude-serjtag:
  • Pour Windows: avrdude-serjtag
  • Pour Linux: Avrdude suffit, pour son installation, procédez comme vous le faites d'habitude sur votre distrib
  • Pour Mac Os: Je n'ai pas trouvé de version pour mac, si vous en avez une, envoyez moi un mail ;)

Il faut ensuite éditer le fichier avrdude.conf et y rajouter:
#arduino diecimila
programmer
  id="diecimila";
  desc = "FT232R Synchronous BitBang";
  type = ft245r;
  miso = 3;  # CTS X3(1)
  sck = 5;  # DSR X3(2)
  mosi = 6;  # DCD X3(3)
  reset = 7;  # RI X3(4)
;

Que reste t'il a faire ?

Il faut modifier les fuses de l'atmel, les fuses correspondent à la configuration de l'atmel, c'est dans ceux ci que l'ont va par exemple indiquer a l'atmel s'il doit utiliser l'oscillateur interne ou un quartz externe, s'il est en mode de programmation ou pas.

Pour savoir quelle valeur de fuse utiliser, tout dépend de ce que vous voulez faire, le plus simple est d'utiliser un calculateur de fuse: calculateur de fuse fusecalc. Par contre pas d'aide sur le coup la, google est votre seul ami ;)

Selon si l'on est sous linux ou sous windows, les ports series changent, sous linux c'est un port /dev/ttyS0, sous windows c'est ft0, bien entendu le 0 depend d'ou vous avez branché le programmateur sur votre machine.

Les exemples suivant sont pour un atmega32 (m32) sous windows (ft0).

Lecture des fuses:

avrdude -c diecimila -P ft0 -B 4800 -p m32 -v

Ecriture des fuses (ici sur oscillateur externe):

avrdude -c diecimila -P ft0 -B 4800 -p m32 -U lfuse:w:0xef:m -U hfuse:w:0x89:m

Envoi du programme main.hex:

avrdude -c diecimila -P ft0 -B 4800 -p m32 -v -U flash:w:main.hex:i

Vous venez d'envoyer du code dans votre atmel!

Il ne reste plus qu'a débrancher la prise icsp, en effet le port reset empeche la puce d'executer son code...
Si votre code s'execute, vous avez gagné!
Un peu truc utile a connaitre est l'option -V qui permet de passer la verification lors de l'envoi du binaire.

Conclusion

Grace a l'utilisation de la puce ft232 de l'arduino, on est capable de programmer des atmel sans cout supplementaire, il ne reste plus qu'a faire des circuits qui utilisent ces atmels ;)
Au boulot! :D