Beruflich Dokumente
Kultur Dokumente
Julien Marot
julien.marot@fresnel.fr
Marc Allain
marc.allain@fresnel.fr
Formation au dveloppement d'applications en Assembleur et C sur un microcontrleur Mircrohip PIC 18F4 !" en utlisant l'environnement MP#A$ I%& et le compilateur C18'
1.
Avant de commencer
Ces sances de travau= prati>ues ?,P@ sont destines A illustrer les notions >ui vous ont t prsentes en cours' Pour celaB vous aureC A concevoir et A tester un certain nombre de pro)rammes soit en lan)a)e assembleur soit en lan)a)e C' Po'r cha,'e t4che ,'e vo's a're5 " raliser6 nous vous invitons A enre)istrer votre pro)ramme sous un nom particulier pour )arder une sauve)arde de travail' Pour 2aciliter le dbo)a)e et assurer la maintenance et la portabilit de vos codesB il est primordial >ue vous commencieC par rdi)er un al)ori)rammeB >ue vous commentieC clairement votre pro)ramme et >ue vous pensieC A le rendre le plus clair possible ? ex : en choisissant des noms appropris pour les labels@' *oncernant l(val'ation de votre travailB nous vous demanderons de nous prsenter le pro)ramme correspondant A cha>ue tDche >ue vous aureC A pro)rammer sur le simulateur ou sur le Eit de dmonstration ?cf' plus bas@' Fous corri)erons )alement vos codes en portant une attention particuli3re A la lisibilit ?penseC donc au= commentaires G@' &n2inB vous devreC )alement nous rendre les al)ori)rammes >ui correspondent au= codes'
2.
#e Eit PIC%&M ! Plus est un Eit simple >ui permet de mettre en vidence les capacits de di22rents micro; contrleurs du 2abricant Microchip A travers divers priphri>ues et accessoires reproduits sur le schma de la 2i)ure 1'
-eset
MC##&%s -$"'''-$*
Microcontrleur
#C%
IC%
-$4B -$1
&i+ure $, -e .it P#C/0M ) Plus1 Pri23ri ues et 4ccessoires #e micro;contrleur utilis est le PIC18F4 !" de Microchip' C'est un micro;contrleur 8 bits disposant d'une mmoire de pro)ramme de *! (oB de 1 *4 octets de -AM ?-andom Access MemorH@B d'une &&P-<M ?&lectricallH &rasable Pro)rammable -ead <nlH MemorH@ de ! 4 octets et de *4 entres9sorties' 8ne part importante de la di22icult pour pro)rammer un micro;contrleur rside dans l'ac>uisition d'in2ormations' Pour ac>urir cette comptenceB nous vous invitons A vous r2rer 2r>uemment A la documentation techni>ue du micro;contrleurB ainsi >u'A la documentation techni>ue de la carte d'valuationB c2' les documentations lectroni>ues'
M1 +I+
!"119!"1!
2.2.
MP#A$ I%& est un environnement )ratuit de pro)rammation pour les micro;contrleurs de la 2amille Microchip' #Ienvironnement int3)re un diteur dIassembleurB un dbo)ueur complet ainsi >ue tous les outils permettant de )rer les pro)rammateurs de composants' #a possibilit dIint)rer un compilateur C dans lIenvironnement de dveloppement MP#A$ sIinscrit directement dans la politi>ue du service >ui est dIutiliser des lan)a)es de pro)rammation volus dans les dveloppements en lectroni>ue'
2.3.
Il permet de trans2rer le pro)ramme directement de MP#A$ dans le micro;contrleur via le port srie ?-+!*!@ d'un PC'
3.
Pour chacun des binmesB un compte utilisateur a r cr' Pour ne pas oublier votre nom d'utilisateur et votre mot de passe' vous pouveC le noter ci;dessous' Attention JindoJs 2aire la di22rence entre les maKuscules et les minuscules'
M1 +I+
!"119!"1!
4.
ASM
#e but de ce ,P est de se 2amiliariser avec la suite lo)icielle . MP#A$ Inte)rated %evelopment &nvironment / ?v1'4@ de Microchip a2in de pouvoir utiliser les 2onctions de bases de cet outil dveloppement A savoir : crer un proKetB diter et compiler un pro)ramme en assembleurB simuler son 2onctionnement et en2in pro)rammer le microcontrleur ?LC@' #es di22rentes 2onctions sont e=pli>ues A travers deu= pro)rammes >ui vous sont donns'
4.1.
Pro.ramme : !nterr')te'r ;
#e pro)ramme . Interrupteur / boucle A lIin2ini sur les tDches ci;dessous a2in de reproduire le 2onctionnement dIun interrupteur' TBc3e $ , lire lItat du bouton poussoir +!B broche -A4 TBc3e ) , si le bouton est appuHB on allume la diode lectro;luminescente ?#&%@ #1B broche -$"B sinon on lIteint' <n notera >ue les boutons poussoirs sont branchs au microcontrleur en lo)i>ue n)ative' #'tat . bouton appuH / correspond donc A un " lo)i>ue' #es #&% sont cDbles en lo)i>ue positiveB elles s'allument pour un 1 lo)i>ue' #e 2onctionnement demand peut Mtre reproduit par l'al)ori)ramme ci;dessous'
Initialisation du LC
oui
-A4 N "
S) a22uy
non
-$" N 1
4llumer -$
-$" N "
0teindre -$
&i+ure ), 4l+ori+ramme du 2ro+ramme G #nterru2teur H #'al)ori)ramme peut se traduire en assembleur de la mani3re suivante : LIST P=18F4520 #include <P18F4520.inc> #include <CONFIG.inc> or ini# !"0000" /finition du CC utilis1 des constantes s2cifi ues au CC et des 2aramtres de confi+uration encods lors de la 2ro+rammation.
clr$ PO%T& 'o(l) *"00000000" 'o()$ T%IS& clr$ PO%T+ 'o(l) *"00010000" 'o()$ T%IS+
*oucle
*#$,c PO%T+-4 o#o e#eindre *,$ PO%T&-0 o#o *oucle e#eindre *c$ PO%T&-0 o#o *oucle .N/
To't a' lon. des trava'1 )rati,'es6 no's vo's demandons d(tablir 'n .lossaire des diffrentes instr'ctions rencontres avec le'r e1)lication en fran<ais. *e .lossaire vo's sera trs 'tile )o'r les diffrents )ro.rammes ,'e vo's sere5 amener " raliser.
M1 +I+
!"119!"1!
4.2.
Cette partie permet d'apprendre A crer un proKet MP#A$B saisir un pro)ramme en assembleur et le compiler'
4.2.1.
Avant de commencerB crer le rpertoire t2$ puis dans ce rpertoire crer A nouveau un rpertoire interru2teur. Copier dans ce dernier rpertoire les 2ichiers P$%&'()*.inc et CIJ&#K.inc #ancer la suite lo)icielle MP#A$ I%& A partir de lIicne >ui se trouve sur votre bureau'
4.2.2.
4.2.3.
Crer un nouveau 2ichier dans le proKetB &ile LL 4dd Je= &iles to ProjectN #Ienre)istrer dans le rpertoire proKet avec lIe=tension asm ?e= : 2ro+.asm@ MP#A$ &ditor se lance +aisir le pro)ramme . Interrupteur / et enre)istrer' Penser A aKouter des commentaires au pro)ramme pour montrer >ue vous aveC bien compris les di22rentes instructions' 8ne li)ne de commentaire commence par . O /'
4.2.4.
*om)ilation
Cli>uer sur Project LL Euild 4ll N ou sur lIicne de la barre de menu ou encore CtrlP&$* pour compiler le proKet complet' &rreurs et Jarnin)s sont si)nals dans la 2enMtre Iut2ut ainsi >ue le rsultat de la compilation EU#-/ SUCC00/0/ ou EU#-/ &4#-0/. 0n dou6leQcli uant sur une erreur ou un =arnin+ dans la fenRtre Iut2ut1 vous serez amener directement ; la M1 +I+
!"119!"1!
4.3.
3im'lation
Avant dIenvoHer un pro)ramme au LCB vous pouveC tester son 2onctionnement dans le simulateur ?%ebu))er@ MP#A$ +IM' Pour lancer le simulateurB cli>uer sur /e6u++er LL Select Tool LL MP-4E S#M' 8ne nouvelle barre dIoutils est aKoute ainsi >uIun on)let . MP-4E S#M H dans la 2enMtre <utput' #e simulateur 2onctionne selon trois modes : le mode Ste2 Ey Ste2 >ui permet de 2aire une e=cution pas A pas du pro)ramme ?vous Mtes alors lIhorlo)e du LC@' le mode 4nimate >ui e=cute automati>uement le pro)ramme mais A une vitesse rduite pour >ue lIon puisse suivre l'=cution' le mode Dun oQ le pro)ramme est e=cut automati>uement A la vitesse du PC' %ans les deu= premiers modesB nous obtenons des rsultats au 2ur et A mesure de la simulation alors >ue dans le dernierB les rsultats ne sont visibles >ue lors>ue la simulation est stoppe' %ans ce para)rapheB nous nous intressons au= modes 4nimate et Ste2 Ey Ste2 car ils nous permettent de voir >uIelle est lIin2luence des entres sur les sorties' #e r)la)e de la 2r>uence de lIoscillateur utilis se 2ait dans /e6u++er LL Settin+s N' %ans notre cas cIest 4 MhC'
4.3.1.
%ntres 3tim'l's
Comme son nom lIindi>ue cette 2onctionnalit permet de prvoir les vnements d'entres de mani3res sHnchrones ?les dates sont connues avant la simulation@ et asHnchrones ?les vnements sont dclenchs durant la simulation par lIutilisateur@' #es di22rents vnements sont enre)istrs dans une table ?6orEbooE@' Pour en crer uneB cli>uer sur /e6u++er LL Stimulus LL Je= Mor.6oo.' %ans le cadre du proKet . interrupteur / on souhaite crer les vnements suivants : A t N "B initialisation de -A4 A 1 ?bouton +! relDch@B A t N 1" cHclesB on appuie sur +! ?-A4 N "@B A t N ! cHclesB on relDche le bouton ?-A4 N 1@' on veut )alement pouvoir inverser lItat de -A4 >uand on le souhaite'
#Ion)let . Pin < De+ister 4ctions H de la 2enMtre . Stimulus H permet la saisie des vnements en pro)rammant leurs dates dIarrive ?vnements sHnchrones@' %marche de cration dIvnements sHnchrones : AKouter une colonne -A4 au tableau dIvnement ?bouton . Clic 3ere to 4dd Si+nals H@ -echercher -A4 dans la liste . 4vaila6le Si+nals H et lIaKouter A la liste . Selected Si+nals H -emplir la table dIvnement ?,imeB -A4@ avec ?"B1@ ?1"B"@ ?! B1@ Choisir cyc ?cHcle@ comme base de temps dans menu . Time Units H &nre)istrer la table ?bouton . Save Mor.6oo. H@
#Ion)let . 4sync3 H de la 2enMtre . Stimulus H permet de pr;pro)rammer des boutons ?colonne . &ire H@ A la )nration dIvnement ?vnements asHnchrones@' %marche de cration dIvnement asHnchrone : +aisir -A4 dans la colonne . Pin<S&D H de la premi3re li)ne #e menu de la colonne . 4ction H propose cin> tHpes dIaction : Set Si+3 : -A4 N 1 Set -o= : -A4 N " To++le : -A4 N -A4 Pulse Si+3 : -A4 N la lar)eur de lIimpulsion est r)le Pulse -o= : -A4 N colonnes . Midt3 H et . Units H' Choisir . To++le H pour inverser -A4 &nre)istrer la table ?bouton . Save Mor.6oo. H@ M1 +I+
dans les
!"119!"1!
4.3.2.
M1 +I+
!"119!"1!
4.3.3.
Maintenant >ue les entres et sorties de la simulation sont con2i)uresB on peut lancer la simulation' Avant toutes chosesB a2in dIinitialiser le LCB il est ncessaire dIe22ectuer un . Deset H en cli>uant sur le bouton puis cli>uer sur
le bouton . 4nimate H
ArrMter lIanimation A lIaide du bouton B 2aire un nouveau . Deset HB relancer lIanimationB ouvrir lIon)let . 4sync3 H de la 2enMtre . Stimulus HB a)ir sur -A4 et observer les rsultats'
0ditor #a 2l3che verte sHmbolise le Pro+ram Counter &i+ure (, MP-4E #/01 Mode Simulation
Tous pouveC )alement 2aire avancer le pro)ramme pas A pas ?mode . +tep $H +tep /@ avec le bouton . Ste2 #nto H ' <n notera >ue les boutons . Ste2 Iver H et . Ste2 Iut H permettent respectivement une e=cution pas A pas avec une e=cution automati>ue des sous;pro)rammes et une e=cution Kus>uIA la 2in des sous;pro)rammes'
4.4.
Cette phase consiste A envoHer le code he=adcimal du pro)ramme dans le LC' 8ne 2ois le pro)ramme compil avec succ3sB le code he=adcimal du pro)ramme se trouve dans le 2ichier avec l'e=tension 3ex ?e= : 2ro+.3ex@' Tous pouveC visualiser le 2ichier avec la 2enMtre . Pro+ram Memory H du menu . Tie= H' #e code de trouve sous l'on)let . I2code Sex H' $marche de transfert : Connecter le pro)rammateur PIC+,A-, Plus sur le port srie du PC et au secteur Placer le LC sur le pro)rammateur DAttention a' sens EF %ans MP#A$B sous le menu Pro+rammer L Select Pro+rammer chosir . $ P#CST4DT Plus H' 8n nouvel on)let est alors aKout A la 2enMtre . Iut2ut H' Con2i)urer le port C<M sur le>uel est connect le pro)rammateur ?C<M1@B menu Pro+rammer L Settin+s ... Activer le pro)rammateurB menu Pro+rammer L 0na6le Pro+rammerB une nouvelle barre d'outils est aKoute' &nvoHer votre pro)rammeB menu Pro+rammer L Pro+ram ou en cli>uant sur 1 le trans2ert est termin lors>ue la #&% Kaune 4ctivate du pro)rammateur est teinte et >ue le messa)e . Pro+rammin+<Terification com2leted successfullyU H apparaRt dans la 2enMtre Iut2ut.
M1 +I+
!"119!"1!
4.&.
Pro.ramme : *li.notant ;
AnalBse et com)rhension d' )ro.ramme
4.&.1.
#e pro)ramme ci;apr3s 2ait cli)noter la #&% #1B broche -$"B A une 2r>uence dIenviron 1SC' #Itat de la #&% chan)e donc toutes les ""ms'
LIST P=18F4520 /finition du CC utilis1 des constantes s2cifi ues au CC et des #include <P18F4520.inc> 2aramtres de confi+uration encods lors de la 2ro+rammation. #include <CONFIG.inc> or !"0000"
4dresse de d2art a2rs un reset du CC. -es varia6les t$ et t) sont ran+es dans la 6an. * de la ram 5adresse *x**7 et ont 2our taille un octet.
011111 /2cl3r3#ion de (3ri3*le, C&LOC4 0500 #1 6 1 #2 6 1 .N/C 011111 Ini#i3li,3#ion Ini# clr$ PO%T& 'o(l) !"00" 'o()$ T%IS& 011111 Pro r3''e *oucle 'o(l) 5or)$ c3ll c3ll o#o Princi73l !"80" PO%T& #e'7o250', #e'7o250', *oucle
Eoucle infini ,
011111 Sou,17ro r3''e #e'7o250', 'o(l) #10 'o()$ #1 co'71 dc$,n8 #1 re#urn 'o(l) #20 'o()$ #2 co'72 dc$,n8 #2 o#o co'71 o#o co'72 .N/ M1 +I+
In ralise deux 6oucles im6ri ues ui G occu2e H le CC durant environ )(* ms.
!"119!"1!
Comprendre le pro)ramme . cli)notant / et raliser l'al)ori)ramme associ' &=pli>uer lIutilit de xor=f dans le pro)ramme principal ?utiliser une table de vrit@' Calculer les valeurs dIinitialisation t1" et t!" pour >ue le sous pro)ramme de temporisation sIe=cute en ! " ms V 1 ms' #e nombre de cHcle re>uis par cha>ue instruction est donn dans le Keu dIinstruction' Crer un nouveau proKet dans MP#A$ et le sauver dans le rpertoire t2$<cli+no puis saisir le pro)ramme prcdent en remplaUant t1" et t!" par leur valeur ?pour in2ormer le compilateur de la base dans la>uelle la valeur est crite on prc3de la valeur de la premi3re lettre de la baseB ainsi 17! en dcimal sIcrit dI17!IB hIC"I en he=adcimal ou encore bI11""""""I en binaire@' Compiler votre pro)ramme et passer A la partie simulation' JFou6liez 2as de co2ier les fic3iers P$%&'()*.inc et CIJ&#K.inc dans le r2ertoire t2$<cli+no.
4.&.2.
3im'lation
Tous pouveC simuler le pro)ramme de la mMme mani3re >ue le pro)ramme . interru2teur / mais vous vous apercevreC tr3s vite >ue cIest tr3s lon) du 2ait de lIanimation et de la temporisation' ?Tous pouveC tout de mMme le 2aire pour bien comprendre mais en initialisant t1" et t!" A * et par e=emple'@ Fous allons donc 2aire les simulations en mode Dun1 e=cution automati>ue' Pour notre pro)rammeB nous nIavons besoin dIaucun vnement dIentre mais si besoin avait t on aurait pu saisir un chancier comme prcdemment' &n mode . Dun H le pro)ramme sIe=cute donc de 2aUon automati>ue et ne sIarrMte >ue lors>uIil rencontre un point dIarrMt ou A la 2in du pro)ramme' Il 2aut donc placer correctement les points dIarrMt a2in de valider le 2onctionnement de notre pro)ramme' Pour observer la dure de la temporisation il 2aut donc mettre un point dIarrMt sur la li)ne dIappel du sous pro)ramme de temporisation et un autre sur la li)ne suivante' Pour aKouter un point dIarrMt B double cli>uer sur la li)ne du pro)ramme oQ vous le souhaiteCB ou alors utiliser le menu /e6u++er LL Erea.2oints P disponible depuis la touche &)'
&i+ure W, Placement des 2oints d'arrRt Fous allons suivre lIe=cution du pro)ramme A lIaide de la 2enMtre . Simulator Trace H disponible dans le menu . Tie= H' Fous allons nous intresser plus particuli3rement A la colonne . Time H' Tous pouveC chan)er lIunit de temps de cette colonne par un clic droit menu . /is2lay Time H' #ors>ue vous a22icheC le temps en toutes
autres units >ue cHcleB la valeur a22iche dpend de la 2r>uence de lIoscillateur du LC'
#ancer la simulationB bouton <bserver la 2enMtre . Simulator Trace H lors>ue la simulation sIarrMte au premier point dIarrMt et noter le temps dIappel de la temporisation ?e= : ti N ! "*"* cHcles@ -elancer la simulationB bouton Foter A nouveau le temps de la 2enMtre . Simulator Trace H ?e= : t2 N ""4"! cHcles@ Tous pouveC alors calculer la dure de la temporisation d N t2 W ti N ! "!77 cHcles soit ! "B!77 ms avec un oscillateur A 4 MSC' 8tiliser cette mthode pour valider vos initialisations de t1" et t!"'
M1 +I+
!"119!"1!
M1 +I+
1"
!"119!"1!
&.
#'obKecti2 de ce ,P est d'crire et de tester un ensemble de 2onctions assembleurs pour communi>uer avec un a22icheur #C%' #a premi3re partie de ce ,P est ralise en simulation a2in d'crire les di22rentes 2onctions ncessaires au bon 2onctionnement de l'a22icheur'
&.1.
#es a22icheurs A cristau= li>uides )nralement appels #C% ?#i>uid CrHstal %isplaH@ sont des modules compacts >ui ncessitent peu de composants pour leur mise en oeuvre' Plusieurs a22icheurs sont disponibles sur le marchB ils se di22rencient les uns des autres par leurs dimensions ?de 1 A 4 li)nes de 4 A 8" caract3res@' Certains sont )alement dots de 2onctions de rtroclaira)e' #'a22icheur du Eit PIC%&M ! Plus est un a22icheur 14 X ! c'est A dire ! li)nes de 14 caract3res avec des caract3res de X8 pi=els' Pour communi>uer avec l'e=trieur tout a22icheur A besoin d'un circuit spcialis de )estion appel . contrleur d'a22icha)e /B il en e=iste di22rents mod3les sur le march mais ils ont tous le mMme 2onctionnement' #a carte d'valuation est >uipe du mod3le S%4418"8 de +SA-P' #e contrleur sert donc d'inter2ace entre le microcontrleur et l'a22icheur ?c2' 2i)ure 7@' #e but du driver est de )rer le bus C<F,-<# a2in >ue le contrleur d'a22icha)e comprenne le bus %A,A et a22iche ce >ue l'on souhaite sur l'cran #C%'
%A,A 4 ou 8
LC
P#C$%&'()* C<F,-<# *
Contleur d'a22icha)e
S/''W%*U
C<M 14
+&5 4"
#C% 14 X !
&i+ure X, Communication avec l'affic3eur -C/ #e contrleur d'a22icha)e peut recevoir deu= tHpes d'in2ormation sur le bus %A,AB un ordre ?e=: e22acer l'cran@ ou une donne ?e=: le caract3re A@' <rdres ou donnes sont envoHs sur le bus %A,A sous 2orme d'octets ?8 bits@' Mais pour ne pas utiliser toutes les broches de sorties d'un microcontrleur pour communi>uer avec un #C%B les contrleurs d'a22icha)e 2onctionnent )alement en 4 bitsB un nombre cod sur 4 bits s'appelle un >uartet' &n mode 4 bitsB un octet est envoH en deu= 2ois : le >uartet de poids 2ort puis le >uartet de poids 2aible' #e bus C<F,-<# est constitu de trois li)nes : #a li)ne 93 D9e.ister 3electF >ui permet au contrleur d'a22icha)e de savoir si le contenu du bus %A,A est un ordre ou une donne' 8n niveau bas indi>uera un ordre et un niveau haut une donne' #a li)ne 9@ D9ead @riteF in2orme le contrleur si on vient lire ou crire dans sa mmoireB un niveau bas correpondant A une action d'criture' #a li)ne % D%nableF >ui in2orme le contrleur d'a22icha)e >u'un >uartet ?mode 4 bits@ ou un octet ?mode 8 bits@ est disponible' Cette li)ne est active sur 2ront descendant' &lle ralise la sHncronisation entre le microcontrleur et l'a22icheur' #es conne=ions entre le contrleur d'a22icha)e et le microcontrleur sont re)roupes dans le tableau 1' %'apr3s le tableau 1 >uel est le mode de 2onctionnement du contrleur d'a22icha)e Y
M1 +I+
11
!"119!"1!
Ta6leau $, Connexion entre le contr!leur d'afffic3a+e et le microcontr!leur 4ttention , In a Po=erQon Deset1 D4( and D49,D4* are confi+ured as analo+ in2uts and read as Y*F. D4' is confi+ured as a di+ital in2ut... 5cf datas3eet 2))'7
&.2.
8onctions de .estion
Transfert d('n octet
&.2.1.
#'criture d'un ordre ou d'une donne en mode 4 bits se 2ait selon la s>uence reproduite en 2i)ure 1"B l'octet A trans2rer tant b1b4b b4b*b!b1b" avec b1 bit de poids 2ort'
&i+ure $*, Transfert d'un octet en mode ' 6its Phase I : -6N" et &N"' -+ et %$1'''4 sont positionns A la valeur souhaite : >uartet de poids 2ort ?M+$@ Phase II : &N1' Phase III : &N"B le >uartet trans2r ?poids 2ort@ est pris en compte par le contrleur lors du 2ront descendant' Phase IT : %$1'''4 sont positionns A la valeur souhaite : >uartet de poids 2aible ?#+$@ Phase T : &N1' Phase TI : &N"B le >uartet trans2r ?poids 2aible@ est pris en compte par le contrleur lors du 2ront descendant' -aliser l'al)ori)ramme et crire la 2onction . lcd?ecrire? uartet / >ui )n3re la s>uence ITB TB TI sans tenir compte de l'tat de -+ pour l'instantB & tant dKA initialis A "' #e >uartet A crire est stocE dans les 4 bits de poids 2aible du re)istre de travail . 6 /' #a li)ne & restant A l'tat haut durant ! cHcles' Tous pourreC utiliser les instructions no21 6sf1 6cf1 mov=f1 andl= ?c2' datasheet@' ,ester cette 2onction avec le simulateur de MP#A$' Fous allons maintenant crire la 2onction . lcd?ecrire?octet / ?c'est A dire la s>uence I '''TI@ en utilisant bien videmment la 2onction . lcd?ecrire? uartet /' <n ne tient touKours pas compte de l'tat de -+ et & tant initialis A "' #'octet complet A trans2rer se trouve dans le re)istre . M / et sera sauve)ard dans la variable . lcd?d6 / stocEe en ram' #'instruction s=a2f pourrait vous Mtre utile' 0crire et tester cette 2onction en simulation' #es 2onctions d'criture sont maintenant >uasiment termines' Il reste A )rer l'tat li)ne de la li)ne -+B il su22it pour cela d'aKouter une instruction avant l'appel de la 2onction . lcd?ecrire?octet /' -aliser les al)ori)rammes et crire les deu= 2onctions . lcd?ecrire?ordre / et . lcd?ecrire?donnee /' M1 +I+
1!
!"119!"1!
Travaux Prati ues de Microcontr!leur " P#C $%&'()* &.2.2. Lect're de l(tat d' contrCle'r d(afficha.e
#ors>ue >ue l'on demande au contrleur d'=cuter une action ?ordre ou commande@B ce dernier met un certain temps A la raliser' +i une nouvelle action lui est demande alors >ue la prcdente n'est pas encore termineB elle ne sera pas prise en compte' Pour rsoudre ce probl3me il est ncessaire de savoir si le contrleur est disponible' <n ne va donc plus . crire / mais . lire / dans le contrleur'
&i+ure $$, -ecture de l'tat de l'affic3eur en mode ' 6its Phase I : -6N1 et -+ N "B il s'a)it d'une instruction ?ordre@ de lecture et &N" Phase II : & passe A 1 pour demander le >uartet de poids 2ort' Phase III : <n vient lire la valeur du >uartet M+$ sur %$1'''%$4' Phase IT : & passe A " pour si)naler la 2in de la lecture du premier >uartet' Phase T : & repasse A 1 pour demander le >uartet de poids 2aible' Phase TI : <n vient lire la valeur du >uartet #+$ sur %$1'''%$4' Phase TII : & repasse A " pour si)naler la 2in de la lecture du deu=i3me >uartet' Jote , Pour venir lire /EW.../E' il faut ue les 6roc3es D/9...D/* soient confi+ures en entres. Mais il faut 2ense ; les remettre en sortie 2our la suite. +ur la 2i)ure 1*B l'octet reUu est de la 2orme $F AC4AC AC4AC*AC!AC1AC" avec $F bit de poids 2ort' $F >ui si)ni2ie Eusy &la+ vaut 1 si l'a22icheur est occup' #es bits AC4'''1 reprsentent l'4ddress Counter c'est A dire la valeur courante du pointeur de -AM du contrleur cette in2ormation doit Mtre lue mais ne nous est pas utileB elle ne sera donc pas mmorise' -aliser l'al)ori)ramme puis crire la 2onction . lcd?dis2o / >ui boucle tant >ue le bit $F n'est pas )al "' C'est A dire tant >ue l'a22icheur n'est pas prMt A e22ectuer une nouvelle action' Au dbut de la 2onction mettre les broches -%*'''-%" en entre et penser A les remettre en sortie avant de >uitter celle;ciB )rer )alement les li)nes -+ et -6' Avant de lire le >uartet on attend ! cHcles' ,ester ce sous;pro)ramme avec le simulateur'
M1 +I+
1*
!"119!"1!
Travaux Prati ues de Microcontr!leur " P#C $%&'()* &.2.3. Procd're d(initialisation d' contrCle'r d(afficha.e
Zuand le contrleur dmarre on ne sait pas si il est positionn en 4 ou 8 bitsB comme le montre la procdure d'intialisation reproduite en 2i)ure 1!B il est donc ncessaire d'envoHer la commande de passa)e en mode 8 bits ?Function +et 8;$it Inter2ace@ plusieurs 2ois pour >u'elle soit bien comprise' Puis on demande le passa)e en 4 bits ?Function +et 4;$it Inter2ace@'
&i+ure $), Procdure d'initialisation ' 6its du contr!leur d'affic3a+e 5extrait de la datas3eet du S/''W%*U 7 &n analHsant la procdure on remar>ue >u'il H a trois temporisations ?O1 msB O4B1ms et O1""Ls@' Pour simpli2ier le code nous allons crire deu= 2onctions de temporisationB une d'environ ms ?1 N X*@ et une autre d'environ 1""Ls' &n vous inspirant de la temporisation ralise au ,P n[1' -aliser les al)ori)rammes puis crire les 2onctions M1 +I+
14
!"119!"1!
&.2.4.
#e contrleur d'a22icha)e dispose d'une mmoire %%-AM reprsentant l'a22icheur' %ans notre cas la taille de la mmoire utilise est de ! li)nes de 14 octets chacune' Pour chan)er de li)neB il su22it de venir positionner l' 4ddress Counter au dbut de li)ne souhaite'
&i+ure $9, //D4M du contr!leur &n utilisant vos di22rentes 2onctions crire les 2onctions . lcd?l$ / et . lcd?l) / permettant de choisir la li)ne sur la>uelle on souhaite crire' 0crire la 2onction . lcd?cls / >ui e22ace tout l'cran' ?c2' 2i)ure 1!@ Modi2ier la 2onction . lcd?ecrire?octet / a2in d'attendre >ue le contrleur est pris en compte l'action'
&.2.&.
ToilA nous sommes maintenant prMt A utiliser l'a22icheur #C%' Pour 2aciliter l'utilisation des 2onctions >ue vous veneC de crer il est conseill de toutes les mettre dans un 2ichier . lcd.asm / a2in de pouvoir les inclure dans vos 2uturs pro)rammes' #'utilisation de ce 2ichier par la suite est tr3s simpleB il su22it de taper la commande . Zinclude lcd.asm / A l'endroit de votre pro)ramme oQ vous souhaiteC int)rer vos 2onctions et de d2inir les variables . lcd?d61 ... / au dbut de votre pro)ramme' #e 2ichier . lcd.asm / doit se trouver dans le mMme rpertoire >ue votre pro)ramme' 0crire le pro)ramme >ui reproduit l'cran ci;dessous sur l'a22icheur' I n $ o I n d u , Si vous ta2er G movl= '#' H le re+istre G M H sera c3ar+ avec le code ascii du caractre #.
M1 +I+
!"119!"1!
&.3.
#a mthode >ui nous a permis de tester les 2onctions de )estion de l'a22icheur n'est pas des plus e22icace car il est ncessaire de retaper le mMme code pour chacun des caract3res' Fous allons donc crire une 2onction >ui a22iche une chaine de caract3res compl3te' #a chaine de caract3res est stocEe dans la mmoire pro)ramme' Pour stocEer une chaRne en mmoire pro)rammeB il su22it d'utiliser la directive . d6 / comme dans l'e=emple suivant : ... or !"0000" o#o '3in c! d* 9:icrocon#roleur9-";0" 0ecrire en '2'oire 7ro r3''e
'3in no7 ... #a chaRne . Microcontroleur / est stocEe dans la mmoire pro)rammeB elle se termine par le caract3re . [* /' #e label . c3 / pointe vers le premier caract3re de la chaRneB c'est donc l'adresse de dbut de la chaine' %ans la mmoire pro)ramme du PIC 18F4 !"B les adresses sont codes sur !1 bits donc * octets' Comme nous disposons d'un microcontrleur 8 bits nous utiliserons les directives . UPP0D5c371 S#KS5c371 -IM5c37 / pour obtenir respectivement l'octet de poids le plus 2ortB de poids intermdiaire et de poids 2aible' Pour lire dans la mmoire pro)rammeB il 2aut tout d'abord initialiser le pointeur d'adresse de mmoire pro)ramme . TE-PTD / avec l'adresse de l'octet A lire' Pour lire un octet on utilse l'instruction . TE-D/ / >ui trans23re le contenu de la mmoire dans le re)istre . T4-E4T /' Consulter la datas3eet du 2ic 2W9QWV et 29*(. Con2i)urer correctement l'instruction . TE-D/ /' -aliser l'al)ori)ramme de la 2onction . lcd?ecrire?c3aine /' 0crire et tester cette 2onction' -'affic3eur -C/ ne 2eut affic3er ue $V caractres 2ar li+ne...
M1 +I+
14
!"119!"1!
+.
TP n3 !nterr')tions et Pri)hri,'es
ASM
Ce troisi3me ,P est divis en >uatre parties durant les>uelles vous apprendreC A )rer les interruptions et di22rents modules du micro;contrleur en lan)a)e Assembleur et dans un pro)ramme uni>ue'
+.1.
Fous devons maintenant 2aire cli)noter la led #1B broche -$"B A une 2r>uence de !SC sans mobiliser le microcontrleur' Il n'est donc plus >uestion d'utiliser une temporisation pour compter le temps ?c2' ,P n[1@' Fous allons demander A un module e=terne : le ,IM&-"B de compter le temps et de si)naler la 2in du compta)e au microcontleur par une interruption dite interruption de dbordement' #a 2i)ure 14 montre le si)nal de sortie du ,IM&-" et les interruptions de dbordement associes' #e ,IM&-" compte Kus>u'A la valeur max en T secondes' ,outes les T secondesB l'tat de la led #1 est invers'
Interruptions de dbordement
ma=
" ,
&i+ure $', #nterru2tion de d6ordement du T#M0D* ,rouverB en utilisant la datasheetB l'e=pression de la valeur max et de la priode de compta)e T en 2onction de la con2i)uration du ,IM&-"' ?cf datas3eet 2$)9@ Zu'elle est la con2i)uration pour une priode de compta)e T d'environ 1s Y Zuels sont les bits A intialiser pour activer l'interruption du ,IM&-" Y &=pli>uer la con2i)uration du re)istre ,"C<F' #'nonc demande de 2aire cli)noter la led A une 2r>uence de !SC donc une priode de compta)e de 1s' Avec la con2i)uration choisi prcdemmentB on a une interruption toutes les ?1\ t@sB si on souhaite mesuer le temps prcisement cette erreur de t seconde n'est pas n)li)eable' Pour compenser cette erreur dcala)eB l'ide est d'initialiser les re)istres ,M-"S ,M-"# a2in >ue le compta)e ne commence pas A " mais A une valeur min permettant d'annuler t comme le montre la 2i)ure 1 '
Interruptions de dbordement
ma=
&i+ure $(, #nterru2tion de d6ordement du T#M0D* Calculer la valeur min pour avoir une 2r>uence de compta)e de 1s e=catement' -aliser l'al)ori)ramme du pro)ramme demandB crire et tester ce pro)ramme'
+.2.
*hronomtre
Fous allons maintenant raliser un chornom3tre simpli2i en utilisant le ,IM&-"B l'a22icheur #C% et le bouton +!B broche -A4' #e temps doit s'a22icher sur le #C% sous le 2ormat :
M1 +I+
11
!"119!"1!
#e 2onctionnement souhait est le suivant : ] la mise sous tensionB le chronom3tre est initialis A . 001100 /' 8n premier appui sur +! dclenche le chronom3treB le temps volue sur l'a22icheur #C%' 8n deu=i3me appui sur +! arrMte le chronom3treB le temps coul est a22ich sur le #C%' 8n troisi3me appui sur +! rinitialise le chronom3tre' #es nombres reprsentant les minutes et les secondes seront respectivement stocEs dans les octects M#J et S0C' #e temps est mesur par l'interruption de dbordement du ,IM&-"' Comme il a t vu au ,P prcdentB l'a22icheur #C% ne comprend >ue des caract3res ?code A+CII@B on ne peut donc pas directement lui envoHer les octects M#J et S0C puis>ue ceu= sont des nombres'
"
48 47 " 1 ! * 4 4 1 ?"=*"@ ?"=*1@ ?"=*!@ ?"=**@ ?"=*4@ ?"=* @ ?"=*4@ ?"=*1@ ?"=*8@ ?"=*7@ Ta6leau ), Code 4SC## des c3iffres
-aliser l'al)ori)ramme puis crire le code de la 2onction . lcd?ecrire?nom6re / >ui a22iche sur le #C% le nombre contenu dans JE sachant >ue ce nombre est compris entre "" et 77' Il 2aut donc a22icher le chi22re des diCaines puis le chi22re des units' ?JE est un octect ; dclarer1 vous 2ouvez tester cette fonction en simulation@ -aliser l'al)ori)ramme puis crire le code de la routine d'interruption et de l'interruption de dbordement du ,IM&-"' #e bouton poussoir +! permet A l'utilisateur d'a)ir sur l'tat chronom3tre' %'apr3s le 2onctionnement dcrit ci; dessusB 'n appui sur le bouton chan)e l'tat du chronom3tre' -aliser l'al)ori)ramme et crire la 2onction . 6outon?a22ui / >ui dtecte un appui sur le bouton +!B l'appui tant dtect lors>ue l'utilisateur relDche le bouton' -aliser l'al)ori)ramme du chronom3tre puis crire le pro)ramme principal' ,rans2rer votre pro)ramme et chronometreC;vousG
+.3.
&n partant du pro)ramme prcdentB on souhaite maintenant aKouter une 2onctionnalit : A cha>ue appui sur le bouton poussoir +* connect A -$"B on souhaite activer le transducteur piCo;lectri>ue ?pendant la dure de l'appui@' #e transducteur piCo;lectri>ue peut Mtre command )rDce A la broche -C! du micro;contrleur' 8n transducteur piCo;lectri>ue est un composant lectroni>ue constitu dIune lamelle de matriau piCo; lectri>ue' Cette lamelle est d2orme si une tension alternative est appli>ue au= bornes du transducteur piCo; lectri>ue'
M1 +I+
18
!"119!"1!
&i+ure $V, -e transducteur 2izoQlectri ue #e mouvement de la lamelle dans lIair )n3re un son' #a 2r>uence du son mis est directement li A la nature et A la 2r>uence du si)nal appli>u au= bornes du transducteur piCo;lectri>ue' +ur la carte dIvaluation PIC%&M ! PlusB le transducteur piCo;lectri>ue peut Mtre command )rDce A la broche -C! du micro;contrleur' #e monta)e lectroni>ue utilis pour commander le transducteur piCo;lectri>ue permet de lIalimenter avec une tension bipolaire ?\ TB ; T@' Pour )nrer un sonB on doit donc )nrer un si)nal rectan)ulaire ?)rDce au module P6M@ >ue l'on appli>uera au transducteur piCo;lectri>ue si l'utilisateur appuie sur le bouton poussoir +*' Il 2audra initialiser tous les modules ncessaires A la )nration d'un si)nal rectan)ulaire ?module CCP1B ,IM&-!@ ?voir p'1 7 du . dataQs3eet H@ et initialiser le PIDTC' ] partir du pro)ramme prcdentB apporter les modi2ications ncessaires : lors de l'initialisation , Con2i)urer le P<-,C en entre e=cept la broche -C! en sortieB Con2i)urer le module P6MB placer la valeur "=8" dans le re)istre P-! ?2i=e la 2r>uence du si)nal rectan)ulaire@B r)ler le dutH time ?rapport cHcli>ue@ A "' B on placera la valeur "="" dans le re)istre CCP1C<FB Activer le ,IM&-!B plac le . 2ostscaler / A 1:1B plac le . 2rescaler H A 4B dans le 2ro+ramme 2rinci2al : on testera la valeur sur la broche -$"B %ans le cas oQ -$" est A l'tat haut on activera le transducteur piCo;lectri>ue en a)issant sur le re)istre CCP1C<FB %ans le cas oQ -$" est A l'tat bas on dsactivera le transducteur piCo;lectri>ue en a)issant sur le re)istre CCP1C<FB %ans le cas oQ la valeur sur la broche -$" est )ale A la derni3re valeur ac>uise on ne 2era rien' Attention : -e /uty Time est le tem2s 2endant le uel le si+nal est ; lFtat 3aut. #l faut ada2ter ce tem2s en fonction de la fr uence du si+nal +nr 2our +arder un ra22ort cycli ue +ale ; *1(. Pour cela lisez la documentation tec3ni ue et trouver la relation uFil doit exister entre les valeurs des re+istres PD) et CCPD$-,CCP$CIJ\(,'L 2our ue le ra22ort cycli ue reste +ale ; *.(. %onner la relation >uIil doit e=ister entre les valeurs des re)istres P-! et CCP-1#:CCP1C<F^ :4O pour >ue le rapport cHcli>ue reste )ale A "' et proposer un partie de pro)ramme ?le plus simple possible@ en lan)a)e Assembleur >ui permet dIadapter le rapport cHcli>ue ?contrl par les re)istres CCP-1#:CCP1C<F^ :4O@ en 2onction de la 2r>uence ?contrle par le re)istre P-!@ du si)nal )nr' -aliser l'al)ori)ramme du pro)ramme demandB 0crire le pro)ramme sur ordinateur avec MP#A$B simuler son 2onctionnement et le valider sur la carte d'valuation' /ans un 2remier tem2s1 modifier le 2ro+ramme 2rcdent 2our uFil +nre un si+nal rectan+ulaire 5en utilisant le module PMM7 sur la 6roc3e DC). Puis vous 2rendrez en com2te la +estion du 6outon DE*. 0n s2arant les deux 2ro6lmes1 la difficult est rduite.
+.4.
M1 +I+
17
!"119!"1!
+.&.
<n souhaite maintenant >ue le micro;contrleur )3re par interruption l'appui sur le bouton poussoir' Ainsi A cha>ue appui sur le bouton poussoir +*B on souhaite activer ou dsactiver le transducteur piCo;lectri>ue' Zuand le transducteur piCo;lectri>ue sera activB le pro)ramme principal ralisera une ac>uisition de la tension sur la broche -A" et mettra A Kour la 2r>uence et le rapport cHcli>ue du si)nal rectan)ulaire' Zuand le transducteur piCo;lectri>ue ne sera pas activB le pro)ramme principal ne ralisera aucune opration' Pour )rer les appuis sur le bouton poussoir +*B on utilisera l'interruption IF,"' ] partir du pro)ramme prcdentB il 2audra modi2ier : la con2i)uration des interruptions pour prendre en compte la nouvelle interruption IF,"B simpli2ier le pro)ramme principal en trans2rant une partie du code vers la routine d'interruption' -aliser l'al)ori)ramme du pro)ramme demandB 0crire le pro)ramme sur ordinateur avec MP#A$B simuler son 2onctionnement et le valider sur la carte d'valuation'
M1 +I+
!"
!"119!"1!
-.
#'obKecti2 de cette sance est de vous initier A la 2ro+rammation en lan+a+e C d'un micro;contrleur' Par rapport A l'assembleurB le recours A un lan)a)e de . haut niveau / tel >ue le C s'est notablement dvelopp en prati>ue car il permet de simpli2ier l'criture des codes ainsi >ue leurs portabilits et leurs maintenabilits' FotammentB vous pourreC crire des instructions du tHpe . if5x@@y7 / ou . tem2 @ *x)W / pour e22ectuer un test d')alit ou une a22ectation' #e code >ue vous crireC devra Mtre crit en C standard AF+I' #a compilation des instructions C se 2era par le compilateur C18 >ui permet de )nrer du code pour la 2amille des PIC 18____' Comme l'assembleurB le compilateur traduit des instructions interprtables pour un oprateur humain en un code machine e=cutable par le PIC' Comme nous le verronsB l'criture et la compilation de vos pro)rammes sources C se 2era dans l'environnement MP#A$' Comme pour le dveloppement de codes en assembleurB MP#A$ sera donc l'environnement >ui vous permettra d'crireB de compiler et de dbo)uer vos sources C ?cf'B section * de ce ,P@'
Assemble'r
*om)ilate'r *
<n notera >ueB dans le cadre d'un mRme proKetB il est possible de dvelopper des parties en C et des parties en assembleur' %3s lorsB la construction d'un code mac3ine excuta6le est illustr par le dia)ramme de la 2i)ure 11' %ans cet e=empleB un code source en assembleur et deu= codes sources en C ont t crits' Pour cha>ue sourceB l'assemble'r ?MPA+M6IF@ ou le com)ilate'r?MCC18@ est utilis pour )nrer des fic3iers o6jets ?file$.o1...1file9.o@' #e 2ichier obKet file9.o est ensuite utilis avec un 2ichier pr;compil e=istant file'.o de mani3re A 2ormer un 2ichier de librairie li6$.li6' FinalementB les 2ichiers obKets restants sont utiliss avec le 2ichier de librairie par l'dite'r de lien ?MP#IF(@ pour crer un e=cutable out2ut.3ex'
FoteC bien )alement le 2ichier scri2t.l.r ?cf.B 2i)ure 11@ >ui permet de con2i)urer correctement l'diteur de lien pour le micro;contrleur utilis'
-.2.
Pour vous 2amiliariser avec la pro)rammation en C du micro;contrleurB le 2remier 2rojet sera de reprendre le pro)ramme de cli)notement d'une #&% >ue vous avieC crit en assembleur' #e source C ci;apr3s 2ait cli)noter la #&% M1 +I+
!1
!"119!"1!
0nQtRte du 2ro+ramme
<<111111111111111111111111111111111111111111111111 << /irec#i(e, 3u 7r27roce,,eur <<111111111111111111111111111111111111111111111111 << $ic!ier d"en1#@#e 7our le PIC184020 #include <718$4520.!> << $ic!ier d"en1#@#e 7our le, $onc#ion, de #e'7o #include <del3A,.!> << /2,3c#i(3#ion du B3#c!/o #7r3 '3 con$i B/T = OFF
&ic3iers d'enQtRte 2our le P#C$%'()* ?p1824 !"'h@ et 2our l'utilisation des fonctions de tem2orisation ?delaHs'h@ /irective G 2ra+ma H de dsactivation du Jatchdo)'
<< Pro r3''e Princi73l (oid '3inCDE <<111111111111111111111111111111111111111111111111 << /2cl3r3#ion de, (3ri3*le, loc3le, <<111111111111111111111111111111111111111111111111 << 1<2 Periode d"o,cill3#ion en N* de cAcle, TFP. /e'iPeriode = +%GG:.NT0 << Con$i ur3#ion du 7or#& T%IS& = 05000 << PO%T& en ,or#ie PO%T& = 05000 << %+H du PO%T& << Con$i . %&01%&I en 'ode I<O nu'eriJue +/CON1 = 050F0 /claration et affectation de la varia6le dfinissant le nom6re de cycles ncessaire ; une demiQ2riode d'oscillation ?" com)lter@' Confi+uration du 2ort E
<< 11> &oucle T3n#Kue 6 On *oucle ind2$inie'en#... )!ileC1DE << *3,cule'en# du *i# 0 du PO%T& PO%T& = PO%T& L 05010 << G#ili,3#ion d"une $onc#ion de del3A,.! FONCTIONC+%GG:.NTD0 M << 11> Fin de *oucle T3n#Kue M
Eoucle 2ermanente de c3an+ement d'tat de DE* QL 6asculement de DE* QL a22el ; la fonction de tem2orisation 5cf. delaHs'h7 2ermettant d'attendre (**ms ?" com)lter@'
Comprendre le pro)ramme ci;dessus' %2inir le tHpe de la variable /emiPeriode' %duire du 2ichier d'en;tMte . delays.3 H la 2onction A utiliser pour une temporisation telle >ue la priode soit de 1ms' %duiseC;en )alement l'ar)ument associ' Passer A la section suivante pour crer un proKet pour ce codeB pour le compiler et pour e22ectuer la simulation'
-.3.
Cette partie permet d'apprendre A crer un proKet MP#A$B A saisir un pro)ramme en C et A le compiler'
-.3.1.
Avant de commencerB crer le rpertoire . t2' puis dans ce rpertoire crer A nouveau un rpertoire . cli+notement?C H. CopieC dans ce rpertoire les 2ichier . delays.3 H et . $%f'()*.l.r /. M1 +I+
!!
!"119!"1!
-.3.2.
Cli>uer sur Project LL Project Mizard N Cli>uer sur Suivant L puis slectionner . P#C$%&'()* H dans le menu droulant . /evice H' Cli>uer sur Suivant L puis slectionner . Microc3i2 C$% Toolsuite H a2in de pouvoir dvelopper en C' Cli>uer sur Suivant L puis dans le champ . Project Jame H saisir le nom du proKet ?e= : cli)notant`C@ et dans le champ . Project /irectory H aller chercher A lIaide du bouton . Ero=se HB le dossier cr au dbut : . t2'<cli+notant?C H' Cli>uer de'1 fois sur +uivant O et aKouter . $%f'()*.l.r / au proKet A lIaide du bouton 4dd LL Cli>uer sur Suivant L puis sur Terminer'
-.3.3.
Cli>uer sur ProjectLEuild I2tions...LProject et cli>uer sur l'on)let . Keneral H' Tri2ieC >ue les chemins de . #nclude Pat3 H et de . -i6rary Pat3 H sont correctement positionns en utilisant l'option . Ero=se H''' %ans l'on)let MP#IF( #inEerB cli>uer sur l'option . Su22ress CI/Qfile +eneration H' Cli>uer sur I]'
-.3.4.
Crer un nouveau 2ichier dans le proKetB &ile LL 4dd Je= &iles to ProjectN #Ienre)istrer dans le rpertoire proKet avec lIe=tension c ?e= : cli+notant?C.c@ MP#A$ &ditor se lance +aisir le pro)ramme et enre)istrer' ue vous avez 6ien com2ris les diffrentes
-.3.&.
*om)ilation
#a compilation et l'dition de lien se 2ait en cli>uant sur l'icne de la barre de menu' Comme en assembleurB les erreurs et Jarnin)s sont si)nals dans la 2enMtre . Iut2ut H ainsi >ue le rsultat de la compilation EU#-/ SUCC00/0/ ou EU#-/ &4#-0/.
0n dou6leQcli uant sur une erreur ou un =arnin+ dans la fenRtre G Iut2ut H1 vous serez amener directement ; la li+ne concerne dans votre 2ro+ramme.
-.4.
#es procdures de simulation et de trans2ert du code e=cutable sur le micro;contrleur ne di223rent pas de celles >ue vous aveC pu mettre en oeuvre pour le dveloppement en assembleur a cf' l'nonc du premier ,P' &22ectueC la simulation du )nrateur de si)nal carr donn ci;avant dans l'nonc'
-.&.
A))lications
*henillard sans interr')tion
-.&.1.
<n souhaite crer un chenillard A moti2 variable' 8n moti2 tant d2ini par une s>uence d'claira)e des #&% comme par e=emple b"="1B "="!B "="4B "="8cB cette s>uence est rpte A l'in2ini' %onner l'al)ori)ramme du chenillard d2ini par la s>uence de moti2 b"="1B "="!B "="4B "="8c' Cha>ue moti2 devra rester allum pendant un temps de "" ms' Pour dfinir la s uence de motifs1 vous 2rendrez soin de dclarer un ta6leau de unsi+ned c3ar car ce ty2e corres2ond ; un format % 6its ui 2ourra directement Rtre affect sur le PIDT E 5cf.1 MP#A$ C18 C C<MPI#&- US0DFS KU#/01 2a+e $$7. M1 +I+
!*
!"119!"1!
-.&.2.
<n souhaite aKouter un second moti2 distinct au chenillard de mani3re A permettre le choi= de la s>uence' <n prendra par e=emple comme seconde s>uence b"="1B "="!B "="4B "="8B "="4B "="!c' #a s>uence considre sera slectionne par une variable dans la 2onction principale ?ie'B la 2onction main57@' #e moti2 A a22icher A l'intrieur de la s>uence considre sera retourn par une 2onction appele valeur?c3enillard57 dont vous d2inireC les entres et les sorties' %onner l'al)ori)ramme du chenillard d2ini par le couple de s>uences b"="1B "="!B "="4B "="8c et b"="1B "="!B "="4B "="8B "="4B "="!c' 0crire et tester ce pro)ramme'
-.&.3.
#'obKecti2 de ce dernier e=ercice est de permettre de chan)er r)uli3rement le moti2 du chenillard en utilisant les interruptions )nres par le ,IM&-"' 8ne des di22icults consiste alors A con2i)urer correctement le ,IM&-" de mani3re A permettre de )nrer les interruptions priodi>uement' <n donne ci;arp3s les lments du code source pour ce 2aire'
<<1111111111111111111111111111111111111111111111111 << Con$i ur3#ion de, in#erru7#ion,- c$. ,ec#ion, << 11 du d3#3,!ee# e# le $ic!ier !e3der 718!4520.! <<1111111111111111111111111111111111111111111111111 << 3c#i(e l"in#erru7#ion 7our le TI:.%0 INTCON = O+L.G%0 << Pl3ce l"in#erru7#ion TI:.%0 en 7riori#e !3u#e INTCON2 = O+L.G%0
e#
<< +c#i(e l3 e,#ion de, 7riori#e, 7our le, in#erru7#ion, %CON*i#,.IP.N = O+L.G%0 << .$$3ce le re i,#re T:%0P T:%0P = O+L.G%0 << .$$3ce le re i,#re T:%0L T:%0L = O+L.G%0 << +c#i(e le TI:.%0 e# con$i ure l3 (3leur du 7re,c3ler T0CON = O+L.G%0 << +c#i(e le, in#erru7#ion, INTCON*i#,.GI. = O+L.G%0
#'obKecti2 est alors de dclencher une interruption A cha>ue 2ois >ue le ,IM&-" est en . over2loJ /B cette interruption commandant le chan)ement de moti2 du chenillard' A toutes 2ins utilesB on rappelle >ue le lan)a)e C ne permet pas directement de traiter les interruptions puis>u'il ne laisse pas A l'utilisateur le contrle des adresses du pro)ramme ?>uivalent du or+ en assembleur@' A la place une directive Z2ra+ma a donc t int)re au compilateur : #es directives #7r3 '3 code 'onQ7ro = R (oid 'onQ7ro C(oidD E code C ... M #7r3 '3 code 2orcent le compilateur A placer le code C A l'adresse @ ?cf.B MP#A$
!4
!"119!"1!
M1 +I+
!"119!"1!
/.
#e module . &nhanced 8niversal +Hnchronous -eceiver ,ransmitter / ?&8+A-,@ est le module du Pic18F4 !" permettant une communication srie de tHpe -+!*!' Ce tHpe de conne=ion tant )alement disponible sur un PC' Fous utiliserons le pro)ramme . hHperterminal / de 6indoJs pour dialo)uer avec le LC'
LC
Inter2ace
M4^)9)
-+!*!
Port
CIM
SHperterminal PC
Picdem ! Plus
&i+ure $%, Communication PCQCC -+!*! est une norme >ui standardise les communications sries' #a transmission de donnes pouvant se 2aire sur 1 ou 8 bitsB avec ou sans contrle de paritB celle;ci pouvant Mtre )res de 2aUons paire ou impaire' 8ne trame -+!*! commence par un bit de start et se termine par un ou deu= bits de sto2' #a 2i)ure suivante illustre une des con2i)urations possibles' #a vitesse de trans2ert pouvant )alement varier d'une application A l'autre' #a vitesse se mesure en $auds ?nombre de sHmbole transmis par seconde@' 8ne conne=ion -+!*! est asHnchrone car entre l'metteur et le rcepteurB il H a seulement les li)nes de donnes -= et ,= ?pas de li)ne d'horlo)e@'
str
b4
b4
b*
b!
b1
b"
par
stp
stp
&i+ure $X, Trame DS)9)1 W 6its1 2arit1 ) 6its de sto2 Fous utiliserons la con2i)uration suivante : Titesse : 74"" $auds ,aille des donnes : 8 bitsB Parit : AucuneB $it de +top : 1'
/.1.1.
L(hB)erterminal
#'hHperterminal est un pro)ramme livr avec 6indoJs >ui permet de se connecter A des htes distants ?ordinateursB sites telnetB oscilloscopeB '''@ A l'aide d'un modemB d'un cDble null;modem ?liaison srie@ ou d'une conne=ion ,CP9IP' A cha>ue 2ois >u'un caract3re est saisiB il est envoH sur le support de communicationB tout caract3re reUu est a22ich' #'hHperterminal est accessible dans le menu /marrer L Tous les 2ro+rammes L 4ccessoires L Communications L Sy2erterminal ?6in _P@ ou alors via la commande . 3y2erterm H dans menu /marrer L 0xcuter' #ors>u'il s'ouvreB il vous demande de con2i)urer la conne=ion : saisir un nom ?e=, Pic@ et cli>uer sur I]1 con2i)urer le tHpe de conne=ionB )nralement CIM$ et cli>uer sur I]1 con2i)urer les proprits de la conne=ion ?74"" $audsB 8 bitsB aucune paritB 1 bit de stopB pas de contrle de 2lu=@ et cli>uer sur I]1 enre)istrer la conne=ion dans votre rpertoire pour ne pas avoir A la recrer ?menu &ic3ier L 0nre+ister sous ...@'
/.1.2.
Pro.ramme : echo ;
#e pro)ramme . echo / renvoie sur la liaison srie tout octet reUu sur celle;ciB l'envoi et la rception des octets est ralis sans interruption'
M1 +I+
!4
!"119!"1!
_mission et Dce2tion
#'octet reUu est plac dans le re)istre -C-&5 ?Decieve De+ister@ et l'octet A envoHer est A placer dans ,_-&5 ?Transmit De+ister@' MMme lors>ue >ue les interruptions sont interditesB on peut utiliser les 2la)s pour connaRtre l'tat ?vide ou plein@ des re)istres -C-&5 et ,_-&5' #es 2la)s se trouvent dans le re)istre PI-1 ?Peri23eral #nterru2t De uest &la+ De+ister 1@' Pour savoir si un octet est disponibleB il su22it simplement de re)arder le 2la) associ A -C-&5 ?rception d'un octet@' #a procdure d'mission est reprsente par le schma blocB ci;dessous ?e=trait du datac3eet@'
&i+ure )*, Sc3ma 6loc du module d'mission #ors>u'un octet est plac dans ,_-&5B il est . coup / dans ,+- ?Transmit S3ift De+ister@ >ui comme son nom l'indi>ue e22ectue un dcala)e A la vitesse impose par +P$-5S:+P$-5' <n notera >ue l'tat de ,_-&5 est visible dans ,_IF et >ue l'in2ormation de transmission en cours se situe dans ,-M,' #e schma bloc de la rception se trouve en pa)e !1* du . datas3eet H'
8tiliser le datac3eet pour initialiser les re)istres $A8%C<FB -C+,A et ,_+,A'?Pour r+ler $ 6it de sto21 le 6it S0J/E du re+istre T^ST4 doit Rtre ; *@ 0crire et tester le pro)ramme . echo /B utiliser le cDble srie du pro)rammateur pour communi>uer avec la carte LC'
/.2.
A))lications
*henillard " motif variable
/.2.1.
<n souhaite crer un chenillard A moti2 variable' 8n moti2 tant d2ini par une s>uence d'claira)e des #&% comme par e=emple b'""""'B '"""1'B '""1"'B '"1""'B '1"""'cB cette s>uence est rpte A l'in2ini' #e chan)ement de s>uence se 2ait par l'envoi du numro de la s>uence par liaison -+!*! A l'aide de l'hHperterminal' Ainsi la saisie de 1 au clavier Kouera la s>uence 1B etc. #e code A+CII des chi22res du pav numri>ue M1 +I+
!1
!"119!"1!
48 47 " 1 ! * 4 4 1 ?"=*"@ ?"=*1@ ?"=*!@ ?"=**@ ?"=*4@ ?"=* @ ?"=*4@ ?"=*1@ ?"=*8@ ?"=*7@ Ta6leau 9, Code 4SC## des c3iffres
,outes les ""msB l'tat des #&% est modi2i en utilisant une 2onction de delays.h' #e chan)ement de s>uence est )r sur interruption de rception ?&8+A-,@B >uand un octet est reUu par le LCB il le renvoi pour l'a22icher dans l'hHperterminal' +i la s>uence demand n'e=iste pasB le LC renvoi 'Y' au PC et ne modi2ie pas le choi= de s>uence' 0crire et tester ce pro)ramme Jote , -a valeur du c3iffre associ au code 4SC## 2eut Rtre o6tenue 2ar une soustraction. 0n C1 le 2remier lment du ta6leau est *. Une matrice est un ta6leau de ta6leau.
/.2.2.
$evinette
#e pro)ramme . %evinette / est un Keu entre le LC et vousB les communications se 2aisant via le PC ?hHperterminal@' #e principe est simpleB le LC choisi un nombre entre " et ! et doit vous le 2aire deviner en un temps donnB 1 min' #e temps restant est visible sur les 4 #&%s ?1 led correspondant A ! s@' +i vous trouveC le nombre choisi avant 1 minB le LC vous donne le temps >ue vous aveC mis en secondesB sinon il vous in2orme >ue vous aveC perdu et vous donne la rponseB puis le Keu recommence'
Fonctions de communications :
0crire et tester les 2onctions de communications ?-+!*!@ suivantes : com?init >ui initialise les re)istres de l'&8+A-,' com?recieve >ui attend l'arrive d'un octet et le renvoie' com?transmit >ui permet d'envoHer un octet vers le PC' com?strin+?transmit >ui envoie une chaRne de caract3res ?tableau d'octets@ au PC' com?strin+?receive >ui permet de recevoir une chaRne de caract3re envoHe par le PCB cette 2onction reUoit en param3tre l'adresse du tableau ?chaRne@ oQ l'on veut stocEer la chaRne reUue' ?#a 2in de la saisie dans l'hHperterminal peut Mtre si)nale par l'appui sur la touche &ntre@ /ans l'3y2erterminal1 le caractre '[n' 2ermet de 2asser ; la li+ne suivante 5touc3e CTD-P0ntre7 et '[r' de faire un retour c3ariot1 retour en d6ut de li+ne 5touc3e 0ntre7. Une c3a8ne se termine 2ar le caractre '[*'.
Cette 2onction doit renvoHer le nombre mHst3re' Pour cela elle incrmente un entier n cod sur 8 octets ?de tHpe unsi)ned char@ tant >u'aucune donne n'est reUue sur la liaison srie' Zuand n N ! B si on aKoute 1 on a n N ! 4 >ui se code sur 7 bits mais comme n est sur 8 bitsB on aura n N "' 0crire cette 2onction'
#e temps ma=imal pour trouver la solution est d2init dans le pro)ramme principal ? main@' #e temps restant est une variable )lobale ?commune A toutes les 2onctions@' <n mesure le temps avec le ,IM&- "' 0crire les 2onctions : timer?init >ui initialise les re)istres du timerB des interruptionsB timer?+o >ui lance le dcompte et les interruptionsB timer?sto2 >ui arrMte le dcompte et les interruptionsB timer?interru2t >ui dcrmente le temps et met A Kour les #&% ?une #&% correspond A ! secondes restantes@'
Pro+ramme com2let
M1 +I+
!8
!"119!"1!
M1 +I+
!7
!"119!"1!
0.
A2in de permettre A la secrtaire de la 2ormation de vous di22useC plus 2acilement divers messa)es nous allons raliser un sHst3me d'a22icha)e A partir de l'a22icheur #C% de la carte' #'a22icha)e se 2ait sur deu= li)nes : #e titre du messa)e sur la premi3re li)neB il est centr et ne doit pas dpasser 14 caract3res' #e corps du messa)e >ui d2ile en boucle sur la seconde li)ne' Pour mettre A Kour le titre et9ou le corps du messa)e la secrtaire utilisera . 3y2erterminal / ?liaison rs!*!@B elle aura aussi la possibilit de dsactiv l'a22icheur' #e messa)e ainsi >ue l'tat de l'a22icheur . actif / et . inactif / devront Mtre sauve)ard mMme en cas de coupure de courant'
0.1.
0.1.1.
%ans le ,P n[*B nous avons cris le driver de l'a22icheur en assembleurB il n'est donc pas directement utilisable dans un pro)ramme C' #e compilateur MCC18 permet l'int)ration de code assembleur dans le code C en utilisant les directives . ?asm / et . ?endasm /' Contrairement au compilateur MPA+M6IFB le compilateur C ne connait pas les options par de2aut des intructions ?c2' Keu d'instructions@ il 2aut donc raKouter toutes les options A votre code assembleur' Ainsi la 2onction lcd`ecrire`>uartet deviendra : (oid lcdQecrireQJu3r#e#Cc!3r JD E B%.G=J0 Q3,' 3ndl) 050F *c$ PO%T/-I-0 *c$ PO%T/-2-0 *c$ PO%T/-1-0 *c$ PO%T/-0-0 ... Qend3,' M Complter la 2onction . void lcd?ecrire? uartet5c3ar 7 / +ur le mMme principe crire . void lcd?dis2o5void7 / Fous avons maintenant cod les deu= 2onctions de base pour la )estion du lcdB les autres 2onctions vont Mtre recodes en C' 0crire la 2onction . void lcd?ecrire?octet5c3ar lcd?d67 /' %ans MCC18 l'instruction s=a2f est remplace par la 2onction S=a2f. Pour inverser les >uartets M+$ et #+$ de . = /B il su22it d'crire . S=a2f 5MD0K1*1*7O /' 0crire les 2onctions . void lcd?ecrire?ordre5c3ar o7 / et . void lcd?ecrire?donnee 5c3ar d7 /' 0crire les 2onctions . void lcd?cls5void7 /B . void lcd?l$5void7 / et . void lcd?l)5void7 /' 0crire les 2onctions . void lcd?init5void7 / en utilisant la biblioth3>ue . delays.3 / pour les temporisations' Crer la 2onction . void lcd?curseur?2osition5c3ar l1 c3ar 27 / >ui permet de positionner le curseur d'a22icha)e A la . 2 /i3me position de la li)ne . l /' ?c2 2i)ureB pa)e @ ,ester ses 2onctions sur la carte d'valuation'
0.1.2.
#e lan)a)e C nous permet d'crire tr3s simplement des 2onctions plus volues pour la )estion de l'a22icheur' 0crire la 2onction . void lcd?lcls5c3ar l7 / >ui e22ace la li)ne . l /' 0crire la 2onction . void lcd?ecrire?c3aine5c3ar `c37 / >ui a22iche une chaine de caract3re sur la li)ne active' 0crire la 2onction . void lcd?ecrire?c3aine?centre5c3ar `c31 c3ar l7 / >ui a22iche une chaine de caract3re en la centrant sur la li)ne . l /B selon le principe ci dessous' ; Cas d'une chaine de lon)ueur paire :
M1 +I+
*"
!"119!"1!
0.1.3.
Fous disposons maintenant d'un ensemble de 2onctions de )estion du #C% a2in de les utiliser et de pouvoir les di22user plus 2acilement nous allons les re)rouper dans une librairie >ue l'on nomera . a22icheurlcd /' 8ne librairie ?2ichier d'lib@ est en 2ait une compilation de 2ichier obKets' #es 2ichiers obKets contiennent entre autres la liste des noms de 2onctions ou les ti>uettes ?pour A+M@ ainsi >ue leur code machine ?coda)e binaireB ces 2ichiers ne sont pas ditables@' #es 2ichiers obKets ?d'o@ sont obtenus apr3s compilation de votre code dans MP#A$' Crer un nouveau proKet sous MP#A$ comme pour 2aire un pro)ramme classi>ue' %ans le 2ichier source . coller / vos 2onctions de )estion de l'a22icheur avec les di22rents . Zinclude / CompilerB une erreur vous in2orme >ue la 2onction . main / n'est pas d2inieB c'est normal G %ans votre rpertoire proKetB un 2ichier obKet du mMme nom >ue votre pro)ramme a t cr' C'est ce 2ichier >ue nous allons maintenant convertir en librairie A l'aide de l'utilitaire de )estion de biblioth3>ue MP#I$' MP#I$ est un pro)ramme 2onctionnant en mode console sous %<+ avec les options suivantes : <c Cration contenant un ou plusieurs 2ichiers obKets <# <d <r <5
#iste le contenu de la libraire &22ace un obKet de la librairie -emplace un obKet e=istant dans la librairie &=trait un membre de la librairie
#nclure la li6rairie dans un 2rojet +i l'on souhaite utiliser notre biblioth3>ue comme une biblioth3>ue dKA installe ?avec
M1 +I+
*1
!"119!"1!
0.2.
Gestion de l(%%P9LM
#a mmoire &&P-<M ?&lectricallH;&rasable Pro)rammable -ead;<nlH MemorH ou mmoire morte e22aUable lectri>uement et pro)rammable@ ?aussi appele &!P-<M ou &eP-<M@ est un tHpe de mmoire morte' C'est A dire utilise pour enre)istrer des in2ormations >ui ne doivent pas Mtre perdues lors>ue l'appareil >ui les contient n'est plus aliment en lectricit' ,outes les in2ormations ncessaires A la lecture est A l'criture dans l'&&P-<M interne se trouvent dans la datasheet pa)es 8* A 81' #e PIC 18F4 !" dispose de ! 4 octets de mmoire &&P-<M interne >ui sont rparties de la mani3re suivante : l'tat du panneau ?1 octet@ le titre du messa)e ?11 octets : 14 caract3res \ le caract3re 'f"' de 2in de chaine@ le corps du messa)e ?!*1 octets : !*4 caract3res \ le caract3re 'f"'@ 0crire les 2onctions . c3ar ee2rom?lire5c3ar ad7 / et .void ee2rom?ecrire5c3ar data1 c3ar ad@ / >ui permettent respectivement de lire et d'crire A l'adresse . ad / de l'&&P-<M' #'adresse mmoire varie entre *x** et *x&&' /ans la fonction d'criture l'interdiction des interru2tions est ncessaire seulement si celleQci ont t active et on ne doit 2as uitter cette 2rocdure tant ue l'enre+istrement dans la mmoire n'est 2as termin. Tous 2ouvez tester les fonctions d'criture et de lecture dans l'00PDIM avec le simulateur de MP-4E ; condition de dsactiver l'attente de fin d'criture... 4ller dans le menu Tie= L 00PDIM en dou6le cli uant sur un es2ace mmoire vous 2ouvez le modifier. Pour notre panneau d'a22icha)eB nous allons venir lire la chaine ?li)ne 1@ ou une partie de la chaine ?li)ne !@ dans l'&&P-<M' Pour cela vous alleC crie la 2onction . void ee2rom?lire?c3aine5 c3ar `c31 c3ar len1 c3ar ad7 /' Cette 2onction copie dans la chaine . ch / le contenu de l'&&P-<M A partir de l'adresse . ad / Kus>u'A ce >ue le caract3re '[*' soit rencontrer ou >ue la chaine . c3 / soit de lon)eur . len / Zuel sont les pla)es d'adresse en &&P-<M de l'tat de l'a22icheurB le titre et le corps du messa)e Y 0crire la 2onction ee2rom?lire?c3aine. +imuler cette 2onction avec MP#A$+IM'
0.3.
Pannea' d(afficha.e
Pannea' " messa.e fi1e
0.3.1.
0crire un pro)ramme >ui a22iche le titre du messa)e sur la premi3re puis 2ait d2iler en continu le corps du messa)e sur la seconde li)ne: le corps du messa)e commence A apparaRtre sur la droite de l'cranB puis d2ile vers la )auche' Zuand la derni3re lettre du corps du messa)e sort de la )auche de l'cranB le d2ilement recommence' %ans ce pro)rammeB vous deveC )alement )rer l'tat du panneau : si l'tat vaut "B le te=te ne d2ile pas et gSors +erviceg est a22ich sur le panneauB si l'tat vaut 1B le corps du messa)e d2ile' #a vitesse de d2ilement est de "" ms9caract3re' #ors>ue l'a22icheur est en service la led connecte A -$" est allumeB en hors service elle cli)note A une 2r>uence de 1 SC' Tous pouveC pro)rammer l'&&P-<M interne du LC via MP#A$ a2in d'initialiser le te=te A a22icher' Tous pouveC initialiser vous mMme le te=te A a22icher dans l'&&P-<M en respectant les pla)es mmoiresB les valeurs et le caract3res '[*' ou alors importer directement le 2ichier . t2V?ee2rom.mc3 / >ui vous est 2ourni' #ors de la pro)rammation du LCB l'&&P-<M le sera )alement' ,ester ce pro)ramme sur la carteB penser A essaHer le cas oQ le panneau est acti2 et celui oQ il est hors service' M1 +I+
*!
!"119!"1!
Travaux Prati ues de Microcontr!leur " P#C $%&'()* 0.3.2. Pannea' " messa.e variable
#e pro)ramme >ue vous veneC d'crire est tr3s utile pour di22user un messa)e mais peu prati>ues' &n e22etB si A cha>ue 2ois >ue la secrtaire veut modi2ier le messa)e elle doit prendre un pro)rammateur et repro)rammer l'&&P-<MB elle ne voudra pas l'utiliser : c'est compli>uB Ua prend du tempsB il 2aut sortir le microcontrleur du panneau''' Pour r)ler ce probl3me vous alleC mettre en place un sHst3me de mise A Kour A distance en utilisant le protocole -+!*! comme vous l'aveC dans le ,P n[ ' Tia hHperterminal la secrtaire acc3dera A une inter2ace d'administration >ui lui permettra de modi2ier l'tat du panneauB le titre et le corps du messa)e' #e pro)ramme va donc a22icher en continu le messa)e et basculer en mode mise A Kour lors>ue la commande sera reUue' #es di22rentes commandes et la procdure de mise A Kour sont d2inis dans l'al)ori)ramme 2i)rue !! pa)e suivante' Complter le pro)ammme prcdent pour int)rer l'inter2ace d'administration' CommenteC bien ce pro)ramme a2in d'e=pli>uer ce >ue vous 2aRtes et pour>uoi' Penser ; +rer la taille maximale des c3aines et le carctre '[*' en cas de d2assement de la taille maximale en inform la secrtaire 53y2erterminal7.
Taleur dans -C-&5 Y -C-&5N'd' Mettre le panneau hors le service Mettre panneau hors service -C-&5N'e' -C-&5N's' -envoHer l'tat du panneau et le contenu du titre et du corps du messa)e dans hHperterminal -C-&5N'u' A22icher .hMise A Kourh/ sur le panneau -cuprer le nouveau titre du messa)e -cuprer le nouveau corps du messa)e
&i+ure )), 4l+ori+ramme de l'interface d'administration du 2anneau #'application ralise ici est tr3s proche d'un cas d'utilisation relle si ce n'est >ue l'a22icheur aurait peut Mtre plus de li)nes' #a di22rence maKeure serait dans l'interace d'administration elle ne serait pas ralise avec hHperterminalB mais avec un pro)ramme spcial en CB C\\B etc ''' >ui serait crit avec des boRtes de dialo)ues beaucoup plus conviales pour la secrtaire'
M1 +I+
**
!"119!"1!
12.
TP n- 3tation 3ervice
%ans ce ,P nous allons raliser de la mani3re la plus raliste possible le pro)ramme de commande d'un automate de pompe A essence'
12.1.
A'tomate de Pom)e
#e bouton poussoir connect A -$" reprsente la poi)ne de distribution de carburant' #ors>ue le bouton est appuHB la distribution est en coursB le moteur de la pompe est alors est alors activ ?led -$* claire@' 8n dbitm3tre mesure le dbit de carburant a2in de calculer le volumeB il donne une impulsion A cha>ue centilitre vers' IciB il sera simul par le timer " >ui e22ectura une impulsion toute les 1 ms environ' 0crire un premier pro)ramme >ui initialise les entres sorties utilisesB le timer "B autorise les interruptions puis A l'in2ini =cute : 'o#eur 7o'7e 3rr@#2 d2*i'V#re 3rr@#2 #3n# Jue Poi n2e +ccroc!2e $3ire $in $3ire 'o#eur 7o'7e 3c#i(2 d2*i'V#re 3c#i(2 #3n# Jue Poi n2e /2croc!2e $3ire $in $3ire Pour tester ce 2ro+ramme lors d'une interru2tion1 inverser l'tat de DC) afin d'envoyer un si+nal d'environ (* Sz sur le transducteur 2izoQlectri ue. Fous allons maintenant int)r au pro)ramme les calculs de volume et de pri=' #e volume est compt en centilitres de " A 7777 cl' Il peut donc Mtre stocEer dans une variable de tHpe entier ?14 bits@' #e pri= du litre est 2i= A 1B"8iB un centilitre vaut donc 1B"8 centime d'euro' #e pri= ma=imun peut atteindre 1"8B"" i' #e pri= sera donc un nombre de centi3mes de centimes variant entre " et 1"1787!B il doit Mtre cod sur entier lon) ?*! bits@' Cha>ue interruption du timer " correspond A un centrilitre vers' #e sous pro)ramme d'interruption incrmentre le volume ?\1cl@ et le pri= en centi3me de centime ?\1"8c@' <n aurait )alement pu calcul le pri= en multipliant le volume par le pri= au litre mais cela aurait ncessit des multiplicationsB plus lon)ues A e22ectuer >ue les additions' Modi2ier votre pro)ramme pour int)rer ces calculsB puis assureC;vous en simulation >ue le volume et le pri= voluent correctement' #'a22icheur #C% va nous permettre ?via la librairie crite au ,P n[4@ d'a22icher le pri= et le volume lors>ue la distribution est en cours' #e volume est un entier compris entre " et 7777 et nous voulons l'a22icher A l'cran sous la 2orme dcimale :
^mO^cOB^dO^uO l oQ ^ m OB '''B ^ u O reprsentent respectivement le chi22re des milliersB centaintesB diCaines et units' +i on e22ectue la division euclidienne de la variable volume par 1"""B ^ m O est le >uotient et le reste reprsente centainesB diCainesB units '''
0n C1 le uotient de la division euclidienne est donne 2as l'o2rateur < et le reste 2ar b. AKouter ces calculs au pro)ramme prcdentB et le simuler' Tri2ier l'e=actitude des di22rents chi22res A a22icher' Puis en utilisant les points d'arrMtB mesurer la dure d'=cution du code de calcul des chi22res A a22icher' Pour acclrer les calculsB nous allons utiliser l'al)orithme suivantB donn ici pour le chi22re ^mO' #es calculs tant e22ectu dans la variable vol a2in de ne pas modi2ier la variable volume' ' = 0 (ol = (olu'e #3n# Jue (ol >= 1000 $3ire ' = ' W 1 (ol = (ol X 1000 $in $3ire
M1 +I+
*4
!"119!"1!
<n calcule le pri= A a22icher de la mMme 2aUon >ue le volume' Zuel est le premier chi22re A a22icher Y 0crire le code corresspondant au calcul des HHHBHH i' #ors>ue >ue le client raccroche la poi)neB la pompe est blo>ue tant >ue celui;ci n'a pas paH' #a validation du paiement tant reUue de l'automate de caisse' Pour l'instant un appui sur -A4 validera la paiement et permettra au client suivant de se servir en carburant' Int)rer )alement la contrainte >ue le volume ne doit pas dpasser pas 7777clB sinon la pompe s'arrMte et attends le paiement' 0crire et tester ce pro)ramme sur la carte'
12.2.
5nralement une station service est constitue de plusieurs pompes' <n ne peut donc pas utiliser une conne=ion de tHpe -+!*! pour communi>uer avec l'automate de caisse ou alors il 2autB A cha>ue clientB aller brancher le cDble sur la bonne pompe''' Seuresement il e=iste d'autres mani3res de communi>uer a2in de mettre plusieurs entits en rseau' #e PIC 18F4 !" int3)re un module M++P de communication srie ?Master +Hnchronous +erial Port@ >ui )3re entre autre le protocole IeC >ue nous allons utiliser'
12.2.1.
Le b's !M*
IeC ?pour Inter Inte)rated Circuit $us@ est le nom du bus histori>ueB dvelopp par Philips pour les applications de domoti>ue et dIlectroni>ue domesti>ue au dbut des annes 178"B notamment pour permettre de relier 2acilement A un microprocesseur les di22rents circuits dIune tlvision . moderne /' #e bus IeC est un bus srie sHnchrone constitu de deu= li)nes : +erial %ata #ine ?+%A@ et +erial ClocE #ine ?+C#@ >ui assurent la communication entre di22rents modules'
+%A +C#
Maitre
m etteur1 rce2teur
&sclave 1
m etteur1 rce2teur
'''
&scalve n
m etteur1 rce2teur
&i+ure )9, 4rc3itecture #cC #e module >ui demande le trans2ert de donnes et >ui )n3re lIhorlo)e est le maRtreB le module >ui rpond est un esclave' 8n mMme sHst3me peut disposer de plusieurs maRtresB on le nomme alors multimaRtre' %ans ce casB il 2aut arbitrer la discussion entre les di22rents modules' Fous ne verrons ici seulement le cas d'un seul maRtre avec plusieurs esclaves' #e bus IeC travaille A une vitesse de 1"" Ebits9s en mode standard et 4"" Ebits9s en mode rapide' #es li)nes +%A et +C# sont bidirectionnelles' Au reposB elles sont au niveau haut' #e 2ormat d'une trame standard est reproduit dans le tableau 4' 8n trans2ert tHpe IeC est reproduit en 2i)ure ! '
Adresse
-6
%onnee
A '''
%onnee
A P
Ta6leau ', Trame #cC 3 : bit de startB est la condition de dpart : +%A passe de lItat haut A lItat bas pendant >ue +C# est au niveau haut ?c2' 2i)ure !4@' Adresse : reprsente celle du module A la>uelle on veut s jadresserB elle est compose de 1 bits A4A A4A*A!A1A"B A4A A4A* sont 2i=s par lIIeC commitee A!A1A" sont libres pour nous permettre de
M1 +I+
!"119!"1!
&i+ure )', Eus #cC1 Eit de Start et Eit de Sto2 %Iapr3s le protocole de trans2ertB on peut voir >ue le nombre ma=imal dIesclaves est !1 soit 1!8' Comme les li)nes +%A et +C# sont au repos au niveau hautB les composants ?maRtresB esclaves@ IeC ne peuvent donc >ue les 2orcer >uIA lItat bas' Ce 2onctionnement impose au= circuits des sorties A collecteur ?2i)ure !4@ ouvert ou A drain ouvert pour +%A et +C# ?c2' %ocumentation IeC@'
M1 +I+
*4
!"119!"1!
Pour stopper une transmissionB en mode lecture le maRtre nIac>uitte pas le dernier mot transmis et )n3re un bit de stop' &n mode critureB si lIesclave nIac>uitte pas le dernier motB le maRtre )n3re le bit de stop' #es donnes ne sont valides >ue sur un niveau haut de +C#' 8ne e=tension de l'IeC permet d'avoir plus de priphri>ues en codant l'adresse sur 1" bitsB nous ne verrons pas ce cas dans ce tp'
&i+ure )V, Connexions ; collecteur ouvert +ur un bus IeCB le pic peut Mtre soit maRtre soit esclave' %ans notre application >ui Kouent les rles de maRtre et d'esclave Y Justi2ier votre rponse'
12.2.2.
&n attente de client %istribution en cours %istribution termineB attente de validation du paiement
Ta6leau (, Communication 4utomate de 2om2e vers caisse
Messa+e
Talidation du paiement
Ta6leau V, Communication 4utomate de caisse vers 2om2e d : HHHHH sont les chi22res du montant A paHer'
'v'
12.2.3.
Fous allons commencer par tudier le pro)ramme de l'automate de caisse' Ce pro)ramme permet via hHperterminam de communi>uer avec les pompes' Pour connaRtre le statut d'une pompeB il su22it de saisir son numro dans hHperterminal A l'aide du pav numri>ue' Fous nous intressons seulement A la partie IeC du pro)ramme dans le ,P' &=pli>uerB commenter les 2onctions de l'automate de caisse reproduite dans le tableau 1' ] partir de ces 2onctions de )estion du busB crire les 2onctions de communication . void i)c?master?to?slave5 c3ar adresse1 c3ar donnee 7 / et . c3ar i)c?slave?to?master5 c3ar adresse 7 / ralisant respectivement le trans2ert d'un octet du maRtre vers l'esclave et de l'esclave vers le maRtre' -es c3rono+rammes 2a+e $X) et $X9 de la datas3eet 2ourraient vous Rtre utile. Zuelles modi2ications 2aut;il apporter au= 2onctions >ue vous veneC d'crire pour >u'elles soient utilisables dans le cas de la station service Y
M1 +I+
*1
!"119!"1!
12.2.4.
Intressons nous maintenant au pro)ramme d'un automate de pompeB la pompe tant intrro) par l'automate de caisse' #'adresse de l'automate de pompe sur le bus IeC est code sur 1 bits et correspond au code A+CII du numero de la pompe' Ainsi l'adresse de la pompe n[1 sera "=*1 >ui se code bien sur 1 bits' #a pla)e d'adresse est de "=*1 A "=*8' #'adresse doit Mtre stocEe dans les bits de poids 2ort du re)istre correspondantB le bit " de ce re)istre restant A Cro' #es li)nes +C# et +%A sont connectes respectivement au= broches -C* et -C4B broches >ui doivent Mtre con2i)ures en entre' Fous utiliserons le mode de 2onctionnement standard et sans interruptions de bits de +tart et de +top' C'est l'automate de caisse >ui va venir demander A l'automate de pompe la somme A encaisser' #ors>ue
A4 $it de +tart
A" -6
%1
%4
Ac>uittement de l'esclave
l'automate de caisse veut 2aire une demandeB il envoi sur le bus l'adresse de la pompe intrro)e ?mode lecture@' +i l'automate de pompe reconnaRt son adresse et le 2la) ++PIF se l3ve' +i les interruptions ont t autorise le pro)ramme passe alors A la routine associe' #'automate de pompe 2onctionnant en mode esclave il est donc ncessaire d'utiliser les interruptions car sinonB le pro)ramme va passer son temps A surveiller le bus et ne pourra pas e22ectuer la distribution de carburant' %'autant plus >ue la demande de l'automate de caisse peut intervenir n'importe >uand' ?Fous utiliserons les messa)es reproduits en tableau '@ M1 +I+
*8
!"119!"1!
Complter la 2onction d'initialisation ?ci;apr3s@ du module M++P pour l'utilisation en mode IeC dans le cas d'un automate de pompe' &=pli>uer vos initialisations' (oid i2cQ,l3(eQini#C(oidD E T%ISC*i#,.T%ISCI = ... T%ISC*i#,.T%ISC4 = ... SSPCON1 = ... SSPCON2=00 SSPST+T=00 SSPST+T*i#,.S:P = ... SSP+// = ... IP%1*i#,.SSPIP = 1 ... = ... ... = ... M
<<C4P=1 ...
&n utilisant la datasheet du picB >uels sont les bits A initialiser pour autoriser l'interruption du module IeC Y -aKouter ces initialisations A la 2onction . void i)c?slave?init5 void 7 /' &n re)ardant la datasheet on s'aperUoit >uand mode esclaveB il H'a * bits >ui permettent de connDitre l'tat de la communication IeC' ,out le reste tant )rer par le module M++P et donc transparent pour nous' Ceu= sont les bits -`6B %`A et $F du re)istre ++P+,A,' Zuelles sont les in2ormations >ue nous donnent chacun de ces bits Y #'tude des chrono)rammes pa)e 114 et 111 de la datasheet montrent les di22rentes con2i)urations possibles de ces bits lors d'une interruption du module IeC :
Mode lecture : le maRtre a )nr un Fin de l'envoiB ce cas n'est pas obli)er AC( si)ni2iant la 2in de la lecture' d'Mtre traiter dans le pro)ramme'
Ta6leau %, #cC1 esclave1 interru2tion MSSP , /iffrentes confi+urations 2ossi6les Complter le tableau 8' &n 2onction de la con2i)uration de . %`AB -`6B $F /B e=pli>uer ce >ue veut le mettre et ce >ue doit 2aire l'esclave' #ors d'une re>uMte de lectureB le module IeC esclave du PIC 2orce +C# A " pour empMcher >ue le maRtre reprenne le contrle du bus avant >u'il est pu prparer la donne A transmettre' 8ne 2ois >ue la donne A transmettre est prMtre il 2aut repositionner le bit C(P du re)istre ++PC<F1 A 1 a2in de relDcher l'horlo)e' <n parle de clocE stretch' Erratum Microchip Mode I C : /ans la datas3eet du P#C$%&'()*1 il est dit ue dans le cas d'une lecture du ma8tre1 la rce2tion de l'octet d'adresse ne 2ositionne 2as le 6it E&1 or ce n'est 2as le cas U Tenez com2te de cette erreur dans l'criture de votre routine d'interru2tion #cC. Int)rer les 2onctions IeC au pro)ramme de l'automate de pompe et tester son 2onctionnement' #e pro)ramme de l'automate de caisse vous est 2ournit' #iseC la partie suivante avant de tester votre pro)ramme sur la carte'
12.2.&.
Comme on peut le voir sur la 2i)ure !4B la partie phHsi>ue d'un bus IeC est ralise par trois li)nes lectri>ues : la masse ?5F%@B les donnes ?+%A@ et l'horlo)e ?+C#@' Comme les composants connects sont de tHpes collecteur ouvert
M1 +I+
*7
!"119!"1!
PIC%&M ! Plus ; I
PIC
PIC%&M ! Plus ; II
PIC
5F%
!4#! 4
!4#! 4
,C14
,C14
5F%
-C*
-C4
-C*
-C4
\ T
&i+ure )W, Connexion en #cC de deux cartes P#C/0M ) Plus /ans le 2ro+ramme de caisse1 si vous ta2er le caractre 't' dans 3y2erterminal1 la tem2erature sera affic3e en utilisant le ca2teur TCW' connect au 6us ; l'adresse *x'/!
-di)er un petit bilan sur l'ensemble des travau= prati>ues : Zu'est ce >ui vous a pluB dpluB ennuH Y Zu'aveC vous apprisB retenu Y k'a t'il des choses A amliorer pour les 2uturs tudiants Y '''
M1 +I+
4"
!"119!"1!
Notes
M1 +I+
41
!"119!"1!