Looking for Computer Science  & Information Technology online courses ?
Check my new web site: https://www.yesik.it !

Ce n'est pas un hasard si les micro-contrôleurs AVR d'Atmel ont été retenus pour la plate-forme Arduino: en effet, entre autres qualités, ils sont bon marché et simples à mettre en œuvre. Mais, si Arduino est la porte d'entrée empruntée par de nombreux amateurs ou débutants pour découvrir la programmation embarquée sur cible AVR, vous allez voir qu'il est tout à fait possible de programmer directement un micro-contrôleur AVR – et cela avec un minimum de matériel.

Le matériel

Ici, le programmateur que je vais mettre en œuvre est le JYE Tech 07302. Il s'agit d'un programmateur externe d'un prix raisonnable et qui est facilement disponible sur Internet chez seeedstudio.com. Une fois n'est pas coutume, voici la liste des courses à faire pour réaliser les manipulations décrites ici:

Désignation Qté Prix approximatif (HT)
Cible Microcontrôleur ATmega48 en boitier DIP 1 $2.58
Accessoires Platine Labdec (breadboard) 8,2cm×5,3cm 1 $5.50
Un assortiment ( min. 10 pièces) de câbles pour platine Labdec 1 $5.00
Programmateur Programmateur USB AVR JYE Tech 07302 1 $15.00
Cordon USB A - mini-USB B (pour le programmateur) 1 $2.00
Embases mâles au pas de 2,54mm 1 $1.43
Total: $31.51

Tout ce matériel est disponible en ligne. Dans le tableau ci-dessus, je vous ai donné les liens vers les pages correspondantes des sites de SeeedStudio et DigiKey qui sont tous les deux fiables, mais vous pourrez trouver le matériel nécessaire ailleurs. À noter que tout ce matériel peut resservir pour d'autres manipulations.

En plus de ces éléments, vous aurez aussi besoin d'un ordinateur sur lequel les outils de développement AVR seront installés (avr-gcc, avr-objcopy et avrdude). Pour ma part, ce sera un ordinateur sous Debian Squeeze. Je vous renvoie sur un autre article pour l'installation de ces logiciels.

Dernier mot sur le matériel: la cible que j'utilise ici est un micro-contrôleur ATmega48-A. Mais la plupart des autres micro-contrôleurs 8 bits de la famille Atmel AVR peuvent être envisagés. Dans tous les cas, veillez à choisir un modèle en boitier DIP (Dual In-line Package – on dit aussi parfois DIL) pour pouvoir l'insérer sur votre platine Labdec!

Préparation du programmateur

Si j'utilise ici le programmateur JYE Tech 07302, ce n'est pas parce qu'il est plus performant ou de meilleur qualité que d'autres. Et pour tout dire, le mien comportait pas mal de trace de flux utilisé pour la soudure que j'ai dû nettoyer tant bien que mal... Mais ce programmateur a pour qualité d'être facile à adapter puisque toutes les broches sont accessibles en périphérie de la carte. Ce qui m'a permis d'y souder des embases mâles pour pouvoir l'insérer sur une platine Labdec.

JYE Tech 07302.png

JYE Tech 07302 USB AVR Programmer — Le JYE Tech 07302 est un programmer AVR alimenté par le port USB qui permet de programmer les micro-contrôleurs AVR d'Atmel via leur port SPI. Sur cet exemplaire, j'ai soudé des embases mâles aux broches du repère J1 (VCC, port B, GND) pour pouvoir aisément l'insérer et l'utiliser sur une platine Labdec.



La cible

Vous l'avez vu dans mon inventaire, la cible que j'utilise ici est un micro-contrôleur ATmega48. Le choix d'un membre de la famille AVR plutôt qu'un autre dépend surtout de la mémoire (flash et RAM) qui vous est nécessaire et des entrées/sorties dont vous pouvez avoir besoin. Dans ce dernier domaine, les ATmega se révèlent plutôt polyvalents puisqu'ils sont notamment dotés d'un port USART/UART (port série) ou encore d'un convertisseur analogique-numérique. Et surtout, comme tous les micro-contrôleurs de la famille, ils possèdent une interface SPI qui va permettre de les programmer.

ATmega48 SPI programmer.png

Connexion de l'ATmega48 pour une programmation par SPI — Pour programmer le micro-contrôleur ATmega48 par l'interface SPI, il est nécessaire de raccorder celle-ci au programmateur, puis de mettre la broche RESET du micro-contrôleur à l'état bas. Ce modèle a aussi pour particularité d'imposer le raccordement de la broche AVCC (normalement utilisée par le convertisseur analogique numérique) à la même tension que la broche VCC (±0,3V).



Raccordement du programmateur

Broche programmateur Signal Broche micro-contrôleur
(boitier DIP)
VCC Alimentation 7 (VCC), 20 (AVCC)
GND Masse 8 (GND), 1 (/RESET)
PB5 Horloge bus SPI 19
PB4 MISO 18
PB3 MOSI 17

Si comme moi vous avez soudé des embases au pas de 2,54mm sur votre programmateur, celui-ci doit pouvoir s'enficher sur votre platine Labdec. En le plaçant à une extrémité de la plaque, même sur une platine de petite taille, vous avez largement la place pour placer le micro-contrôleur AVR à programmer à l'autre extrémité. Sur le montage illustré ci-dessous, remarquez que j'ai placé le repère qui indique la broche 1 du circuit intégré vers l'intérieur de la platine.

ATmega48 programmation.png

Connexion du programmer à l'ATmega48 — Pour programmer un micro-contrôleur AVR à l'aide de l'interface SPI, il faut relier les broches SCK, MISO et MOSI du programmateur à leur homologue sur le micro-contrôleur. Il faut également placer /RESET à l'état bas en le reliant à la masse. Enfin, et plus spécifiquement pour les ATmega, la broche AVCC doit être au même potentiel que VCC (±0,3V). Avec un programmateur comme je JYE Tech 07302, la liaison USB sert à la fois pour la communication avec le PC et pour l'alimentation du montage.



Piège:

Le brochage des micro-contrôleurs de la famille AVR varie d'un modèle à l'autre. Si vous utilisez un autre micro-contrôleur que l'ATmega48, vérifiez l'emplacement des broches MOSI, MISO et SCK sur les documents constructeurs correspondant!

Téléchargement du programme

Installation

Sous Debian vous aurez besoin des paquets avr-gcc, avr-libc, binutils-avr et avrdude pour ce qui suit. Si ces logiciels ne sont pas déjà sur votre machine utilisez le gestionnaire de paquets de votre distribution pour procéder à l'installation.

sh# apt-get install avr-gcc
sh# apt-get install avr-libc
sh# apt-get install binutils-avr
sh# apt-get install avrdude

Cet article n'est pas un tutoriel sur l'écriture de programmes pour AVR. Je ne vais donc pas m'étendre sur le code source du programme C de démonstration utilisé ici. Si vous avez une expérience préalable de ce langage, le code devrait vous sembler un minimum familier. Dans tous les cas, vous trouverez quelques explications dans un précédent article relatif à l'USnooBie – une cible AVR compatible Arduino.

Comme toujours (c'est lassant) pour tester je vais utiliser un programme de clignotement de LED. En fait, je vais quasiment utiliser le même programme que celui de l'article sur l'USnooBie dont je parlais plus haut:

/*
  led.c
 
  for ATmega48 @ 1MHz (factory default using internal oscillator)
*/
#include <avr/io.h>
#include <avr/interrupt.h>
 
/*
 * Routine d'interruption pour le timer1
 */
ISR(TIMER1_COMPA_vect)
{
  PORTC ^= (1<<PC5);		// Inverser (xor 1) l'état du port PC5
}
 
/*
 * Programme principal.
 * L'exécution du code utilisateur commence ici
 */
int main(void)
{
  // Configuration des entrées/sorties
  DDRC |= (1<<PC5);		// Configurer la broche PC5 en sortie
  PORTC |= (1<<PC5);		// Initialiser la broche PC5 à 1 (LED allumée)
 
  // Réglage de l'horloge
  cli();			// Désactivation globale des interruptions
  TCCR1B |= 1<<CS11 | 1<<CS10;	// Diviser l'horloge par 64
  OCR1A = 15625;		// Compter 15625 cycles pour 1 interruption/seconde
				// (car 64*15625 = 1000000)
  TCCR1B |= 1<<WGM12;		// Régler le timer en mode "Clear Timer on Compare"
  TIMSK1 |= 1<<OCIE1A;		// Générer une interruption à l'échéance du timer
  sei();			// Réactivation globale des interruptions
 
  // Boucle sans fin
  while(1) {
    // Rien à faire ici: tout est géré par la routine d'interruption
    // sur le timer1
  }
}

Pour compiler le programme et le transférer sur la cible, je vais utiliser les outils classiques de la toochain AVR:

sh$ avr-gcc -std=c99 -mmcu=atmega48a led.c
sh$ avr-objcopy -j .text -j .data -O ihex a.out rom.hex
# S'assurer que la cible AVR est convenablement raccordée au programmateur
# et que la broche /RESET est maintenue à l'état bas. 
sh$ avrdude -p m48 -c usbasp -b 1024 -U flash:w:rom.hex
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.02s

avrdude: Device signature = 0x1e9205
[...]
avrdude: verifying ...
avrdude: 242 bytes of flash verified

avrdude: safemode: Fuses OK

avrdude done.  Thank you.

Si vous avez relié la cible au programmateur conformément à l'illustration plus haut, la programmation a du être un succès comme dans mon cas. Dans le cas contraire, vérifiez vos connexions et le câblage. Assurez-vous aussi d'avoir placé le micro-contrôleur dans le bon sens. Vérifiez enfin que vous avez bien un ATmega48 comme moi.

Si avrdude se plaint de ne pouvoir accéder au programmateur, cela peut venir d'un problème de permissions:

En effet, il est indispensable que l'utilisateur possède les droits en écriture sur le périphérique. Sous Debian Squeeze, ce n'est pas le cas par défaut. Ici et là, on trouve sur internet la suggestion de travailler sous root pour contourner le problème. Ce n'est pas une bonne idée! Sur un système utilisant udev (c'est le cas de la majorité des grandes distributions), un moyen nettement plus recommandable est d'utiliser une règle pour donner au périphérique les permissions adéquates lorsqu'il est détecté.

Sous Debian, la règle doit être ajoutée dans un nouveau fichier à placer dans le dossier /etc/udev/rules.d. Le nom exact du fichier est à votre convenance, personnellement, j'utilise toujours le mot local pour préciser que c'est une règle spécifique à mon système et pas une règle standard:

sh# cat > /etc/udev/rules.d/90-local-USBasp.rules << EOF
# Custom rule for USBasp 

SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device",ATTR{idVendor}=="16c0" , ATTR{idProduct}=="05dc", MODE="0666"
EOF

Le début de la règle sert à identifier le périphérique en question: un périphérique usb, avec l'identifiant de vendeur 16c0 et l'identifiant de produit 05dc. Une fois le périphérique identifié, vous voyez que j'impose les permissions 666 – c'est à dire lecture et écriture pour tout le monde.

gcc et avrdude n'utilisent pas les mêmes options pour désigner les différents micro-contrôleurs de la famille AVR
Micro-contrôleur Option
gcc avr-dude
ATmega8 -mmcu=atmega8 -p m8
ATmega8-A
ATmega48 -mmcu=atmega48 -p m48
ATmega48-A -mmcu=atmega48a
ATmega48-PA -mmcu=atmega48p
ATmega328 -mmcu=atmega328 -p m328p
ATmega328-P -mmcu=atmega328p
ATtiny13 -mmcu=attiny13 -p t13
ATtiny13-A -mmcu=attiny13a
ATtiny2313 -mmcu=attiny2313 -p t2313
ATtiny2313-A -mmcu=attiny2313a
ATtiny4313 -mmcu=attiny4313 ???

Si vous avez un autre modèle de micro-contrôleur AVR 8 bits, dans le principe, la programmation de la cible sera la même: il vous suffira de modifier le câblage du programmateur pour l'adapter à votre modèle, et de changer les options de avr-gcc et avrdude pour préciser votre processeur. Attention, ces deux logiciels n'utilisent pas les mêmes noms pour désigner les différents modèles. Je donne quelques exemples dans le tableau ci-contre – sachant que certains modèles peuvent être supportés en utilisant les options correspondant à un modèle proche. Enfin, mon programme utilise la broche PC5 et configure le timer pour la fréquence d'horloge par défaut de l'ATmega48 (1MHz). À nouveau pour un autre modèle, ces paramètres peuvent être à changer.

Si tout est OK, vous êtes prêt pour l'épreuve du feu: modifiez le câblage pour placer une DEL entre la broche PC5 et la masse. Vous pouvez laisser en place les autres câbles, sauf la broche /RESET qu'il faut déconnecter de la masse. Dans ce montage, le micro-contrôleur sera alimenté par le port USB de votre ordinateur (via le programmateur) et commencera à exécuter son programme dès sa mise sous tension – et la DEL clignote (normalement à la fréquence de 0,5Hz).

ATmega48-LED.png

Montage de test pour ATmega48 — Ce montage permet de tester le fonctionnement de l'ATmega48 après y avoir téléchargé un programme mettant alternativement la broche PC5 à 1 puis à 0. Dans ce montage, le micro-contrôleur est alimenté par le port USB via le programmateur externe. Il fonctionnerait tout aussi bien en alimentant de manière indépendante le micro-contrôleur AVR et en retirant le programmateur. Vous remarquerez que je n'utilise pas de résistance pour limiter le courant circulant dans la LED, le courant fournit par les broches de sortie étant de l'ordre de 5mA (µC alimenté sous 3V – montant à environ 20mA si AVCC connecté à VCC).


plain, -P, -PV ou -PA?

Si vous achetez des micro-contrôleurs chez un marchand très achalandé comme DigiKey, vous remarquerez peut-être qu'il existe diverses versions d'un même modèle. Par exemple, l'ATmega48 existe en ATmega48, ATmega48-P, , ATmega48-PV et ATmega48-PA. La différence entre ces versions réside essentiellement dans leurs caractéristiques électriques (consommation, tension d'alimentation). Mis à part cela, les différentes versions d'un même modèle sont compatibles entre elles – et seront interchangeables dans beaucoup d'applications. Sauf besoin spécifique, le choix de l'une ou l'autre sera surtout question de budget et de disponibilité.

Pour vous aider à faire un choix, en fouillant sur le site d'Atmel vous pourrez dénicher quelques notes de migration d'une version à l'autre qui vous donneront tous les détails. Par exemple, pour les ATmega48/88/168, vous trouverez: