Você está na página 1de 34

II2 - TD n1 Architecture du 16F84

Voir WIKI en franais (http://fr.wikibooks.org/wiki/Comment_d%C3% !marrer_a"e#_$n_%IC&'()*+ ,es %ICs ont -t- introd$its en &!.. par General Instrument Corporation. ,es %ICs repr-sentent $ne fami//e te//ement di"ersifi-e 0$1i/ est diffi#i/e de r-a/iser $n ensemb/e de 23s s$ffisamment g-n-ra$4 po$r /es pr-senter. 5o$s a"ons #hoisi de pr-senter /a s-rie des &'().. 0$i seront $ti/is-s en 2ra"a$4 %rati0$es. %o$r /a partie assemb/e$r6 se$/es seront pr-sent-es /es instr$#tions d$ &'(6 /e &'()* -tant en#ore tr7s $ti/is-.

I) Architecture gnrale 1) Architecture mmoire ,a donn-e de base de %IC (&'(888+ est /9o#tet. ,9o#tet #omporte ) bits. ,e bit : est /e bit de poids faib/e et /e bit . est /e bit de poids fort. Mmoire programme : /a m-moire programme d$ %IC (&'()*+ est organis-e en

mots de &* bits. ,e bit : est a$ssi /e bit de poids faib/e et /e bit &3 est /e bit de poids fort. ,1adressage de #ette m-moire programme se fait s$r &: bits. ,a m-moire m-moire programme #omporte don# &k 4 &* bits.
Mmoire !"#M : /e %IC (&'()*+ dispose de '* o#tets de m-moire ;;%<=>.

Mmoire donne : /e %IC (&'()*+ de$4 ban0$es (s-/e#tionn-es par /e bit <%: d$ registre ?2 2@? s$bdi"is-es en de$4 parties : A #ases m-moires sp-#ia/es (registres sp-#ia$4+ A #ases m-moires /ibres 0$e "o$s po$"eB $ti/iser C "otre g$ise. ,a m-moire d$ &'(888 est organis-e en ban0$es s-/e#tionn-es par /e(s+ bit(s+ <%: (et <%&+ d$ registre $TAT%$. ?e$/ <%: est $ti/is- po$r /e &'()*6 soit de$4 ban0$es.
(i/e ddress ::h
bcf status,rp0

Dan0$e : Indire#t addr. 2><: %C, ?2 2@? (?< %=<2 %=<2D AAA ;;3 2 ;; 3< %C, 2H I52C=5 ') #ases m-moires ?< > in$ti/is-

Dan0$e & Indire#t addr. %C, ?2 2@? (?< 2<I? 2<I?D AAA ;;C=5& ;;C=5F %C, 2H I52C=5

(i/e ddress ):h bsf status,rp0 passe en ban0$e & )Fh )3h )*h )Gh )'h ).h ))h )!h ) h )Dh

:&h :Fh :3h :*h :Gh :'h :.h :)h :!h : h :Dh :Ch ... *(h .(h

=%2I=5_<;E )&h

passe en ban0$e :

#orrespond C /a )Ch ban0$e : C(h in$ti/is((h

23 IIF E;IIA& I@2 2roIes (?erge >o$to$+

,a premi7re partie de #ette m-moire (/es registres+ est parfois appe/-e &anc de regi'tre'. 2) (e mod)le de programmation du !I* +16F84) I/ pe$t Jtre pr-sent- de /a mani7re tr7s simp/ifi-e s$i"ante : . &F &F ##$m$/ate$r W : %ointe$r de pi/e ?% Compte$r ordina/ %C ?tat$s I<% <%& <%: /2= /%3 K %3 : %ower 3own 3C C :

I<% : s-/e#tion Dan0$e en adressage indire#t <%& : s-/e#tion ban0$e K : B-ro <%:: s-/e#tion ban0$e 3C : demiAreten$e (demiA#arrI+ 2= : 2imer ="erf/ow C : reten$e (CarrI+

,e pointe$r de pi/e n1est manip$/- dire#tement par a$#$ne instr$#tion. I/ ne #omporte 0$1$ne profonde$r de ) ni"ea$4. Cette fon#tionna/it- man0$ante #omp/i0$e /a r-a/isation de #ompi/ate$rs de /angage -"o/$- (C par e4emp/e+. ,e #ompte$r programme est en fait #ompos- de de$4 registres ) bits : A !*( (:Fh/)Fh+ po$r /es ) bits de poids faib/es (a##essib/e en /e#t$re/-#rit$re+ A !*(AT, (: h/) h+ po$r /es G bits de poids forts (a##essib/e en /e#t$re/-#rit$re+ ,e &'()* g7re se$/ement &: bits des &3 bits d$ %C ,e mod7/e de programmation #omp/et est p/$s #omp/e4e6 en parti#$/ier C #a$se des registres. I/ est pr-sent- en anne4e C /a fin d$ do#$ment. II) "ali'ation' de programme' a''em&leur' 1) (-in'truction mo. dan' tou' 'e' tat' ,1instr$#tion mo" e4iste so$s p/$sie$rs formes 0$e no$s no$s proposons d1e4aminer maintenant. a) adre''age Immdiat ou littral +Immediate) C1est /1adressage est /e p/$s fa#i/e. ,1op-rande se tro$"e dire#tement dans /e programme derri7re /e #ode de /1instr$#tion.
=p-rations /itt-ra/es (adressage imm-diat+ et de #ontrL/es po$r &'(888 >n-moni0$e =p-rande >=V,W k #hargement d$ /itt-ra/ dans W & && ::44 kkkk kkkk 3es#ription CI#/es &* bits =p#ode stat$s notes affe#ted

&) Adre''age Direct (1adresse de /1op-rande se tro$"e dans /1instr$#tion.


=p-rations orient-es o#tets entre registre et m-moire ((i/e en ang/ais+ >n-moni0$e =p-rande F / 3* 3es#ription CI#/es &* bits =p#ode stat$s notes affe#ted

23 IIF E;IIA& I@2 2roIes (?erge >o$to$+

>=V( f6d

d-p/a#ement de f "ers W si dM:. ?i dM& d-p/a#ement (AN( mais en positionnant K

&

:: &::: dfff ffff

&6F

>=VW( f d-p/a#ement de W "ers f & :: :::: &fff ffff ?a$f sp-#ifi#ation #ontraire6 d "a$t to$Oo$rs6 a$ #hoi4 : A : /a destination est W et /e #onten$ de /9emp/a#ement m-moire n9est pas modifi-. A & /a destination est f (/a /ettre f+ : dans #e #as /e r-s$/tat est sto#k- dans /9emp/a#ement m-moire.

;4emp/e : P '* o#tets en a##ess < > CBLOCK 0x0C ;sur 16F84 voir doc %&te'p (1 ; )one de 1 'ontab+eau ( 8 ; ,one de 8 'avariab+e (1 ; ,one de 1 -.#C ; Fin de +a ,one /// 'ovf 'avariab+e ,0 ;'ovf

section I 1! du "#1$ b*te b*tes b*te 'avariab+e ,0 123 4'avariab+e$ 3 0

/ercice 1 &Q+ Ca/#$/er /a "a/e$r de #ha#$ne des -ti0$ettes Rw_tempR6 Rmontab/ea$R et Rma"araib/eR6 p$is assemb/er /1instr$#tion mo"f d$ programme #iAdess$s. FQ+ =n donne /e #onten$ de /a < > #orrespondant C /a dire#ti"e.

adresse 500C

contenu

Instruction (directive ici)

'ontab+eau ( 8 ; ,one de 8 b*te 'avariab+e (1 ; ,one de 1 b*tes -.#C ; Fin de +a ,one S$e//e sera /a "a/e$r de /1-ti0$ette ma"ariab/e (en he4ad-#ima/+ T @ne instr$#tion 'ovf 'avariab+e ,% ;4'avariab+e$ 3 0 est e4-#$t-e6 0$e//e "a/e$r est #harg-e dans W (W6 registre de tra"ai/ ) bits+ T 3Q+ ssemb/eB /1instr$#tion de /a 0$estion FQ+ *Q+ =n aOo$te /1instr$#tion 'ov%f PORTA ; 0 3 <O="9 en fin de programme. S$e fait #ette instr$#tion T ssemb/eB #ette instr$#tion en "o$s ser"ant de /1ar#hite#t$re m-moire po$r tro$"er /a "a/e$r de !#"TA. 2) 0ien comprendre le mod)le de programmation I/ est important de bien #omprendre /e fon#tionnement g-n-ra/ d1$n mi#roA#ontrL/e$r po$r bien se pers$ader 0$1$ne #onnaissan#e parfaite d1$n -tat permet de tro$"er ses -tats s$i"ants. %o$r $n mi#roA #ontrL/e$r on appe//e -tat /a #onnaissan#e (partie//e+ des "a/e$rs des registres et de #e//es des m-moires. %o$r tra"ai//er s$r #e mod7/e6 i/ "o$s fa$t rep-rer /e #ompte$r programme et sa "a/e$r6 p$is #ommen#er C d-sassemb/er C partir de #ette "a/e$r.

06 07 08 04 09 09 CBLOCK 0x0C ; d;but de +a ,one variab+es %&te'p (1 ; )one de 1 b*te 0B 0: 06 1F 7-

3 / 3*

23 IIF E;IIA& I@2 2roIes (?erge >o$to$+

/ercice 2 (donn-es en he4ad-#ima/+ ,a dire#ti"e $ti/is-e po$r r-ser"er /a m-moire < > dans #et e4er#i#e est
CBLOCK 0x0C ; d;but de +a ,one variab+es en 9CC->> =9? so''e&pdsfort (1 ; )one de 1 b*te so''e&pdsfaib+e ( 1 ; ,one de 1 b*tes co'pteur (1 ; ,one de 1 b*te 'o*enne (1 ; +e resu+tat sera ici -.#C ; Fin de +a ,one

=n donne /es -tats (#onnaissan#e partie//e : on ne #onnaUt pas to$t6 mais #1est s$ffisant+ s$i"ants :

PC=120 adresses &&( m-moire 3:C' 3:(( ::); 3::: ::)( &F*

&Q+ 31apr7s /e s#h-ma donn- #iAdess$s6 d-sassemb/er /a partie $ti/e d$ #ode. FQ+ ;4-#$ter ens$ite /es instr$#tions 0$e "o$s po$"eB6 et donner /es -tats s$##essifs. /ercice 1 V#rire $n programme 0$i transfert /a "a/e$r 0$i est dans Rw_tempR dans /a "ariab/e Rma"ariab/eR.

* / 3*

23 IIF E;IIA& I@2 2roIes (?erge >o$to$+

II2 - TD n2 Arithmti2ue
I) 3uel2ue' nou.elle' in'truction'
,a s-rie des &'(888 poss7de 3G instr$#tions a$ tota/. ;//es sont pr-sent-es en anne4e en fin de #e do#$ment. 5o$s #ommenons par pr-senter /es instr$#tions /i-es C /1arithm-ti0$e. 1) "appel' 'ur la repr'entation de' nom&re'

,9$nit- #entra/e #onnaUt trois repr-sentations des nombres : 4om&re' entier' non 'ign' (@nsigned Integer+: @n o#tet pe$t a"oir des "a/e$rs entre : et FGG (W((+6 $n mot entre : et 'GG3G (W((((+. 4om&re' entier' 'ign' complment 5 2 (2wo9s #omp/ement+. @n o#tet pe$t a"oir des "a/e$rs entre A&F) (W):+ et X&F. (W.(+6 $n mot entre A3F.') (W):::+ et 3F.'. (W.(((+. ,e bit de poids fort indi0$e to$Oo$rs /e signe. Dcimal cod &inaire (DC3 DinarI Coded 3e#ima/+: @n o#tet #ontient de$4 #hiffres d-#ima$4. ,es bits .6'6G6* #ontiennent /e #hiffre de poids fort6 /es bits 36F6&6: #ontiennent /e #hiffre de poids faib/e. @n o#tet pe$t don# a"oir des "a/e$rs entre : (W::+ et !! (W!!+. Comme bea$#o$p de mi#roA#ontrL/e$r6 /e %IC (&'()*+ g7re #e format C tra"ers /a demiAreten$e (bit 3C d$ registre stat$s+. /ercice 1 Con"ert the fo//owing de#ima/ n$mbers to binarI : X&&6 A&&6 AF3 (two1s #omp/ement representation with ) bits+. 2hen #on"ert these n$mbers to he4ade#ima/. Con"ert the fo//owing binarI n$mbers to de#ima/ : &&&:&&6 &&:&:&:&. %erform the fo//owing binarI s$bstra#tion $sing (i+ the Y ordinarI Z s$bstra#tion te#hni0$e P (ii+ the two1s #omp/ement method. &&:&& A &:&:& &&&:: A &::&
2) (e' in'truction' arithmti2ue' du 16F84 5o$s pr-sentons /es instr$#tions 0$i de pr7s o$ de /oin6 ont $n rapport a"e# /es #a/#$/s arithm-ti0$es.
=p-rations arithm-ti0$es >n-moni0$e =p-rande C,<( f I5C( f6d 3;C( f6d 33,W k 33W( f6d ?@D,W k mise C : de f In#r-mente f 3-#r-mente f ddition de W et k dditionne W et f retire W d$ /itt-ra/ & & & & & & :: :::& &fff ffff :: &:&: dfff ffff :: ::&& dfff ffff && &&&4 kkkk kkkk :: :&&& dfff ffff && &&:4 kkkk kkkk 3es#ription CI#/es &* bits =p#ode stat$s notes affe#ted K K K C63C6K C63C6K C63C6K &6F &6F F &6F &6F

?@DW( f6d so$strait W de f & :: ::&: dfff ffff C63C6K ?a$f sp-#ifi#ation #ontraire6 d "a$t to$Oo$rs6 a$ #hoi4 : A : /a destination est W et /e #onten$ de /9emp/a#ement m-moire n9est pas modifi-. A & /a destination est f (/a /ettre f+ : dans #e #as /e r-s$/tat est sto#k- dans /9emp/a#ement m-moire.

/ercice 2 (donn-es en he4ad-#ima/+ ,a dire#ti"e $ti/is-e po$r r-ser"er /a m-moire < > dans #et e4er#i#e est
G / 3*

23 IIF E;IIA& I@2 2roIes (?erge >o$to$+

CBLOCK 0x0C ; d;but de +a ,one variab+es en 9CC->> =9? data1 (1 ; ,one de 1 b*te data7 (1 ; +e resu+tat sera ici -.#C ; Fin de +a ,one

=n donne /1-tat (#onnaissan#e partie//e : on ne #onnaUt pas to$t6 mais #1est s$ffisant+ s$i"ant :

PC=01F adresses :&( :F& m-moire %rog. :))C : :3 3;:& adresses :C >-moire < > ((

C=0

Z=0

&Q+ 31apr7s /e s#h-ma donn- #iAdess$s6 d-sassemb/er /a partie $ti/e d$ #ode C /1aide d$ tab/ea$ d1instr$#tions d$ 23& et 23F. FQ+ ;4-#$ter ens$ite /es instr$#tions 0$e "o$s po$"eB et donner /es -tats s$##essifs. II) !lu' loin a.ec l-a''em&leur pr7s $n reset o$ $n d-marrage /e %IC (&'()*+ d-marre en adresse :. ,1adresse :4::* -tant r-ser"-e a$4 interr$ptions6 $n programme a$ra $ne str$#t$re or@ 0x000 ; 9dresse de d;part aprAs reset @oto start ; 9dresse 0( initia+iser /// or@ 0x00: ; 32: ici start -.# start est $ne -ti0$ette. 2o$t programme se termine par /a dire#ti"e ;53. Voi#i $n programme #omp/et 0$i $ti/ise $ne instr$#tion goto fa#i/e C e4p/i0$er et pr-sent-e dans /e 23 s$i"ant. ; 64 octets en access =9? CBLOCK 0x0C ; d;but de +a ,one variab+es sur 16F84 %&te'p (1 ; )one de 1 b*te status&te'p ( 1 ; ,one de 1 b*te 'avariab+e ( 1 ; Be d;c+are 'a variab+e -.#C ; Fin de +a ,one or@ 0x000 ; 9dresse de d;part aprAs reset @oto start; 9dresse 0( initia+iser or@ 0x00: ; aprAs +Cinterruption start c+rf 'avariab+e bouc+e incf 'avariab+e,1 ;incf 'avariab+e,f 3f @oto bouc+e -.# =n disting$e dans #e programme de$4 -ti0$ettes (start et bo$#/e+6 $ne d-finition sImbo/i0$e des "ariab/es6 $n #ommentaire et /a d-finition de /1origine d$ programme. ,1instr$#tion goto sera e4p/i0$-e dans /e 23 s$i"ant. 2o$s /es programmes de"ront #ommen#er C /1adresse :4::: mais ne #ommen#eront pas for#-ment par $n Rgoto startR #omme dans #et e4emp/e.
' / 3*

23 IIF E;IIA& I@2 2roIes (?erge >o$to$+

/ercice 1 V#rire $n programme 0$i additionne de$4 "a/e$rs en < > (Rdonnee&R et RdonneeFR+ et met /e r-s$/tat dans $ne "ariab/e ) bits RsommeR.

II2 - TD n1 (e' 'tructure' de contr6le' et l-arithmti2ue


1) In'truction 7#T# ,1instr$#tion E=2= est $ne instr$#tion de sa$t in#onditionne/ 0$e /1on a d-OC ren#ontr- dans /e 23 F.
=p-rations orient-es bits s$r /es registres >n-moni0$e =p-rande E=2= k a//er C /1adresse F &: &kkk kkkk kkkk 3es#ription CI#/es &* bits =p#ode stat$s notes affe#ted

/ercice 1 &Q+ ?$r #ombien de bits est /1adresse de destination d$ E=2= T #omparer a"e# /es &k d1adresse m-moire d$ &'()*. FQ+ ,e %IC &'().. poss7de )k de m-moire programme et /a mJme ar#hite#t$re 0$e /e &'()* (mJmes instr$#tions+. Comment pe$tAon r-a/iser $n sa$t de /a premi7re adresse "ers /a derni7re T 3Q+ ssemb/er /e programme d$ 23 F $ti/isant $n E=2=. Voi#i en r-s$m- /e fon#tionnement d$ goto : A ,9adresse de sa$t s$r && bits est #harg-e dans /e %C. A ,es F bits man0$ants sont #harg-s dep$is !*(AT, (b3 et b*+6 pas po$r /e &'()*. A ,e r-s$/tat donne /9adresse s$r &3 bits (&: bits po$r /e &'()*+ A ,a s$ite d$ programme s9effe#t$e C /a no$"e//e adresse d$ %C. ?o$"eneBA"o$s6 0$e po$r /e &'()* : dresse de sa$t M adresse r-e//e. 2) Me' premier' te't' 5o$s pr-sentons 0$atre instr$#tions 0$1i/ ne fa$t pas #onfondre. ,es de$4 premi7res positionnent $n bit tandis 0$e /es de$4 derni7res testent /a "a/e$r d1$n bit.
=p-rations orient-es bits s$r /es registres >n-moni0$e =p-rande DC( f6b D?( f6b D2(?C f6b D2(?? f6b mise C : d$ bit b dans f mise C & d$ bit b dans f test d$ bit b : de f sa$te si : test d$ bit b : de f sa$te si & & & &6(F+ &6(F+ :& ::bb bfff ffff :& :&bb bfff ffff :& &:bb bfff ffff :& &&bb bfff ffff 3es#ription CI#/es &* bits =p#ode stat$s notes affe#ted &6F &6F &6F &6F

,es instr$#tions de tests fon#tionnent to$Oo$rs de /a mJme mani7re s$r /es %ICs. ?i /e test est n-gatif on e4-#$te /a /igne s$i"ante6 sinon on sa$te $ne /igne. Voi#i $n e4emp/e dans /e0$e/ on doit e4-#$ter $ne se$/e instr$#tion s$pp/-mentaire si /e bit "a$t & : btfsc >"9"D>,C bsf 'avariab+e,7 xxxx ; tester si +e bit C du re@istre >"9"D> vaut 0 ; non 4C20$, a+ors bit 7 de 'avariab+e 'is E 1 ; +a suite du pro@ra''e est ici dans +es 7 cas

S$e faire si /es traitements n-#essitent p/$sie$rs instr$#tions T ;t bien6 on #ombine /es
. / 3*

23 IIF E;IIA& I@2 2roIes (?erge >o$to$+

sa$ts #onditionne/s a"e# /es sa$t in#onditionne/s (par e4emp/e goto+. /ercice 2 &Q+ =n #her#he C additionner de$4 "a/e$rs ) bits -ga/es C FGG (:4((+. S$e/ est /e r-s$/tat de /a sommeT Ce r-s$/tat tientAi/ dans $ne "ariab/e ) bits T FQ+ V#rire $n programme 0$i additionne 0$atre "a/e$rs "a/e$rs ) bits po$r mettre /e r-s$/tat dans de$4 "ariab/es ) bits(Rsomme_pdsfortR et Rsomme_pdsfaib/eR+. =n "o$s donne /a str$#t$re de donn-es asso#i-e : CBLOCK 0x00C ; d;but de +a ,one variab+es so''e&pdsfort (1 ; )one de 1 b*te so''e&pdsfaib+e ( 1 ; ,one de 1 b*tes va+1 (1 ; ,one de 1 b*te 1ere va+eur va+7 (1 ; ,one de 1 b*te 7e'e va+eur va+8 (1 ; ,one de 1 b*te 8e'e va+eur va+4 (1 ; ,one de 1 b*te 4e'e va+eur -.#C ; Fin de +a ,one 1) (e ca' particulier de' di.i'ion' ,a di"ision est $ne op-ration #o$te$se 0$i n1e4iste pas dans /a s-rie des %ICs &'(888. 3ans #ertains #as parti#$/iers6 e//e pe$t se faire par des d-#a/ages (di"ision par Fn+. Voi#i /es op-rations de d-#a/age.
=p-rations orient-es o#tets entre registre et m-moire ((i/e en ang/ais+ >n-moni0$e =p-rande <,( f6d <<( f6d <otation ga$#he a"e# /a reten$e <otation droite a"e# /a reten$e & & :: &&:& dfff ffff :: &&:: dfff ffff 3es#ription CI#/es &* bits =p#ode stat$s notes affe#ted C C &6F &6F

/ercice 1 @ti/iser /es op-rations de d-#a/age po$r aOo$ter $n #a/#$/ de /a moIenne po$r /1e4er#i#e F. =n pr-sente maintenant /es str$#t$res de #ontrL/e dans /e #as d$ %IC (&'()*+. GA& ?tr$#t$re siAa/orsAsinon Cette str$#t$re est r-a/is-e par de$4 instr$#tions -/-mentaires de base btfs# et btfss : GAF ?tr$#t$re for (bo$#/e a"e# #ompte$r+ =n $ti/ise /1$ne des de$4 instr$#tions s$i"antes :
=p-rations orient-es o#tets entre registre et m-moire ((i/e en ang/ais+ >n-moni0$e =p-rande 3;C(?K f6d 3;C(?K f6d6a I5C(?K f6d I5C(?K f6d6a In#r-mente f (sa$te si :+ &6(F+ 3-#r-mente f (sa$te si :+ &6(F+ :: &:&& dfff ffff ::&: &&da ffff ffff :: &&&& dfff ffff ::&& &&da ffff ffff K &6F63 3es#ription CI#/es &*/&' bits =p#ode stat$s notes affe#ted K &6F63

d "a$t to$Oo$rs6 a$ #hoi4 : A : /a destination est W et /e #onten$ de /9emp/a#ement m-moire n9est pas modifi-. A & /a destination est f (/a /ettre f+ : dans #e #as /e r-s$/tat est sto#k- dans /9emp/a#ement m-moire. a est /e < > a##ess bit : A : /1emp/a#ement m-moire est en a##ess < >
) / 3*

23 IIF E;IIA& I@2 2roIes (?erge >o$to$+

A & /1emp/a#ement m-moire est en banked (d-termin- par /e registre D?<+ Voi#i $n e4emp/e 0$i $ti/ise $n #ompte$r de bo$#/e : ; bouc+er trois fois 'ov+% 8 ; cFar@er 8 dans % 'ov%f co'pteur ; initia+iser co'pteur 'ov+% 0x: ; cFar@er : dans % bouc+e ; ;tiGuette add%f 'avariab+e , 1 ; aBouter : E 'a variab+e decfs, co'pteur , 1 ; d;cr;'enter co'pteur et tester sa va+eur @oto bouc+e ; si co'pteur pas 0, on bouc+e 'ovf 'avariab+e , 0 ; on cFar@e +a va+eur obtenue dans %
Exercice 4 (exercice 2 du DS 2010)

&Q+ ?tr$#t$re for ... (rappe/ de #o$rs+ ?i /1on sait #ombien de fois on e4-#$te $ne bo$#/e on pe$t $ti/iser /a te#hni0$e s$i"ante :

Technique utilise par la suite


;for 4co'pteur20;co'pteur1:;co'pteurHH$ 'ov+% 0x: ; cFar@er : dans % 'ov%f co'pteur ; initia+iser co'pteur bouc+e ; ;tiGuette ;IIIIIII action : fois ici IIIIIIIIIII decfs, co'pteur , f ; d;cr;'enter co'pteur et tester va+eur @oto bouc+e ; si co'pteur pas 0, on bouc+e ;IIIIII sortie de +a bouc+e ici IIIIIIIIIII
Question Raliser un programme qui vient chercher six fois des valeurs (8 its) sur le !"R#$ et les additionne dans une varia le %Somme% (8 its)& "n vous demande de grer la somme sur 8 its seulement sans grer la retenue& Indication '

'ovf <O="B,0 Rponse '

; <O="B

3 0

! / 3*

23 IIF E;IIA& I@2 2roIes (?erge >o$to$+

II2 TD n4 8 (e' 'ou'-programme'


1) (e' in'truction' de 'ou'-programme' ,es instr$#tions C ,, et <;2,W et <;2@<5 sont po$r /1appe/ de so$sAprogramme.
=p-rations /itt-ra/es (adressage dire#t+ et de #ontrL/es >n-moni0$e =p-rande C ,, k E=2= k <;2,W k <;2@<5 appe/ d$ so$s programme k a//er C /1adresse reto$r a"e# /e /itt-ra/ dans W reto$r de so$sAprogramme F F F F &: :kkk kkkk kkkk &: &kkk kkkk kkkk && :&44 kkkk kkkk :: :::: :::: &::: 3es#ription CI#/es &* bits =p#ode stat$s notes affe#ted

,e rL/e de /a pi/e po$r /es appe/s imbri0$-s "e# /e %IC &'( on ne pe$t pas ab$ser des so$sAprogrammes #ar i/ n1I a 0$e ) ni"ea$4 d1imbri#ations. C1est re/ati"ement pe$ po$r /1$ti/isation de #ompi/ate$rs #ar /es /ibrairies e//esAmJmes pe$"ent d-OC en #omporter 0$e/0$es $ns. /ercice 1 <eprendre /1e4er#i#e 3 d$ 23 pr-#-dent en $ti/isant $n so$sAprogramme po$r #a/#$/er /a moIenne. 2) (e' choi/ multiple' ,a programmation de s$i"ant /e #as faire... pe$t se faire de diff-rentes mani7res. 5o$s #ommenons par en pr-senter $ne :
CBLOCK 0x00 ; d;but de +a ,one variab+es en 9CC->> =9? %&te'p (1 ; )one de 1 b*te status&te'p ( 1 ; ,one de 1 b*te CFoix ( 1 ; Be d;c+are 'a variab+e -.#C ; Fin de +a ,one /// ;si CFoix20 faire +e sous pro@ra''e sp@'0 si CFoix21 faire sp@'1 ; CFoix contient ici une va+eur 12. 'ov+% 0x0 sub%f CFoix,% ;CFoix 0 3 0 btfsc >"9"D>,) ;)21 si 2 0 et on saute @oto sp@'0 'ov+% 0x1 sub%f CFoix,% ;CFoix 0 3 0 btfsc >"9"D>,) ;)21 si 2 0 et on saute @oto sp@'1 /// 'ov+% 0x. sub%f CFoix,% ;CFoix 0 3 0 btfsc >"9"D>,) ;)21 si 2 0 et on saute @oto sp@'. ; erreur ici JJJ suite //// sp@'0 ;code ici @oto suite //// &: / 3*

23 IIF E;IIA& I@2 2roIes (?erge >o$to$+

<emar0$e : /es so$sAprogrammes ne sont pas i#i de "rais so$sAprogrammes (appe/-s a"e# goto et non #a// finissant par goto a$ /ie$ de ret$rn+. 31a$tre part6 #ette te#hni0$e ne traite pas /e d-passement de /1inde4 signa/- par Rerre$r i#iR. "o$s d1Jtre #r-atifs... 1) (e' ta&leau/ en mmoire programme (/ook$p tab/e en ang/ais+ Comme a$#$ne instr$#tion ne permet de /ire $n o#tet en m-moire programme6 /9ast$#e est d9$ti/iser /9instr$#tion ret/w 0$i permet de reto$rner $ne "a/e$r pass-e en arg$ment. V#ri"ons don# notre tab/ea$ so$s forme de ret/w ("oir 23 *+ : #e/a donne :
ret+% ret+% /// ret+% 0 1 77: ; ; ; pre'ier ;+;'ent 2 0 deuxiA'e ;+;'ent 2 1 niA'e ;+;'ent 2 77:

5o$s po$"ons ens$ite $ti/iser !*( (poids faib/e d$ #ompte$r programme+ po$r a##-der C #e tab/ea$. ?i /1inde4 d1a##7s a$ tab/ea$ est dans $ne "ariab/e Rinde4R : 'ovf index, % ca++ tab+eau ///
tab+eau add%f <CL , f ret+% 0 ret+% 1 /// ret+% 77:

; index

3 0

; aBouter % E <CL ; pre'ier ;+;'ent 2 0 ; deuxiA'e ;+;'ent 2 1 ; niA'e ;+;'ent 2 77:

3on#6 si on #harge & dans W et 0$9on effe#t$e $n appe/ Y #a// tab/ea$ Z. ,e programme se bran#he s$r /a bonne /igne6 /e !*( est in#r-ment- de & et /e programme e4-#$te don# a/ors /a /igne Y ret/w & Z. ?i /1origine d$ tab/ea$ est a$Ade/C des ) bits6 par e4emp/e :
O=K 0x800 tab+eau add%f <CL , f ; aBouter % E <CL ret+% 0 ; pre'ier ;+;'ent 2 0

ne pas o$b/ier de positionner !*(AT, #orre#tement. %o$r /1e4emp/e #iAdess$s6 #e/a donne :
'ov+% 08 'ov%f <CL9"L

4) /ercice' /ercice 1 >odifier /e premier e4emp/e d$ Y s$i"ant /e #as faire ... Z po$r 0$e #e 0$e /1on doi"e faire se tro$"e dans des so$sAprogrammes. ,e fait 0$e /es #hoi4 se font s$r $ne instr$#tion #omp/i0$e $n pe$ /a sit$ation. >odifier /e programme en $ti/isant $ne te#hni0$e simi/aire a$4 tab/ea$4 en m-moire programme. /ercice 2 V#rire $n programme 0$i /it sans arrJt /e !#"T0 po$r /e mettre dans Choi4 et 0$i s$i"ant /a "a/e$r d-#ima/e (&6 F6 *6 )6 &'6 3F6 '*6 &F)+ appe//e $n des so$s programme do6 re6 mi6 fa6 so/6 /a6 si et doF. =n ne "o$s demande pas de d-tai//er /es so$sAprogrammes . /ercice 1 V#rire $n programme 0$i6 s$i"ant /a "a/e$r pr-sente en !#"T0 soit fait /a somme des #ases d1$n tab/ea$ de * #ases6 soit #a/#$/e /a moIenne de #es #ases6 soit #her#he /e ma4im$m d$ tab/ea$.
&& / 3*

23 IIF E;IIA& I@2 2roIes (?erge >o$to$+

II2 TD n9
1) Arithmtique binaire et expressions en C PIC (16F84) %o$r bien #omprendre /a signifi#ation des e4pressions6 i/ est essentie/ d1a"oir F notions en tJte : /a priorit- et /1asso#iati"it-. 5o$s donnons #iAapr7s $n tab/ea$ des op-rate$rs par priorit- d-#roissante : *atgorie d-oprateur' #prateur' A''ociati.it Ea$#he AN 3roite

fon#tion6 tab/ea$6 membre de ( + [ \ . AN str$#t$re6 pointe$r s$r $n membre de str$#t$re op-rate$rs $naires m$/tip/i#ation6 di"ision6 mod$/o addition6 so$stra#tion d-#a/age op-rate$rs re/ationne/s op-rate$rs de #omparaison et binaire o$ e4#/$sif binaire o$ binaire et /ogi0$e o$ /ogi0$e op-rate$r #onditionne/ op-rate$rs d1affe#tation op-rate$r "irg$/e A XX AA ] ^ _ ` siBeof (tIpe+ _ / % X A aa NN a aM N NM MM ]M ` b c `` cc T : M XM AM _M /M %M `M bM cM aaM NNM 6

3roite ANEa$#he Ea$#he AN 3roite Ea$#he AN 3roite Ea$#he AN 3roite Ea$#he AN 3roite Ea$#he AN 3roite Ea$#he AN 3roite Ea$#he AN 3roite Ea$#he AN 3roite Ea$#he AN 3roite Ea$#he AN 3roite 3roite AN Ea$#he 3roite AN Ea$#he Ea$#he AN 3roite

/ercice 1 ;n/e"er /es parenth7ses des e4pressions s$i"antes /ors0$1e//es pe$"ent Jtre retir-es. aM(FG_&F+XbP if ((aN*+ ``(bMM&)++ d e ((aNM'+``(ba&)++cc(#]M&)+ #M(aM(bX&:++P V"a/$er #es e4pressions po$r aM'6 bM&) et #MF* ,es tIpes d$ C %IC sont : unsi@ned cFar a;MM8 bits, 0 to 7:: si@ned cFar b; MM8 bits, 178 to 17N unsi@ned int c; MM16 bits, 0 to 6::8: si@ned int d; MM16 bits, 87N68 to 87N6N +on@ e; MM87 bits, 714N488648 to 714N48864N f+oat f; MM87 bits /ercice 2 b7 b6 b5 b4
&F / 3*

b3

b2

b1

b0

23 IIF E;IIA& I@2 2roIes (?erge >o$to$+

?i $ne "ariab/e p& de tIpe signed #har () bits sign-s+ est d-#/ar-e -#rire /es e4pressions en C permettant de : A mettre C & /e bit bF A mettre C & /e bit b3 et b' A mettre C : /e bit b: A mettre C : /e bit b* et bG A in"erser /e bit b3 (se fait fa#i/ement a"e# $n o$ e4#/$sif+ A mettre C & /e bit bF et C : /e bit b: A mettre C & /es bits b: et b. et C : /es bits b3 et b* /ercice 1 =n donne /e so$sAprogramme s$i"ant (tir- d1$n an#ien proOet interAsemestre+ : void conversion4cFar nb,cFar resu+tO8P$Q cFar i; for4i2N;i320;i $ if 44nb R 4111i$$ 22 4111i$$ resu+tOiP21; e+se resu+tOiP20; S &+ %e$tAon retirer des parenth7ses dans /1e4pression boo/-enne d$ if T F+ %e$tAon -#rire 4nb R 4111i$$ a$ /ie$ de 44nb R 4111i$$ 22 4111i$$T 3+ Constr$ire /1e4pression boo/-enne 0$i permettrait /1-#rit$re for4i2N;i320;i $ if 4-/B/TTTTT$ resu+tOiP20; e+se resu+tOiP21; en donnant to$Oo$rs /e mJme /e mJme r-s$/tat de #on"ersion. *+ >odifier /e programme po$r 0$1i/ fasse $ne #on"ersion d1entier (&' bits+ "ers /e binaire. G+ ;stA#e 0$e /1a/gorithme s$i"ant donne /e mJme r-s$/tat de #on"ersion : for4i20;i18;iHH$ Q resu+tOiP2nbU47$; nb 2 nb M 7; S /ercice 4 ?oit $ne "ariab/e : cFar nb; V#rire /es e4pressions permettant de #a/#$/er /es #entaines6 /es diBaines et /es $nit- de #ette "ariab/e.

I/ e4iste p/$sie$rs a$tres m-thodes po$r positionner /es bits


(http://www.mi#ro#hip#.#om/Hi2e#hC( S/inde4.php+ &Q m-thode po$r positionner bit C bit : Vdefine bit&set4var,bitno$ 44var$ W2 1 11 4bitno$$ Vdefine bit&c+r4var,bitno$ 44var$ R2 X41 11 4bitno$$$ unsi@ned cFar x20b0001; bit&set4x,8$; MMno% x20b1001; bit&c+r4x,0$; MMno% x20b1000;IM FQ m-thode po$r positionner p/$sie$rs bits Vdefine bits&on4var,'asY$ var W2 'asY Vdefine bits&off4var,'asY$ var R2 X0 Z 'asY unsi@ned cFar x20b1010; bits&on4x,0b0001$; MMno% x20b1011 bits&off4x,0b0011$; MMno% x20b1000 IM

&3 / 3*

23 IIF E;IIA& I@2 2roIes (?erge >o$to$+

II2 TD n6
1) xpression boolenne vraie (PIC 18F
et autres)

Dans la suite du cours on appellera vraie expression boolenne une expression qui si elle tait affecte une variable donnerait soit la valeur 0 ou soit la valeur 1. Le C est un langage qui permet de fabriquer de fausses expressions boolennes. C est tr!s pratique" mais la confusion des deux peut conduire des erreurs. Donnons un exemple # Fausse expression boolenne cFar n210; %Fi+e4n$ Q /////; n ; S Vraie expression boolenne cFar n210; %Fi+e4nJ20$ Q /////; n ; S

Ces deux constructions marc$ent en C. %i on se rappelle que dans une parent$!se d un &$ile on a une 'xpression (ollenne )'.(.*" d un c+t n et de l autre n,-0 sont des '.(. La diffrence entre les deux est que pour n elle peut prendre toutes les valeurs entre .1/0 et 11/2 )car n est de t3pe c$ar* alors que n,-0 ne prendra que deux valeurs 0 ou 1. La deuxi!me sera donc appele '.(. vraie et la premi!re '.(. Le probl!me du langage C est que l oubli d un 4 ou d un 5 conduit en gnral une fausse expression boolenne ce qui est tout fait autoris. 6ar exemple crire a 4 b au lieu de a 44 b. !xer"i"e 1 Diffrence entre 44 et 4 7valuer les expressions # a4b a44b pour a- 0x80 et b-0x08 'n dduire les valeurs boolennes correspondantes )si ces expressions taient utilises dans un if par exemple*. Construire des vraies expressions boolennes sur les tests suivants expression vraie si le bit b9 est 1 le bit b: est 0 le bit b9 est l inverse du bit b: le bit b/ est 1 et le bit b; est 0 le bit b/ est 1 ou le bit b2 est 0 Les tests d un bit particulier en C peuvent aussi <tre raliss de la mani!re suivante )$ttp#==&&&.microc$ipc.com=>i?ec$C8@A=index.p$p* x20b1000; MMdeci'a+ 8 or Fexadeci'a+ 0x8 if 4testbit&on4x,8$$ a4$; e+se b4$; MMfunction a4$ @ets executed if 4testbit&on4x,0$$ a4$; e+se b4$; MMfunction b4$ @ets executed if 4Jtestbit&on4x,0$$ b4$; MMfunction b4$ @ets executed Vdefine testbit&on4data,bitno$ 44data33bitno$R0x01$ !xer"i"e # Auelle opration arit$mtique est ralise par un dcalage B 7valuer pour cela les expressions suivantes )avec a-1/ et b-/:* # . a - a CC 1 )ou a CC- 1* . a - a CC / )ou a CC- /* . b - b DD 1 )ou b DD-1* . b - b DD / )ou b DD-/*
&* / 3*

23 IIF E;IIA& I@2 2roIes (?erge >o$to$+

Gnralisation. Construire une vraie expression boolenne avec oprateur de dcalage" 4 et E qui reprend le test de l exercice prcdent # le bit b9 est l inverse du bit b: !xer"i"e $ %oit le programme suivant # Vinc+ude 1stdio/F3 'ain4$ Q int n210,p2:,G210,r; r2 n 22 4p 2 G$; printf4[9 ( n 2 Ud p 2 Ud G2 Ud r 2 Ud\n[,n,p,G,r$; n 2 p 2 G 2 :; n H2 p H2 G; printf4[B ( n 2 Ud p 2 Ud G2 Ud\n[,n,p,G$; G 2 nHH1p WW pHH J2 8; printf4[C ( n 2 Ud p 2 Ud G2 Ud\n[,n,p,G$; G 2 HHn 22 8 RR HHp 22 8; printf4[# ( n 2 Ud p 2 Ud G2 Ud\n[,n,p,G$; return 0; S S$e donneraAtAi/ #omme affi#hage s$r /1-#ran T

&G / 3*

23 IIF E;IIA& I@2 2roIes (?erge >o$to$+

%&' ( )es ports A et * (PIC: 16F et 18F)


1) 7nralit'
@ddr Fame (it 2 (it 9 (it G (it ; (it : (it / (it 1 (it 0 Halue on 6o&er.on Ieset 111. .1.1 1111 1111 . .111 1111 xxxx xxxx .
I(2=6GD I(9=6GC I(G=6GL

881$ IF?CJF/ 8M:$ 8M/$ ?II%( ?II%@

=I(6K

IF?'DG0 IF?'DG1

?LI0I6

I(I6

80@$ L@?( 80M$ 801$ 800$ L@?@ 6JI?( 6JI?@

.xxx xxxx I(;


I@;= ?JCOI

I(:= C@FIN

I(/=C@F I(1=IF?1 I(0=IF?0 ?N=IF?/

xxxx xxxx .x0x 0000

I@9=CLO J=J%C/

I@G= @F;

I@:=@F: I@/=@F =Href1 /=Href.

I@1= @F1

I@0=@F0= CHref

,a manip$/ation des bits de registre d-pend des #ompi/ate$rs $ti/is-s. ;n mikroC6 i/ est possib/e d1a##-der C $n bit parti#$/ier po$r to$te "ariab/e s$r ) bits a"e# (:..(.. %o$r /es registres6 on pe$t $ti/iser /a mJme m-thode o$ $ti/iser /es noms des bits. 5o$s pr-sentons $n e4emp/e po$r #omprendre : >ikroC cFar de'o; de'o/F: 2 1;
MM if MM if If =B0 is set, set =C0( 4<O="B/F0$ <O="C/F0 2 1; ou encore 4=B0&bit$ =C0&bit 2 1;

C&) cFar de'o; de'o2 de'o W0x70;


MM If =B0 is set, set =C0( if 4<O="Bbits/=B0$ <O="Cbits/=C0 2 1;

MM uti+isation du no' dCun bit I."CO./"?=0IF 2 0; MM C+ear "?=0IF MM ou encore "?=0IF&bit 2 0; MM C+ear "?=0IF

MM uti+isation du no' dCun bit I."CO.bits/"?=0IF20;MM C+ear "?=0IF

,es mas0$es pe$"ent Jtre $ti/is-s po$r -#rire d$ #ode portab/e : si /e #ompi/ate$r est bien fait i/ optimisera a"e# /es instr$#tions assemb/e$rs #orrespondantes. =n pe$t $ti/iser ses propres d-finitions po$r manip$/er des bits. ;n >ikroC6 par e4emp/e6 on pe$t -#rire
struct Q unsi@ned ( 7, MM >Yip bits 0 and 1, no identifier Fere '*bits ( 8; MM =e+evant bits 7, 8, and 4 MM Bits :, 6, and N are i'p+icit+* +eft out S '*re@;

o$ en#ore

&' / 3*

23 IIF E;IIA& I@2 2roIes (?erge >o$to$+

t*pedef struct Q presca+er ( 7; ti'eronoff ( 1; postsca+er ( 4;S '*bitfie+d; /// MM #ec+are a bit fie+d "i'erContro+( '*bitfie+d "i'erContro+; void 'ain4$ Q "i'erContro+/presca+er 2 0; "i'erContro+/ti'eronoff 2 1; "i'erContro+/postsca+er 2 8; "7CO. 2 "i'erContro+; S

,es %=<2? fon#tionnent to$Oo$rs s$r /e prin#ipe /e#t$reANmodifi#ationAN-#rit$re. %ar e4emp/e6 si "o$s -#ri"eB bsf %=<2 6&6 /e %ICf pro#7de de /a mani7re s$i"ante : &+ ,e !#"TA est /$ en int-gra/it- (pins en entr-e et en sortie+ F+ ,e bit & est mis C & 3+ 2o$t /e !#"TA est r--#rit (#on#erne /es pins en sortie+. insi6 s$pposons par e4emp/e 0$e /e < * soit en sortie et mis C &. Comme i/ est C drain o$"ert6 si $ne -/e#troni0$e e4terne /e for#e C :6 si "o$s effe#t$eB /9op-ration s$i"ante : bsf <O="9 , 1 ; 'ettre =91 E 1

,ors0$e /e !#"TA "a Jtre /$6 < * sera /$ #omme :6 bien 0$9i/ soit C &. < & sera for#- C &6 et /e to$t sera rep/a#- dans !#"TA. < * est don# maintenant C :6 sans 0$e "o$s /9aIeB e4p/i#itement modifi-. 2) (e regi'tre T"I$A Ce registre est sit$- C /1adresse :4(!F. Ce registre est d9$n fon#tionnement tr7s simp/e et est /i- a$ fon#tionnement d$ !#"TA. Cha0$e bit positionn- C & #onfig$re /a pin #orrespondante en entr-e Cha0$e bit C : #onfig$re /a pin en sortie $ reset d$ %ICf6 to$tes /es pins sont mises en entr-e6 afin de ne pas en"oIer des signa$4 non d-sir-s s$r /es pins. ,es bits de T"I$A seront don# mis C & /ors de #ha0$e reset. 5oteB -ga/ement 0$e6 #omme i/ n9I a 0$e . pins $ti/is-es s$r /e !#"TA6 se$/s . bits (b:/b'+ seront $ti/is-s s$r T"I$A. ,es bits de T"I$A sont d-sign-s par 2<I? bits.2<I? : ... 2<I? bits.2<I? . 1) (e' regi'tre' !#"T0 et T"I$0 Ces registres fon#tionnent e4a#tement de /a mJme mani7re 0$e !#"TA et T"I$A6 mais #on#ernent bien entend$ /es ) pins <D. 2o$s /es bits sont don# $ti/is-s dans #e #as. VoIons maintenant /es parti#$/arit-s d$ !#"T0. ,es entr-es d$ !#"T0 pe$"ent Jtre #onne#t-es C $ne r-sistan#e de rappe/ a$ XGV de mani7re interne6 #ette s-/e#tion s9effe#t$ant par /e bit . d$ registre #!TI#4 (effa#ement d$ bit. <D%@ po$r "a/ider /es r-sistan#es de rappe/ a$ XGV+. ,es bits de T"I$0 sont d-sign-s par 2<I?Dbits.2<I?D: ... 2<I?Dbits.2<I?D. 4) Inter;a<age d-un cla.ier

&. / 3*

23 IIF E;IIA& I@2 2roIes (?erge >o$to$+

?$r $n %C6 /e #/a"ier est #omp/7tement d-#od-. C1est C dire 0$e /ors0$1$ne to$#he est app$I-e6 sa position s$r /e #/a"ier est en"oI-e s$r /a /iaison %?F. ,e fait d1en"oIer /a position et non /e #ode ?CII permet de g-rer /es #/a"iers en di"ers /ang$es. %o$r de petites app/i#ations6 on $ti/ise $n #/a"ier C &F to$#hes. I/ est #ompos- de simp/es #onta#ts et /e d-#odage est r-a/is- par /e sIst7me informati0$e. "e# se$/ement ) to$#hes6 $n %=<2 de ) bits en entr-e s$ffit. ?i /e #/a"ier poss7de p/$s de ) to$#hes6 i/ fa$t: A soit $ti/iser d1a"antage d1entr-es6 A soit m$/tip/e4er /es entr-es en de$4 -tapes. ;n $ti/isant * fi/s po$r /es /ignes et * fi/s po$r /es #o/onnes6 on pe$t diff-ren#ier par #roisement &' to$#hes. =n $ti/ise don# ) fi/s re/i-s C ) bits d1$n %=<2 po$r &' to$#hes. %o$r nos &F to$#hes on pe$t #gb/er #omme indi0$- #iA dess$s. I/ s1agit ens$ite de pro#-der en de$4 phases6 $ne po$r /a d-te#tion de /a #o/onne

0cc

!"R#$
b7 b6 b5 b4 b3 b2 b1 b0
1 . + 2 ) 8 0 ( * , /

clavier

et $ne a$tre po$r /a d-te#tion de /igne.

3ue'tion 1 8 dtermination du numro de colonne %rogrammer /es dire#tions a"e# T"I$0 (%D'A%D3 en sortie et %DFA%D: en entr-e+. 2ester si $ne to$#he est app$I-e. ?i o$i sa$"egarder dans $ne "ariab/e /a "a/e$r /$e s$r !#"T0 p$is transformer #ette "a/e$r en n$m-ro de #o/onne (: C ga$#he et F C droite+ S$e/ est /e #ode #orrespondant : so$sAprogramme cFar +ecture&co+onne4$ 3ue'tion 2 8 dtermination du numro de ligne %rogrammer /es dire#tions a"e# T"I$0 (%D'A%D3 en entr-e et %DFA%D: en sortie+. 2ester si $ne to$#he est app$I-e. ?i o$i sa$"egarder dans $ne "ariab/e /a "a/e$r /$e s$r !#"T0 p$is transformer #ette "a/e$r en n$m-ro de /igne (: en ha$t et 3 en bas+ S$e/ est /e #ode #orrespondant : so$sAprogramme cFar +ecture&+i@ne4$ 3ue'tion 1 8 dtermination du caract)re partir des de$4 informations pr-#-dentes transformer /e n$m-ro de #o/onne et /e n$m-ro de /igne en #ara#t7re #orrespondant s$r /e #/a"ier : 1&1 o$ 1F1 o$ ... o$ 1:1 o$ 1h1 <emar0$e : /es bits <D*A<D. pe$"ent ser"ir C d-#/en#her $ne interr$ption (<D port #hange Interr$pt+. ?i /1on "e$t $ti/iser #ette interr$ption i/ fa$drait #gb/er notre #/a"ier a$trement. ,es interr$ptions seront abord-es p/$s /oin.

&) / 3*

23 IIF E;IIA& I@2 2roIes (?erge >o$to$+

TD 8 8 (e Timer= de' !I*: 16F>>>


I) (e Timer = ,a do#$mentation d$ 2imer: d$ %ICf &'().. est pr-sent-e maintenant so$s forme s#h-mati0$e. 5oteB 0$e /e registre 2><: est $n registre h$it bits6 dans /e0$e/ on pe$t -#rire o$ /ire (en $ne se$/e instr$#tion+.

4 MUX 0 b7 Timer0 .................................. b0 Timer0 1 OPTION MCU Clock =1


T0SE : Source Edge select

b7 RBPU b6
INTEDG

Overflow (8 bits)

b5 T0CS

b7 b6 b5 b4 b3 b2 b1 b0
INTCON TMR0IF

b4 T0SE b3 PSA

PORTA 2, 4, ...,256 =2(n+1)

b2 T0PS2 b1 T0PS1 b0 T0PS0

b7 b6 b5 b3 b2 b1 b0 b4 RA4/T0CKI

MUX 0 1

Timer0 dans 16FXXX


+emarque # le registre ,P%I,- se note J6?IJFPI'G en LiQroC. II) )es .i//rents mo.es .e /on"tionnement

Le timer0 est en fait un compteur. Lais quRalleS.vous compter avec ce timer B 't bien" vous aveS deux possibilits # . 'n premier lieu" vous pouveS compter les impulsions reTues sur la pin I@;=?0COI. Fous dirons dans ce cas que nous sommes en mode compteur . Hous pouveS aussi dcider de compter les c3cles dR$orloge du 6ICU lui.m<me. Dans ce cas" comme lR$orloge est fixe" nous compterons donc en ralit du temps. Donc" nous serons en mode V timer W. La slection dRun ou lRautre de ces deux modes de fonctionnement sReffectue par le bit G du registre ,P%I,- # ?0C% pour ?mr0 ClocQ %ource select bit. ?0C% - 1 # 8onctionnement en mode compteur ?0C% - 0 # 8onctionnement en mode timer Dans le cas oX vous dcideS de travailler en mode compteur" vous deveS aussi prciser lors de quelle transition de niveau le comptage est effectu. Ceci est prcis grYce au bit ; du registre %0C,- # ?0%' pour ?imer0 %ource 'dge select bit. ?0%' - 0 # comptage si lRentre I@;=?JOI passe de 0 1 )front montant* ?0%' - 1 # comptage si lRentre I@;=?JOI passe de 1 0 )front descendant*
&! / 3*

23 IIF E;IIA& I@2 2roIes (?erge >o$to$+

III) Me'ure du temp' d-e/cution d-un algorithme ,1optimisation d1$n a/gorithme en "itesse (o$ en tai//e+ est tr7s importante dans /es sIst7mes embar0$-s r-a/is-s par des mi#roA#ontrL/e$rs. @ne re#her#he d1a/gorithmes s$r Internet "o$s donnera des r-s$/tats 0$1i/ "o$s fa$dra -"a/$er. %ar e4emp/es6 /e site : http://www.piclist.com/techref/language/ccpp/convertbase.htm vous propose un algorithme de division par 10 que voici :
unsigned int A; unsigned int Q; /* the quotient */ Q = ((A >> 1) + A) >> 1; /* Q = ((Q >> 4) + Q) ; /* Q = ((Q >> 8) + Q) >> 3; /* /* either Q = A/10 or Q+1 = Q = A*0.11 */ Q = A*0.110011 */ Q = A*0.00011001100110011 */ A/10 for a A ! "34#8$0 */

Exercice 1 1) Sans chercher comprendre l'algorithme de division, on vous demande de le transformer en une fonction unsigned int div10(unsigned int A); FQ+ V#rire $n programme #omp/et 0$i mes$re /e temps d1e4-#$tion d$ so$s programme de di"ision par &:6 p$is modifier /e programme po$r 0$1i/ p$isse #omparer a"e# $ne di"ision par &: norma/e. I1) )e mo.e .e s"rutation .u /la2 Fous devons savoir ce niveau" que tout dbordement du timer0 )passage de 0x88 0x00* entraZne le positionnement du flag ?0I8" bit b/ du registre I-%C,-. Hous pouveS donc utiliser ce flag pour dterminer si vous aveS eu dbordement du timer0" ou" en dRautres termes" si le temps programm est coul. Cette mt$ode lRinconvnient de vous faire perdre du temps inutilement dans une boucle d attente. 6etit exemple #
c+rf bcf +oop btfss @oto xxx I."CO. , "0IF +oop ; tester si co'pteur a d;bord; ; non, attendre d;borde'ent ; poursuivre ( 7:6M6::86 ;v;ne'ents ;cou+;s t'r0 I."CO. , "0IF ; d;but du co'pta@e dans 7 c*c+es ; 4voir re'arGue p+us bas$ ; efface'ent du f+a@

!xer"i"e # 3uestion 1 7crire en langage C un programme qui fait la m<me c$ose que le programme assembleur ci.dessus # initialise le timer0" efface le flag et attend" l aide d une boucle" le positionnement de ce dernier. Lais vous pourrieS vous dire que vous ne dsireS pas forcment attendre /G9 incrmentations de tmr0. %upposons que vous dsirieS attendre 100 incrmentations. Il suffit dans ce cas de placer dans tmr0 une valeur telle que 100 incrmentations plus tard" tmr0 dborde. exemple # [ timer0 en mode 0 bits
'ov+% 'ov%f bcf +oop btfss @oto xxx I."CO.,"0IF +oop ; tester si co'pteur a d;bord; ; non, attendre d;borde'ent ; oui, poursuivre ( 100 ;v;ne'ents ;cou+;s 7:6 100 t'r0 I."CO.,"0IF ; cFar@er 7:6 ] 100 ; initia+iser t'r0 ; efface'ent du f+a@

3uestion # 7crire en langage C un programme qui fait la m<me c$ose que le programme assembleur ci.dessus # initialise le timer0" efface le flag et attend l aide d une boucle le positionnement de ce dernier. Iemarque # ceci pourrait sembler correct" mais en fait toute modification de %4+0 entraZne un arr<t de comptage de la part de celui.ci correspondant / c3cles dRinstruction multiplis par la valeur du pr
F: / 3*

23 IIF E;IIA& I@2 2roIes (?erge >o$to$+

diviseur. @utrement dit" un arr<t correspondant tou\ours / units %4+0. Il faut donc tenir compte de cette perte" et placer V /G9.M0 W et non V /G9.100 W dans le timer. 3uestion $ Gnrer un signal de frquence 1 O>S )avec un quartS de ; L>S*. 6our cela # . calculer la valeur de la pr division . calculer la valeur de dcomptage . 7crire le programme. 3uestion 4 L<me c$ose mais il faut que la priode diminue progressivement 3uestion 5 Gnrer un signal de sortie de rapport c3clique 1=; sur le m<me principe. Il 3 a mieux faire avec les 6ICs" utiliser le module CC6.

F& / 3*

23 IIF E;IIA& I@2 2roIes (?erge >o$to$+

TD ? 8 Interruption timer=
I) (e timer =

,a do#$mentation d$ 2imer: d$ %ICf &'().. a -t- pr-sent-e dans /e 23). 5o$s passons don# C /a des#ription de son interr$ption asso#i-e.

Interruption timer0 du 16F877


INTCON & & & &

b7 GIE/GIEH b6 PIE/GIEL b5 TMR0IE b4 INT0IE b3 RBIE

b2 TMR0IF b0 RBIF

b1 INT0IF

Overflow Timer0 b7 .................................... b0

Ce sc$ma de principe fonctionne de la mani!re suivante. Il 3 aura interruption si on arrive raliser un front montant dans l ellipse" sac$ant que le matriel ne g!re que l overflo& )bit ?LI0I8 du registre I-%C,-*. Le programme qui g!re l interruption sera en adresse 0x00;" mais ce sera transparent en langage C. II) )es interruptions en C ,a gestion des interr$ptions en C est fortement d-pendante des #ompi/ate$rs6 #omme /e montre /e tab/ea$ #iAdesso$s :
>ikroC MM interruption Faute priorite seu+e'ent void interrupt4$ Q MM traite'ent interruption MM positionne'ent du FL9K S void 'ain4$ Q MM traite'ent %Fi+e41$; S Hite#h C Vinc+ude 1pic1684/F3 void interrupt it&@ene4void$; 'ain4$Q MM traite'ent %Fi+e41$; S void interrupt it&@ene4void$ Q MM traite'ent interruption MM positionne'ent du FL9K S

"e# /e #ompi/ate$r mikroC /e nom de /1interr$ption est fi4-. ,1-#rit$re d1$ne interr$ption se fait norma/ement en trois -tapes : A sp-#ifier 0$e /e so$sAprogramme n1est pas $n so$sAprogramme norma/6 mais $n so$sAprogramme d1interr$ption6 A fi4er /1adresse d$ so$sAprogramme d1interr$ption A initia/iser /e m-#anisme d1interr$ption dans /e programme prin#ipa/. %o$r #ertains #ompi/ate$rs (>ikroC+ /es de$4 premi7res -tapes se font simp/ement en donnant $n nom pr-d-termin- a$ so$sAprogramme d1interr$ption. /ercice 1
FF / 3*

23 IIF E;IIA& I@2 2roIes (?erge >o$to$+

@n %IC&'()* est enfo$i dans $n (%E . ?a se$/e parti#$/arit- est de fon#tionner C G:>HB #ontre &: (resp. F: >HB+ de fr-0$en#e ma4ima/e d1hor/oge po$r /es %IC &'()* (resp. &'()* +. I/ e4-#$te /e programme s$i"ant (-#rit a"e# /e #ompi/ate$r Hite#h C+ :
Vinc+ude 1pic1684/F3 void interrupt deca+a@e4void$; unsi@ned cFar nb; 'ain4void$ Q "=I>9 2 0xF6; MM 6 entrees, 7 sorties pour 9 "=I>B 2 0x00; MM 8 sorties pour B O<"IO. 2 0x0N; MM presca+er 7:6 , entree sur Guart, I."CO. 2 0x90; MM autorise +Cinterruption ti'er <O="B 2 0x01; MM une seu+e diode a++u'ee "?=0 2 0x00 ; nb20; %Fi+e41$ Q MM on ne fait rien Gue recopier sur 7 se@'ents +a va+eur de >01 if 44<O="9 R 0x01$ 22 1$ <O="9 2 0x06; S S void interrupt deca+a@e4void$ Q nbHH; MM"?=0 2 0x00; MMcCest fait car ici par overf+o% if 4J4nb U 16$$ <O="B 2 4<O="B 11 1$ ; if 4<O="B 22 0x00$ <O="B 2 0x01; "0IF 2 0; MM acGuitte'ent interruption S

<emar0$eB #omment est -#rit $ne interr$ption a"e# #e #ompi/ate$r. &Q+ <ep-rer et modifier /es /ignes de #e programmes po$r 0$1i/ fon#tionne a"e# /e #ompi/ate$r >ikroC. FQ+ Ca/#$/er si /e #heni//ard r-a/is- par #e programme est "isib/e C /1ii/ h$main (fr-0$en#e de #hangement de position des ,;3s inf-rie$re C F: HB+. 3Q+ Comment pe$tAon -#rire /1instr$#tion Rif 4J4nb U 16$$[ po$r p/$s d1effi#a#it-. *Q+ S$e//e est /a s$ite des -tats (,;3s a//$m-es+ r-a/is-e par #e programme. ,es de$4 0$estions s$i"antes sont iss$es d$ 3e"oir ?$r"ei//- de j$in F:&:. GQ+ ,e programme s$i"ant est donn- #omme e4emp/e d$ #ompi/ate$r >ikroC et to$rne dans $n %IC &'()* 0$i a $n 0$artB de * >HB.
unsi@ned cnt; void interrupt4$ Q if 4"?=0IF&bit$ Q cntHH; "?=0IF&bit 2 0; "?=0 2 66; S S

MM incre'ent counter MM c+ear "?=0IF

F3 / 3*

23 IIF E;IIA& I@2 2roIes (?erge >o$to$+

void 'ain4$ Q O<"IO.&=-K 2 0x84; 9.>-L 2 0; 9.>-LL 2 0; C1O.&bit 2 0; C7O.&bit 2 0; "=I>B 2 0; <O="B 2 0xFF; "?=0 2 66; I."CO. 2 0x90; cnt 2 0; do Q if 4cnt 32 400$ Q <O="B 2 X<O="B; cnt 2 0; S S %Fi+e41$; S

MM 9ssi@n presca+er to "?=0 MM Confi@ure 9. pins as di@ita+ MM #isab+e co'parators MM MM MM MM MM <O="B is output Initia+i,e <O="B "i'er0 initia+ va+ue -nab+e "?=O interrupt Initia+i,e cnt

MM "o@@+e <O="B L-#s MM =eset cnt

S$e//e est /a fr-0$en#e de #/ignotement des ,;3s re/i-es a$ %=<2D T 'Q+ >odifier /1interr$ption po$r 0$1e//e r-a/ise $n #heni//ard d1$ne ,;3 se d-p/aant "ers /es poids faib/es. /ercice 2 @ne partie mat-rie//e est #onstit$-e de de$4 affi#he$rs sept segments m$/tip/e4-s. ,es sept segments sont #ommand-s par /e !#"T*6 tandis 0$e /es #ommandes d1affi#hages sont r-a/is-e par /es bits b: et b& d$ !#"T0. @n s#h-ma de prin#ipe est donn- #iAapr7s. &Q+ /1aide de /a do#$mentation #a/#$/er /es "a/e$rs dans $n tab/ea$ Runsi@ned cFar >-K?-."OP 2 Q0x8F,///S;R po$r $n affi#hage des #hiffres de : C !. FQ+ r-a/iser $ne fon#tion responsab/e d$ trans#odage :
unsi@ned cFar #isp+a*4unsi@ned cFar no$ Q unsi@ned cFar <attern; unsi@ned cFar >-K?-."OP 2 Q0x8F,////

3Q+ <-a/iser /e programme main(+ responsab/e de /1initia/isation de /1interr$ption 0$i doit a"oir /ie$ to$tes /es &:ms (a"e# $n 0$artB de *>HB+ et 0$i #ompte de :: C !! to$tes /es se#ondes en"iron (a"e# $n R3e/aI_ms(&:::+PR+ *Q+ <-a/iser enfin /1interr$ption 0$i affi#hera tantLt /es diBaines6 tantLt /es $nit-s.

PIC 16F877A

RC0 RC1 RC2 RC3 RC4 RC5 RC6

290

DC56-11EWA Common Cathode a b c d e f g 1k a f e d g b c

RB0 RB1

1k

F* / 3*

23 IIF E;IIA& I@2 2roIes (?erge >o$to$+

%& 10 6 )e mo.e "omparaison .u mo.ule **! +*apture@*ompare@!AM)


L ob\ectif de ce ?D est de gnrer des signaux de frquences dtermines. Ce travail est ralis en gnral avec le module CC6 )Capture=Compare=6]L* et plus exactement son mode comparaison. Fous allons commencer par dcrire le fonctionnement du timer 1 du 198022. I) )e %imer 1 et ses re2istres

b15

Timer1 TMR1H TMR1L .................................. b0 Timer1 PIR1

4 MUX 0 1 T1CON

b7 b6
& overflow

MCU Clock 1, 2, 4,8 =2(n) PORTC

b7 b6 b5 b4 b3 b2 CCP1IF b1 b0 TMR1IF

b5 b3 b2

T1CKPS1

b4 T1CKPS0
T1OSCEN NOT_T1SYNC

b1 TMR1CS b0 TMR1ON
Dtection synchronise

b7 b6 b5 b4 b3
T1OSI
T1OSO/T1CLI

MUX 1 0

b2 b1 b0

Timer1 dans 16F877A


Les registres utiliss par le ?imer1 sont donc # . %4+17 et %4+1)" . %1C,. ventuellement le P,+%C" et PI+1.

La dtection s3nc$ronise doit <tre obligatoirement utilise dans les modes compare )de ce ?D* et le mode capture du ?D suivant. !xer"i"e 1 ?$e 6ICf $as an oscillator frequenc3 of ; L>S. ]$at is t$e slo&est ?imer 1 interrupt rate it can generate &it$ t$is internal clocQ B II) )e mo.e "omparaison Le mode comparaison va nous permettre de gnrer des signaux de frquence dtermine.

FG / 3*

23 IIF E;IIA& I@2 2roIes (?erge >o$to$+

COMPARAISON PIC 16F877


Special Event Trigger dclenchera: - un Reset du Timer1 (mais pas un positionnement du drapeau d'interruption de Timer1) - positionnement du bit GO/DONE qui dmarre une conversion A/D (ECCP1 seulement)

PORTC

b7 b6 b5 b4 b3 b2 b1 b0 b7 b6 b5 b4 b3 b2 b1 b0
0 RC2/CCP1

TMR1H Special Event Trigger Q S R Logique de sortie

TMR1L

Comparaison

TRISC

b7 b6 b5 b4

CCP1CON

CCPR1H CCPR1L PIR1

b7

b3 CCP1M3 b2 CCP1M2 b1 CCP1M1 b0 CCP1M0

b6 b5 b4 b3 b2 CCP1IF b1

0010 : Compare bascule sortie quand comparaison (CCPxIF) b0 TMR1IF 1000 : Compare force CCP un (CCPIF est gr) 1001 : Compare force CCP zro (CCPIF est gr) 1010 : Compare sort rien sur CCP mais sur CCPIF 1011 : Compare force Special Event Trigger reset sur timer1 (CCP1IF est gr)

/ercice 2 <-a/isation d1$n signa/ de &HB et son am-/ioration. &Q+ 5otre hor/oge 0$artB a $ne fr-0$en#e de F: >HB. @ti/iser /e r-s$/tat de /1e4er#i#e & po$r r-pondre : par #ombien doitAon di"iser /a fr-0$en#e de CC%&I( minima/e po$r obtenir $n temps de G::::: s (:6G s+T FQ+ =n #hoisit $ne di"ision par G. ,e prin#ipe sera don# d1attendre CC%&I( #in0 fois sans o$b/ier de /e remettre C : et d1in"erser par /ogi#ie/ /a sortie <CF. I/ no$s fa$t don# #hoisir $n mode de fon#tionnement /ogi#ie/ (&:&: 0$i n1agit pas s$r <CF+. V#rire /e programme #omp/et. <emar0$e : on po$rrait $ti/iser /e f/ag de d-bordement d$ 2imer& (2><&I( d$ registre !I"1+ po$r faire /a mJme #hose6 #e 0$i n1$ti/iserait pas /e mod$/e CC%.

F' / 3*

23 IIF E;IIA& I@2 2roIes (?erge >o$to$+

3Q+ "e# /a te#hni0$e de /a 0$estion pr-#-dente6 i/ no$s est abso/$ment impossib/e de r-g/er e4a#tement /a fr-0$en#e de sortie. =n "a essaIer de pa/ier C #et in#on"-nient en $ti/isant $n a$tre mode 0$i n1agit pas s$r <CF mais a /1a"antage de d-#/en#her $ne remise C : d$ timer& 0$and i/ I a #omparaison : #1est /e mode &:&&. Ca/#$/er /a "a/e$r C mettre dans **!"1. V#rire /e programme. *Q+ Comp/-ter /e programme pr-#-dent po$r 0$1i/ en"oie s$r $ne /iaison s-rie (a"e# $n printf+ /e temps en he$re min$te se#onde. =n "erra p/$s tard 0$1$ne m-thode p/$s pr-#ise #onsiste C $ti/iser $n 0$artB hor/oger.

F. / 3*

23 IIF E;IIA& I@2 2roIes (?erge >o$to$+

TD 11 8 (e mode capture du module **! +*apture@*ompare@!AM)


3ans /e mode #apt$re6 *!!"1, et *!!"1( #apt$rent /a "a/e$r d$ timer & o$ d$ timer 3 0$and $n -"-nement se prod$it s$r <CF/C%%& d$ port C. @n -"-nement est d-fini #omme : $n front des#endant $n front montant to$s /es * fronts montants to$s /es &' fronts montants

CAPTURE POUR 16F877


CCPR1H CCPR1L PIR1

b7 b6 b5 b4 b3 b2 b1 b0

PORTC TMR1H TMR1L

b7 b6 b5 b4 b3

CCP1CON
RC2/CCP1

b7 b6 b5 b4 b3 CCP1M3 b2 CCP1M2 b1 CCP1M1 b0 CCP1M0

b2 CCP1IF b1 b0

1,4,16

}
D5 D6

0000 : Module CCP1 dsactiv 0100 : Capture tous les fronts descendants 0101 : Capture tous les fronts montants 0110 : Capture tous les 4 fronts montants 0111 : Capture tous les 16 fronts montants

ttention /e !#"T* doit Jtre #onfig$r- en entr-e po$r /e bit bF (a"e# T"I$*+. /ercice : @ti/isation d$ mode #apt$re po$r /ire $n #/a"ier %?F <emar0$e pr-/iminaire : en to$te rig$e$r6 i/ serait pr-f-rab/e de r-a/iser #ette #apt$re a"e# $ne interr$ption. >ais /es interr$ptions ne sont abord-es 0$1a$ 23 &F. %r-sentation d$ proto#o/e %?F : ,e proto#o/e %?F #omp/et est $n m-/ange de proto#o/e sIn#hrone et asIn#hrone :
psF_#/
startbit stopbit

ps2_dat a bus y rdy

D0

D1

D2

D3

D4

D7

ok se$/es /es premiers signa$4 psF_#/k et psF_data "ont no$s int-resser. Comme #1est /e #/a"ier 0$i -met /es donn-es #1est C /$i de fabri0$er /1hor/oge. ,a fr-0$en#e d1hor/oge est #omprise entre &:kHB et
F) / 3*

23 IIF E;IIA& I@2 2roIes (?erge >o$to$+

&'kHB et on "a $ti/iser /a partie #apt$re non pas po$r mes$rer /a fr-0$en#e de /1hor/oge (dans $n premier temps en to$t #as+6 mais po$r d-te#ter /es fronts des#endants de /1hor/oge grg#e a$ bit CC%&I( d$ registre %I<&. &Q+ V#rire /e so$sAprogramme Rvoid initKB#4void$ R destin- C initia/iser /e fon#tionnement d$ mod$/e CC% po$r 0$1i/ inter#epte /es fronts des#endants de %?F_#/k6 si /es donn-es psF_data sont sont s$r /e bit b& d$ %=<2C. 5e pas o$b/ier de mettre /es de$4 bits d$ %=<2C en entr-e. FQ+ V#rire /e programme prin#ipa/ 0$i /it /es informations C #ha0$e fois 0$1$n front des#endant arri"e et #onstr$it /e bit d$ s#anA#ode apr7s /e#t$re po$r /e sortir s$r /e %=<2D (positionn- en sortie+. 3Q+ @ti/iser maintenant #omp/7tement /e mode #apt$re po$r #a/#$/er /a fr-0$en#e moIenne de /1hor/oge psF_#/k si notre fr-0$en#e de 0$artB est * >HB.. "emar2ue : /e #ompi/ate$r >ikroC poss7de $ne /ibrairie de /e#t$re d$ %?/F.
6rotot3pe Description void 6s/PInit)unsigned s$ort ^port*[ InitialiSes port for &orQ &it$ 6%=/ Qe3board" &it$ default pin settings. 6ort pin 0 is Data line" and port pin 1 is ClocQ line. _ou need to call eit$er 6s/PInit or 6s/PConfig before using ot$er routines of 6%=/ librar3. void 6s/PConfig)c$ar ^port" c$ar clocQ" c$ar data*[ InitialiSes port for &orQ &it$ 6%=/ Qe3board" &it$ custom pin settings. 6arameters data and clocQ specif3 pins of port for Data line and ClocQ line" respectivel3. Data and clocQ need to be in range 0..2 and cannot point to t$e same pin. _ou need to call eit$er 6s/PInit or 6s/PConfig before using ot$er routines of 6%=/ librar3. c$ar 6s/POe3PIead)c$ar ^value" c$ar ^special" c$ar ^pressed*[ ?$e function retrieves information about Qe3 pressed. 6arameter value $olds t$e value of t$e Qe3 pressed. 8or c$aracters" numerals" punctuation marQs" and space" value &ill store t$e appropriate @%CII value. Ioutine `recogniSesa t$e function of %$ift and Caps LocQ" and be$aves appropriatel3. 6arameter special is a flag for special function Qe3s )81" 'nter" 'sc" etc*. If Qe3 pressed is one of t$ese" special &ill be set to 1" ot$er&ise 0. 6arameter pressed is set to 1 if t$e Qe3 is pressed" and 0 if released.

6rotot3pe Description

6rotot3pe Description

Voi#i $n e4emp/e tro$"- dans sa do#$mentation :


unsigned short keydata, special, down; void main() { CMC ! " 0#0$; %% &isa'le analog comparators (comment this (or )*C1+) *!,C ! " 0; %% &isa'le all interrupts )s-.*nit(/) 0,A); %% *nit )1%- 2ey'oard on ) 0,A &elay.ms(100); %% 3ait (or key'oard to (inish do { i( ()s-.2ey.0ead(/keydata, /special, /down)) { i( (down // (keydata "" 14)) {%% 5ackspace %% 666do something with a 'ackspace666 7 else i( (down // (keydata "" 18)) {%% 9nter :sart.3rite(18); 7 else i( (down // ;special // keydata) { :sart.3rite(keydata); 7 7 &elay.ms(10); %% de'ounce 7 while (1); 7%%<;

F! / 3*

23 IIF E;IIA& I@2 2roIes (?erge >o$to$+

TD 12 8 (e mode !AM du module **! +*apture@*ompare@!AM)


%W> signifie Y %$/se Width >od$/ation Z6 #e 0$9on po$rrait trad$ire par mod$/ation de /arge$r d9imp$/sion. ?on obOe#tif est de #hanger $ne "a/e$r moIenne en Oo$ant s$r /e rapport #I#/i0$e. %$is0$e #e mod$/e $ti/ise essentie//ement /e timer F6 no$s #ommenons don# C /e d-#rire. I) &es"ription .u timer # Le timer / est identique sur le 6ICf &'().. et /e &)(*GG:. I/ s1agit d1$n timer ) bits dont /a des#ription s#h-mati0$e est pr-sent-e maintenant.

b7 .................................. b0 PR2

Timer2 dans 18F4550 et 16F877A


0000 = 1: 1 0001 = 1: 2 0010 = 1: 3 .... 1111 = 1:16

PIR1

Comparateur

T2CON

b7 b6 b5 b4 b3 b2 CCP1IF b1 TMR2IF

b7
Reset Timer2 b7 .................................. b0 &

TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON

b6 b5 b4 b3 b2

1, 2, .., 16

b1 T2CKPS1

b0 T2CKPS0

1, 4, 16
00 = 1: 1 01 = 1: 4 1x = 1: 16

b0 TMR1IF
4

MCU Clock

?a se$/e entr-e est /1entr-e hor/oge d$ %ICf di"is-e par * s$i"ie d1$n pr-Adi"ise$r g-r- par de$4 bits. @n #omparate$r donne $n signa/ 0$i sert de reset a$ timerF et d1entr-e C $n postAdi"ise$r #apab/e de di"iser par $n nombre entre & et &'. ,a p-riode 2 pe$t Jtre #a/#$/-e par : 2 M (!"2 X &+ 4 (2imerF inp$t #/o#k period+ soit : 2 M (!"2X&+ 4 (2os# 4 * 2imer F pres#a/e "a/$e+ /ercice 1 2he %ICf has an os#i//ator fre0$en#I of * >HB. What is the s/owest 2imer F interr$pt rate it #an generate T DI writing to the T2*#4 register6 2imer F is swit#hed on6 with neither preA nor posts#a/e. What is the "a/$e Io$ ha"e to write to !"2 to rea/iBe a *6:: kHB fre0$en#I T Auand on s intresse au 6]L le c$oix de la priode est ralis simplement comme dans l exercice 1. 6uisque le tipmer/ est sur 0 bits" la rsolution de la priode est de /G9. Le c$oix du rapport c3clique est par contre dfini par le contenu d un registre 0 bits CCP+1) avec deux bits supplmentaires DC1(1 et DC1(0. Ceci est montr dans la documentation ci.dessous #
3: / 3*

23 IIF E;IIA& I@2 2roIes (?erge >o$to$+

b7 .................................. b0 PR2 8 Comparateur

PWM dans 18F4550 et 16F877A


T2CON

b7 b6 b5 b4 b3 b2
b1 b0

TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON

0000 = 1: 1 0001 = 1: 2 0010 = 1: 3 .... 1111 = 1:16

PIR1

b7 b6 b5 b4 b3 b2 CCP1IF b1 TMR2IF

1, 2, .., 16

b7

Reset 8 .................................. b0 Timer2

b9 .................................. b2 10 &

b1 T2CKPS1

b0 T2CKPS0

1, 4, 16
00 = 1: 1 01 = 1: 4 1x = 1: 16

b0 TMR1IF b7 b6 b5 DC1B1 b4 DC1B0

CCP1CON

Comparateur 10 CCPR1H b9 .................................. b2 CCPR1L b7 .................................. b0 R Q S Entre n'importe quand prise en compte en fin de priode. b1 b0 4 MCU Clock

PORTC

b7 b CCP1M1 1 b6 b CCP1M0 b5 b4 b3
RC2/CCP1
0

b3 CCP1M3 b2 CCP1M2

b2 b1 b0

TRISC

b7 b6 b5 b4 b3
0

b2 b1 b0

3& / 3*

23 IIF E;IIA& I@2 2roIes (?erge >o$to$+

Le 6]L ne fonctionnera correctement que si

CCPR1L PR2 .

Timer2 PR2 CCPR1L

T
La formule permettant de calculer ton est #

ton

ton M (p$/se width register+ 4 (2os# 4 2imerF pres#a/e "a/$e+ "emar2ue : noteB /a disparition d$ terme * dans #ette form$/e : #e n1est p/$s * 2os# mais bien 2os#. /ercice 2 2he 2imer F and %W> mod$/e of a &'().3 are operating in an app/i#ation with a #/o#k os#i//ator fre0$en#I6 (=?C6 of *>HB. 2he 2imer F pres#a/er is initia//I set to &:*6 the !"2 register is /oaded with a "a/$e F*: (de#ima/+6 and CC%<&H with a "a/$e of 3: (de#ima/+. & A a+ Whi#h register #ontro/s the period of the %W> wa"eform6 and whi#h register #ontro/s the 1on1 timeT & A b+ (or the settings des#ribed6 what is the res$/ting %W> period T & A #+ (or the settings des#ribed6 what is the appro4imate res$/ting 1on1 time T FQ+ ;#rire /e programme C 0$i r-a/ise #e fon#tionnement. "emar2ue : /e #ompi/ate$r >ikroC poss7de $ne /ibrairie de gestion d$ %W>. Voi#i $n e4emp/e tro$"dans sa do#$mentation :
%=,he e#ample changes )3M duty ratio on pin 0C- continually6 *( >9& is connected to 0C-, you can o'serve the gradual change o( emitted light6 =% char i " 0, ? " 0; void main() { ) 0,C " 0#@@; %% ) 0,C is output )wm.*nit(A000); %% *nitialiBe )3M module at A2CB )wm.1tart(); %% 1tart )3M while (1) { %% 1low down, allow us to see the change on >9&D (or (i " 0; i E -0; iFF) &elay.us(A00); ?FF; )wm.Change.&uty(?); %% Change duty ratio 7 7 6rotot3pe Description void 6&mPC$angePDut3)c$ar dut3Pratio*[ C$anges 6]L dut3 ratio. 6arameter dut3Pratio taQes values from 0 to /GG" &$ere 0 is 0b" 1/2 is G0b" and /GG is 100b dut3 ratio. Jt$er specific values for dut3 ratio can be calculated as )6ercent^/GG*=100. 3F / 3*

23 IIF E;IIA& I@2 2roIes (?erge >o$to$+

A--! ! 6 les instru"tions .u PIC (16F84)


#prande' : A f : register fi/e address (adresse m-moire X registres+ de :: C .( A W : registre de tra"ai/ A d : s-/e#tion de destination : dM: "ers W6 dM& "ers f A b : adresse de bit dans $n registre ) bits (s$r 3 bits+ A k : #hamp /itt-ra/ () o$ && bits+ A %C #ompte$r programme A 2= 2ime =$t bit A %3 %ower 3own bit
=p-rations orient-es o#tets entre registre et m-moire ((i/e en ang/ais+ >n-moni0$e =p-rande 33W( f6d 53W( f6d C,<( f C,<W A C=>( f6d 3;C( f6d 3;C(?K f6d I5C( f6d I5C(?K f6d I=<W( f6d >=V( f6d >=VW( 5=% A <,( f6d <<( f6d ?@DW( f6d ?W %W f6d 8=<W( f6d dditionne W et f ;2 bit C bit W et f mise C : de f mise C : de W Comp/-ment de f 3-#r-mente f 3-#r-mente f (sa$te si :+ In#r-mente f In#r-mente f (sa$te si :+ =$ in#/$sif de f d-p/a#ement de f (adressage dire#t+ d-p/a#ement de W "ers f pas d1op-ration <otation ga$#he a"e# /a reten$e <otation droite a"e# /a reten$e so$strait W de f in"erser /es 0$artets dans f =$ e4#/$sif de f & & & & & & &6(F+ & &6(F+ & & & & & & & & & :: :&&& dfff ffff :: :&:& dfff ffff :: :::& &fff ffff :: :::& :444 4444 :: &::& dfff ffff :: ::&& dfff ffff :: &:&& dfff ffff :: &:&: dfff ffff :: &&&& dfff ffff :: :&:: dfff ffff :: &::: dfff ffff :: :::: &fff ffff :: :::: :44: :::: :: &&:& dfff ffff :: &&:: dfff ffff :: ::&: dfff ffff :: &&&: dfff ffff :: :&&: dfff ffff K C C C63C6K &6F &6F &6F &6F &6F 3es#ription CI#/es &* bits =p#ode stat$s notes affe#ted C63C6K K K K K K K K K K K &6F &6F &6F63 &6F &6F63 &6F &6F &6F &6F F

=p-rations orient-es bits s$r /es registres >n-moni0$e =p-rande DC( f6b D?( f6b D2(?C f6b D2(?? f6b mise C : d$ bit b dans f mise C & d$ bit b dans f test d$ bit b : de f sa$te si : test d$ bit b : de f sa$te si & & & &6(F+ &6(F+ :& ::bb bfff ffff :& :&bb bfff ffff :& &:bb bfff ffff :& &&bb bfff ffff 3es#ription CI#/es &* bits =p#ode stat$s notes affe#ted &6F &6F &6F &6F

=p-rations /itt-ra/es (adressage imm-diat+ et de #ontrL/es 33 / 3*

23 IIF E;IIA& I@2 2roIes (?erge >o$to$+

>n-moni0$e =p-rande 33,W k 53,W k C ,, k C,<W32 A E=2= k I=<,W >=V,W <;2(I; <;2,W k <;2@<5 ?,;;% ?@D,W k 8=<,W

3es#ription ddition de W et k ;t /ogi0$e de W et k appe/ d$ so$s programme k mise C : d$ timer wat#hdog a//er C /1adresse =$ in#/$sif /itt-ra/ #hargement de W en /itt-ra/ <eto$r d1interr$ption reto$r a"e# /e /itt-ra/ dans W reto$r de so$sAprogramme a//er a$ mode standbI retire W d$ /itt-ra/ =$ e4#/$sif a"e# /itt-ra/

CI#/es &* bits =p#ode & & F & F & & F F F & & & && &&&4 kkkk kkkk && &::& kkkk kkkk &: :kkk kkkk kkkk :: :::: :&&: :&:: &: &kkk kkkk kkkk && &::: kkkk kkkk && ::44 kkkk kkkk :: :::: :::: &::& && :&44 kkkk kkkk :: :::: :::: &::: :: :::: :&&: ::&& && &&:4 kkkk kkkk && &:&: kkkk kkkk

stat$s notes affe#ted C63C6K K /2=6/%3 K

/2=6/%3 C63C6K K

Fote 1# ]$en an I=J register is modified as a function of itself ) e.g." LJH8 6JI?(" 1*" t$e value used &ill be t$at value present on t$e pins t$emselves. 8or example" if t$e data latc$ is R1R for a pin configured as input and is driven lo& b3 an external device" t$e data &ill be &ritten bacQ &it$ a R0R. /# If t$is instruction is executed on t$e ?LI0 register )and" &$ere applicable" d - 1*" t$e prescaler &ill be cleared if assigned to t$e ?imer0 Lodule. :# If 6rogram Counter )6C* is modified or a conditional test is true" t$e instruction requires t&o c3cles. ?$e second c3cle is executed as a FJ6.

&es"ription .e la mmoire +A4


@ddr (anQ 0 00$ 01$ 0/$ 0:$ 0;$ 0G$ 09$ 02$ 00$ 0M$ 0@$ 0($ IFD8 ?LI0 6CL %?@?K% 8%I 6JI?@ 6JI?( .... ''D@?@ ''@DI 6CL@?> IF?CJF
Ktilise le contenu de 8%I pour adresser les donnes )pas un registre*

Fame

(it 2

(it 9

(it G

(it ;

(it :

(it /

(it 1

(it 0

Halue on 6o&er.on Ieset .... .... xxxx xxxx 0000 0000

?imer temps rel 0 bits Compteur programme )0 bits de poids faible* II6 . I(2 I61 . I(9 I60 . I(G =?J
I@;= ?JCOI

=6D I@: I(:

c I@/ I(/

DC I@1 I(1

C I@0
I(0=IF?

0001 1xxx . ...x xxxx

6ointeur indirect de mmoire

I(;

Fon implment Iegistre de donnes ''6IJL Iegistre d adresses ''6IJL ... GI' ... ''I' ... ?0I'
Compteur programme )poids $aut* \usqu G bits

xxxx xxxx xxxx xxxx ...0 0000 II(8 0000 000x I(I' ?0I8 IF?8

IF?'

Ralis avec OpenOffice sous Linux

3* / 3*

Você também pode gostar