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:
|
|
|
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 :
- 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.
- sur le programmateur placer le jumper qui le configure en mode lent. (IMPORTANT sinon ATmega pas vu !)
- 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"
- dans avr8burnomat:
-dans AVR type, choisir le bon uP (ici ATmega32)
-ouvrir le menu "settings" / AVRDUDE choisir:
-programmeur = usbasp
-port = usb
-faire apply
- 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
|
|
|
|