Intéressé par des cours d'informatique en ligne ?
Visitez mon nouveau site
https://www.yesik.it !
…enfin peut être pas le moins cher, mais en tous cas un des moins chers! En effet à moins de 3€ port compris au moment où j'écris ces lignes, on trouve sur e-bay un petit programmateur USB ISP pour Atmel AVR fabriqué par la société chinoise LCSoft Studio. Son design est basé sur l'USBasp de Thomas Fischl – ce qui lui garanti d'être supporté par de nombreux outils et en particulier avrdude.
Seul « souci », la documentation du vendeur est succincte et le site du fabriquant est en chinois… Bon ça reste un clone de l'USBasp, donc il ne devrait pas être bien compliqué à mettre en œuvre, comme nous allons le voir dans les lignes qui suivent.
Sommaire
USBasp en général
Avant de passer à la pratique, un rappel sur l'USBasp. Lui et ses clones sont des programmateurs logiciels (firmware only). C'est à dire qu'ils embarquent pour seul composant actif un micro-contrôleur (un AVR ATmega8 ou ATmega88 dans le design de Thomas Fischl). C'est ce circuit qui est chargé – grâce au firmware adéquat – de gérer la communication entre le PC hôte (via le port USB) et la cible à programmer (via le port SPI). D'un point de vue pratique, un USBasp possède donc deux ports:
- un port USB
- destiné à communiquer avec le PC hôte, ainsi qu'à l'alimentation du programmateur et de sa cible (dans la configuration par défaut)
- un port ISP (In-system programming)
- relié à la cible AVR à programmer.
La plupart des USBasp possèdent aussi un jeu de cavaliers qui permettent d'en modifier le fonctionnement. C'est le cas du modèle produit par LCSoft Studio, comme nous allons le voir dans un instant.
Attention:
N'allez pas chercher d'opto-coupleur ou un quelconque autre dispositif d'isolation galvanique sur l'USBasp ou un de ses clones: sur ce type de programmateur, il y a une connexion électrique directe entre la cible et le PC hôte. Donc, même si l'interface SPI permet en principe de programmer un AVR sur site, dans la pratique, il vaut mieux être prudent et extraire le micro-contrôleur de sa carte pour le programmer.
C'est d'autant plus vrai si votre cible est susceptible de consommer un courant important (pilotage de moteurs, par ex.): en effet, l'alimentation fournie par le programmateur provient du port USB de l'ordinateur auquel il est relié. En cas de pic de courant ou de consommation excessive, c'est donc le port USB qui va être sollicité – éventuellement au point de l'endommager.
USBasp par LCSoft Studio
Cavaliers
Après ces généralités, passons maintenant à l'étude du produit qui nous intéresse spécifiquement ici, à savoir l'USBasp fabriqué par LCSoft Studio. Ce programmateur comporte trois emplacements pour des cavaliers sérigraphiés JP1, JP2 et JP3 sur la carte. Des trois, seul JP1 est peuplé avec des embases à picots. Si vous voulez utiliser les autres cavaliers, vous devrez souder vous-même les embases manquantes.
Position | Description | |
---|---|---|
JP1 | Dans cette position, la broche VCC de l'interface ISP est directement reliée à la broche VCC du port USB et fournit donc une tension de 5V environ | |
Dans cette position, l'alimentation délivrée sur la broche VCC de l'interface ISP vient aussi du port USB, mais elle transite par un régulateur de tension (AMS1117 - 3.3V). La tension fournie est donc de 3,3V. | ||
Sans cavalier, la broche VCC de l'interface ISP est en l'air. Aucune tension n'est fournie par VCC – et la broche devrait être non connectée | ||
JP2 | Fonctionnement normal – l'USBasp sert à programmer une cible externe. | |
Mode auto-programmation – un programmateur externe peut mettre à jour le firmware de l'USBasp. | ||
JP3 | Vitesse normale. | |
Slow SCK. |
JP1
JP1 permet de sélectionner la tension fournie par le programmateur sur la broche de sortie VCC de l'interface ISP.
Notez que le cavalier JP1 n'a d'incidence que sur la tension délivrée par la broche VCC de l'interface ISP. Le micro-contrôleur embarqué est toujours alimenté en 5V par le port USB. Et les niveaux logiques de sortie sont ceux qui correspondent à cette tension.
JP2
Sur le programmateur qui m'a été livré, JP2 n'est pas muni de picot. JP2 est un cavalier noté self program sur le schéma électrique du programmateur. Le nom est un peu trompeur puisque qu'il permet de mettre à jour le firmware de l'USBasp à partir d'un autre programmateur.
En fait son rôle est simplement de relier la broche /RESET de l'ATmega8 sur la broche /RST de l'interface ISP – ce qui permet au programmateur externe de faire passer le micro-contrôleur en mode mise à jour du firmware par SPI. En fonctionnement normal, vous ne devez pas utiliser de cavalier à cet emplacement.
JP3
JP3 Slow clock (Slow SCK) permet de ralentir la vitesse de programmation. Ce cavalier se révèle utile dans le cas d'un câble de liaison trop long entre le programmateur et la cible. Ou dans le cas d'un AVR dont la fréquence d'horloge est trop lente – comme ça peut être le cas d'un AVR neuf (configuré d'usine avec l'oscillateur interne 1MHz et un diviseur d'horloge ÷8). La règle est que la fréquence de programmation doit être inférieure au quart de la fréquence d'horloge de la cible [1].
Ceci dit, cette discussion autour du cavalier JP3 est très théorique ici: en effet, mesures faites, quelque soit la position du cavalier JP3, le programmateur semble toujours utiliser une horloge de 92kHz. J'ai aussi lu sur le forum AVRfreaks que certains clones USBasp utilisent un firmware personnalisé capable de s'adapter à la vitesse d'horloge de la cible, mais cela ne semble pas non plus le cas puisque j'ai mesuré la même fréquence sur le bus SPI quelle que soit la position des fusibles (fuse) CKDIV8, CKSEL1 et CKSEL0 de l'ATtiny qui m'a servi pour les tests…
Brochage de l'interface ISP
L'interface ISP est disponible sur une embase mâle 2×5 broches. Le connecteur – et le brochage – sont à peu près standard parmi les différents clones. C'est également celui utilisé par les kits de développement Atmel STK200/STK500. Par contre il y a une différence notable au niveau du brochage de l'USBasp LCSoft Studio. En effet, habituellement les broches 4 et 6 du connecteur sont reliées à la masse. Or, ici, elles sont reliées aux broches TXD et RXD de l'ATmega8 embarqué sur la carte. C'est sans doute pour permettre de transformer le programmateur en interface USB-UART. Mais pour cet usage, je pense qu'il faudra (?) flasher un autre firmware. Toujours est-il que ces broches ne sont pas directement reliées à la masse, et qu'il faudra donc éviter de les connecter. Quand à la broche 3, elle ne semble reliée à rien. Il faudra donc également la laisser non connectée (NC). C'est aussi une petite différence avec le STK200/STK500, puisque cette broche y est utilisée pour signaler que la programmation est en cours.
Utilisation
Broche USBasp | Signal | Broche ATtiny13 (boitier DIP) | |
---|---|---|---|
2 | Vcc | 8 | |
8, 10 | Masse | 4 | |
1 | → | MOSI | 5 |
9 | ← | MISO | 6 |
7 | → | SCK | 7 |
5 | → | /RESET | 1 |
Raccordement à la cible et test avec avrdude
Muni du brochage de l'interface ISP, il devient possible de tester ce programmateur. J'ai attrapé un ATtiny13 que j'ai raccordé au programmateur USBasp de LCSoft Studio. À titre indicatif j'ai résumé le raccordement dans le tableau ci-contre. Mais je vous conseille fortement de vous reporter à la documentation du micro-contrôleur que vous voulez programmer pour vérifier le brochage! En plus de cela, faites bien attention, car l'usage veut que l'on ne numérote pas les broches des circuits intégrés et celles des embases dans le même ordre (voir illustration). Une fois les connexions vérifiées et le programmateur raccordé à un port USB de votre ordinateur, vous constaterez que la DEL d'alimentation G (comme green … mais la mienne est rouge) est allumée.
Sur ma machine, avrdude est déjà installé. Et j'ai déjà configuré les permissions pour d'autres programmateurs compatibles USBasp. Si ce n'est pas le cas pour vous, je vous renvoie sur un autre article ou je détaille la procédure.
Une fois les outils en place, le programmateur peut enfin être testé:
sh$ avrdude -p t13 -c usbasp avrdude: warning: cannot set sck period. please check for usbasp firmware update. avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.00s avrdude: Device signature = 0x1e9007 avrdude: safemode: Fuses OK avrdude done. Thank you.
Pendant la manipulation, l'autre DEL (R) du programmateur s'illumine, signifiant que le programmateur communique avec la cible. C'est confirmé par le message renvoyé sur la console par avrdude – puisque celui-ci a (notamment) détecté la signature 0x1e9007 qui correspond bien à un Attiny13. En cas de problème avrdude le signalerait clairement.
Petite déception: vous voyez aussi que le programmateur semble livré avec une ancienne version du firmware USBasp. Une mise à jour est suggérée pour pouvoir contrôler par logiciel la fréquence d'horloge de programmation. Pour l'instant, je n'ai pas fait cette mise à jour, d'autant plus que j'ai un doute que le firmware installé soit un authentique firmware USBasp écrit par Thomas Fischl. J'ai bien la possibilité d'en faire un backup avec avrdude en mettant le programmateur en mode self-programming (JP2) – et en utilisant un autre programmateur – mais en l'état il fonctionne de façon satisfaisante. Pas forcément très vite, puisque comme je disais plus haut il semble configuré pour utiliser la vitesse fixe de 92kHz, mais c'est bien assez pour commencer.
Télécharger un programme
Si vous disposez de la toolchain AVR, vous pouvez compiler un petit programme et essayer de le télécharger – vous ne devriez rencontrer comme moi aucun problème pour peu que vous ayez convenablement raccordé votre cible au programmateur:
/* * blink.c - blinking LED on PB4 * * Fait clignoter une LED reliée au port PB6 */ #include <avr/io.h> #include <util/delay.h> int main(void) { DDRB |= (1<<DDB4); while(1) { _delay_ms(500); PORTB ^= (1<<PORTB4); } }
# Compile pour ATtiny13 @ 1MHz sh$ avr-gcc blink-pb4.c -O2 -mmcu=attiny13 -DF_CPU=1000000 sh$ avr-objcopy -j .text -j .data -O ihex a.out rom.hex # Téléchargement du firmware sh$ avrdude -p t13 -c usbasp -U flash:w:rom.hex
En plaçant une résistance et une DEL en série entre les broches PB4 (3) et GND (4) on peut voir clignoter cette dernière à environ 1Hz – c'est bien mon programme qui a été téléchargé et qui s'exécute…
Accés aux fusibles (fuses)
Les fusibles (fuses) sont des drapeaux binaires qui permettent de modifier le fonctionnement des micro-processeurs de la famille AVR d'Atmel. Rassurez-vous, malgré leur nom, il ne s'agit pas de vrais fusibles – et lorsque vous en aurez modifié la valeur, vous pourrez (presque) toujours revenir en arrière.
Ne jouer pas au hasard avec les fusibles!
En effet, il y a quelques fusibles dont la valeur est critique pour la programmation du micro-contrôleur AVR avec des outils comme un USBasp. En particulier, sur un ATtiny13, faites attention à ne pas toucher à RSTDISBL et SPIEN.
fuse | valeur par défaut | description | |||
---|---|---|---|---|---|
RSTDISBL | High byte | bit 0 | External Reset disable | 1 (unprogr.) | Pour être programmé avec l'interface SPI, il est nécessaire de mettre la broche /RESET du micro-contrôleur à l'état bas. Ce fusible permet de désactiver le reset externe via cette broche, rendant de fait impossible de programmer le micro-contrôleur de cette manière. |
SPIEN | Low byte | bit 7 | Enable Serial Programming and Data | 0 (progr.) | Quand ce bit est programmé (c'est à dire à zéro), l'interface SPI peut être utilisée pour télécharger des données et des programmes sur le micro-contrôleur. Déprogrammer ce bit (le mettre à un) rend inutilisable l'interface SPI dans ce but. Normalement, vous ne pouvez pas changer la valeur de ce bit via l'interface SPI elle-même. |
Il ne s'agit ici que des fusibles critiques pour l'ATtiny13 que j'ai sous la main. Je ne saurais assez vous conseiller d'examiner la documentation d'Atmel correspondant votre micro-contrôleur avant de vous aventurer en territoire inconnu.
Avec avrdude et l'USBasp de LCSoft Studio (comme avec n'importe quel autre, d'ailleurs), vous pouvez accéder facilement aux fusibles pour en lire la configuration actuelle:
# Lire la configuration actuelle du fusible "low fuse" (affichage en binaire) sh$ avrdude -p t13 -c usbasp -U lfuse:r:/dev/stdout:b -q -q 0b1101010 # Idem avec le "high fuse" sh$ avrdude -p t13 -c usbasp -U hfuse:r:/dev/stdout:b -q -q 0b11111111
lfuse – ATmega13 | ||||||||
---|---|---|---|---|---|---|---|---|
0 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | = 0x7A |
SPIEN | EESAVE | WTDON | CKDIV8 | SUT1 | SUT0 | CKSEL1 | CKSEL0 |
Il est bien entendu possible de modifier leur valeur. Ainsi, admettons que l'on souhaite désactiver le diviseur d'horloge /8 (CKDIV8 – low fuse, bit 4):
sh$ avrdude -p t13 -c usbasp -U lfuse:w:0b1111010:m -q -q
Alors?
Bon, je ne vais pas m'appesantir plus longuement sur ce clone de l'USBasp par LC Studio: il s'agit en résumé d'un petit programmateur classique et sans prétention, mais qui fonctionne sans problème, et satisfera n'importe quel utilisateur occasionnel de micro-contrôleurs AVR. Et surtout pour un prix dérisoire qui met décidément le monde de l'embarqué à la portée de tous!