Programmez les microcontrôleurs AVR en C sous GNU/Linux
Les outils performants de développement pour composants programmables sont souvent chers, donc
inabordables pour les particuliers, voire pour de petites entreprises. Néanmoins, l'avancée du système d'exploitation
GNU/Linux a permis l'élaboration de logiciels de compilation et de programmation ISP très puissants et gratuits. Le
seul investissement réside éventuellement dans la réalisation d'une carte de test.
L'ensemble décrit dans cet article ouvre la porte à la programmation des microcontrôleurs AVR en
langage C, qui autorise l'écriture de fonctions de haut niveau, l'implémentation de routines mathématiques, mais qui
laisse aussi toutes les ressources interruptives et temps réel disponibles. De plus, il est possible de linker du code source
assembleur avec des appels en C.
Fichier .ASM Fichier1 .C Fichier2 .C Librairies
Compilateur ASM Compilateur C
Linker
Code objet
Binutils
Code source .SRC complet Fichier .HEX complet
Programmateur
Platine de développement
/
Application
L'écriture d'un programme passe d'abord par l'étude de la partie matérielle de la platine de
développement ou de la platine d'application finale. On répertorie les entrées – sorties, leur configuration, les éléments
internes tels que UART, Timers, puis on définit des équivalences et des routines d'initialisation. Ensuite, il s'agit d'écrire
les routines (appelées "fonctions" en C) qui gèrent ces entrées – sorties ou les éléments internes. L'écriture du
programme principal s'en trouve simplifié et beaucoup plus "lisible" (compréhensible pour quelqu'un qui relit le
programme). Le test du programme se fera immédiatement après la compilation (transformation des sources ASM et C
en code directement exploitable par le microcontrôleur), à la fin de la programmation ISP.
La platine de développement proposée supporte le microcontrôleur AT90S8515. Voici un bref
récapitulatif de ses caractéristiques :
§ noyau RISC, une instruction exécutée en un cycle d'horloge
§ 8Ko de Flash
§ 512o de SRAM
§ 512o d'EEPROM
§ Timer 8 bits et Timer 16 bits
§ Comparateur analogique
§ UART
§ SPI
On a donc ajouté les composants nécessaires pour "évaluer" ses possibilités :
§ liaison RS232
§ liaison ISP
§ afficheur LCD 2x16 caractères
§ Dip Switch
§ Leds
§ Boutons – poussoirs
§ connecteurs d'entrées – sorties
LCD 2x16
RS
232
PC de développement ISP AT90S8515
I/O
Boutons
Leds DS04
poussoirs
L'étude du schéma reprend en détail tous ces points : le microcontrôleur est cadencé à 7.3728MHz par le
quartz Q1. Le temps de cycle d'exécution d'instruction est approximativement de 135ns. Le connecteur JP2 sert à la
programmation ISP du composant, ou à l'utilisation normale du port SPI. Le connecteur JP3 sert à la liaison RS232
entre la platine de développement et un PC, ou un système RS232 quelconque. Les niveaux TTL présents sur les
broches PD0/RD et PD1/TD sont adaptés par le circuit U2 (MAX232). Bien entendu, le connecteur JP3 respecte le
brochage de ce type de prise RS232.
Les boutons poussoirs PB1 et PB2 sont reliés aux ports PD2 et PD3. Ces lignes d'entrées – sorties sont
partagées avec les ressources internes “entrée d'interruptions externes 0 et 1”. La gestion de ces deux boutons poussoirs
peut se faire de manière classique (lecture régulière de la valeur TTL correspondante, au travers du registre PIND) ou
par interruption (priorité d'exécution de la routine correspondante lors de la détection du front configuré). Quelle que
soit la solution retenue, les ports PD2 et PD3 seront configurés avec résistances de tirage au niveau haut internes.
L'appui sur un bouton fera passer la ligne de +5V à 0V. Si on utilise la fonction "interruption externe", elle sera activée
sur front descendant, front montant ou niveau bas, en fonction de la configuration du registre spécifique MCUCR. Cela
laisse donc le choix quant à la manière de gérer un évènement.
Quatre leds sont connectées au port C, de PC4 à PC7. Ces lignes seront configurées en sorties, et elles
peuvent fournir suffisamment de courant pour piloter les leds. On choisira tout de même des modèles 2mA, pour ne pas
surcharger le port en courant.
Le reste du port C, PC0 à PC3 est connecté à un DIP Switch à quatre interrupteurs. Le port est configuré
en entrée, mais avec résistances de tirage au niveau haut. Ainsi, comme pour les bouton - poussoirs, la fermeture d'un
interrupteur provoquera le passage à 0V de la ligne correspondante. La lecture du DS04 se fera au travers du registre
PINC (état des entrées du port C).
Le port A est utilisé pour piloter un afficheur LCD 2x16 caractères. Les lignes de contrôle (RS, R/W et
E) sont gérées par les ports PA0, PA1 et PA2. Les lignes de données sont quant à elles gérées par les ports PA4 à PA7.
Seule la ligne PA3 reste inutilisée. L'afficheur sera configuré en mode 4 bits, ce qui économise des sorties
microcontrôleur. Le code de gestion de l'afficheur augmente de quelques lignes, mais ce n'est pas pénalisant pour la
rapidité d'exécution d'affichage (un écran complet, 32 caractères, est affiché en 1.5ms). Le réglage du contraste de
l'afficheur se fait par le trimmer TR1. La ligne de contrôle E (Enable) valide l'envoi de données vers l'afficheur. La
ligne RS (Register Select) informe l'afficheur du type de donnée envoyée : caractère ou commande (positionnement du
curseur, effacement complet, etc). La ligne R/W (Read / Write) permet d'écrire une donnée ou de lire l'état de l'afficheur
(Busy, par exemple).
Tous ces composants fonctionnent sous +5V, rôle confié au régulateur U1, un MC78T05CT. Ce modèle,
moins courant que le MC7805, peut fournir 3A. Ce qui est pratique si on utilise le rétro - éclairage de l'afficheur LCD,
sans être obligé d'ajouter un dissipateur thermique. Les condensateurs C1 à C5 garantissent le découplage des lignes
d'alimentation. La tension d'entrée (connecteur JP1) est continue, et est d'au moins +6.5V.
La carte est fabriquée avec de l'époxy 1.6mm, simple face. Le format est au standard Europe (160mm x
100mm). Il conviendra de souder en premier lieu les straps, les résistances, les petits condensateurs, les boutons -
poussoirs et le quartz. Ensuite, seront placés les supports DIL, le DS04 et les condensateurs plus gros. On terminera par
les connecteurs DB9, bornier à vis, barrettes sécables (LCD et entrées – sorties). Avant de mettre en place les circuits
intégrés, on peut éventuellement tester la présence du +5V sur les lignes d'alimentation. Si le microcontrôleur n'est pas
vierge, il se peut que les leds ou l'afficheur LCD aient un fonctionnement aléatoire.
Lorsque la carte est finie, on peut passer à l'installation des logiciels de compilation et de
programmation ISP.
Le système GNU/Linux, qui se répand de plus en plus chez les particuliers comme dans certaines
entreprises, est un système multi - tâches et multi - utilisateurs. Sans rentrer dans des détails qui dépasseraient le cadre
de la revue, il faut toutefois noter que c'est un operating system libre et gratuit, développé et maintenu par des centaines
d'informaticiens à travers le monde. Malgré cela, il est très performant et réellement stable.
Le développement d'une application en C pour les microcontrôleurs AVR va être réalisée en plusieurs
étapes : installation du compilateur, des libraires, des binutils et du programmateur. Pour l'installation des fichiers et des
différents programmes, nous vous invitons à consulter le site de l'auteur : www.jls-info.com/yann. Vous y trouverez les
fichiers compressés à télécharger, ainsi que la procédure complète d'installation et de configuration des logiciels.
Lorsque ces étapes sont terminées, on procédera à l'écriture d'un premier programme en C, destiné à
piloter les leds du port C :
#include <io.h>
#include <io8515.h> // définition des équivalences spécifique au AT90S8515
#define PLED PORTC // équivalence LEDS / PORTC
void init(void) // fonction d'initialisation
{
outp(0xF0, DDRC); // configuration des entrées - sorties
outp(0x00, PLED); // LEDS OFF
}
void delay(void) // fonction delay, pour ralentir la modification des LEDS
{
unsigned i,j;
for (i = 0; i < 10000; i++) // compteur n°1
{
for (j = 0; j < 10000; j++); // compteur n°2
}
}
int main (void) // programme principal
{
init(); // appel de la fonction d'initialisation
while (1) // à tout jamais ...
{
outp(0xF0, PLED); // LEDS ON
delay(); // temporisation
outp(0x00, PLED); // LEDS OFF
delay(); // temporisation
}
}
On trouvera également sur le site Internet les exemples de codes C pour gérer le DS04, l'afficheur LCD,
les interruptions externes et l'UART, ainsi que la manière d'appeler des routines assembleur. Lorsque tous les outils
logiciels sont installés, la compilation, le linkage et la génération du code final en assembleur se font à travers un fichier
Makefile. Cela génère aussi un fichier .HEX destiné à la programmation du microcontrôleur, ainsi qu'un fichier .SRC
qui est le code source assembleur de l'ensemble de l'application. Le logiciel UISP sera utilisé pour la programmation du
microcontrôleur. De petits fichiers exécutables sont disponibles pour "remettre à zéro" le microcontrôleur, pour l'effacer
et le programmer in situ.
L'auteur tient à remercier l'ensemble de la communauté GNU/Linux pour leur travail titanesque, efficace
et bénévole.
Yann Leidwanger
Liste des composants
Référence Désignation
JP1 Bornier à vis 2 points
JP2, JP3 DB9 mâle coudée
JP4 Barrette sécable 6 points
JP5 Barrette sécable 5 points
U1 MC78T05CT
U2 MAXA233 + support DIP20
U3 AT90S8515-8PC + support DIP40
U4 Afficheur LCD 2x16 caractères
C1, C2 22µF/16V
C3 à C5 100nF
C7, C8 22pF
Q1 7.3728MHz
PB1, PB2 Touches KSA
R1 à R4 1.5K
LD1 à LD4 Led verte 2mA
SW1 DS04
TR1 Trimmer 10K