Programmation des AVR ATmega
en langage C
sous Linux

Depuis quelque temps une famille de microcontrôleurs monte en puissance et surtout voit son prix baisser et devient très facilement approvisionnable (Sélectronic et Electronique Diffusion entre autres distributeurs en France, mais aussi beaucoup d'autres distributeurs en Europe. Moi je ne vends rien!)

Il s'agit des MICROCONTROLEURS 8bits RISC
AVR ATMEL, en particulier les ATmega

1 -

Voici un ATmega8 -16

(8ko de prog en Flash, horloge =16MHz ) en boîtier:
  • PDIP (DIL étroit)
  • SMD (CMS "Composants Miniatures pour montage en Surface" en français)


La pièce de 2 euro donne une idée de la taille minuscule du boîtier CMS

2 Petit tableau comparatif de deux circuits de prix équivalents (je n'ai rien contre les PIC, je les ai utilisés pendant des années)


PIC16F628
ATmega8 -16MHz
Architecture
RISC (33 instructions)
RISC (mais beaucoup plus d'instructions très utiles, 130 instructions)
Accumulateur logique
1 seul (W)
32 , tous adressables directement
Pile
8 niveaux
TOUTE LA RAM !!!!! On respire !
PROG en FLASH
2 K
8 K
EEPROM
128 octets
512 octets
RAM
224 octets
1 K
fréquence horloge
20 MHz  (4c/instr)
16 MHz mais.... 1cycle horloge / instruction (sauf branchements)
vitesse
20/4 = 5Mips
16 Mips
timers
3
3
Conv A/N
non
oui
multiplication
non
oui
prix (environ)
environ 4 euros
1.50 euro (Avril 2009)

3 Remarques

Bien sûr il existe des PIC beaucoup mieux dotés en ressources, mais alors... ils sont plus cher (actuellement en 2005) Avril 2009: On commence à trouver des ATmega32 à 2 euro! (la version CMS) (liens externes) (32 Ko de mémoire Flash, 1Ko EEPROM, compatibles JTAG, 4 ports de 8 bits complets). Remarques: Une nouvelle famille (lien externe 2) de uC commence à me faire des clins d'oeil: les uC à coeur ARM 32 bits comme les AT91SAM7 d'ATMEL, des petites bêtes qui tournent à 55MHz ! Ah là là ! ça va trop vite, difficile de suivre! Septembre 2011: Pour 15€ on peut jouer avec un AT91SAM9RL64 qui tourne à 240MHz (265 MIPS à 240 MHz) et dont la liste des caractéristiques donne le vertige: des DMA, USB2, instructions DSP, LCD Controller, 64-KByte internal SRAM, PLL à 240 MHz, des timers 32 bits etc, etc... AT91SAM9R64.pdf Je vais maintenant vous donner un certain nombre de conseils, afin d'éviter de galérer si vous décidez d'utiliser les ATmega pour la première fois.

4 COMMENT EN SAVOIR PLUS SUR LES CIRCUITS AVR ?

Je vous conseille de lire l'ouvrage de Christian Tavernier "Microcontrôleurs AVR, description et mise en oeuvre" chez DUNOD Pour plus d'informations sur ce livre, voir le site ce Ch. Tavernier: http://www.tavernier-c.com/livres.htm

5 Où trouver plus d'informations sur les uC ATMEL ainsi que les datasheets ?

6 COMMENT ECRIRE ET ASSEMBLER UN PROGRAMME EN ASSEMBLEUR AVR ?

Avec le soft AVR Studio (actuellement version 6) téléchargeable gratuitement sur le site d'ATMEL

http://www.atmel.com/dyn/products/tools.asp?family_id=607

Vous obtenez ainsi un fichier .ASM et après assemblage un fichier .HEX A noter: concernant la description des instructions, l'aide de Studio6 est mieux faite et plus pratique que le datasheet.

7 Programmation des AVR en langage C, sous LINUX :

J'ai pendant des années programmé les AVR avec l'IDE Kontrollerlab.
Kontrollerlab était un IDE parfaitement adapté à la programmation des uC ATMEL AVR. Il était lui même développé sous KDE3.5 Or KDE3.5 a laissé la place à KDE4 (dans les dernières versions de Linux Ubuntu) et la cohabitation KDE3-KDE4 est délicate et déconseillée. On peut toujours tenter de compiler les sources, mais on bute rapidement sur des problèmes de dépendances non satisfaites si KDE3.5 n'est pas installé.
Le portage de Kontrollerlab sur KDE4, bien qu'entrevu en 2008, n'est toujours pas réalisé à ma connaissance. C'est la raison pour laquelle j'ai abandonné Kontrollerlab au profit de Geany, qui correctement paramétré, permet d'obtenir le même résultat.

Je vous présente donc ci-dessous deux pages distinctes décrivant la mise en oeuvre et l'utilisation de ces deux logiciels:

8 liens

9 COMMENT PROGRAMMER les ATmega en PASCAL ?

Il est possible de développer des applications directement en langage PASCAL pour les microcontrôleurs AVR.

En particulier E-LAB-Computers fournit toute une gamme d'outils de développement MULTI TACHE en mode graphique, avec debuggueur puissant et complet intégré, et  comprenant en prime l'implantation automatique de fonctions de communications telles que:
  • RC5 (télécommandes IR pour TV par exemple)
  • DCF77 (protocole des horloges radio-pilotées)
  • FAT16 (interface disque dur et autre cartes mémoires)
  • Servo RC
  • bus I2C
  • USB
etc..  Je ne vous en dis pas plus, voyez par vous-même dans la caverne d'Ali-Baba:
 C'est très pro, et bien documenté. Le tuto est très bien fait, très clair.

La version pour ATmega8 est gratuite! Cette version limite la taille du code compile a 8ko. De quoi remplir un ATmega8 donc. Le problème qui apparaît rapidement c'est que le code généré est volumineux dès qu'on inclus des "drivers" et des routines math (virgule flottante). Et c'est une des raisons pour lesquelles, après plusieurs réalisations faites en Pascal avec cet outil, je me tourne actuellement vers la programmation en C avec avr-gcc (voir plus haut). Je vais pouvoir comparer la taille des codes obtenus... je vais faire la comparaison pour le générateur VHF 160MHz décrit sur ce site.


25 avril 2012:

Les informations fournies ci-dessus sont à vérifier. J'ai laissé tomber le Pascal au profit du langage C et des outils logiciels libres qui vont avec.

10 COMMENT PROGRAMMER les ATmega en Basic Bascom ?

Il est possible de développer des applications directement en langage BASIC pour les microcontrôleurs AVR.

Je ne suis pas spécialiste de la question, tout ce que je connais du langage basic se résume à son instruction "goto" et aux ZX81 et  ZX Spectrum avec lesquels je jouais il y a bien longtemps...
Mais le basic a ses adeptes qui lui trouvent bien des atouts pour l'utilisation sur ces petits microcontroleurs, le principal étant sans doute la simplicité de la mise en oeuvre pour de petits programmes.

Je passe donc la parole à des spécialistes, qui vous en diront plus que moi sur ce site:


11 COMMENT PROGRAMMER PHYSIQUEMENT LA BESTIOLE ?

Avec un "Programmateur en circuit (ICSP) pour microcontrôleurs ATMEL" tel que celui décrit par Christian Tavernier  sur son site :

en particulier sur cette page: Vous y trouverez le schéma (très simple) et l'implantation.

Pour ma part, voici ci-contre celui que j'ai réalisé d'après ce schéma de Ch. Tavernier, mais j'ai refait l'implantation (afin d'obtenir des pistes nettes...) sous EAGLE. (Que j'utilise depuis peu en remplacement de Orcad, il faudra que je vous parle aussi de cela!)

25 avril 2012:

Depuis j'ai laissé tomber Eagle au profit de Kicad, logiciel libre qui tourne sous Linux.

12 programmateur USBASP

13 USBASP

30 Avril 2007:
Je viens de découvrir ceci: programmateur USBASP

Un programmateur USB simple à réaliser pour les microcontrôleurs ATMEL AVR, basé sur un ATMEGA8.
Le logiciel de programmation associé au programmateur USBASP est « AVRDude »
J'ai testé: ça fonctionne très bien avec mes ATmega8 et ATmega32.

Ce soft fonctionne en ligne de commande: sous Linux, il faut taper dans un terminal une commande comme par exemple:
  • sudo avrdude -p m32 -c usbasp -P /dev/ttyUSB0 -u -U flash:w:/chemin/truc.hex:i
(pour plus de détails sur les paramètres, taper avrdude --help dans un terminal)

 Il existe des interfaces graphiques (GUI) qui permettent de l'utiliser confortablement,  je citerai:
  • avrdude-gui (ce fichier zip contient avrdude)
  • AVR8-Burn-O-Mat (logiciel en java, multiplateforme donc, et beaucoup plus confortable pour programmer les fuses)

Site du concepteur du programmateur USBASP:
J'utilise couramment ce programmateur
  • sous Windows (avec AVR8-burn-O-Mat)
  • sous  Linux (avec AVR8-burn-O-Mat et avrdude)
Août 2009:
Note pour Linux:
si avrdude vour retourne le message d'erreur suivant:
avrdude: Warning: cannot query manufacturer for device: error sending control message: Operation not permitted, c'est que vous n'avez pas les droits d'acces en ecriture au peripherique USB. (Lancez avrdude en "sudo", vous verrez... )

Astuce: sous Linux (gnome, comme par exemple Ubuntu) pas besoin  de programme spécial pour lancer avrdude. Il suffit de créer un script nautilus (un fichier texte auquel on donne la permission d'exécution) avec comme contenu:

#!/bin/bash

gnome-terminal --command="avrdude -p m32 -c usbasp -P ttyUSB0 -u -U flash:w:./ape2008.hex:i"

(remplacer le nom du fichier.hex {ici ape2008.hex} par le bon). le ./ qui le précède indique le chemin relatif (c.a.d que le script doit être dans le répertoire du .hex)
ttyUSB0 : voir dans  /dev si c'est le bon (ça peut être ttyUSB1 par exemple)

On peut aussi lancer la commande directement dans un terminal ouvert manuellement...

Pratique pour reprogrammer un ATmega pour lequel on ne dispose pas des sources ou du compilateur mais juste du .hex

Voici les options pour la commande avrdude. Les possibilités ne manquent pas !

Usage: avrdude [options] Options: -p Required. Specify AVR device.
-b Override RS-232 baud rate.
-B Specify JTAG/STK500v2 bit clock period (us).
-C Specify location of configuration file.
-c Specify programmer type.
-D Disable auto erase for flash memory
-i ISP Clock Delay [in microseconds]
-P Specify connection port.
-F Override invalid signature check.
-e Perform a chip erase.
-O Perform RC oscillator calibration (see AVR053). -U :r|w|v:[:format]
Memory operation specification.
Multiple -U options are allowed, each request
is performed in the order specified.
-n Do not write anything to the device.
-V Do not verify.
-u Disable safemode, default when running from a script.
-s Silent safemode operation, will not ask you if fuses should be changed back.
-t Enter terminal mode.
-E [,] List programmer exit specifications.
-x Pass to programmer.
-y Count # erase cycles in EEPROM.
-Y Initialize erase cycle # in EEPROM.
-v Verbose output. -v -v for more.
-q Quell progress output. -q -q for less.
-? Display this usage.


Enfin voici un lien vers une page qui vous décrira la fonction de chaque jumper placés sur la carte USBASP.


14 Oui, mais... QUEL LOGICIEL UTILISER POUR FAIRE FONCTIONNER LE PROGRAMMATEUR de Tavernier ?

Voici un logiciel compatible et prenant en charge les ATMEGA (et pas seulement les AT90...) :

Pony Prog

versions Win98, WinXP et LINUX !
que vous pouvez télécharger ici:


15 Un petit tuyau pour la route...

Le programmateur permet de programmer le uC en place dans son environnement électronique définitif, (si celui-ci laisse l'accès libre aux signaux MOSI, MISO Reset et SCK) et si il est alimenté par la platine électronique sur laquelle est implanté l' ATMEGA.
Mais... peut-on l'utiliser pour programmer un microcontrôleur "tout seul", sans montage électronique associé ?

OUI, mais il faut au moins:

  • alimenter le microcontrôleur sous 5V
  • et câbler le quartz 16MHz d'horloge et les deux condensateurs associés (ou une horloge externe)
Sans quoi... le uC n'est ni reconnu, ni programmé.

On peut donc, le cas échéant,  fabriquer une petite platine recevant ces composants et le microcontrôleur, plus un 78L05  et une pile de 9V pour l'alimentation en 5V (sauf si vous optez pour le  programmateur USBASP qui fournit une alimentation 5V à partir de l'USB, en plaçant juste un cavalier sur la carte).
Le tout à connecter au bout d'une nappe à 10 fils (nappe "port série" récupérée sur un PC par exemple, en ajoutant un connecteur enclipsable manquant avec un petit étau).

16 Configurer un ATmega tout neuf

Pour programmer un ATmega32A (par exemple) (boitier sdm TQFP44) neuf il faut : -lire les fusibles et les programmer correctement le cas échéant.
Pour cela :

  1. connecter le programmateur usbasp sur l'ATmega par le connecteur de programmation série (ICSP utilisant les pins MOSI, MISO, SCK, RESET, GND, et VCC). Le VCC doit être alimenté, le quartz câblé avec ses des condensateurs.

  2. sur le programmateur placer le jumper qui le configure en mode lent. (IMPORTANT sinon ATmega pas vu !)

  3. Lancer (dans un terminal ouvert dans le répertoire contenant l'exécutable java AVR-8_Burn-o-Mat) le programme AVR-8_Burn-o-Mat (avr8burnomat pour les intimes) par la commande (qui le lance en mode administrateur donc): "sudo java -jar AVR8_Burn_O_Mat.jar"

  4. dans avr8burnomat:
    -dans AVR type, choisir le bon uP (ici ATmega32)
    -ouvrir le menu "settings" / AVRDUDE choisir:
    -programmeur = usbasp
    -port = usb
    -faire apply


  5. de retour dans la fenêtre principale de avr8burnomat clique sur le bouton "Fuses"

    si on utilise un quartz 16MHz :
    -aller dans l'onglet "Oscillateur-Clock Options"
    -aller dans le sous-onglet "External cristal or ceramic resonator"
    sélectionner:
    -Type = "cristal"
    -Frequency range = "8.0MHz - 16.0MHz"

Puis cliquer sur le bouton tout en haut "write fuses".
Une petite fenêtre indique alors "Fuses sucessfully written"

Maintenant on peut retirer le jumper (sur le programmateur) qui place l'ATmega en mode lent. On peut aussi utiliser un autre programme de programmation. Moi j'utilise avrdude dans un terminal Linux en tapant (par exemple) ceci :

"sudo avrdude -p m32 -c usbasp -P /dev/ttyUSB0 -u -U flash:w:./Enregistreur_SDcard.hex:i"

On est obligé de taper tout ça 50 fois dans la journée ??? Heureusement que non, sous Linux, un appui sur la touche "flèche haute" dans le terminal rappelle la commande.
Taper "avrdude --help" dans le terminal pour avoir les détails des options de cette commande.

17 J'ai suivi tous les conseils, mais rien ne fonctionne: l'ATMEGA oscille à une fréquence très lente !

..voire pas du tout et impossible de le programmer!

Sans doute n'avez-vous pas ou mal programmé les "bits de configuration", "fusibles" ou "fuses" (un bouton représentant un cadenas dans Pony prog permet d'accéder à cette fonction, il faut cocher judicieusement les bonnes cases) et votre ATMEGA est en mode oscillateur externe ou RC interne, mais pas en mode oscillateur à quartz.

Il faut alors câbler un oscillateur (4MHz environ) externe qui ne servira qu'une fois, le temps de reprogrammer les fuses (avec le programmateur port // de Tavernier et le soft Pony Prog car je n'ai pas réussi dans ce cas de figure à réveiller les ATmega, parfois même tout neuf,  avec le programmateur USB, ne me demandez pas pourquoi, quelque chose m'échappe...), par exemple ceci:

18 schéma oscillateur externe

Le circuit 40106N est un Circuit intégré de la famille CMOS de type CD40106 contenant 6 inverseurs à hystérésis.

Datasheet du 40106:


Voir aussi le datasheet de l'ATmega pour le raccordement de cet oscillateur à l'ATmega:


Dans le cas où le microcontrôleur cible doit fonctionner en mode oscillateur RC à très basse fréquence, pensez à fermer le jump JP3 sur la carte du programmateur USBASP, sinon la réponse du circuit ne sera pas reçue et la programmation échouera. Voir cette page :

19 retour d'expérience

Pour la petite histoire:

Il m'est arrivé  la chose suivante: Après avoir travaillé avec un ATmega32 pendant plusieurs semaines, l'avoir reprogrammé à maintes reprises avec le programmateur USB, un beau matin impossible de l'utiliser: le programme qu'il contenait ne tournait plus, et plus moyen de le programmer in-situ. Evidemment le CI était soudé sur le proto, pas sur support! Ayant tout essayé infructueusement pour le programmer in-situ, je me suis vu, une pince coupante à la main, avec l'intention de lui couper toutes les 40 pattes, direction la poubelle! Puis j'ai eu un remord, j'ai pris la peine de le dessouder à grand renfort de pompe et de tresse à dessouder, roundujuu! puis je l'ai placé sur une plaque d'essai, juste alimenté, sans les condensateurs ni le quartz d'horloge, mais câblé sur le fameux oscillateur à 40106. Un coup de programmateur // sur ses fusibles, et là, hop! il s'est réveillé en pleine forme!
Je pense que sa déprogrammation (y compris donc de ses fusibles) était due à des  manipulations malencontreuses sur le plan électrostatique du proto (de l'APE2008) alors que certains de ses pins étaient 'en l'air'  juste connectés à des bouts de fils volants.

20 et le mode parallèle ?

24 juin 2008:
Mon expérience des ATmega augmentant au fil du temps, je commence à mieux cerner les causes de blocage. Le meilleur moyen de se retrouver avec un ATmega32 sourd à toute tentative de programmation, (de la Flash, et des fuses) quel que soit le programmateur en mode série utilisé c'est de tenter (alors qu'il est encore en parfaite santé) de le programmer en oubliant de l'alimenter. (On connecte le programmateurICSP sur le uC en circuit et on envoie le programme en oubliant d'alimenter la carte hôte...) Ca m'est arrivé plusieurs fois, et à chaque fois ça n'a pas raté, j'ai obtenu 'device not present' puis plus moyen de le faire reconnaître sauf sorti de sa carte et en lui ajoutant une horloge externe comme expliqué plus haut. Sauf que... il peut arriver (il vient de m'arriver) que cela ne suffise pas: il semblerait que l'étourderie du manque d'alimentation entraîne une programmation partielle et aléatoire qui touche également les 'fuses'. En principe le fusible 'SIEN' (permettant la programmation en mode série ) ne peut pas être (dé)programmé en mode série, oui mais avec un uC non alimenté on y arrive apparemment. (à moins que ce ne soit un des nombreux fuses d'interdiction en écriture de telle ou telle partie, présents sur le ATmega32. Mais dans ce cas la fonction d'effacement général devrait encore être active, ce qui n'est pas le cas).

Dans ce cas que faire? le jeter? En fait je pense que l'ATmega n'est pas mort, et donc en théorie il est toujours programmable et effaçable avec un programmateur en mode parallèle. Je ne peux pas le confirmer pour l'instant parce que je n'ai pas trouvé de schéma de programmateur // (après avoir cherché des heures durant, tout le monde, moi compris y va de sont petit programmateur série, mais le mode parallèle personne n'en parle).
Le datasheet de l'ATmega32 décrivant les algorithmes de programmation //, il me reste plus qu'à en concevoir un (avec un ATmega8 par exemple) !
Je vous tiens au courant.

Par la suite je maintiens que la programmation USB est bien plus pratique.

Avec le soft AVR8-Burn-O-Mat, la programmation des fuses est rendue très simple.

Pour en savoir plus à propos des "fuses" voir également ces pages:


Voilà de quoi obtenir rapidement un environnement de travail totalement fonctionnel.
J'ai testé le programmateur et  tous ces logiciels (sous Windows) et j'ai pu programmer de nombreux ATMEGA8 avec succès.

14 novembre 2010:

"Guillaume" me fait, par e-mail, une remarque que je recopie ici:

Vous indiquez sur votre site qu'en cas de problème avec les fusibles d'un avr, il est possible d'utiliser le mode de programmation en parallèle. Pour les "petits" avr, il existe la méthode "haute tension" +12V sur la patte "reset" J'ai même trouvé un programmateur usb qui intégre cette fonctionnalité:
Je ne doute que vous connaissiez cette méthode (puisque j'ai vu votre intervention sur le site pobot) mais il me semble que vous ne l'indiquez pas sur votre page dédié aux avr.

Voilà qui est fait. Merci Guillaume pour cette info.

21 Quelques réalisations perso. à titre d'exemple (Liens internes):

22 Un Générateur de Fréquences

23 Générateur HF 1Hz-40MHz sinus - digital à DDS AD9850

24 Générateur HF 40 à 90 MHz sortie sinus synthétisé par PLL

25 Générateur HF 90 à 160 MHz sortie sinus synthétisé par PLL

26 Distributeur de nourriture pour petits animaux de compagnie

27 Déclencheur automatique pour APN

28 PROGRAMMATEUR POUR LAVE LINGE

29 Variateur (Contrôleur) pour moteur BRUSHLESS

30 LIENS EXTERNES

ARM: (uC 32 bits)

moi je ne vends rien, je n'ai aucun intérêt dans la vente de composants et je n'ai aucun lien personnel avec les commerces cités; toutefois je publie ci-dessous des liens qui permettent de s'approvisionner en composants parfois difficiles à trouver en France, à part chez Electronique Diffusion).

  1. AVRfreaks un site spécialisé dans les AVR.
  2.  http://www.trade-shop.de/catalog/index.php (vente de composants divers à l'unité et en particulier des uC ATmega haut de gamme )
  3. http://dkc1.digikey.com/fr/digihome.html (vente de nombreux uContrôleurs y compris des  AT91SAM7 !)
  4. http://en.shop.embedit.de/
  5. ARDUINO
  6. http://www.lextronic.fr/R2547-arduino-version-officielle.html
  7. http://www.robotshop.com/eu/arduino-en.html
  8. http://www.jlectronique.org/index.php
  9. http://www.jlectronique.org/jlectronique/Uno.htm

31 -

Liens...



91336