Vous êtes sur la page 1sur 32

TD II2 GEII-1 IUT Troyes (Serge Moutou)

II2 TD n1 : langage C : oprateurs et expressions


Le contenu de ce polycopi peut tre trouv dans un cours wikiversit :
http://fr.wikiversity.org/wiki/Utiliser_les_PI_!"#_et_!$#
1. Arithmtique binaire et expressions en C PIC (16F84)
Pour bien comprendre la signification des expressions, il est essentiel d'avoir 2 notions en tte : la
priorit et l'associativit. Nous donnons ci-aprs un tableau des oprateurs par priorit
dcroissante :
Catgorie d'oprateurs Oprateurs Associativit
fonction, tableau, membre de
structure, pointeur sur un
membre de structure
( ) [ ] . -> Gauche -> Droite
oprateurs unaires - ++ -- ! ~
* & sizeof (type)
Droite ->Gauche
multiplication, division,
modulo
* / % Gauche -> Droite
addition, soustraction + - Gauche -> Droite
dcalage << >> Gauche -> Droite
oprateurs relationnels < <= > >= Gauche -> Droite
oprateurs de comparaison == != Gauche -> Droite
et binaire & Gauche -> Droite
ou exclusif binaire ^ Gauche -> Droite
ou binaire | Gauche -> Droite
et logique && Gauche -> Droite
ou logique || Gauche -> Droite
oprateur conditionnel ? : Droite -> Gauche
oprateurs d'affectation = += -= *= /= %=
&= ^= |= <<= >>=
Droite -> Gauche
oprateur virgule , Gauche -> Droite
Exercice 1
Enlever les parenthses des expressions suivantes lorsqu'elles peuvent tre retires.
a=(25*12)+b;
if ((a>4) &&(b==18)) { }
((a>=6)&&(b<18))||(c!=18)
c=(a=(b+10));
valuer ces expressions pour a=6, b=18 et c=24
Les types du C PIC sont :
TD II2 GEII-1 IUT Troyes (Serge Moutou)
unsigned char a;//8 bits, 0 to 255
signed char b; //8 bits, -128 to 127
unsigned int c; //16 bits, 0 to 65535
signed int d; //16 bits, -32768 to 32767
long e; //32 bits, -2147483648 to 2147483647
float f; //32 bits
Exercice 2
b7 b6 b5 b4 b3 b2 b1 b0
Si une variable p1 de type signed char (8 bits signs) est dclare crire les expressions en C
permettant de :
- mettre 1 le bit b2
- mettre 1 le bit b3 et b6
- mettre 0 le bit b0
- mettre 0 le bit b4 et b5
- inverser le bit b3 (se fait facilement avec un ou exclusif)
- mettre 1 le bit b2 et 0 le bit b0
- mettre 1 les bits b0 et b7 et 0 les bits b3 et b4
Exercice 3
Soit une variable :
char nb;
crire les expressions permettant de calculer les centaines, les dizaines et les unit de cette variable.
Il existe plusieurs autres mthodes pour positionner les bits
(http://www.microchipc.com/HiTechCFAQ/index.php)
1mthode pour positionner bit bit :
#define bit_set(var,bitno) ((var) |= 1 << (bitno))
#define bit_clr(var,bitno) ((var) &= ~(1 << (bitno)))
unsigned char x=0b0001;
bit_set(x,3); //now x=0b1001;
bit_clr(x,0); //now x=0b1000;*/
2mthode pour positionner plusieurs bits
#define bits_on(var,mask) var |= mask
#define bits_off(var,mask) var &= ~0 ^ mask
unsigned char x=0b1010;
bits_on(x,0b0001); //now x=0b1011
bits_off(x,0b0011); //now x=0b1000 */
2. Expression boolenne raie
%ans la suite du cours on appellera e&pression 'oolenne (). *.+ une e&pression ,ui si elle tait
affecte - une varia'le donnerait soit la valeur . ou soit la valeur !. Le est un langage ,ui ne per/et
de fa'ri,uer ,ue des e&pressions ()&pr+. 0est tr1s prati,ue2 /ais la confusion des deu& peut conduire
- des erreurs. %onnons un e&e/ple :
expression (!xpr) expression boolenne (!. ".)
char n=10;
while(n) {
.....;
n--; }
char n=10;
while(n!=0) {
.....;
n--; }
2 / 32
TD II2 GEII-1 IUT Troyes (Serge Moutou)
es deu& constructions sont per/ises en car il y a une techni,ue universelle ,ui per/et de
transfor/er une e&pression en e&pression 'oolenne.
3 tout ce ,ui est valu - . est considr co//e fau&2
3 tout ce ,ui est valu diffrent de . est considr co//e vrai.
4i on se rappelle ,ue dans une parenth1se d0un while on a une )&pression *oolenne (). *.+. %0un
c5t n et de l0autre n67. sont donc des ). *. La diffrence entre les deu& est ,ue pour n elle peut
prendre toutes les valeurs entre 3!8$ et 9!8: (car n est de type char+ alors ,ue n67. ne prendra ,ue
deu& valeurs . ou !. La deu&i1/e sera donc appele ). *. et la pre/i1re )&pr ,ui sera transfor/e
co//e indi,u.
Le pro'l1/e du langage est ,ue l0ou'li d0un ; ou d0un < conduit en gnral - une e&pression souvent
en lieu et place d0une e&pression 'oolenne ce ,ui est tout - fait autoris. Par e&e/ple crire a ; ' au
lieu de a ;; '2 ou pire encore un =7= au lieu d0un =77=.
Exercice 4
%iffrence entre ;; et ;
>valuer les e&pressions :
a;'
a;;'
pour a7 .&#. et '7.&.#
)n dduire les valeurs 'oolennes correspondantes (si ces e&pressions taient utilises dans un if par
e&e/ple+.
onstruire des e&pressions 'oolennes sur les tests suivants
e&pression vraie si
le 'it '" est - !
le 'it '? est - .
le 'it '" est l0inverse du 'it '?
le 'it '8 est - ! et le 'it '@ est - .
le 'it '8 est - ! ou le 'it ': est - .
Les tests d0un 'it particulier en peuvent aussi tre raliss de la /ani1re suivante
(http://www./icrochipc.co//AiBech#CD/inde&.php+
x=0b1000; //decimal 8 or hexadecimal 0x8
if (testbit_on(x,3)) a(); else b(); //function a() gets executed
if (testbit_on(x,0)) a(); else b(); //function b() gets executed
if (!testbit_on(x,0)) b(); //function b() gets executed
#define testbit_on(data,bitno) ((data>>bitno)&0x01)
Exercice 5
Duelle opration arith/ti,ue est ralise par un dcalage E >valuer pour cela les e&pressions
suivantes (avec a7!8 et '78?+ :
3 a 7 a FF ! (ou a FF7 !+
3 a 7 a FF 8 (ou a FF7 8+
3 ' 7 ' GG ! (ou ' GG7!+
3 ' 7 ' GG 8 (ou ' GG78+
Hnralisation.
onstruire une vraie e&pression 'oolenne avec oprateur de dcalage2 ; et I ,ui reprend le test de
l0e&ercice prcdent : le 'it '" est l0inverse du 'it '?
Exercice 6
On donne le sous-programme suivant (tir d'un ancien projet inter-semestre) :
void conversion(char nb,char result[8]){
char i;
for(i=7;i>=0;i--) if ((nb & (1<<i)) == (1<<i)) result[i]=1;
else result[i]=0;
}
3 / 32
TD II2 GEII-1 IUT Troyes (Serge Moutou)
1) Peut-on retirer des parenthses dans l'expression boolenne du if ?
2) Peut-on crire (nb & (1<<i)) au lieu de ((nb & (1<<i)) == (1<<i)) ?
3) Construire l'expression boolenne qui permettrait l'criture
for(i=7;i>=0;i--) if (E.B.?????) result[i]=0;
else result[i]=1;
en donnant toujours le mme le mme rsultat de conversion.
4) Modifier le programme pour qu'il fasse une conversion d'entier (16 bits) vers le binaire.
5) Est-ce que l'algorithme suivant donne le mme rsultat de conversion :

for(i=0;i<8;i++) {
result[i]=nb%(2);
nb = nb / 2;
}
Exercice 7
4oit le progra//e suivant :
#include <stdio.h>
main() {
int n=10,p=5,q=10,r;
r= n == (p = q);
printf("A : n = %d p = %d q= %d r = %d\n",n,p,q,r);
n = p = q = 5;
n += p += q;
printf("B : n = %d p = %d q= %d\n",n,p,q);
q = n++<p || p++ != 3;
printf("C : n = %d p = %d q= %d\n",n,p,q);
q = ++n == 3 && ++p == 3;
printf("D : n = %d p = %d q= %d\n",n,p,q);
return 0;
}
Que donnera-t-il comme affichage sur l'cran ?
4 / 32
TD II2 GEII-1 IUT Troyes (Serge Moutou)
II2 - TD n2 Architecture des PIC 16FXXX
1. Ar#hite#ture $nrale
1) Architecture mm!ire
La donne de 'ase de PI (!"#JJJ+ est lKoctet. LKoctet co/porte $ 'its. Le 'it . est le 'it de poids
fai'le et le 'it : est le 'it de poids fort.
"m!ire #r!$r%mme : la //oire progra//e du PI (!"#$@+ est organise en /ots de !@ 'its et
elle peut en contenir !.8@ (soit !k+. Le 'it . est aussi le 'it de poids fai'le et le 'it !? est le 'it de poids
fort. La //oire //oire progra//e co/porte donc !k & !@ 'its.
Exercice 1
Ln rappelle ,u0une //oire est caractrise par un 'us de donne de largeur n (n 'its de %. - %n3!+
et un 'us d0adresse de largeur / (/ 'its de C. - C/3!+.
!M+ Pour la //oire progra//e du !"#$@ donner / et n.
8M+ La //oire progra//e du !"#$:? est @ fois plus grande : donner les nouveau& / et n.
?M+ La //oire progra//e du !"#$$: utilis en BP est $ fois plus grande ,u0en !M2 donner les
nouveau& / et n.
"m!ire EEP&'" : le PI (!"#$@+ dispose de "@ octets de //oire ))PNLO.
Exercice 2
alculer / et n pour l0))PNLO du !"#$@.
"m!ire d!nne :
%escription si/plifie
%escription dtaille pour le !"#$@
Il faut aPouter une division verticale ,ue l0on appelle 'an,ue. Le PI (!"#$@+ poss1de deu& 'an,ues
(slectionnes par le 'it NP. du registre (TAT)( su'divises en deu& parties :
3 registres de fonctions spciales (4#N 4pecial #unction Negisters+
3 cases //oires li'res ,ue vous pouveQ utiliser - votre guise.
5 / 32
NCO
R
Fi*e en anglais
*anc Neg/NCO
S
4#N
4pecial
#unction
Negisters
'
:
'
"
'
T
'
@
'
?
'
8
'
!
'
.
*anc de registres
TD II2 GEII-1 IUT Troyes (Serge Moutou)
File Address Banque 0 Banque 1 File
Address
00h Indirect addr. Indirect addr. 80h
bcf status,rp0
01h TMR0 OPTION_REG 81h bsf status,rp0
passe en 02h PCL PCL 82h passe en
banque 0 03h STATUS STATUS 83h banque 1
04h FSR FSR 84h
05h PORTA TRISA 85h
06h PORTB TRISB 86h
07h --- --- 87h
08h EEDATA EECON1 88h
09h EEADR EECON2 89h
0Ah PCLATH PCLATH 8Ah
0Bh INTCON INTCON 8Bh
0Ch 68 cases
mmoires
SRAM
idem la
banque 0
8Ch
...
4Fh CFh
inutilis inutilis
7Fh FFh
La //oire du !"#JJJ est organise en 'an,ues slectionnes par le(s+ 'it(s+ NP. (et NP!+ du
registre (TAT)(. 4eul NP. est utilis pour le !"#$@2 soit deu& 'an,ues.
2) +e m!d,*e de #r!$r%mm%ti!n du PIC -16FXXX)
Il peut tre prsent de la manire trs simplifie suivante :
7 Accumulateur W 0
12 Pointeur de pile SP 0
12 Compteur ordinal
PC 0
Status IRP RP1 RP0 /TO /PD Z DC C
INP : slection *an,ue en adressage indirect P% : Power %own
NP! : slection 'an,ue U : Qro
NP.: slection 'an,ue % : de/i3retenue (de/i3carry+
BL : Bi/er Lverflow : retenue (arry+
Le pointeur de pile n0est /anipul directe/ent par aucune instruction. Il ne co/porte ,u0une
profondeur de $ niveau&.
Le co/pteur progra//e est en fait co/pos de deu& registres $ 'its :
6 / 32
TD II2 GEII-1 IUT Troyes (Serge Moutou)
3 PC+ (.8h/$8h+ pour les $ 'its de poids fai'les (accessi'le en lecture/criture+
3 PC+AT. (.Ch/$Ch+ pour les T 'its de poids forts (accessi'le en lecture/criture+
Le !"#$@ g1re seule/ent !. 'its des !? 'its du P
Le /od1le de progra//ation co/plet est plus co/ple&e2 en particulier - cause des registres. Il est
prsent en anne&e - la fin du docu/ent.
2. %tiliser les re$istres &u PIC en C
Le registre (TAT)( prsent ci3dessus co/porte des 'its ,ui poss1dent un no/. e n0est pas le seul
registre a avoir cette proprit. Oais peut3on en dduire ,ue les 'its des registres poss1dent tous un
no/ ,ue le co/pilateur connait E La rponse est non 6 )t pour corser le tout il n0y a aucune r1gle
gnrale. 4i vous vouleQ vous en sortir le seul /oyen est de lire les fichiers d0entte correspondant -
votre PI. )n gnral2 le no/ des registres et des 'its est respect /ais il e&iste des 'its ,ui ont un
no/ dans la docu/entation officielle /ais pas avec le Oikro.
1) Exem#*e de /ichier d0en-t1te #!ur "i2r!C
V propre/ent parler2 pour le co/pilateur Oikro2 les dfinitions ne sont pas dans un fichier avec une
e&tension (.h+ /ais dans des fichiers ,ui se trouvent dans un rpertoire defs et ,ui ont l0e&tension (.c+.
Ln en prsente un e&trait /aintenant :
//***** MikroC fichier P18F84A.c ******
const unsigned short
W = 0x0000,
F = 0x0001,
!P = 0x000",
!P1 = 0x000#,
!P0 = 0x000$,
%&'('& = 0x0004,
%&'(P) = 0x000*,
+ = 0x000,,
)C = 0x0001,
C = 0x0000,
....
unsigned short register -o./ti.e
0'A'10 /2so.ute 0x000*3
....
unsigned short register
&P'&%(!45 /2so.ute 0x0081,
....
ela per/et de connaWtre le no/ des 'its du registre (TAT)( et de confir/er le no/ du registre
'PTI'3 (co//e LPBILX_N)H+. NappeleQ3vous ,ue le langage est sensi'le - la casse des
caract1res.
2) +es tr!is #!ssi4i*its #!ur %tteindre un 4it #%rticu*ier
Voici travers un exemple comment accder un bit particulier pour le registre OPTION :
Exemple en MikroC Fichier d'entte
-oid 6/in7 -oid8 9
....
//*** 'ou:ours *****
&P'&%(!45.F* =13
//**** 0i on conn/;t .e no6
&P'&%(!45.P0A =13
...
<
....
//********** 2its de &P'&%
%&'(!=P1 = 0x000",
%'4)5 = 0x000#,
'0C0 = 0x000$,
'004 = 0x0004,
P0A = 0x000*,
P0, = 0x000,,
P01 = 0x0001,
P00 = 0x0000,
...
7 / 32
OPTION
b
7
b
6
b
5
b
4
b
3
b
2
b
1
b
0
T0CS
T0SE
PSA
PS2
PS1
PS0
RBPU
INTEDG
TD II2 GEII-1 IUT Troyes (Serge Moutou)
Exercice 5
Fichier d'entte
Pour vrifier la 'onne co/prhension de ce ,ui
vient d0tre dit2 nous donnons - droite le fichier
d0entte des 'its correspondant au registre
I3TC'3.
!M+ %essiner le registre correspondant
8M+ )n utilisant les /as,ues du B% prcdent2
crire les instructions per/ettant :
3 /ise - ! de HI)
//********* 2its de %'C&%
54 = 0x000",
444 = 0x000#,
'04 = 0x000$,
%'4 = 0x0004,
!=4 = 0x000*,
'0F = 0x000,,
%'F = 0x0001,
!=F = 0x0000,
3 /ise - . de IXB).
3 tester si B.I) est - !
3 tester si B.I# est - .
?M+ Nefaire le //e travail en utilisant les no/s des 'its directe/ent.
8 / 32
TD II2 GEII-1 IUT Troyes (Serge Moutou)
II2 - TD n3 Des LEDs et des boutons poussoirs sur des PORTs
1. 'e P()* pour entrer et sortir &es in+ormations
1) +e re$istre T&I(A
e registre est dKun fonctionne/ent tr1s si/ple et est li au fonctionne/ent du P'&TA.
ha,ue 'it de T&I(A positionn - ! configure la 'roche correspondante
en entre. ha,ue 'it - . configure la pin en sortie
Brochage du PIC 16F84
Cu reset du PIY2 toutes les pins sont /ises en
entre2 afin de ne pas envoyer des signau& non
dsirs sur les pins. Les 'its de T&I(A seront donc
/is - ! lors de cha,ue reset.
XoteQ gale/ent ,ue2 co//e il nKy a ,ue T pins
utilises sur le P'&TA2 seuls T 'its
('. ... '@+ seront utiliss sur BNI4C. Les 'its de
BNI4C sont dsigns par BNI4C.#. ... BNI4C.#@
2) +es re$istres P'&T6 et T&I(6
es registres fonctionnent e&acte/ent de la //e /ani1re ,ue P'&TA et T&I(A2 /ais
concernent 'ien entendu les $ pins N*. Bous les 'its sont donc utiliss dans ce cas.
Zoyons /aintenant les particularits du P'&T6. Les entres du P'&T6 peuvent tre connectes -
une rsistance de rappel au 9TZ de /ani1re interne2 cette slection sKeffectuant par le 'it : du registre
'PTI'3 (efface/ent du 'it: N*PU pour valider les rsistances de rappel au 9TZ+.
Les 'its de T&I(6 sont dsigns par BNI4*.#. ... BNI4*.#:
2. 'e P()* et sa mo&lisation le#trique
Le /od1le lectri,ue est tr1s si/ple : on le /odlise co//e d0ha'itude - l0aide de Bhevenin.
9 / 32
b
7
b
6
b
5
b
4
b
3
b
2
b
1
b
0
PIC16F
)/4
)/4
)/4
)/4
)/4
)/4
)/4
)/4
PORT
PORTA
*us
interne
)/4 physi,ue
b
7
b
6
b
5
b
4
b
3
b
2
b
1
b
0
TRISA
NC8
(!+ NC8
NC?
NC@/B.[I
OLN
/asse/Z44
N*./IXB
N*!
N*8
(\+ N*?
NC! (!$+
NC.
L4!/L[IX
L48/L[LUB
Z%%/Zcc
N*:
N*"
N*T
N*@ (!.+
TD II2 GEII-1 IUT Troyes (Serge Moutou)
Il est raisonnable de prendre un Imax de 10 mA pour 16F84 et 15 mA pour 16F877
,. Conne#ter et &imensionner &es '!-s
Une L)% est une diode et par cons,uant se /odlise de la //e /ani1re :
Il ya deu& fa]ons typi,ues pour connecter des L)%s :
Oicro3contr5leur co//e source de courant Oicro3contr5leur co//e puits de courant
Exercice 1
Xous allons essayer de di/entionner N! dans les /ontages ci3dessus.
!M+ Une led rouge ([ing'right 7 "8:n/ !T/cd - !./C Z% 7 !2\TZ+ est /onte co//e - gauche sur
le 'it '. du P'&T6 d0un !"#$@. C l0aide du /od1le de Bhvenin du PLNB2 on vous de/ande d0valuer
la rsistance N! - /ettre pour avoir un courant ne dpassant pas T/C.
8M+ Une led verte ([ing'right 7T"Tn/ !8/cd - !./C Z% 7 82.\Z+ est /onte co//e sur le sch/a
de gauche (sur le 'it '8 du P'&T6+. alculer N! sans prendre l0appro&i/ation de Nth pour avoir un
courant ,ui ne dpasse pas les @/C.
?M+ Ln dsire co//ander deu& led rouge en srie. #aire le sch/a et di/ensionner correcte/ent la
rsistance.
10 / 32
Nappel :
%iode 'lo,ue %iode passante
N
%
U
%
ou U
.
: tension de seuil
4i U
%
inconnue prendre !2$Z.
N
%
: rsistance dyna/i,ue
4i N
%
inconnue prendre ..
U
%
N
th
U
Ath
7 TZ
I
LA
N0
th
U
Lth
7.Z
I
LL
Ln prendra touPours N
th
7!..
!"GN0
th
G?"
T"GN
th
G!$.
4ortie
haute
4ortie
'asse
Oicro3contr5leur
NC!
Oicro3contr5leur
NC8
Zcc
N
!
N
!
I
4
I
)
TD II2 GEII-1 IUT Troyes (Serge Moutou)
4. Conne#ter &es boutons poussoirs
Il est naturelle/ent possi'le de connecter des 'outons poussoirs - un PLNB et de de/ander au
/icro3contr5leur de dire si le 'outon est appuy ou rel^ch. (4ur un ro'ot /o'ile on peut utiliser ce
principe pour dtecter des o'Pets+
4i votre PLNB ne poss1de pas de rsistance de tirage interne2 il faut en /ettre une - l0e&trieur.
Exercice 2
Ln connecte deu& interrupteurs co//e indi,u dans la partie gauche sans utiliser de rsistance
pull3up interne.
Les deu& L)%s de l0e&ercice ! sont elles aussi connectes.
!M+ Ln dsire crire un progra//e ,ui ne fait rien si on n0appuie sur aucun 'outon poussoir2 fait
clignoter la L)% rouge si l0on appuie sur un 'outon2 fait clignoter la led verte si on appuie sur l0autre
'outon2 et les deu& L)%s si l0on appuie sur les deu& 'outons.
!3a+ %onner les @ valeurs possi'les de la varia'le interrupteurs avec l0instruction
interrupteurs = PORTB & 0x12;
!3'+ o/plter alors le /orceau de code ci3dessous pour en faire un progra//e :
// boucle d'attente ATTET!O PB"=1 et PB1=0 au repos
#$ile%interrupteurs&'1==0 && interrupteurs&'"==1(
interrupteurs = PORTB & 0x12;
s#itc$%interrupteurs( )
case 0x12 * PORTB = PORTB+0x01;brea,;
case 0x00* PORTB = PORTB+0x0";brea,;
case 0x02 * PORTB = PORTB+0x0-;brea,; // les deux
.
/ela012s%1000(;
8M+ Peut3on /odifier facile/ent le progra//e pour ,ue les deu& L)%s fonctionnent - deu& fr,uences
diffrentes E
Exercice 5
Ln dsire raliser un d co//e indi,u sur le sch/a en page suivante.
!M+ alculer les sept valeurs prdfinies pour allu/er correcte/ent le d et les ranger dans un ta'leau
si la pre/i1re case du ta'leau teint tout.
Duel est l0affichage du d correspondant - :
unsi3ned c$ar tableau456=)0x0070x0870x2270x2A70x--70x-/70x55.;
8M+ >crire un progra//e co/plet ,ui affiche les " valeurs du d avec un dlai d0attente de ?s utilisant
la fonction =%elay_/s(+= de la li'rairie Oikro.
?M+ Ln dsire /aintenant gnrer de /ani1re alatoire le score affich sur le d. Pour cela on
11 / 32
Oicro3contr5leur
P*@
Zcc7TZ
N
!
ela
fonctionne3t3il
sans pull3up E
P*!
Oicro3contr5leur
P*@
Zcc7TZ
N
8
P*!
N
!
Zcc7TZ
4ans pull3up
interne
N
?
@:.
@2:k
@2:k
TD II2 GEII-1 IUT Troyes (Serge Moutou)
vous propose d0utiliser la fonction ci3contre.
?3a+ alculer la pre/i1re valeur de cette fonction
si Li/7".
?3'+ )crire le progra//e gnral ,ui gn1re les
valeurs du d de /ani1re alatoire d1s l0appui du
'outon poussoir (attente de .2?s pour viter les
re'onds+.
unsigned ch/r >seudoA.e/t7int ?i68 9
unsigned ch/r resu.t3
st/tic unsigned int @=13
@ = 7@ * *,"1A B *8 C *,"4A3
!esu.t = 77@ C ?i68B183//B1 D e-iter 0
return !esu.t3
<
@M+ Proposer un sch/a pour raliser deu& ds en utilisant un seul PLNB de sortie sur $ 'its. >crire le
progra//e correspondant.
L0astuce consiste - regrouper les leds ,ui s0allu/ent ense/'les (pour un d+ sur un //e 'it du
PLNB : il faut ainsi @ 'its par d.
.. Inter+a#er un #laier
4ur un P2 le clavier est co/pl1te/ent dcod. 0est - dire ,ue lors,u0une touche est appuye2 sa
position sur le clavier est envoye sur la liaison P48. Le fait d0envoyer la position et non le code C4II
per/et de grer les claviers en divers langues.
Pour de petites applications2 on utilise un clavier - !8 touches. Il est co/pos de si/ples contacts et le
dcodage est ralis par le syst1/e infor/ati,ue. Cvec seule/ent $ touches2 un PLNB de $ 'its en
entre suffit. 4i le clavier poss1de plus de $ touches2 il faut:
3 soit utiliser d0avantage d0entres2
3 soit /ultiple&er les entres en deu& tapes.
)n utilisant @ fils pour les lignes et @ fils pour les colonnes2 on peut diffrencier par croise/ent !"
touches. Ln utilise donc $ fils relis - $ 'its d0un PLNB pour !" touches. Pour nos !8 touches on peut
c^'ler co//e indi,u ci3dessus. Il s0agit ensuite de procder en deu& phases2 une pour la dtection
de la colonne et une autre pour la dtection de ligne.
12 / 32
PI!"#
OLN
NC.
NC!
NC8
NC?
NC@
NCT
N).
N)!
N)8
Z
HX%
NC:
NC"
N.
N!
N8
N?
N%.
N%!
N*:
N*"
N*T
N*@
N*?
N*8
N*!
N*.
Zcc
HX%
N%:
N%"
N%T
N%@
N:
N"
NT
N@
N%?
N%8
Zcc
!.k
@2:k
%!
%8
%?
%@
%T
%"
%:
8\.
8\.
Cppuyer
pour
lancer le
d
TD II2 GEII-1 IUT Troyes (Serge Moutou)
Exercice 4
7uesti!n 1 8 dtermin%ti!n du numr! de c!*!nne
Edefine %&'AF4@ 1,"
// co.onne 1 G g/uche
ch/r .ecture(co.onne789
ch/r ch3
'!0==0x0F3 // 0000 1111
P&!'= = P&!'= H 0x0F3 // =4, =$,=# et =" 6is G 0
ch = P&!'= H 0x043 // on ne g/rde Iue .es 2its intJress/nts =1, =, et =*
sKitch 7ch8 9
c/se 14 D return 03///ucune touche
c/se # D return 13/// g/uche
c/se 10 D return ,3// /u 6i.ieu
c/se 1, D return *3/// droite
// si /utre c/s, deux touches ou /utre
def/u.t D return %&'AF4@3
<
<
o//enter en testant les 'onnes valeurs du case.
7uesti!n 2 8 dtermin%ti!n du numr! de *i$ne
Progra//er les directions avec T&I(6 (P*:3P*@ en entre et P*?3P*! en sortie+.
Duel est le code correspondant : sous3progra//e char lecture_ligne()
7uesti!n 5 8 dtermin%ti!n du c%r%ct,re
C partir des deu& infor/ations prcdentes transfor/er le nu/ro de colonne et le nu/ro de ligne en
caract1re correspondant sur le clavier : 0!0 ou 080 ou ... ou 0.0 ou 0_0
Ne/ar,ue : les 'its N*@3N*: peuvent servir - dclencher une interruption (N* port change Interrupt+.
4i l0on veut utiliser cette interruption il faudrait c^'ler notre clavier autre/ent. Les interruptions seront
a'ordes plus loin.
13 / 32
b
7
b
6
b
5
b
4
b
3
b
2
b
1
b
0
1
3
5
6
7 9
0 *
4
8
#
Vcc
clavier
PORTB
2
Rsista!ces
"e tira#e
TD II2 GEII-1 IUT Troyes (Serge Moutou)
II2 - TD 4 Le Timer0 des PIC 16FXXX
1. 'e *imer /
La docu/entation du Bi/er. du PIY !"#$:: est prsente /aintenant sous for/e sch/ati,ue.
XoteQ ,ue le registre BON. est un registre huit 'its2 dans le,uel on peut crire ou lire (en une seule
instruction+.
&em%r9ue : le registre 'PTI'3 se note LPBILX_N)H en Oikro.
2. 'es &i++rents mo&es &e +on#tionnement
Le ti/er. est en fait un co/pteur. Oais ,uKalleQ3vous co/pter avec ce ti/er E )t 'ien2 vous aveQ deu&
possi'ilits :
3 )n pre/ier lieu2 vous pouveQ co/pter les i/pulsions re]ues sur la pin NC@/B.[I.
Xous dirons dans ce cas ,ue nous so//es en /ode co/pteur
3 Zous pouveQ aussi dcider de co/pter les cycles dKhorloge du PIY lui3//e. %ans
ce cas2 co//e lKhorloge est fi&e2 nous co/pterons donc en ralit du te/ps. %onc2
nous serons en /ode ` ti/er a.
La slection dKun ou lKautre de ces deu& /odes de fonctionne/ent sKeffectue par le 'it T du registre
'PTI'3 : B.4 pour B/r. lock 4ource select 'it.
B.4 7 ! : #onctionne/ent en /ode co/pteur
B.4 7 . : #onctionne/ent en /ode ti/er
%ans le cas ob vous dcideQ de travailler en /ode co/pteur2 vous deveQ aussi prciser lors de ,uelle
transition de niveau le co/ptage est effectu. eci est prcis gr^ce au 'it @ du registre T:C'3 :
B.4) pour Bi/er. 4ource )dge select 'it.
14 / 32
INTCON
RA4/T0CKI
b
7
..................................

b
0
OPTION
b
7
b
6
b
5
b
4
b
3
b
2
b
1
b
0
PORTA
b
7
b
6
b
5
b
4
b
3
b
2
b
1
b
0
Timer0
Timer0 dans 16FXXX
T0CS
MCU
Clock
=1
T0SE
PSA
MUX 0
2, 4, ...,256
=2
(n+1)
MUX 0
1
1
PS2
PS1
PS0
RBPU
INTEDG
TMR0
4
T0SE : Source Edge select
b
7
b
6
b
5
b
4
b
3
b
2
b
1
b
0
T0IF
Overflow (8 bits)
TD II2 GEII-1 IUT Troyes (Serge Moutou)
B.4) 7 . : co/ptage si lKentre NC@/BL[I passe de . - ! (front /ontant+
B.4) 7 ! : co/ptage si lKentre NC@/BL[I passe de ! - . (front descendant+
,. 0esure &u temps &1ex#ution &1un al$orithme
L0opti/isation d0un algorith/e en vitesse (ou en taille+ est tr1s i/portante dans les syst1/es
e/'ar,us raliss par des /icro3contr5leurs. Une recherche d0algorith/es sur Internet vous donnera
des rsultats ,u0il vous faudra valuer. Par e&e/ples2 le site :
http://www.piclist.com/techref/language/ccpp/convertbase.htm
vous propose un algorith/e de division par !. ,ue voici :
unsi3ned int A;
unsigned int L3 /* the Iuotient */
L = 77A MM 18 B A8 MM 13 /* L = A*0.11 */
L = 77L MM 48 B L8 3 /* L = A*0.110011 */
L = 77L MM 88 B L8 MM *3 /* L = A*0.00011001100110011 */
/* either L = A/10 or LB1 = A/10 for /.. A N $*4,8A0 */
Exercice 1
1)Sanschercher comprendrel'algorithmede division, on vousdemandede le transformeren une fonctionunsi3ned
int di910%unsi3ned int A(;
8M+ >crire un progra//e co/plet ,ui /esure le te/ps d0e&cution du sous progra//e de division par
!.2 puis /odifier le progra//e pour ,u0il puisse co/parer avec une division par !. nor/ale.
4. 'e mo&e &e s#rutation &u +la$
Xous devons savoir - ce niveau2 ,ue tout d'orde/ent du ti/er. (passage de .&## - .&..+
entraWne le positionne/ent du flag B.I#2 'it '8 du registre I3TC'3. Zous pouveQ donc utiliser ce flag
pour dter/iner si vous aveQ eu d'orde/ent du ti/er.2 ou2 en dKautres ter/es2 si le te/ps
progra// est coul. ette /thode - lKinconvnient de vous faire perdre du te/ps inutile/ent dans
une 'oucle d0attente.
Petit e&e/ple :
while (INTCON.T0IF==0); //attente active
Exercice 2
$e %uart& est c'(isi ) 4*+& "a!s ce pr(,l-.e/
7uesti!n 1
Ln donne le progra//e suivant concernant le ti/er . :
1 void main(void){
2 // initialisation du timer division par 8
3 OPTION_REG = 0x02; // prescaler 8 , entre sur quartz
4 TMR0 = 0x00; // clrf tmr0 ; dbut du comptage dans 2 cycles
5 // bit RA0 du PORTA en sortie
6 TRISA0=0;
7 while(1) {
8 INTCON.T0IF = 0;
9 while (INTCON.T0IF == 0);
10 RA0 = ~RA0; // on bascule : ~complement bit a bit
11 }
12 }
PouveQ3vous donner la fr,uence d0oscillation du 'it '. du P'&TA avec ,uel,ues e&plications E
7uesti!n 2
>crire en langage un progra//e ,ui fait la //e chose ,ue le progra//e asse/'leur ci3dessus :
initialise le ti/er.2 efface le flag et attend - l0aide d0une 'oucle le positionne/ent de ce dernier /ais
!.. incr/entations seule/ent.
15 / 32
TD II2 GEII-1 IUT Troyes (Serge Moutou)
Ne/ar,ue : en fait toute /odification de T"&: entraWne un arrt de co/ptage de la part de celui3ci
correspondant - 8 cycles dKinstruction /ultiplis par la valeur du pr diviseur. Cutre/ent dit2 un arrt
correspondant touPours - 8 units T"&:. Il faut donc tenir co/pte de cette perte2 et placer ` 8T"3\$ a
et non ` 8T"3!.. a dans le ti/er.
7uesti!n 5
Hnrer un signal de fr,uence ! [AQ. Pour cela :
3 calculer la valeur de la pr division
3 calculer la valeur de dco/ptage
3 >crire le progra//e.
7uesti!n 4
O/e chose /ais il faut ,ue la priode di/inue progressive/ent
7uesti!n 5
Hnrer un signal de sortie de rapport cycli,ue !/@ sur le //e principe.
Il y a /ieu& - faire avec les PIs2 utiliser le /odule P.
16 / 32
TD II2 GEII-1 IUT Troyes (Serge Moutou)
II2 - TD 5 : Interruption timer0
1. 'e timer /
La docu/entation du Bi/er. du PIY !"#$:: a t prsente dans le B%T. Xous passons donc - la
description de son interruption associe.
e sch/a de principe fonctionne de la /ani1re suivante. Il y aura interruption si on arrive - raliser un
front /ontant dans l0ellipse2 sachant ,ue le /atriel ne g1re ,ue l0overflow ('it BON.I# du registre
I3TC'3+.
Le progra//e ,ui g1re l0interruption sera en adresse .&..@2 /ais ce sera transparent en langage .
2. 'es interruptions en C
La gestion des interruptions en est forte/ent dpendante des co/pilateurs2 co//e le /ontre le
ta'leau ci3dessous :
MikroC (notre compilateur) Hitech C
// interruption haute priorite
seulement
void interrupt() {
// traitement interruption
// positionnement du FLAG
}
void main() {
// traitement
while(1);
}
#include <pic1684.h>
void interrupt it_gene(void);
main(){
// traitement
while(1);
}
void interrupt it_gene(void) {
// traitement interruption
// positionnement du FLAG
}
Cvec le co/pilateur /ikro le no/ de l0interruption est fi&.
L0criture d0une interruption se fait nor/ale/ent en trois tapes :
3 spcifier ,ue le sous3progra//e n0est pas un sous3progra//e nor/al2 /ais un sous3progra//e
d0interruption2
3 fi&er l0adresse du sous3progra//e d0interruption
17 / 32
b
7
b
6
b
5
b
4
b
3
b
2
b
1
b
0
T0IE
INTE
RBIE
T0IF
INTF
RBIF
GIE/GIEH
PIE/GIEL
&
&
&
&
Timer0
Overflow
Interruption timer0 du 16F877
b
15
....................................

b
0
INTCON
TD II2 GEII-1 IUT Troyes (Serge Moutou)
3 initialiser le /canis/e d0interruption dans le progra//e principal.
Pour certains co/pilateurs (Oikro+ les deu& pre/i1res tapes se font si/ple/ent en donnant un no/
prdter/in au sous3progra//e d0interruption.
Exercice 1
Un PI!"#$@ est enfoui dans un #PHC. 4a seule particularit est de fonctionner - T.OAQ contre !.
(resp. 8. OAQ+ de fr,uence /a&i/ale d0horloge pour les PI !"#$@ (resp. !"#$@C+. Il e&cute le
progra//e suivant (crit avec le co/pilateur Aitech + :
#include <pic1684.h>
void interrupt decalage(void);
unsigned char nb;
main(void) {
TRISA = 0xF9; // 6 entrees, 2 sorties pour A
TRISB = 0x00; // 8 sorties pour B
OPTION = 0x07; // prescaler 256 , entree sur quartz
INTCON = 0xA0; // autorise l'interruption timer
PORTB = 0x01; // une seule diode allumee
TMR0 = 0x00 ;
nb=0;
while(1) {
// on ne fait rien que recopier sur 2 segments la valeur de SW1
if ((PORTA & 0x01) == 1) PORTA = 0x06;
}
}
void interrupt decalage(void) {
nb++;
//TMR0 = 0x00; //c'est fait car ici par overflow
if (!(nb % 16))
PORTB = (PORTB << 1) ;
if (PORTB == 0x00) PORTB = 0x01;
T0IF = 0; // acquittement interruption
}
Ne/ar,ueQ co//ent est crit une interruption avec ce co/pilateur.
!M+ Neprer et /odifier les lignes de ce progra//es pour ,u0il fonctionne avec le co/pilateur Oikro.
8M+ alculer si le chenillard ralis par ce progra//e est visi'le - l0cil hu/ain (fr,uence de
change/ent de position des L)%s infrieure - 8. AQ+.
?M+ o//ent peut3on crire l0instruction =if (!(nb % 16))" pour plus d0efficacit.
@M+ Duelle est la suite des tats (L)%s allu/es+ ralise par ce progra//e.
Les deu& ,uestions suivantes sont issues du %evoir 4urveill de duin 8.!..
TM+ Le progra//e suivant est donn co//e e&e/ple du co/pilateur Oikro et tourne dans un PI
!"#$@ ,ui a un ,uartQ de @ OAQ.
unsigned cnt;
void interrupt() {
if (INTCON.T0IF==1) {
cnt++; // increment counter
INTCON.T0IF = 0; // clear T0IF
TMR0 = 96;
}
}
18 / 32
TD II2 GEII-1 IUT Troyes (Serge Moutou)
void main() {
OPTION_REG = 0x84; // Assign prescaler to TMR0
ANSEL = 0; // Configure AN pins as digital
ANSELH = 0;
C1ON_bit = 0; // Disable comparators
C2ON_bit = 0;
TRISB = 0; // PORTB is output
PORTB = 0xFF; // Initialize PORTB
TMR0 = 96; // Timer0 initial value
INTCON = 0xA0; // Enable TMRO interrupt
cnt = 0; // Initialize cnt
do {
if (cnt >= 400) {
PORTB = ~PORTB; // Toggle PORTB LEDs
cnt = 0; // Reset cnt
}
} while(1);
}
Duelle est la fr,uence de clignote/ent des L)%s relies au PLNB* E
"M+ Oodifier le progra//e principal pour raliser un chenillard d0une L)% se dpla]ant vers les poids
fai'les.

Exercice 2
Une partie /atrielle est constitue de deu& afficheurs sept seg/ents /ultiple&s. Les sept seg/ents
sont co//ands par le P'&TC2 tandis ,ue les co//andes d0affichages sont ralise par les 'its '.
et '! du P'&T6. Un sch/a de principe est donn ci3apr1s.
!M+ C l0aide de la docu/entation calculer les valeurs dans un ta'leau =unsigned char SEGMENT[] =
{0x3F,...};= pour un affichage des chiffres de . - \.
8M+ raliser une fonction responsa'le du transcodage :
unsigned char Display(unsigned char no) {
unsigned char Pattern;
unsigned char SEGMENT[] = {0x3F,....
?M+ Naliser le progra//e /ain(+ responsa'le de l0initialisation de l0interruption ,ui doit avoir lieu toutes
les !./s (avec un ,uartQ de @OAQ+ et ,ui co/pte de .. - \\ toutes les secondes environ (avec un
=%elay_/s(!...+e=+
@M+ Naliser enfin l0interruption ,ui affichera tant5t les diQaines2 tant5t les units.
19 / 32
a
b
c
d
e
f
g
PIC
16F877A
RC0
RC1
RC2
RC3
RC4
RC5
RC6
a
b
c
d
e
f
g
290
RB0
RB1
1k 1k
DC56-11EWA Common Cathode
TD II2 GEII-1 IUT Troyes (Serge Moutou)
TD 6 8 +e m!de c!m#%r%is!n du m!du*e CCP (Capture/Compare/PWM)
L0o'Pectif de ce B% est de gnrer des signau& de fr,uences dter/ines. e travail est ralis en
gnral avec le /odule P (apture/o/pare/PfO+ et plus e&acte/ent son /ode co/paraison.
Xous allons co//encer par dcrire le fonctionne/ent du ti/er ! du !"#$::.
1. 'e *imer 1 et ses re$istres
Les registres utiliss par le Bi/er! sont donc :
3 T"&1. et T"&1+2
3 T1C'3
3 ventuelle/ent le P'&TC2 et PI&1.
La dtection synchronise doit tre o'ligatoire/ent utilise dans les /odes co/pare (de ce B%+ et le
/ode capture du B% suivant.
Exercice 1
Bhe PI has an oscillator fre,uency of @ OAQ. fhat is the slowest Bi/er ! interrupt rate it can
generate with this internal clock E
2. 'e mo&e #omparaison
Le /ode co/paraison va nous per/ettre de gnrer des signau& de fr,uence dter/ine.
20 / 32
T1OSO/T1CLI
b
15
..................................

b
0
T1CON
b
7
b
6
b
5
b
4
b
3
b
2
b
1
b
0
PORTC
b
7
b
6
b
5
b
4
b
3
b
2
b
1
b
0
Timer1
Timer1 dans 16F877A
TMR1CS
MCU
Clock
T1OSCEN
MUX 0
1, 2, 4,8
=2
(n)
MUX 1
0
1
T1CKPS1
T1CKPS0
TMR1ON
Timer1
TMR1H
TMR1L
4
&
NOT_T1SYNC
Dtection
synchronise
T1OSI
PIR1
CCP1IF
b
7
b
6
b
5
b
4
b
3
b
2
b
1
b
0
TMR1IF
overflow
TD II2 GEII-1 IUT Troyes (Serge Moutou)
Exercice 2 Nalisation d0un signal de !AQ et son a/lioration.
!M+ Xotre horloge ,uartQ a une fr,uence de 8. OAQ. Utiliser le rsultat de l0e&ercice ! pour rpondre :
par co/'ien doit3on diviser la fr,uence de P!I# /ini/ale pour o'tenir un te/ps de T..... s (.2T
s+E
8M+ Ln choisit une division par T. Le principe sera donc d0attendre P!I# cin, fois sans ou'lier de le
re/ettre - . et d0inverser par logiciel la sortie N8. Il nous faut donc choisir un /ode de
fonctionne/ent logiciel (!.!. ,ui n0agit pas sur N8+. >crire le progra//e co/plet.
Ne/ar,ue : on pourrait utiliser le flag de d'orde/ent du Bi/er! (BON!I# du registre PI&1+ pour faire
la //e chose2 ce ,ui n0utiliserait pas le /odule P.
21 / 32
PORTC
RC2/CCP1
CCP1CON
CCP1M3
CCP1M2
CCP1M1
CCP1M0
}
Q S
R
Special Event Trigger
COMPARAISON PIC 16F877
TRISC
CCPR1H CCPR1L
TMR1H TMR1L
Comparaison
PIR1
CCP1IF
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)
0
0010 : Comparaison bascule sortie quand comparaison (CCPxIF)
1000 : Comparaison force CCP1 un (CCPIF est gr)
1001 : Comparaison force CCP1 zro (CCPIF est gr)
1010 : Comparaison sort rien sur CCP1 mais sur CCPIF
1011 : Comparaison force Special Event Trigger reset sur timer1 (CCP1IF est gr)
b
7
b
6
b
5
b
4
b
3
b
2
b
1
b
0
b
7
b
6
b
5
b
4
b
3
b
2
b
1
b
0
b
7
b
6
b
5
b
4
b
3
b
2
b
1
b
0
b
7
b
6
b
5
b
4
b
3
b
2
b
1
b
0
Logique de sortie
TMR1IF
TD II2 GEII-1 IUT Troyes (Serge Moutou)
?M+ Cvec la techni,ue de la ,uestion prcdente2 il nous est a'solu/ent i/possi'le de rgler
e&acte/ent la fr,uence de sortie. Ln va essayer de palier - cet inconvnient en utilisant un autre
/ode ,ui n0agit pas sur N8 /ais a l0avantage de dclencher une re/ise - . du ti/er! ,uand il y a
co/paraison : c0est le /ode !.!!. alculer la valeur - /ettre dans CCP&1.
>crire le progra//e.
@M+ o/plter le progra//e prcdent pour ,u0il envoie sur une liaison srie (avec un printf+ le te/ps
en heure /inute seconde.
Ln verra plus tard ,u0une /thode plus prcise consiste - utiliser un ,uartQ horloger.
22 / 32
TD II2 GEII-1 IUT Troyes (Serge Moutou)
II2 - TD7 Inter/%cer des *ments de #uiss%nce #!ur /%ire t!urner des m!teurs
Duand le courant - sortir dpasse !T /C (par 'it+2 il faut trouver une solution a/plifie. 0est ce ,ue
nous allons e&a/iner dans ce chapitre.
1. %tilisation &e transistors "2*
Pour co//ander des sorties puissantes
il faut aPouter des transistors (*dB *ipolar
dunction Bransistor+. Les sorties
puissantes peuvent tre :
3 des relais
3 des 'o'ines
3 des L)%s
3 des /oteurs
Exercice 1
Ln veut co//ander une L)% ,ui
ncessite !"/C. Le transistor choisi a un
de !...
!M+ alculer I* E
8M+ )n dduire N! (si l0on prend une
/arge de ?.g ou si l0on prend !/C par
dfaut+
?M+ )n dduire N pour un Z)sat7.28Z (pour une ali/entation Zcc7TZ+ E
@M+ Une rsistance N de !/@f suffit3elle E
2. Inter+a#er &es sorties puissantes ae# &es F!*
Ln peut utiliser des transistors - effet
de cha/p - la place des *dB. Xous
e&a/inons le cas des OL4#)B. Un
para/1tre i/portant - vrifier est la
tension de grille ncessaire - la
co//utation. )n effet pour les
/icro3contr5leur ali/ent en ?2?Z cette
tension peut s0avrer un peu forte pour
des OL4#)B de puissance.
Il e&iste des fa/illes spciale/ent
faites pour tre co//andes
directe/ent par des PLNBs. Zoir
UZX@8."C ("../C+ et UZX@?."C
(!2!C+ de cheQ Uete&.
,. !n#ore plus &e puissan#e
Il faut utiliser des opto3coupleurs. Il per/ettent aussi une isolation galvani,ue ce ,ui est i/portant si la
tension d0ali/entation est tr1s diffrente de celle du /icro3contr5leur.
23 / 32
Oicro3contr5leur
PC8 N!
N

Zcc 7 TZ
Zcc7!8Z
N
8
8[8
!..N
"$.N
![
8X8888 per/et
de sortir Pus,u0-
"./C
Oicro3contr5leur
PC8
N

Zcc 7 TZ
Zcc7!8Z
N
8 8[8
*44!?$ per/et
de sortir Pus,u0-
88./C avec
Z
%4
7.2!?Z
TD II2 GEII-1 IUT Troyes (Serge Moutou)
4. Comman&er &es bobines moteurs et relais ae# "2*
Il e&iste des transistors de puissance adapts. Par e&e/ple le transistor *%!?\ propose un gain
co/pris entre 8T et 8T.. Ln peut l0utiliser avec un courant I7!2T C (?C en pointe+. 4on fai'le gain
ncessite un courant I* asseQ i/portant2 allant au3del- des possi'ilits des ports traditionnels
(typi,ue/ent !./C+. Par e&e/ple pour co//uter !C2 il faut un I*7@./C dans le pire des cas. Il faut
donc un transistor suppl/entaire.
e /ontage appel %arlington e&iste en 'oWtier uni,ue : par e&e/ple le *J?$ peut co//uter des
courants Pus,u0- $../C.
Exercice 2
Le transistor 8X8888 est 'lo,u2 il circule @./C dans I*
!M+ 4i N8 est choisi - ??. 2 ,uelle puissance passe dans N8 E
8M+ 4i le transistor 8X8888 est satur (Z)sat7.28Z+ ,uelle puissance passe dans N8 E
?M+ Lors,ue le *%!?\ est satur2 il circule Il circule I7!C et l0on a Z)sat7.2:.Z. Duelle puissance
est dissipe dans le *%!?\ E
Exercice 5 tir du %4 final de duin 8.!! (onstruction d0un signal PfO pour un /oteur+
%ans tout cet e&ercice2 on dispose d0un ,uartQ gnrant OU lock - @ OAQ. Ln utilisera le ti/er !
docu/ent au B% prcdent.
0est le Bi/er! ,ui va tre responsa'le de la ralisation de la priode de notre signal PfO (OLI
Oodulation de Largeur d0I/pulsion+ ou - rapport cycli,ue varia'le. ette priode est choisie - 8. /s et
on rappelle ,ue notre horloge a une fr,uence de @OAQ. Le fonctionne/ent gnral du progra//e est
le suivant :
3 initialise le ti/er
3 initialiser la co/paraison
*oucle infinie
24 / 32
Oicro3contr5leur
PCi
Z
cc
7TZ
N
!
N

8@Z
harge
BLP!$!
BLP!$! :
!"/C G I
%/a&
G 8./C avec Z
%
G!2?Z - !./C
!/C G I

G!./C
%i/ensionner N
!
.
Oicro3contr5leur
PC8 N
!
N
8
Zcc 7 !TZ
?[?
*%!?\
Zcc 7 !TZ
O
8X8888
per/et de
sortir Pus,u0-
"./C sous
".Z
I
*
%!
TD II2 GEII-1 IUT Troyes (Serge Moutou)
3 attendre une co/paraison et /ettre la sortie N8 - .
3 attendre ,ue le ti/er! dclenche un overflow et /ettre syst/ati,ue/ent la sortie N8 - !
fin 'oucle
!M+ %onner la ou les instructions per/ettant de raliser une division par $. Duelle priode a3t3on alors
- l0entre du 'loc =%tection synchronise= E Duelle est la fr,uence #%4 correspondante E
&#!nses :
8M+ Par co/'ien doit3on diviser la fr,uence #%4 pour o'tenir nos B 7 8./s E
&#!nse :
?M+ 4i la division de la ,uestion 8 est ralise par le ti/er!2 avec valeur doit3on initialiser le ti/er! (en
dci/al et en he&adci/al+
&#!nses :
@M+ %onner l0instruction ,ui slectionne le /ode =dtection synchronise= et le ,uartQ co//e entre
ainsi ,ue BNO!LX.
&#!nses :
TM+ Duelle instruction attend le d'orde/ent du ti/er! E
&#!nse :
"M+ Zoir docu/entation sur la co/paraison au B% prcdent.
La co/paraison est choisie co//e : =!.!. co/pare sort rien sur P /ais sur PI#=. Duelle
instructions per/ettent de choisir ce /ode E
&#!nses :
:M+ Duelles valeurs faut3il /ettre dans PN!A et PN!L pour raliser un rapport cycli,ue de !.g 2
c0est - dire une attente de 8/s E
&#!nses :
$M+ Duelle est l0instruction ,ui per/et d0attendre la co/paraison E
&#!nse :
Duestions hors %4
\M+ o/plteQ les valeurs /an,uantes (co//entaires // EE+ dans le progra//e ci3dessous ,ui ralise
co/pl1te/ent le PfO (en /ode !.!.+
1 TRISC.F2=0; //sortie
2 // timer1
3 T1CON = T1CON | ; // ??
4 // comparaison
5 CCP1CON = CCP1CON & 0xFA | 0x0A; // mode 1010 pour la comparaison
6 CCPR1H = 0x ; // ??
7 CCPR1L = 0x ; // ??
8 PIR1.CCPIF=0;
9 PIR1.TMR1IF=0;
10 while(1) {
11 while(PIR1.CCPIF==0);
12 PORTC.F2=1;
13 PIR1.CCPIF=0;
14 while(PIR1.TMR1IF==0);
15 // c'est parti pour un tour
16 TMR1H = 0x // ??
17 TMR1L = 0x // ??
18 PORTC.F2=1;
19 PIR1.TMR1IF=0;
8. R
25 / 32
TD II2 GEII-1 IUT Troyes (Serge Moutou)
!.M+ Ln utilise le sch/a avec un 8X8888 et un *%!?\ en changeant PC8 en N8. Duel courant
/oyen passe dans le /oteur si le di/ensionne/ent des rsistances est tel ,ue le /a&i/u/ de
courant est de !2T C E
.. Comman&er plusieurs moteurs ae# un #ir#uit unique
Il e&iste des circuits capa'le de co//ander : /oteurs co//e le ULX8..? ,ui a - peu pr1s les
//es caractristi,ues ,ue le *J$? (/ais sept fois+. Ils sont appels %arlington driver I. Le
ULX8$.? poss1de !" 'roches et peut co//ander $ /oteurs avec la possi'ilit d0utiliser deu& sorties
identi,ues pour co//ander un seul /oteur.
Le circuit ULX8..? est capa'le de dlivrer T.. /C sous T.Z.
26 / 32
IX!
IX8
IX?
IX@
IXT
IX"
IX:
($+ HX%
LUB!
LUB8
LUB?
LUB@
LUBT
LUB"
LUB:
Z (\+
ULX8..?
. Z
Z
O
O
ULX8$.?
LUB!
LUB8
LUB?
LUB@
LUBT
LUB"
LUB:
LUB$
Z(!.+
. Z
Z
O
O
IX!
IX8
IX?
IX@
IXT
IX"
IX:
IX$
(\+ HX%
TD II2 GEII-1 IUT Troyes (Serge Moutou)
TD 8 : Le mode capture du module CCP (Capture/Compare/PWM)
%ans le /ode capture2 CPP&1. et CPP&1+ capturent la valeur du ti/er ! ou du ti/er ? ,uand un
vne/ent se produit sur N8/PP! du port . Un vne/ent est dfini co//e :
un front descendant
un front /ontant
tous les @ fronts /ontants
tous les !" fronts /ontants
Cttention le P'&TC doit tre configur en entre pour le 'it '8 (avec T&I(C+.
Exercice : Utilisation du /ode capture pour lire un clavier P48
Ne/ar,ue prli/inaire : en toute rigueur2 il serait prfra'le de raliser cette capture avec une
interruption. Les interruptions sont a'ordes au B% T.
Prsentation du protocole P48 :
Le protocole P48 co/plet est un /lange de protocole synchrone et asynchrone :
27 / 32
ps20"ata
,us1
r"1
20 21 22 23 24 25 26 27 P
ps8_clk
s
t
a
r
t
,
i
t
s
t
(
p
,
i
t
PORTC
RC2/CCP1
CCP1CON
1,4,16
CCP1M3
CCP1M2
CCP1M1
CCP1M0
}
PIR1
b
7
b
6
b
5
b
4
b
3
b
2
b
1
b
0
CCP1IF
CCPR1H CCPR1L
TMR1H TMR1L
CAPTURE POUR 16F877
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
b
7
b
6
b
5
b
4
b
3
b
2
b
1
b
0
b
7
b
6
b
5
b
4
b
3
b
2
b
1
b
0
TD II2 GEII-1 IUT Troyes (Serge Moutou)
ob seules les pre/iers signau& ps8_clk et ps8_data vont nous intresser. o//e c0est le clavier ,ui
/et les donnes c0est - lui de fa'ri,uer l0horloge. La fr,uence d0horloge est co/prise entre !.kAQ et
!"kAQ et on va utiliser la partie capture non pas pour /esurer la fr,uence de l0horloge (dans un
pre/ier te/ps en tout cas+2 /ais pour dtecter les fronts descendants de l0horloge gr^ce au 'it
P!I# du registre PIN!.
!M+ >crire le sous3progra//e =void initKBD(void)" destin - initialiser le fonctionne/ent du
/odule P pour ,u0il intercepte les fronts descendants de P48_clk2 si les donnes ps8_data sont
sont sur le 'it '! du PLNB. Xe pas ou'lier de /ettre les deu& 'its du PLNB en entre.
8M+ >crire le progra//e principal ,ui lit les infor/ations - cha,ue fois ,u0un front descendant arrive et
construit le 'it du scan3code apr1s lecture pour le sortir sur le PLNB* (positionn en sortie+.
?M+ Utiliser /aintenant co/pl1te/ent le /ode capture pour calculer la fr,uence /oyenne de l0horloge
ps8_clk si notre fr,uence de ,uartQ est @ OAQ..
&em%r9ue : le co/pilateur Oikro poss1de une li'rairie de lecture du P4/8.
Prototype void Ps8_Init(unsigned short hport+e
%escription InitialiQes port for work with P4/8 key'oard2 with default pin settings. Port pin . is
%ata line2 and port pin ! is lock line. iou need to call either Ps8_Init or Ps8_onfig
'efore using other routines of P4/8 li'rary.
Prototype void Ps8_onfig(char hport2 char clock2 char data+e
%escription InitialiQes port for work with P4/8 key'oard2 with custo/ pin settings. Para/eters
data and clock specify pins of port for %ata line and lock line2 respectively. %ata
and clock need to 'e in range ...: and cannot point to the sa/e pin. iou need to
call either Ps8_Init or Ps8_onfig 'efore using other routines of P4/8 li'rary.
Prototype char Ps8_[ey_Nead(char hvalue2 char hspecial2 char hpressed+e
%escription Bhe function retrieves infor/ation a'out key pressed. Para/eter value holds the
value of the key pressed. #or characters2 nu/erals2 punctuation /arks2 and space2
value will store the appropriate C4II value. Noutine jrecogniQesk the function of
4hift and aps Lock2 and 'ehaves appropriately. Para/eter special is a flag for
special function keys (#!2 )nter2 )sc2 etc+. If key pressed is one of these2 special
will 'e set to !2 otherwise ..
Para/eter pressed is set to ! if the key is pressed2 and . if released.
Voici un exemple trouv dans sa documentation :
unsi3ned s$ort ,e0data7 special7 do#n;
9oid 2ain%( )
:;:O = 0x05; // /isable analo3 co2parators %co22ent t$is <or P!:18(
!T:O = 0; // /isable all interrupts
Ps21!nit%&PORTA(; // !nit P=/2 >e0board on PORTA
/ela012s%100(; // ?ait <or ,e0board to <inis$
do )
i< %Ps21>e01Read%&,e0data7 &special7 &do#n(( )
i< %do#n && %,e0data == 1@(( )// Bac,space
// &&&do so2et$in3 #it$ a bac,space&&&
.
else i< %do#n && %,e0data == 1A(( )// Enter
Bsart1?rite%1A(;
.
else i< %do#n && Cspecial && ,e0data( )
Bsart1?rite%,e0data(;
.
.
/ela012s%10(; // debounce
. #$ile %1(;
.//DC
28 / 32
TD II2 GEII-1 IUT Troyes (Serge Moutou)
TD ; 8 +e m!de P<" du m!du*e CCP -C%#ture=C!m#%re=P<")
PfO signifie ` Pulse fidth Oodulation a2 ce ,uKon pourrait traduire par /odulation de largeur
dKi/pulsion. 4on o'Pectif est de changer une valeur /oyenne en Pouant sur le rapport cycli,ue. Puis,ue
ce /odule utilise essentielle/ent le ti/er 82 nous co//en]ons donc - le dcrire.
1. -es#ription &u timer 2
Le ti/er 8 est identi,ue sur le PI 16F877 et le 18F4550. Il s'agit d'un timer 8 bits dont la description
schmatique est prsente maintenant.
4a seule entre est l0entre horloge du PIY divise par @ suivie d0un pr3diviseur gr par deu& 'its.
Un co/parateur donne un signal ,ui sert de reset au ti/er8 et d0entre - un post3diviseur capa'le de
diviser par un no/'re entre ! et !".
La priode B peut tre calcule par :
B 7 (P&2 9 !+ & (Bi/er8 input clock period+ soit :
B 7 (P&29!+ & (Bosc & @ Bi/er 8 prescale value+
)&ercice !
Bhe PIY has an oscillator fre,uency of @ OAQ. fhat is the slowest Bi/er 8 interrupt rate it can
generate E
*y writing to the T2C'3 register2 Bi/er 8 is switched on2 with neither pre3 nor postscale. fhat is the
value you have to write to P&2 to realiQe a @2.. kAQ fre,uency E
Duand on s0intresse au PfO le choi& de la priode est ralis si/ple/ent co//e dans l0e&ercice !.
Puis,ue le tip/er8 est sur $ 'its2 la rsolution de la priode est de 8T". Le choi& du rapport cycli,ue
29 / 32
b
7
..................................

b
0
T2CON
b
7
b
6
b
5
b
4
b
3
b
2
b
1
b
0
Timer2
Timer2 dans 18F4550 et 16F877A
T2CKPS1
MCU
Clock
1, 2, .., 16
-
TOUTPS3
4
TMR2ON
PIR1
CCP1IF
b
7
b
6
b
5
b
4
b
3
b
2
b
1
b
0
TMR1IF
TOUTPS2
TOUTPS1
TOUTPS0
PR2
b
7
..................................

b
0
Comparateur
T2CKPS0
1, 4, 16
TMR2IF &
0000 = 1: 1
0001 = 1: 2
0010 = 1: 3
....
1111 = 1:16
00 = 1: 1
01 = 1: 4
1x = 1: 16
Reset
TD II2 GEII-1 IUT Troyes (Serge Moutou)
est par contre dfini par le contenu d0un registre $ 'its CCP&1+ avec deu& 'its suppl/entaires
%!*! et %!*.. eci est /ontr dans la docu/entation ci3dessous :
30 / 32
b
7
..................................

b
0
T2CON
b
7
b
6
b
5
b
4
b
3
b
2
b
1
b
0
Timer2
PWM dans 18F4550 et 16F877A
T2CKPS1
MCU
Clock
1, 2, .., 16
-
TOUTPS3
4
TMR2ON
PIR1
CCP1IF
b
7
b
6
b
5
b
4
b
3
b
2
b
1
b
0
TMR1IF
TOUTPS2
TOUTPS1
TOUTPS0
PR2
b
7
..................................

b
0
Comparateur
T2CKPS0
1, 4, 16
TMR2IF
&
0000 = 1: 1
0001 = 1: 2
0010 = 1: 3
....
1111 = 1:16
00 = 1: 1
01 = 1: 4
1x = 1: 16
Reset
b
9
..................................

b
2
Comparateur
CCPR1H
b
9
..................................

b
2
b
1
b
0
b
1
b
0
8
8
10
10
CCP1CON
CCP1M3
CCP1M2
CCP1M1
CCP1M0
b
7
b
6
b
5
b
4
b
3
b
2
b
1
b
0
DC1B0
DC1B1
PORTC
RC2/CCP1
R Q
S
TRISC
0
b
7
b
6
b
5
b
4
b
3
b
2
b
1
b
0
b
7
b
6
b
5
b
4
b
3
b
2
b
1
b
0
CCPR1L
b
7
..................................

b
0
Entre n'importe quand prise en
compte en fin de priode.
TD II2 GEII-1 IUT Troyes (Serge Moutou)
Le PfO ne fonctionnera correcte/ent ,ue si CCPR1LPR2 .
La for/ule per/ettant de calculer ton est :
t
on
= (pulse width register) x (T
osc
x Timer2 prescale value)
&em%r9ue : noteQ la disparition du ter/e @ dans cette for/ule : ce n0est plus @ Bosc /ais 'ien Bosc.
Exercice 2
Bhe Bi/er 8 and PfO /odule of a !"#$:?C are operating in an application with a clock oscillator
fre,uency2 #L42 of @OAQ. Bhe Bi/er 8 prescaler is initially set to !:@2 the P&2 register is loaded with a
value 8@. (deci/al+2 and PN!A with a value of ?. (deci/al+.
! 3 a+ fhich register controls the period of the PfO wavefor/2 and which register controls the 0on0
ti/eE
! 3 '+ #or the settings descri'ed2 what is the resulting PfO period E
! 3 c+ #or the settings descri'ed2 what is the appro&i/ate resulting 0on0 ti/e E
8M+ )crire le progra//e ,ui ralise ce fonctionne/ent.
&em%r9ue : le co/pilateur Oikro poss1de une li'rairie de gestion du PfO. Zoici un e&e/ple trouv
dans sa docu/entation :
/ET$e exa2ple c$an3es P?; dut0 ratio on pin R:2 continuall0& !< FE/ is
connected
to R:27 0ou can obser9e t$e 3radual c$an3e o< e2itted li3$t& E/
c$ar i = 07 G = 0;
9oid 2ain%( )
PORT: = 0x''; // PORT: is output
P#21!nit%-000(; // !nitialiHe P?; 2odule at ->IH
P#21=tart%(; // =tart P?;
#$ile %1( )
// =lo# do#n7 allo# us to see t$e c$an3e on FE/*
<or %i = 0; i J 20; iKK( /ela01us%-00(;
GKK;
P#21:$an3e1/ut0%G(; // :$an3e dut0 ratio
.
.
Prototype void Pw/_hange_%uty(char duty_ratio+e
%escription hanges PfO duty ratio. Para/eter duty_ratio takes values fro/ . to 8TT2 where .
is .g2 !8: is T.g2 and 8TT is !..g duty ratio. Lther specific values for duty ratio
can 'e calculated as (Percenth8TT+/!...
31 / 32
PR2
CCPR1L
Timer2
t
on
T
TD II2 GEII-1 IUT Troyes (Serge Moutou)
A33EXE
Descri#ti!n de *% mm!ire &A"
Cddr Xa/e *it : *it " *it T *it @ *it ? *it 8 *it ! *it . Zalue on
Power3on
Neset
*ank .
..h IX%#
Utilise le contenu de #4N pour adresser les donnes (pas un registre+
3333 3333
.!h BON. Bi/er te/ps rel $ 'its &&&& &&&&
.8h PL o/pteur progra//e ($ 'its de poids fai'le+ .... ....
.?h 4BCBU4 INP NP! NP. /BL /P% U % ...! !&&&
.@h #4N Pointeur indirect de //oire 3
.Th PLNBC 3 3 3
NC@/
BL[I
NC? NC8 NC! NC. 333& &&&&
."h PLNB* N*: N*" N*T N*@ N*? N*8 N*!
N*./IXB
.:h 3333 Xon i/pl/ent
.$h ))%CBC Negistre de donnes ))PNLO &&&& &&&&
.\h ))C%N Negistre d0adresses ))PNLO &&&& &&&&
.Ch PLCBA 333 333 333
o/pteur progra//e (poids haut+ Pus,u0- T 'its
333. ....
.*h IXBLX HI) ))I) B.I) IXB) N*I) B.I# IXB# NI*# .... ...&
Ralis avec OpenOffice sous Linux
32 / 32

Vous aimerez peut-être aussi