Professional Documents
Culture Documents
GNU Linux Magazine HS - 2009.08 - HS43 - Electronique Embarquee
GNU Linux Magazine HS - 2009.08 - HS43 - Electronique Embarquee
q
ornatsave --noeattiny23 wan.elf
Faisons un petit tour des cibles
= main.hex : C'est notre cible principale od nous retrouvons
Jes options utilisées en ligne de commande avec avr-gcc
pourlle compilateur etI’éditeur de liens. Rien de nouveau
ici, sicen’est 'intégration de a génération du fichiermain.
map. On retrouve également l'utilisation de avr-objcopy
our produire le fichier nain.hex et, juste en dessous,
Ja méme commande pour obtenir un fichier eeprom. hex
‘comprenant les valeurs & stocker dans I'EEPROM de
YAVR. Nous n’avons pas utilisé !/ EEPROM intégrée dans
’Attiny2313 dans notre code, mais cela pourra vous étre
utile en d'autres circonstances. La libe pour AVR intagre
un certain nombre de fonctions utilitaires concernant ce
point. Je vous laisse parcourirle contenu du fichier avr/
eeprom.h, ainsi que le site officiel (hitp:lwww.nongnu.org!
Le monde des microcontrdleurs...
ave!) pour plus d’informations. Notez les options de
la commande avr-obj copy permettant, entre autres, de
réaligner les données pour une utilisation avec AVRdude
(-change-section-Ina .eepron=0).
= dprog : Comme Device PROgramming. C’est ici quo
nous appelons avrdude en utilisant le programmeur in-
situ en place et en récupérant le port a utiliser dans le
fichier ~/-avrdude,
= rd_fuses : Cette cible permet de lire les fuses de 'AVR.
‘Notez| utilisation de deux lignes de commande distinctes.
Normalement, il est possible de spécifier les deux ordres.
hfuse: et Lfuse:r:-:b en une seule commando
‘avrdude (deux occurrences de l'option -U). Ilsemblerait,
que le programmeur USB compatible ait un peu de mal
sur ce point. Le probleme ne se pose pas avec mon
‘adaptatour DAPA, Le b en fin ordre précise un affichage
en binaire, ce qui, pour la lecture des fuses, est bien plus
pratique en termes de compréhension.
= wr_fuses : Ecriture des fuses. Avec le code exemple, la
question de la programmation des fuses ne se pose pas.
Cette cible est placée 18 pour une utilisation avec un
montage plus évolué utilisant un quartz comme source
d'horloge et la désactivation de la division par 8 de la
fréquence. Les valeurs sont spécifiées inline.
'= eeprom : C’est la cible permettant de charger les données
dans EEPROM de I'AVR. Eh oui, AVRdude permet
aussi bien la programmation de la mémoire flash du
microcontréleur que de son EEPROM.
1 reepron : Ilest parfois nécessaire de récupérer les valeurs:
dans !' EEPROM du composant. i, c’est principalement
dans un but d’analyse et de vérification, d’olutllisation
de trois commandes permettant I'affichage (pseudo fichier
=) dans trois formats différents (hexadécimal, binaire et
décimal). Ceci s'avere fort utile lorsqu’on commence a
Jouer avec 'EEPROM et les fonctions dédiées de la libo,
= size : Derniére cible que l'on aurait pu ajouter dans
la phase de génération du fichier au format Intel Hex :
Yaffichage de la taille et de l'occupation de la mémoire
de I'AVR. Encore une fois, la question ne se pose pas
ici avec notre code de démonstration. Dans d'autres
circonstances, il est fort probable que vous risquiez de
jouer du make size assez souvent. En particulier, au
‘moment oll vous vous rendrez compte qu'il est possible
de stocker des données directement dans la mémoire
flash et de les lire depuis votre code,
Ce Makefile est destiné & servir de base de travail A vos
projets. Il peut étre intéressant d’imaginer une division
des instructions dans un fichier commun pour ne garder
dans le Makefile d'un projet quo la partie variable, Ceci se
fera trés facilement en utilisant la directive include dans
votre Nakefile local.
Conclusion
Nous arrivons au terme de cet article ‘introduction.
‘Vous devez étre en mesure maintenant de poursuivre seul
vos expérimentations autour des composants AVR 8 bits,
dAtmel. Je vous conseille de vous équiper avec plusieurs
AVR de familles différentes afin de pouvoir explorer & loisir
tous les types de périphériques intégrés. Personnellement,
Je travaille principalement avec quelques modéles dont
YAtmega8, I‘Attiny2313 et 'Attiny13. Ces trois composants
offrent des avantages ot des fonctionnalités différents tout
en restant trés économiques. Mon domaine de prédilection
se résume généralement a la communication série ou SPI
et... au clignotement de leds. Ne riez pas, il est possible
de faire des choses fantastiques avec 2, 16, 64 ou 192 leds
connectées & un AVR lui-méme branché & un PC par un port
USBisérie. Mais, chacun son terrain de jeu. Peut-étre serez-
vous davantage séduit par les écrans LCD, les capteurs en
tous genres ou la construction d’un AVR communiquant sur
Ethernet. IIn'y a que deux limites, celle des fonctionnalités
de AVR choisi et, surtout, celle de votre imagination,
Aut
Denis BodcTU LS NOIR NR eu
LINUX PRATIQUE 54
O74 CSU Se UR ee ta
AU SOMMAIRE...
eo Ere)
Ee eaeete eer ect caunes
pees e rs
res
Prat
Pere
resent
eed
ers
Pee eo
ieee
Peete erie recerers ot
22 Enwe de réaménager vote incrieur ? Rencontre avec Ie
ddevaloppeur de Sweet Home 3D
a
OS PHOTOS, FILMS, MAILS TET eR ely) aT pratt Te)
LAOS |
SMS NOS
ee ee
ee Ma aaa amused hauler naile inoue Meeps
AUDIOIVIDEO
rT Aiet eee ee oad)
[eset erate CTT
Pe erro Pere eee)
pee ea ete ee ea)
Psa) i Err
Pee alee | Prrererne teenie ay
peste a Bro crn eee tocmecor a
ree)
Laren cng Oe ao
Peal co pry ett entrees chs
eae
Pee ae eee
Reco oe tate nee
ee a Coma arene mete career sta
Lr Peer cna eo Nie ai fotemeettn eres
Rie cuciates rears
Tos = efeeretseteeet)
ees
ot co jest PR ct ae
Perea terial eee
Ce oa a
Eee ee ee
74 Programmes en PHP aac le ZendFramework: les bases
eam ta
Oye ae eke eee
area cea FALL PL
DE JOURNAUX JUSQU'AU 28 AOUT 2009Un éthylometre pour s’authentifier
GNU/Linux, comme d'autres systémes Unix, utilise le systéme
PAM pour modulariser toutes les fonctions d’authentification.
Cave MUM ele eel eee Cle Rem AL teNE
Cue euCnae nen Camara ant cial tear a
aera ac ely eMC CUNe Ree ane
de l'utilisateur ? Aprés tout, un utilisateur saoul est un véritable
danger pour le systéme.
ANTM Age eC MLM (ORO (cre one Ler Nee MeN ULe ETL)
a fait l'objet d’une présentation (RUMP) a SSTIC 2009 par
Ve RS Tae LL ere Nl Pa TA
autres choses. Les explications qui vont suivre seront, bien
entendu, plus détaillées que les 4 malheureuses minutes de
présentation éclair (qui dans les faits ont été plus proches des
eS a tem eerem tee eae eae)
mise en oeuvre d'une des fonctionnalités les plus utiles des
microcontréleurs : la conversion analogique vers numérique
reposant sur/'utilisation d'un ADC (Analog-to-Digital Converter)
ici intégré directement au microcontréleur.
Choix des composants
v = onductivité augmente en fonction de la
NS
Serer eee eee eee ete eee ets
CU ak eec Omer ie oC etter eterna Ten ae
Peart Mint kone eee Cece Meet ta tes eat ens
Gn eee ence tea tata eee eee U rer reese ne rene
relativement pénibles & mettre en ceuvre (variations do la tension de référence ettests successifs)
Sesur le systeme : le montage
Nous avons utilisé ici un capteur répondant a un certain
niveau d’alcool dans I'air, mais les explications qui vont
suivre peuvent étre appliquées a toutes sortes de capteurs
non intelligents (dioxyde de carbone, humidité, ozone,
température, niveau de luminosité, gaz GPL, gaz naturel,
champ électrique, etc.). Dans la plupart des cas, il suffit
d'injecter du courant et de mesurer la tension en sortie,
précisément ce que permet de faire 'ADC.
24 Mise en ceuvre
Le circuit de ce montage est relativement simple. ’Atmega8
ayant été choisi pourson ADC et sa capacité & communique
via un port série, Ie reste de ses fonctionnalités et de ses
broches nest pas utilisé. Ce qui nous intéresse ici ce sont :
= Les broches 2 et 3 correspondantes respectivement aux
lignes RXD (réception série) et TXD (mission série).
= Lesbraches 2328 libellées ADCO & ADCS correspondantes
aux 6 canaux de mesure deI’ADC. Ici, un seul canal nous
sera utile pour connecter le capteur:
1 Les broches 9 et 10 permettant de connecter un quartz
de 14.7456 MHz servant de source d’horloge. LAtmega8
dispose, comme toute la série AVR bit d’un oscillateur
interne, Cependant, celui-ci ne permet pas une précision
optimale pour une communication série. La datasheet,
intagre un certain nombre de tableaux détaillant les,
taux d’erreurs en fonction de la fréquence d’horloge
(page 159 a 162).
= Pour le bon fonctionnement du convertisseur A/N, nous
devons utiliser les pattes 20 et 21 pour y présenter la
tension de référence. Dans le cas présent, il s‘agit, tout
simplement, de relier ces broches a VCC (7), puisque AVR
est alimenté en +5 volts, tout comme le capteur MQ-3,
1 Les broches 7 et 8 correspondent respectivement & la
tension d’alimentation et la masse.
a La broche 1 correspond & la fonction de reset du
microcontrélour. Elle n'a pas besoin d’étre reliée &
VCC via une résistance de rappel au +5 volts. En effet,
contrairement & d’autres modéles d’AVR, I’Atmega8
Intagre déja cette résistance de rappel comme le montre
Je schéma page 38 de la datasheet.
= Labroche 15 peut étre directement lige au comportement
d'un circuit interne (timer) et change alors de nom de
PBI a OCIA. Ceci nous servira a avoir un retour visuel
sure fonctionnement de notre code et la prise de mesure.
Le circuit s'avére donc relativement simple et pourra
facilement étre testé sur une platine & essai (breadboard)
avant 4’étre réalisé sur plaque pastillée ou via les méthodes
classiques de réalisation de circuits imprimés.
Le schéma en figure 1 présente le circuit complet. Notez
utilisation de condensateurs de filtrage permettant de
stabiliser I'alimentation de 'AVR. Ceci s‘avere indispensable
orsqu’on travaille & ces fréquences et via utilisation d’un
quartz ou d’un quelconque autre oscillateur externe. De
‘nombreux problemes aléatoires relativement difficiles& cemner
apparaissent en I'absence de ce type de filtrage. Ceci est tout
aussi valable pour un montage communiquant via un port
série que pourl'USB. Sachez, en effet, qu'il est parfaitement
possible de faire communiquer un AVR « standard » sur
un bus USB. Pour peu que Ie microcontréleur dispose de
ressources suffisantes, il est possible de gérer le protocole
de maniare entiérement logicielle (voir GLMF 100 p. 56).
Principe de fonctionnement
‘Le code pour!‘AVR repose sur plusieurs éléments importants,
Bion que les ressources mises disposition parle microcontréleur
soient largement inutilisées, il est important de bien faire
le tour des fonctionnalités utilisés pour les lecteurs faisant
leurs premiers pas dans ce type de développement.
il Port série
Comme spécifié précédemment, I'Atmegaé intégre ce qui
est décrit sous le nom USART (Universal Synchronous
and Asynchronous serial Receiver and Transmitter) dans
Ja documentation du fabricant. Il s/agit d'un périphérique
de communication extrémement configurable. Lobjectif
ici est son utilisation en mode asynchrone a la maniére
d'un port série de PC, Attention, bien que le protocole de
communication soit similaire, il n’en va pas de méme pour
les broches (ou lignes) en présence et surtout les tensions
utilisées. Hors de question donc de connecter les deux
lignes RX (réception de données) et TX (transmission de
données) directement sur les broches correspondantes d'un
port RS-232 (si vous en disposez encore sur votre machine
récente). On travaille ici en TTL avec des niveaux logiques
entre 0 et 5 volts par opposition au RS-232 qui fait usage de
+12/-12 volts. Un montage simple & base de transistors et de
résistances permet de faire la conversion assez facilement,
‘mais nous avons choisi ici une solution encore plus simple
le convertisseur USB/Série TTL. Celui-ci se présente sous
la forme d’un nouveau port série pour le systeme héte,
mais utilise des tensions TTL, Ce type de produit se trouve
un peu partout sur le Web pour quelques euros avec une
référence pour les sites de ventes aux enchéres en ligne
proposant souvent des productions en provenance de pays
de l'Est ou a’Asio.
Liutilisation de 'USART dans le code AVR est relativement
simple et se passe en plusieurs étapes
Cun
ar1 Initialisation de" USART via des registres spécifiques
de configuration (UBRRL, UCSRB et UCSRC).
Lenvoi de données sur le port via T’utilisation
d'un registre dédié (UDR) apres vérification de
1a possibilité de le faire,
1 Larséception de données, toujours vial registre UDR,
‘mais par''utilisation dune interruption spécifique.
Dans les deux derniers cas, nous utiliserons des
fonctions spécifiques permettant de simplifier ’écriture
et la réutilisation du code. Mais, commencons parle
début, activer et configurer !USART via les registres
= UBRRL est la partie basse du registre de 16 bits,
‘UBRR (USART Baud Rate Register) quidéterminela
vitesse de communication du port. Un tableau dans
ladatasheet donne les valeurs correspondantes en
fonction dela fréquence d‘horloge dumicrocontroleur.
= UCSRB pour USART Control and Status Register
B,est!'un des registres de configuration du port.
Ce qui nous intéresse ici prend la forme des bits
XEN (activation de la réception), TXEN (activation
de’envoi) et RXCTE (Le déclenchement d'une interruption
encas de réception). Les deux premiers bits feront passer
les broches PDO et PD1 de leur fonctionnement classique
(port D) au mode USART.
m= UCSRC pour USART Control and Status Register C
détermine, entre autres choses, le format de données
sur le port série. Ce registre est un peu particulier, car
il partage le méme point d’accés (port) que le registre
UBRRH. Un bit particulier, URSEL, doit impérativement
tre écrit 1 lorsqu’on souhaite accéder au registre UCSRC.
Dans le cas contraire, on écrira dans UBRRH. Lautre bit
qui nous intéresse est UCSZ0 qui permet, en compagnie
d’UCSZ1 et UCSZ2, de choisir la taille des données. Ici,
nous voulons travailler en 8N1 (8 bits de data, pas dé
parité et un bitde stop). Les valeurs par défaut des autres
bits du registre correspondent dja & nos intentions. Pour
information, USBS détermine le nombre de bits de stop,
PHO ot UPI définissent la parité.
COté envol de données (post initialisation donc) la procédure
estrelativement simple. Nous nous assurons que le registre
UDR est disponible en écriture, puis, lorsque c'estle cas, nous
y placons notre donnée qui sera envoyée automatiquement.
Lavérification tient en la lecture d'un simple bit, UDRE dans le
rregistre UCSRA, le registre A de contréle et d'état de 'USART,
La réception est plus complexe. Nous avons configuré
la génération d‘une interruption lors de la réception. Un
voctour d’interruption est donc associé et nous n’avons qu’
positionner notre routine a cet endroit. Une macro permet
cela sans aucune difficulté. Lors de interruption, le registre
UDR contient la donnée recue, mais il ne s’agit. que d’un seul
caractére. Nous souhaitons travailler un peu a la maniére
d'un modem ou d'une console. Tl nous faut récupérer des
lignes complétes (habituellement terminées pas \r) et,
faisons les choses correctement, nous affichons un écho des
données envoyées (fort pratique en phase de test). Lors de
interruption, nous traitons donc le caractére en le plagant
dans un buffer et en incrémentant un compteur. Lorsque
ous recevons \r, nous ajoutons 0x00 en fin de buffer,
nous activons un flag propre & notre code permettant de
signaler qu'une chaine est disponible et nous désactivons
la génération d’une interruption lors de la réception. Ceci
nous permet de ne plus accepter de nouveau caractére tant
que la chaine disponible n’aura pas été traitée.
‘Tout comme pour USAR, ADC doit étre configuré avant
utilisation. Les broches 23 & 28, respectivement PCO &
PCS en mode de fonctionnement classique (bit. 0.4 5 du
port C), devionnent ADCO & ADCS en activant le bit ADEN
du registre ADCSRA (ADC Control and Status Register A).
1 faut également configurer, dans ce méme registre, les
bits ADPSO & ADPS2 definissant le prescaler pour I’ADC.
La datasheet est trés explicite de ce point de vue : pour
un fonctionnement optimal, I'ADC doit fonctionner & une
fréquence d’échantillonnage entre 50 Khz et 200 Khz. Notre
AVR fonctionnant a plus de 14 Mhz, nous configurons les
bits pour une division de la fréquence systéme, Ie prescaler,
par 128 (111), qui nous donne un peu moins de 100 Khz.
C'est un point important & prendre en considération pour
d'autres montages. Ici, nous utilisons un oscillateur &
quartz nous permettant de faire fonctionner l'USART avec
un taux d'erreur nul. Dans d’autres cas, ’Atmega8 pourra
fonctionner avec son oscillateur interne 1 Mhz par exemple
(configuration par défaut).
Ce n'est pas tout. LADC peut fonctionner, & instar de
TUSART, en utilisant une interruption. Le temps de conversion
n'est pas nul. Lorsqu’on déclenche une mesure, il faut
attendre la fin de la conversion pour obtenir le résultat. IL
faut donc activer 'utilisation de I'interruption avec le bit
ADIE du registre ADCSRA. Deux modes de fonctionnement
sont disponibles pour la conversion. Soit nous désirons
une conversion ponctuelle, auquel cas notre configuration
s‘arréte la et nous pouvons déclencher arbitrairement une
mesure en positionnant le bit ADSC, soit nous utilisons le
mode Free Running. Dans ce cas, le fait de positionner
ADSC déclenchera une premiére conversion qui, une fois
terminée en provoquera une seconde et ainsi de suite. Ici,
nous préférons utiliser le premier mode. Nous déclencherons
une conversion de maniére récurrente, mais avec l'aide
dun timer préalablement configuré.
Le schéma de fonctionnement est done simple, Nous
déclenchons une conversion, puis traitons la donnée dans
la routine d’interruption qui signalera, via une variable
globale, la disponibilité des données. Une fois la donnée
traitée, nous réinitialisons la variable globale et la routine
de timer lancera une nouvelle conversion, Afin de signaler
visuellement ces multiples demandes de conversion, noussur le systéme : le montage
associons au timer un basculement d'état sur une broche
de AVR. Une Jed nous permettra donc de voir quand une
demande est faite. De plus, les leds clignotantes sont toujours
du plus bel effet sur un montage.
Voila qui nous permet d’enchainer sur le dernier élément
de configuration, le timer. LAtmega8 dispose de 3 timers
programmables et d’une souplesse d'utilisation exemplaire.
Nous ferons usage ici du timer 1 dont le fonctionnement
peut tre associé a la broche OC1A (PB1).
‘Nous ne nous étendrons pas sur la configuration du timer
relativement simple par definition. Celui-ci sera configuré
via les registres TCCRIA et TCCRIB pour un basculement de
la broche en cas de comparaison vérifige (bit COMIA®) et
imer
avec une remise a zéro dans cette méme situation (bit WGM12
anciennement CTC pour Clear Timer on Compare match).
Nous configurons également le bit OCIELA du registre
TINSK pour déclencher une interruption dans ce cas. Un
prescaler /256 est configuré pour le timer grace aux bits
(510 & (S12 de TCCRIB. Ceci fait, nous n’avons plus qu’a
renseigner le registre de 16 bits OCRIA pour placer notre
indice de comparaison.
Nous avons done un AVR qui fonctionne a 14745600 Hz avec
un prescaler de 256 qui nous donne une incrémentation du
‘compteuritimer & 57,6 Khz. Nous plagons la valeur Ox7FFF
dans 0CRLAet allons donc avoir une comparaison vérifiée tous
les 32767 « pas » avec une remise a z6ro du compteur/timer,
solt 57600/32767 hertz = 1.75 Hz, En d’autres termes, une
interruption toutes les 0,56 secondes, En jouant surla valeur
de presacler et celle d’ OCRIA, nous pouvons faire varier de
délai comme bon nous semble, Du fait de l'utilisation de
WGMI2, le compteur ne débordera donc jamais.
Code et programmation
est maintenant temps d’entrer dans le vif du sujet avec
un peu de code. Notre firmware est trés orienté vers les
interruptions. Le code de la fonction main s’en trouve done
simplifié. Notez que le code présenté icise veut délibérément
didactique et qu'il est possible, bien entendu, d'optimiser
Yensemble aussi bien d'un point de vue de la configuration
que de Valgorithmique.
Configuration
‘Nous débutons par la configuration du timer 1.
77 roete PBL en sorte
ms |= (Ice);
2H aeett du tiner
‘ToOMB = 8;
11 81K baseale on Congare Watch
TUCRIA = (LeeCOHUA®);
1 Timer 1 Outgut Compare Register A
1, Aaleur de seu)
{oHIA = BFF
1 Internation sur eonpreisue
TINSK = (16eCIE14);
11 prescaler 4/255 et ise & zero (CTO)
TRB [= (Lect) bec) (Act) even);
Les commentaires dans le code parlent d’eux-mémes. Le
seuil (OCRIA) est ici fixé & la moitié de la taille du registre
de 16 bits, ce qui conduit au méme résultat qu'un prescaler
7128 avec un débordement de compteur. Ceci permettra un
‘ajustement plus facile de la fréquence de mesure du capteur.
‘On peut éventuellement envisager ‘utilisation d’un autre
‘canal ADC poury brancher un potentiométre et ainsi régler
cette fréquence sans avoir & toucher au firmware. Enfin,
solution plus simple, rien n‘interdit de définir la valeur de
OCRIA via une commande recue par le port série.
Nous passons ensuite a la configuration de ADC
Tea Lean cap ear ear
ADMUX est un registre de configuration dont nous n’avons
pas parlé. Quatre bits permettent le choix du canal ADC
8 utiliser. Les autres bits permettent de choisir la tension
de référence pour la mesure et la maniére de présenter le
résultat dela conversion, La valeur par défaut de 0 convient
ici parfaitement. Cette ligne n'est présente dans le code que
pour ’éventuels ajustement en cas d’évolution du circuit.
Derniére étape de configuration, le port série
Nous choisissons ici d’utiliser une fonction spécifique.
C'est un simple choix pratique permettant de faciliter la
réutllisation du code, De plus, la valeur passée définit &
tlle seule la vitesse de communication en fonction de la
fréquence d’horloge. Nous pouvons donc trés rapidement
changer cette valeur lors des tests. La fonction Ini tUART ()
est implémentée comme cect
old ToituatT Cunsiaed char baudate) {
4 Vitesse p. 161 datasheet pour 16,7856 Mz
VaR = bauretes
Jf sécoption et énission
isis = (1 << ED) | << TD;
1 Format 80,
Notez que nous n’utilisons que le registro UBRRL, la partie
basse du registre de 12 bits UBRR. En d'autres termes, des
valeurs comme 383 ne peuvent étre utilisées avec cette
fonction (vitesse de 2400 bpsavec un MCU a 14.7456 MHz).
‘Avant d’entrer dans la boucle principale, nous affichons un
petit message surle port série (voir plus loin dans article),
activons les interruptions et langons une premiére conversion
printstrp(PSTR(= EehyoSST10 vB ==\0"))s
10;
ADS |= (1 < ADE);
ABUSE |= (1 < ASC);
PYa Interruptions
‘Commencons par interruption provoquée parle timer ou plus
cexactement la comparaison vérifige du compteur incrémentéTSRTTNERL OL et) |
ita ready) (
A00Seh |= _arunte)
fe caNatse);
eae
Nous testons simplement la valeur de a_ready. Si
celle-ci est non nulle, c'est tout simplemént que la
précédente conversion est terminée et nous pouvons
en lancer une nouvelle. Chose que nous provoquons
en utilisant les bits ADSC et ADIE de ADCSRA. Ceci fait,
nous n’oublions pas de rendre la valeur actuelle non
valide en réinitialisant a_ready 40.
Puisque nous en sommes & parler de conversion, traitons
de interruption associée +
Cotte interruption n‘intervient que lorsque la conversion
est terminée. Nous récupérons donc la valeur mesurée
depuis le registre ADGW dans une variable globale appelée
adcval traitée par ailleurs, Nous signalons la présence
d'une valeur valide via a_ready et nous désactivons
Ja génération d'interruption en jouant sur le bit ADIE,
‘Nous pouvons enfin en venir ala routine d’interruption
concernant la réception de données sur le port série
(USART). Celle-ci sera appelée pour chaque caractére regu,
vvérifié ou non (bits de données, parité, bit de stop) :
TSRUSART_RUC_vet) {
char cf
sclearUGsth, FE) {
Te ah Ander < 47)
putchn(c),
buffer indent =o;
yelse {
puter)
puter Mn)
buffer index;
reready = Ty
sea a= ~ Buna);
Le caractare obtenu est stocké dans UDR. Nous testons tout
d'abord le bit FE (Frame Error) pour nous assurer de traiter
‘une donnée valide. Si le bit est & 0, nous pouvons opérer.
La fonction putchr dont nous parlerons plus loin permet
simplement d’avoir un écho. Nous renvoyons le caractere
obtenu s'il ne s'agit pas d'un retour chariot (\r) marquant
Ja validation d’une commande. Nous placons également le
caractére en question dans r_buffer[] en incrémentant une
variable d’index, r_index. Vous comprendrez tout 'intérét
de la variable ¢ recevant la copie de UDR, le registre étant
également utilisé pour I’envoi sur le port série.
En cas de réception de \r, nous renvoyons un retour chariot
et un caractére « nouvelle ligne » (\n) avant d’ajouter \®
(@x09) en fin de buffer de réception. r_ready, tout comme
ready, ost utilisé comme drapeau marquant Ia disponibilité
de données valides. Enfin, nous désactivons I'interruption
en réception sur le port série, Tant que la donnée n'est
pas traitée d'une maniére ou d'une autre, l'interruption
est masquée et r_ready reste & 1. Notez au passage que
inmctsenvaCoyeuteis
re pour s’authentifier|
la taille de r_buffer est déterminée globalement et que
Yespace RAM est limité. I! est donc normalement impératif
de controler la masse de données stockée dans r_buffer
pour éviter le buffer overflow. Colui-ci se traduit Sur AVR.
comme avec d'autres architectures par un écrasement
des données situées en RAM aprés la derniére position du
buffer, ce qui se traduit généralement en comportements
Gtranges, plantages et longues nuits de débogage.
Fonctions pour le port série
‘Afin de simplifier le traitement des envois surle port série de
AVR, nous allons nous attacher a écrire quelques routines
réutilisables. Lenvoi de données via 'USART est extnémement
simple, puisqu’ll suffit de placer les caractéres a émettre
dans le registre UDR aprés avoir vérifé l'état du bit UDRE
(USART Data Register Empty) signalant la disponibilité
du registre. Notre premiére fonction destinée a émettre
un caractére se résume donc a ceci
static wold putehr(car ol
eiT_DTL1s_seUCSMA, WOE;
‘oop_until_bit_is_set est une simple macro définie dans
avr/Sfr_defs. hinclue parles fichiers d’en-téte usuels. Grace
noire fonction putchr(), nous pouvons construire tout aussi
simplement une fonction permettant l'envoi d'une chaine
static void orivtstrunslgnes iat 9) {
bile (5) {
putehn(*s4);
)
putehe( "Wr!
putehn( a);
Celle-ci prend en argument un pointeur sur une chaine et
boucle jusqu’a arriver sur \9. En fin de chaine, nous ajoutons
leretour chariot et le passage a la ligne (\r\n). Cette fonction
comporte cependant un probléme : sa consommation de
RAM, une denrée rare sur I’Atmega8 comme avec tout
microcontréleur, Nous n’avons pas nécessairement besoin
d'afficher des données susceptibles de changer. Inutile done
pourle compilateur de réserver espace en RAM pour tous nos
envols. Nous pouvons utiliser la mémoire Flash pour stocker nos
cchaines. Dans ce sens, nous écrivons donc une autre fonction:sur le systéme : le mo:
static wold printstrptconst char As) (
chat
for (= om etl: cs i, = eal) (
=e)
pater "Yr";
putennte
La fonction prend en argument un pointeur sur une chaine
placée en flash : printstr_p(PSTR(“ma chaine\n”)).On
arcourt ensuite tout simpiement la chaine en question via
Pgn_read _byte( )jusqu’au \@ fatidique. Sile caractére luest
\n.nous plagons tout d'abord un \ravant'envoi via puttchr (),
Voila, nous disposons maintenant de tous les éléments
pour construire notre programme AVR et nous pouvons
passer au coeur du code : la houcle principale.
olatite usioned char +tndexs
har buffer[48);
har fteautter();
eltite unsigned char rev
letile uinti6.t ada
feletle unsignat char area
int sain (oid) {
char end 3)
tar cdg)
char endrst(6] = “resets
wise (1 {
lrreob) ¢
‘eUstrempCend.est, buffer) {
soft_resetO;
}
CUstrenptend 1, rafter) {
printstr_p(Ptnrethylassticln"));
,
‘clstrenpoxe get, r_buffer)) (
iereaty)
printstr( (unsigned char *) stoaCaderel,
‘ta buffer, 180);
}else{
printste_p(PSTR("8");
}
gets nt
‘Uncertain nombre de fichiers d’en-t6te sont nécessaires comme