Vous êtes sur la page 1sur 25

Microcontrôleur PIC16F84 : Aspect Programmation

I. Fonctions générales sur des Registres :


 Programme 1 : Charger/déplacer un registre
Charger la constante b'11011011' dans le registre 0x8C (bank1)
Charger la constante b'00100100' dans le registre 0x10 (bank0)
Déplacer le contenu du registre 0x10 au registre 0x11
Déplacer le contenu du registre 0x8C au registre 0x0D
Label Instruction Opérande Commentaires
List p=16f84 ; (instruction logiciel) choix du μC à programmer
include "p16f84.inc" ; (instruction logiciel) Librairie, qui contient les adresses des registres
et des bits
ORG 0x000 ; (instruction logiciel) Adresse Mémoire programme à laquelle
commence
; l’écriture de notre programme
; 0x000 la ligne du programme exécutée au démarrage ou après
MCLR
GOTO debut ; Sauter au label debut (adresse Mém. Prog. Aléatoire définie par le
logiciel)
; Chargement des constantes
debut BSF STATUS, RP0 ; Aller à la bank1 de la RAM
MOVLW b'11011011' ; mettre une constante binaire dans le registre de travail W
MOVWF 0x8C ; Déplacer le contenu de W vers l'adresse 0x8C

BCF STATUS, RP0 ; Aller à la bank0 de la RAM


MOVLW b'00100100' ; mettre une constante binaire dans le registre de travail W
MOVWF 0x10 ; Déplacer le contenu de W vers l'adresse 0x10
; Déplacement des registre
; BCF STATUS, RP0 ; Rester à la bank0 car les registres GPR de la bank1 sont
MOVF 0x10,W ; Déplacer le contenu de 0x10 dans le registre de travail W, résultat dans W
MOVWF 0x11 ; Déplacer le contenu de W vers l'adresse 0x11

; BCF STATUS, RP0 ; Rester à la bank0 car les registres GPR de la bank1 sont
; dupliqués dans la bak0 (reg 0x8C = reg 0x0C) –voir structure de la
RAM –
MOVF 0x0C, W ; Déplacer le Contenu du registre 0x0C vers le registre W
MOVWF 0x0D ; Déplacer le contenu de W vers l'adresse 0x0D
END ; (instruction logiciel) fin programme

 Programme 2 : Complément
Mettre les valeurs d’15’ et b’11001100’ dans les Variable var1 et var2, puis appliquer le compliment à ces 2 adresses.
Label Instruction Opérande Commentaire
List p=16f84 ; (instruction logiciel) choix du μC à programmer
include "p16f84.inc" ; (instruction logiciel) inclure la librairie du μC
ORG 0x000 ; (instruction logiciel) Adresse de démarrage après reset (instruction
logiciel)
var1 RES 0x0C ; (instruction logiciel) Réserver des adresses pour les variables
var2 RES 0x0D
GOTO debut ; Aller au label debut (adresse définie par le logiciel)

debut ; BCF STATUS, RP0 ; Aller à la bank0


; on peut ignorer cette instruction car au démarrage on est à la bank0 car (RP0=0)
MOVLW d’15' ; mettre une constante décimale dans W
MOVWF var1 ; Déplacer le contenu de W vers la variable var1
MOVLW b'11001100' ; mettre une constante binaire dans W
MOVWF var2 ; déplacer le contenu de W vers la variable var2

COMF var1, 1 ; Complément du contenu de la variable var1, résultat dans la même


variable
COMF var2, 1 ; Complément du contenu de la variable var2, résultat dans la même
variable
END ; (instruction logiciel) fin programme
 Programme 3 : Somme et Soustraction
2STE Lycée Technique Mohamed VI – Azilal [2019/2020] N. EL-GAOUTI Application A T C Page | 36
Mettre les valeurs h’33’ et b’11001100’ dans les variables var1 et var2,
La variable resu1 reçoit l’addition des contenus de var1 et var2, puis resu2 reçoit la soustraction var1 – var2
Label Instruction Opérande Commentaire
List p=16f84 ; Choix du μC à programmer (instruction logiciel)
include "p16f84.inc" ; inclure la librairie du uC (instruction logiciel)
ORG 0x000 ; Adresse de la 1ère instruction dans la mémoire
programme(instruction logiciel)
var1 res 0x0C ; Réserver des adresses pour les variables
var2 res 0x0D
resu1 res 0x10
resu2 res 0x11
GOTO debut ; Aller au label debut (adresse définie par le logiciel)
debut MOVLW h’33' ; mettre une constante hexadécimale dans W
MOVWF var1 ; Déplacer le contenu de W vers var1
MOVLW b'11001100' ; mettre une constante binaire dans W
MOVWF var2 ; Déplacer le contenu de W vers var2

MOVF var1,W ; copier contenu de var1 vers W


ADDWF var2,W ; additionner le contenu de W et de var2, résultat dans W
MOVWF resu1 ; Déplacer le contenu de W vers resu1

MOVF var2,W ; copier contenu de var2 vers W


SUBWF var1,W ; soustraction des contenus var1 – W , résultat dans W
MOVF resu2 ; Déplacer le contenu de W vers resu2
END ; (instruction logiciel) fin programme

II. Utilisation des ports Entrée/Sortie :


 Programme 4 : Port en Sortie
Les ports A et B sont reliés à des afficheurs (Voir simulation)
Utiliser le PORTA pour afficher les valeurs hexadécimales sur 4 bits (5)16 (F)16 (A)16
Utiliser le PORTB pour afficher les valeurs binaires (11011011)2 (11110000)2 (00001111)2
Label Instruction Opérande Commentaire
List p=16f84 ; Choix du μC à programmer (instruction logiciel)
include "p16f84.inc" ; inclure la librairie du uC (instruction logiciel)
ORG 0x000 ; Adresse de la 1ère instruction dans la mémoire
programme(instruction logiciel)
GOTO debut ; Aller au label debut (adresse définie par le logiciel)
; Configuration des ports A et B
debut BSF STATUS, RP0 ; Aller à la bank1
MOVLW h'00' ; Configurer le port en Sortie (en mettant à 0
MOVWF TRISA ; les bits du TRIS) par constante b'0000 0000'  W  TRIS
CLRF TRISB ; ou par RAZ du registre TRIS (TRISB pour configurer PORTB)
; Utilisation des ports A et B
BCF STATUS, RP0 ; Aller à la bank0
MOVLW h'05' ; Charger une constante héxadécimale dans le reg W
MOVWF PORTA ; Contenu du reg W vers le reg PORTA
MOVLW b'11011011' ; Charger une constante binaire dans le reg W
MOVWF PORTB ; Contenu du reg W vers le reg PORTB
Call temp ; appeler sous-programme « temp »
MOVLW h'0F' ; Charger une constante héxadécimale dans le reg W
MOVWF PORTA ; Contenu du reg W vers le reg PORTA
MOVLW b'11110000' ; Charger une constante hexadécimale dans le reg W
MOVWF PORTB ; Contenu du reg W vers le reg PORTB
Call temp ; appeler sous-programme « temp »
MOVLW h'0A' ; Charger une constante héxadécimale dans le reg W
MOVWF PORTA ; Contenu du reg W vers le reg PORTA
MOVLW b'00001111' ; Charger une constante binaire dans le reg W
MOVWF PORTB ; Contenu du reg W vers le reg PORTB
Call temp ; appeler sous-programme « temp »
END ; fin programme (instruction logiciel)

 Programme 5 : Port en entrée


Configurer le PORTA en entrée et stocker son contenu dans l’adresse 0x10
2STE Lycée Technique Mohamed VI – Azilal [2019/2020] N. EL-GAOUTI Application A T C Page | 37
Label Instruction Opérande Commentaire
List p=16f84 ; Choix du μC à programmer (instruction logiciel)
include "p16f84.inc" ; inclure la librairie du uC (instruction logiciel)
ORG 0x000 ; Adresse de la 1ère instruction dans la mémoire
programme(instruction logiciel)
GOTO debut ; Aller au label debut (adresse définie par le logiciel)
; Configuration du Port /// la configuration n’est pas obligatoire, au démarrage les PORTs sont configurés en entrée
Debut BSF STATUS, RP0 ; Aller à la bank1
MOVLW h'FF' ; Configurer le port A en entrée (en mettant à 1
MOVWF TRISA ; les bits du TRISA) par constante b'11111111'  W  TRISA
;CLRF TRISA ; ou par RAZ du registre TRISA puis le complément
;COMF TRISA,1 ;
; Utilisation du Port
BCF STATUS, RP0 ; Aller à la bank0
MOVF PORTA, 0 ; Contenu du reg PORTA vers le reg W
MOVWF 0x10 ; Contenu du reg W vers le reg 0x10
END ; fin programme (instruction logiciel)
 Programme 6 : PORTA (Entrée) vers le PORTB (Sortie)
Configurer le PORTA en entrée et recopier son contenu vers le PORTB en sortie
Label Instruction Opérande Commentaire
List p=16f84 ; Choix du μC à programmer (instruction logiciel)
include "p16f84.inc" ; inclure la librairie du uC (instruction logiciel)
ORG 0x000 ; Adresse de la 1ère instruction dans la mémoire
programme(instruction logiciel)
GOTO debut ; Aller au label debut (adresse définie par le logiciel)
; Configuration du Port : au démarrage les PORTs sont configurés en entrée, on configure seulement le PORTB en sortie
debut BSF STATUS, RP0 ; Aller à la bank1
MOVLW h'00' ; Configurer PORTB en Sortie (en mettant à 0
MOVWF TRISB ; les bits du TRISB) par constante b'0000 0000'  W  TRISB
; CLRF TRISB ; ou par mise à 0 du registre
; Utilisation du Port
BCF STATUS, RP0 ; Aller à la bank0
boucle MOVF PORTA, 0 ; Déplacer le Contenu du reg PORTA vers le reg W
MOVWF PORTB ; Déplacer le Contenu du reg W vers le reg PORTB
GOTO boucle ; répéter la boucle
END ; fin programme (instruction logiciel)

 Programme 7 : PORTB (4 Entrées) vers PORTB (4 Sorties)


Configurer le PORTA en entrée et stocker son contenu dans l’adresse 0x10
Label Instruction Opérande Commentaire
List p=16f84A ; Choix du µC à programmer (instruction logiciel)
include "p16f84A.inc" ; inclure la librairie du uC (instruction logiciel)
ORG 0x000 ; Adresse de la 1ère instruction dans la mémoire
programme(instruction logiciel)
GOTO deb ; Aller au label debut (adresse définie par le logiciel)
; Configuration du PORT
deb BSF STATUS, RP0 ; Aller à la bank1
MOVLW b'11110000' ; Configurer les bits 0,1,2,3 du PORTB en Sortie
MOVWF TRISB ; et les bits 4,5,6,7 en entrée
; utilisation du PORT
BCF STATUS, RP0 ; Aller à la bank0
MOVLW b'11110000' ; créer un masque
ANDWF PORTB,1 ; Appliquer le masque // effacer les anciennes sorties et garder les
entrées
MOVF PORTB,W ; Contenu du PORTB vers W
MOVWF var1 ; Contenu du W vers var1
SWAPF var1,1 ; inverser Quartet-Quartet - Entrée vers sortie
MOVF var1,W ; Contenu de var1 vers W
IORWF PORTB,1 ; Contenu du W vers PORTB
END ; fin programme (instruction logiciel)

 Programme 8 : Structure de teste


Tester l’entrée n° 0 du PORTA

2STE Lycée Technique Mohamed VI – Azilal [2019/2020] N. EL-GAOUTI Application A T C Page | 38


Si elle est à 1, le PORTB reçoit le mot binaire ‘10101010’ // Si elle est à 0, RAZ du PORTB
Label Instruction Opérande Commentaire
List p=16f84 ; Choix du µC à programmer (instruction logiciel)
include "p16f84.inc" ; inclure la librairie du uC (instruction logiciel)
ORG 0x000 ; Adresse de la 1ère instruction dans la mémoire
programme(instruction logiciel)
GOTO debut ; Aller au label debut (adresse définie par le logiciel)

; configuration
debut BSF STATUS, RP0 ; Aller à la bank1
CLRF TRISB ; Configurer PORTB en sortie // PORTA en entrée par défaut

; utilisation
BCF STATUS, RP0 ; Aller à la bank0

test BTFSS PORTA, 0 ; Tester si l'entrée 0 de PORTA est à 1 (résultat vrai 1 ou faut 0),
Sauter si 1
GOTO sifaux ; Saut vers label [sifaux] si le résultat du test est Faut
GOTO sivrai ; Saut vers label [sivrai] si le résultat du test est Vrai

sivrai MOVLW b'10101010' ; Charger la valeur binaire 10101010 dans W


MOVWF PORTB ; contenu de W vers PORTB // affecter les sorties
GOTO test ; répéter depuis le label test
sifaux CLRF PORTB ; RAZ du PORTB
GOTO test ; répéter depuis le label test

END ; fin programme (instruction logiciel)


III. Utilisation des Compteurs :
 Programme 9 : Comptage 10 états
Créer une variable « counter » et réaliser un comptage de 10 états
Solution 1 : incrémentation de 0 à 10
Label Instruction Opérande Commentaire
List p=16f84A ; Choix du µC à programmer (instruction logiciel)
include "p16f84A.inc" ; inclure la librairie du uC (instruction logiciel)
ORG 0x000 ; Adresse de la 1ère instruction dans la mémoire programme
(instruction logiciel)
counter res 0x17 ; Réserver une adresse pour le compteur
GOTO deb ; Aller au label debut (adresse définie par le logiciel)

deb CLRF counter ; Mettre à 0 le compteur


increm INCF counter, 1 ; Incrémenter le contenu du compteur
MOVLW d’10’ ; charger la constante décimale 10 dans le reg W
SUBWF counter, W ; Soustraction (counter - W), résultat dans W
BTFSS STATUS, Z ; Tester le Bit Z (Z=1 si résultat nul) (ce test donne 1 Vrai – 0 Faux)
GOTO increm ; Si Faux alors répéter depuis [increm]
END ; Si Vrai alors fin du comptage // fin programme

Solution 2 : incrémentation de 246 à 0


Label Instruction Opérande Commentaire
List p=16f84A ; Choix du µC à programmer (instruction logiciel)
include "p16f84A.inc" ; inclure la librairie du uC (instruction logiciel)
ORG 0x000 ; Adresse de la 1ère instruction dans la mémoire
programme(instruction logiciel)
counter res 0x17 ; Réserver une adresse pour le compteur
GOTO deb ; Aller au label debut (adresse définie par le logiciel)

deb MOVLW d’246’ ; Charger une constante décimale 246 dans le reg W
MOVWF counter ; Déplacer Contenu du reg W vers counter
increm INCFSZ counter, 1 ; Incrémenter le contenu de counter et tester le bit Z (résultat du test
Vrai1-Faux0)
GOTO increm ; Si Faux alors répéter depuis [increm]
END ; Si Vrai alors fin du comptage // fin programme

2STE Lycée Technique Mohamed VI – Azilal [2019/2020] N. EL-GAOUTI Application A T C Page | 39


Solution 3 : décrémentation de 10 à 0
Label Instruction Opérande Commentaire
List p=16f84A ; Choix du µC à programmer (instruction logiciel)
include "p16f84A.inc" ; inclure la librairie du uC (instruction logiciel)
ORG 0x000 ; Adresse de la 1ère instruction dans la mémoire
programme(instruction logiciel)
counter res 0x17 ; Réserver une adresse pour le compteur
GOTO deb ; Aller au label debut (adresse définie par le logiciel)

deb MOVLW d’10’ ; Charger constante décimale 10 dans le reg W


MOVWF counter ; Contenu du reg W vers counter
decrem DECFSZ counter, 1 ; Décrémenter le contenu de counter et tester le bit Z (résultat du
test Vrai1-Faux0) GOTO decrem ; Si Faux alors répéter depuis [decrem]
END ; Si Vrai alors fin du comptage // fin programme

Solution 4 : Cycle complet


Label Instruction Opérande Commentaire
List p=16f84A ; Choix du µC à programmer (instruction logiciel)
include "p16f84A.inc" ; inclure la librairie du uC (instruction logiciel)
ORG 0x000 ; Adresse de la 1ère instruction dans la mémoire
programme(instruction logiciel)
counter res 0x17 ; Réserver une adresse pour le compteur
GOTO deb ; Aller au label debut (adresse définie par le logiciel)

deb MOVLW d’255’ ; Charger constante décimale 255 dans le reg W


/binaire1111.1111/hexa FF
MOVWF counter ; Contenu du reg W vers counter
decrem DECFSZ counter, 1 ; Décrémenter le contenu de counter et tester le bit Z (résultat du
test Vrai1-Faux0) GOTO decrem ; Si Faux alors répéter depuis [decrem]
END ; Si Vrai alors fin du comptage // fin programme
IV. Utilisation des temporisations :
 Programme 10 : Réaliser des temporisations sur registres
Fréquence Cycle
Quartz
Fq = 4MHz Tq = 0,25 µs
(exemple)
Fint = fq/4 =
Interne Tint = 4*Tq = 1 µs
1MHz
Externe
Fex = 1KHz Tex = 1ms
(exemple)
WatchDog fWD = 55,5Hz TWD=18ms
Solution 1 : Boucle simple
Label Instruction Opérande Nmbr de Cyc Commentaire
List p=16f84A ; Choix du µC à programmer (instruction logiciel)
include "p16f84A.inc" ; inclure la librairie du uC (instruction logiciel)
ORG 0x000 ; Adresse de la 1ère instruction dans la mémoire
programme(instruction logiciel)
counter res 0x10 ; Réserver une adresse pour le compteur
GOTO deb ; Aller au label debut (adresse définie par le logiciel)
deb CLRF counter 1 ; Mettre la valeur max (d’255’ = b’1111.1111’ = h’FF’) dans counter
COMF counter, 1 1 ; par RAZ puis complément ou par Cte -> W -> counter
decrem DECFSZ counter, 1 1*254 + 2 ; Décrémenter le registre et tester si 0 est atteint
GOTO decrem 2*254 ; Si Résultat du test est Faux alors Saut vers [decrem]
END ; Si Résultat du test est Vrai alors fin programme
Durée de la temporisation : 766*1us
N = 1+1+(254+2)+(2*254)
D = N*Tint = N*1µs = 766*1µs = 766µs
Solution 2 : 2 Boucles imbriquées 3*255
Label Instruction Opérande Nmbr de Cyc Commentaire
List p=16f84A ; Choix du µC à programmer (instruction logiciel)
include "p16f84A.inc" ; inclure la librairie du uC (instruction logiciel)
ORG 0x000 ; Adresse de la 1ère instruction dans la mémoire
programme(instruction logiciel)
cntr1 res 0x10 ; Réserver l’adresse du compteur principal
2STE Lycée Technique Mohamed VI – Azilal [2019/2020] N. EL-GAOUTI Application A T C Page | 40
cntr2 res 0x11 ; Réserver l’adresse du compteur imbriqué
GOTO deb ; Aller au label debut (adresse définie par le logiciel)

; initier la boucle principale


deb MOVLW d’03’ 1 ; mettre la valeur d’3’ dans le compteur1
MOVWF cntr1 1 ; de la Boucle Principale

imbriq CLRF cntr2 1*3 ; mettre la valeur max (d’255’) dans le compteur2
COMF cntr2, 1 1*3 ; de la Boucle Imbriquée
decrem DECFSZ cntr2, 1 (1*254 + 2)*3 ; Décrémenter le registre et tester si 0 est atteint
GOTO decrem (2*254)*3 ; Si Résultat du test est Faux alors aller vers [decrem]

; décrémenter principale ; Si Résultat du test est Vrai


DECFSZ cntr1, 1 1*2 + 2 ; décrémenter principale et tester si 0 est atteint
GOTO imbriq 2*2 ; Si Résultat du test est Faux alors Saut vers [imbriq]
END ; Si Résultat du test est Vrai alors fin programme
Durée de la temporisation :
Si la boucle principale est de 3 cycles
N=1+1+3+3+[(1*254 + 2)*3]+[ (2*254)*3]+2+2+4
D=N*Tint = N*1µs = 2308*1µs = 2,3ms
Si la boucle principale est initier à 255 cycles
N=1+1+255+255+[(1*254 + 2)*255]+[ (2*254)*255]+2+2+4
D=N*Tint = N*1µs = 195340*1µs = 0,2 s
Solution 3 : 3 boucles imbriquées 5*255*255
Label Instruction Opérande Nmbr de Cyc Commentaire
List p=16f84A ; Choix du µC à programmer (instruction logiciel)
include "p16f84A.inc" ; inclure la librairie du uC (instruction logiciel)
ORG 0x000 ; Adresse de la 1ère instruction dans la mémoire
programme(instruction logiciel)
cntr0 res 0x10 ; Réserver l’adresse du compteur principal
cntr1 res 0x11 ; Réserver l’adresse du compteur imbriquée1
cntr2 res 0x12 ; Réserver l’adresse du compteur imbriquée2
GOTO deb ; Aller au label debut (adresse définie par le logiciel)
; initier boucle principale
deb MOVLW d’05’ 1 ; mettre la valeur d’05’ dans le compteur1
MOVWF cntr0 1 ; de la Boucle Principale

; initier boucle imbriquée1


imbriq1 MOVLW d’255’ 1*5 ; mettre la valeur d’255’ dans le registre
MOVWF cntr1 1*5 ; de la boucle imbriquée1
; boucle imbriquée2
imbriq2 CLRF cntr2 1*255*5 ; mettre la valeur max (d’255’) dans cntr2
COMF cntr2 1*255*5 ; de la boucle Imbriquée2
decrem2 DECFSZ cntr2, 1 (1*254 + 2)*255*5 ; Décrémenter cntr2 et tester si 0 est atteint
GOTO decrem2 (2*254)*255*5 ; Si Résultat du test est Faux alors répéter [decrem2]

; décrémenter boucle imbriquée1 ; Si Résultat du test est Vrai


DECFSZ cntr1 (1*254 + 2)*5 ; Décrémenter principale et tester si 0 atteint
GOTO imbriq2 2*254*5 ; Si Résultat du test est Faux alors Saut vers [imbriq2]

; décrémenter boucle principale ; Si Résultat du test est Vrai


decR DECFSZ cntr0 1*4 + 2 ; Décrémenter répétition et tester si 0 atteint
GOTO imbriq1 2*4 ; Si Résultat du test est Faux alors Saut vers [imbriq1]
END ; Si Résultat du test est Vrai alors fin programme

Durée de la temporisation :
Si la boucle principale est de 5 cycles :
N = 1+1+5+5+(255*5)+(255*5)+[(1*254 + 2)*255*5]+[(2*254)*255*5]+[(1*254 + 2)*5]+( 2*254*5)+(1*4 + 2)+8
D=N*Tint = N*1µs = 980493*1µs = 980493µs = 1s
Si la boucle principale est de 255 cycles :
N = 1+1+255+255+(254*255)+(254*255)+[(1*254 + 2)*254*255]+[(2*254)*254*5]+[(1*254 + 2)*5]+( 2*254*5)+(1*3 + 2)+6
D=N*Tint = N*1µs = 50005143*1µs = 50005143µs = 50s

 Programme 11 : Sous-programme de temporisation en utilisant le TMR0


2STE Lycée Technique Mohamed VI – Azilal [2019/2020] N. EL-GAOUTI Application A T C Page | 41
Fréquence Cycle
Quartz Fq = 4MHz Tq = 0,25 µs
(exemple)
Interne Fint = fq/4 = Tint = 4*Tq = 1 µs
1MHz
Externe Fex = 1KHz Tex = 1ms
(exemple)
WatchDog fWD = 55,5Hz TWD=18ms
Solution 1 : Horloge interne sans prédiviseur
Label Instruction Opérande Nmbr de Cyc Commentaire
delai BSF STATUS, RP0 ; Aller à la Bank1 pour configurer le Option_reg
BCF OPTION_REG, T0SC1 ; Utiliser TMR0 avec l’horloge interne
BSF OPTION_REG, PSA ; Appliquer le prédiviseur au WatchDog
BCF STATUS, RP0 ; Aller à la bank0 qui contient le reg TMR0
CLRF TMR0 ; Remettre à 0 le TMR0
BCF INTCON, T0IF ; Remettre à 0 le flag T0IF
test BTFSS INTCON, T0IF [(x*1) + 2] = 255 TTMR0 ; Tester si le flag T0IF=1 (débordement TMR0)
GOTO test [(x*2)] ; Si Résultat du test est Faux alors Saut vers [test]
RETURN ; Si Résultat du test est Vrai alors retour vers le programme
principal
Durée de la temporisation :
Durée cycle TMR0 : TTMR0 = 1/fint = 1/(fq/4) = 4/4MHz = 1µs
D = 255 * TTMR0 = 255µs
Solution 2 : Horloge interne avec prédiviseur /256
Label Instruction Opérande Nmbr de Cyc Commentaire
delai BSF STATUS, RP0 ; Aller à la Bank1 pour configurer le reg Option
MOVLW b’00010111’ ; Config du TMR0 par reg OPTION
MOVWF OPTION_REG ; Horloge interne et prédiviseur /256
BCF STATUS, RP0 ; Aller à la bank0 qui contient le reg TMR0
CLRF TMR0 ; Remettre à 0 le TMR0
BCF INTCON, T0IF ; Remettre à 0 le flag T0IF
test BTFSS INTCON, T0IF [(x*1) + 2] = 255 TTMR0 ; Tester si le flag T0IF=1 (débordement TMR0)
GOTO test [(x*2)] ; Si Résultat du test est Faux alors Saut vers [test]
RETURN ; Si Résultat du test est Vrai alors retour vers le programme
principal
Durée de la temporisation :
Durée cycle TMR0 : TTMR0 = 1/(fint/256) = 256/(fq/4) = 256*4/4MHz = 256µs
D = 255 * TTMR0 = 65.280 µs = 65,28 ms
Solution 3 : Horloge externe sans prédiviseur
Label Instruction Opérande Nmbr de Cyc Commentaire
Delai BSF STATUS, RP0 ; Aller à la Bank1 pour configurer le reg Option
MOVLW b’00111111’ ; Config du TMR0 par reg OPTION
MOVWF OPTION_REG ; Horloge externe sans prédiviseur /256
BCF STATUS, RP0 ; Aller à la bank0 qui contient le reg TMR0
CLRF TMR0 ; Remettre à 0 le TMR0
BCF INTCON, T0IF ; Remettre à 0 le flag T0IF
test BTFSS INTCON, T0IF [(x*1) + 2] = 255 TTMR0 ; Tester si le flag T0IF=1 (débordement TMR0)
GOTO test [(x*2)] ; Si Résultat du test est Faux alors Saut vers [test]
RETURN ; Si Résultat du test est Vrai alors retour vers le programme
principal
Durée de la temporisation :
Durée cycle TMR0 : TTMR0 = 1/fex = 1/1kHz = 1ms
D = 255 * TTMR0 = 255ms

Solution 4 : Horloge externe avec prédiviseur /256


Label Instruction Opérande Nmbr de Cyc Commentaire
delai BSF STATUS, RP0 ; Aller à la Bank1 pour configurer le reg Option
MOVLW b’00110111’ ; Config du TMR0 par reg OPTION
MOVWF OPTION_REG ; Horloge externe et prédiviseur /256
BCF STATUS, RP0 ; Aller à la bank0 qui contient le reg TMR0
CLRF TMR0 ; Remettre à 0 le TMR0
BCF INTCON, T0IF ; Remettre à 0 le flag T0IF
test BTFSS INTCON, T0IF [(x*1) + 2] = 255 TTMR0 ; Tester si le flag T0IF=1 (débordement TMR0)
2STE Lycée Technique Mohamed VI – Azilal [2019/2020] N. EL-GAOUTI Application A T C Page | 42
GOTO test [(x*2)] ; Si Résultat du test est Faux alors Saut vers [test]
RETURN ; Si Résultat du test est Vrai alors retour vers le programme
principal
Durée de la temporisation :
Durée cycle TMR0 : TTMR0 = 1/(fex/256) = 256/1kHz = 256ms
D = 255 * TTMR0 = 65.280ms = 65,28s
 Programme 11 : sous-programme de temporisations en utilisant le WatchDog
Fréquence Cycle
Quartz Fq = 4MHz Tq = 0,25 µs
(exemple)
Interne Fint = fq/4 = Tint = 4*Tq = 1 µs
1MHz
Externe Fex = 1KHz Tex = 1ms
(exemple)
WatchDog fWD = 55,5Hz TWD=18ms
Solution 1 : utilisation avec test du bit TO
Label Instruction Opérande Nmbr de Cyc Commentaire
delai BSF STATUS, RP0 ; Aller à la bank1
MOVLW b’0000 1000’ ; Configurer le WD par registre Option
MOVWF OPTION_REG ; en choisissant la prédivision par 1
BCF INTCON, GIE ; désactiver les interruptions
CLRWDT ; remettre à 0 le WatchDog
test BTFSC STATUS, TO ; tester si le bit TO=0 (débordement WatchDog)
GOTO test ; Si Résultat du test est Faux alors Saut vers [test]
RETURN ; Si Résultat du test est Vrai alors retour vers le programme
principal
Durée de la temporisation :
Dt = Cycle complet du cycle WD TWD : de la RAZ du WD jusqu’au débordement TimeOut TO
Durée du cycle WD : TWD = 18ms

Solution 2 : utilisation avec le mode basse-consommation (Sleep)


Label Instruction Opérande Nmbr de Cyc Commentaire
delai BSF STATUS, RP0 ; Aller à la bank1
MOVLW b’0000 1000’ ; Configurer le WD par registre Option
MOVWF OPTION_REG ; en choisissant la prédivision par 1
CLRWDT ; remettre à 0 le WatchDog
SLEEP ; Activer mode basse-consommation
NOP ; Quitter mode Sleep sans exécuter interruption
RETURN ; Retour vers le programme principal
Durée de la temporisation :
Dt = Cycle complet du cycle WD TWD : de la RAZ du WD jusqu’au débordement TimeOut TO
Durée du cycle WD : TWD = 18ms
Solution 3 : utilisation avec le mode basse-consommation (Sleep) avec pré-diviseur :
Label Instruction Opérande Nmbr de Cyc Commentaire
delai BSF STATUS, RP0 ; Configurer le prédiviseur pour le WatchDog par
MOVLW h’0F’ ; le registre OPTION_REG avec PSA=1
MOVWF OPTION_REG ; et code diviseur par 128 (PS2 PS1 PS0 = 111)
CLRWDT ; Remettre à 0 le WatchDog
SLEEP ; Activer mode basse-consommation
NOP ; Quitter mode Sleep sans exécuter interruption
RETURN ; Retour vers le programme principal
Durée de la temporisation :
Dt = Cycle complet du cycle WD TWD : de la RAZ du WD jusqu’au débordement TimeOut TO
Durée du cycle WD : TWD = 18ms * 128 = 2304 ms = 2,3s
(on a TWD = 1/fWD donc avec prédiviseur de fréquence 1/(fWD/PS) = PS*1/fWD = PS*TWD)

V. Utilisation des interruptions :


 Programme 12 : Réaliser un jeu de 8 LED sur le PORTB qui marche comme ci-dessous :
- 2 LEDs sont allumées (0000.0011)
- Après une temporisation tempo1 les LEDs allumées se décalent d’un pas (0.1->1.2->2.3->3.4 …)
- pour la temporisation on utilise le TMR0 avec horloge externe de 1KHz et l’interruption T0I
Solution : utilisation de l’interruption T0I
Label Instruction Opérande Commentaire
2STE Lycée Technique Mohamed VI – Azilal [2019/2020] N. EL-GAOUTI Application A T C Page | 43
List p=16f84 ; Choix du µC à programmer (instruction logiciel)
include "p16f84.inc" ; inclure la librairie du uC (instruction logiciel)

; routine d’interruption
ORG 0x004 ; Adresse de début de la routine d’interruption
;BCF INTCON, GIE ; Bloquer les interruptions (automatiquement)
RLF PORTB, 1 ; Décalage à gauche du PORTB (à travers le bit C)
MOVLW d'236' ; Réinitialiser le TMR0 par la valeur 236
MOVWF TMR0 ; (20cycles TMR0 -> environ 5s)
BCF INTCON, T0IF ; RAZ l’indicateur de l’interruption T0IF (RAZ du flag)
;BSF INTCON, GIE ; Autoriser les interruptions
RETFIE ; Reprendre le programme principal

; Programme principal
ORG 0x000 ; Adresse de la 1ère instruction dans la mémoire
programme(instruction logiciel)
GOTO deb ; Aller au label deb (adresse définie par le logiciel)

; Configurer PORTB, TMR0 et l’interruption T0I


deb ORG 0x030 ; Choisir une adresse aléatoire pour sauter la zone réservée à l’interruption (à partir
de 0x004)
BSF STATUS,RP0 ; Aller à la bank1
CLRF TRISB ; Configurer PORTB en sortie (TRISB<-0000.000)
MOVLW b'00110111' ; Configurer du TMR0 par reg OPTION
MOVWF OPTION_REG ; Horloge externe et prédiviseur /256
BSF INTCON, T0IE ; Autoriser l’interruption INT
BSF INTCON, GIE ; Autoriser les interruptions

; initiation des valeurs sur PORTB


BCF STATUS, RP0 ; Aller à la bank0
MOVLW b'00000011' ; Charger une constance binaire dans W
MOVWF PORTB ; Contenu de W vers PORTB
; initier TMR0
MOVLW d'236' ; Réinitialiser le TMR0 par la valeur 236
MOVWF TMR0 ; (20cycles TMR0 -> environ 5s)
; boucle d’attente vide
bcl NOP ; Appeler le sous-programme de temporisation
GOTO bcl ; Complémenter le PORTB
END ; Sauter vers l’étape de temporisation

 Programme 13 : Réaliser un jeu de LED sur le PORTA qui marche comme ci-dessous :
Les LEDs sont allumée comme tel -> (10101)
Les LEDs changent d’état (01010) après une temporisation (delai)
Si une des entrées 4 à 7 du PORTB est modifiée, le cycle et interrompu
o Toutes les LED sont éteintes pendant une temporisation
o Puis on reprend le cycle normal
Si on appuie sur un bouton lié à l’entrée RB0, le cycle et interrompu
o Toutes les LED sont allumées pendant une temporisation
o Puis on reprend le cycle normal
Solution : utilisation des interruptions RBI et T0I
Label Instruction Opérande Commentaire
List p=16f84a ; Choix du µC à programmer (instruction logiciel)
include "p16f84a.inc" ; inclure la librairie du uC (instruction logiciel)
regW equ 0x0C ; Réserver des adresses pour les variables
regS equ 0x0D
regPA equ 0x0E
; sous-programme de temporisation
delai
RETURN
; Routine d’interruption (depuis l’adresse 0x004)
ORG 0x004 ; Adresse de début de la routine d’interruption
;BCF INTCON, GIE ; Bloquer les interruptions (automatiquement)
;Stocker les registres importants : W, STATUS, PORTA + compteurs
MOVWF regW ; Stocker le registre W en mémoire
SWAPF STATUS, 0 ; Stocker le registre STATUS en mémoire
2STE Lycée Technique Mohamed VI – Azilal [2019/2020] N. EL-GAOUTI Application A T C Page | 44
MOVWF regS
MOVF PORTA, 0 ; Stocker le registre PORTA en mémoire
MOVWF regPA
; Stocker les registres de temporisation
; gestion du PORT
BTFSS INTCON, INTF ; Tester les 2 sources d’interruption RBI (si RBIF=1)
GOTO rbi ; Si faux c’est l’interruption RBI
GOTO int ; Si vrai c’est l’interruption INT
rbi CLRF PORTA ; Mettre à 0 le PORTA
CALL delai ; Appeler le sous-programme de temporisation
GOTO rec ; Sauter vers l’étape de récupération
int CLRF PORTA ; Mettre à 1 le PORTA
COMF PORTA,1 ; Par RAZ puis complément de PORTA
Call delai ; Appeler le sous-programme de temporisation
GOTO rec ; Sauter vers l’étape de récupération
rec
; Récupérer les registres de temporisation
; Récupérer les registres importants : W, STATUS, PORTA + compteurs
MOVF regPA, 0 ; Récupérer le contenu du registre PORTA
MOVWF PORTA
SWAPF regS, 0 ; Récupérer le contenu du registre STATUS SWAPé
MOVWF STATUS
SWAPF regW,1 ; Récupérer le contenu du registre W par 2 SWAP
SWAPF regW, 0
BCF INTCON, INTF ;
BCF INTCON, RBIF ; RAZ des flags T0I et RBI
;BSF INTCON, GIE ; Autoriser les interruptions (automatiquement)
RETFIE ; Reprendre le programme principal

; Programme Principal
ORG 0x000
GOTO deb ; Aller au label deb (adresse définie par le logiciel)
deb ORG 0x050 ; Adresse de la 1ère instruction dans la mémoire
programme(instruction logiciel)
; configurer les sources d’interruption et le PORTA en Sortie
BSF STATUS, RP0 ; Aller à la bank1
CLRF TRISA ; Config PORTA en sortie (TRISA<-0000.000)
BSF INTCON, RBIE ; Autoriser interruption du PORTB
BSF INTCON, INTE ; Autoriser interruption du TMR0
BSF INTCON, GIE ; Autoriser les interruptions
; utiliser le PORTA pour faire clignoter les LED
BCF STATUS, RP0 ; Aller à la bank0
MOVLW b'00001010' ; Charger une constance binaire dans W
MOVWF PORTA ; Contenu de W vers PORTA
cli CALL delai ; Appeler le sous-programme de temporisation (non détaillé ici)
COMF PORTA,1 ; Complément du PORTA, résultat dans PORTA
GOTO cli ; Répéter l’étape de temporisation et le complément
END

VI. Adressage indirect :


 Programme 14 : L’adressage indirect :
- Mettre à Zéro les adresse de la RAM 0x0C à 0x4F
- Stocker successivement les valeurs entrées sur le port B dans la RAM (0x0C à 0x4F)

Label Instruction Opérande Commentaire


List p=16f84a ; (instruction logiciel) choix du μC à programmer
include "p16f84a.inc" ; (instruction logiciel) inclure la librairie du μC
ORG 0x000 ; Adresse de la 1ère instruction dans la mémoire
programme(instruction logiciel)
GOTO RAZ ; Aller au label deb(adresse définie par le logiciel)
; Mettre à Zéro les adresse de la RAM 0x0C à 0x0F
RAZ MOVLW 0x0C ; Mettre la première adresse dans FSR
2STE Lycée Technique Mohamed VI – Azilal [2019/2020] N. EL-GAOUTI Application A T C Page | 45
MOVWF FSR ;
maz CLRF INDF ; MAZ le registre INDF = le registre dont FSR contient l’adresse
INCF FSR, 1 ; Incrémenter FSR pour passer à l’adresse suivante
MOVF FSR, 0 ; Contenu du registre FSR vers le registre W
SUBLW 0x50 ; Soustraction (h’50’ – W) (tester si adresse
BTFSS STATUS, Z ; Tester si on a atteint la dernière adresse
GOTO maz ; Sifaux refaire une MAZ
GOTO sauv ; Si vrai, fin de programme

; Stocker successivement les valeurs entrées sur le port B dans la RAM (0x0C à 0x4F)
sauv MOVLW 0x0C ; Mettre la première adresse dans FSR
MOVWF FSR ; (PORTB est configuré en entrée au démarrage du PIC)
stock MOVF PORTB, 0 ; Contenu du registre PORTB vers le registre W
MOVWF INDF ; Contenu du registre W vers le registre INDF
; INDF = le registre dont FSR contient l’adresse
INCF FSR, 1 ; Incrémenter le registre FSR (passer à l’adresse suivante)
MOVF FSR, 0 ; Contenu du registre FSR vers le registre W
SUBLW 0x50 ; Soustraction (h’50’ – W) (tester si adresse
BTFSS STATUS, Z ; Tester si (Z = 1) on a atteint la dernière adresse
GOTO stock ; Sifaux stocker le nouveau contenu du PORTB
END ; Si vrai fin du programme
VII. Utilisation de l’EEPROM :
 Programme 15 : Utilisation de l’EEPROM
Tester l’entrée RB7, si RB7=1 Stocker le mot binaire du PORTB (entrées) dans l’EEPROM à l’adresse 0x01, si RB7=0 lire le contenu de l’adresse
0x02 de l’EEPROM et l’envoyer au PORTA (Sorties)
Label Instruction Opérande Commentaire
List p=16f84a ; (instruction logiciel) choix du μC à programmer
include "p16f84a.inc" ; (instruction logiciel) inclure la librairie du μC
ORG 0x000 ; (instruction logiciel) Adresse de démarrage après reset (instruction
logiciel)
GOTO deb ; Aller au label deb(adresse définie par le logiciel)

deb BSF STATUS, RP0 ; Bank1


COMF TRISA,1 ; Configurer le PORTA en sortie
MOVLW b'11000000' ; Configurer l’interruption EEI (la fin d’écriture)
MOVWF INTCON ; GIE=1 et EEIE=1

BCF STATUS, RP0 ; Bank0

test BTFSS PORTB,7


GOTO read
GOTO wri

; Stocker le mot binaire du PORTB ----> dans l'adresse 0x02 de l’EEPROM pour le conserver
wri MOVLW 0x02 ; Charger l’adresse EEPROM à laquelle on va faire

MOVWF EEADR ; l’écriture dans le registre EEADR

MOVF PORTB,0 ; Déplacer la donnée à stocker (PORTB) vers le registre W


MOVWF EEDATA ;Charger la donnée dans EEDATA

BSF STATUS, RP0 ; Aller à la bank1


BSF EECON1,WREN ; Autorise l’écriture dans la EEPROM
; Routine spécial d’écriture
MOVLW h'55' ; Séquence spécial d’écriture
MOVWF EECON2 ; charger successivement les valeurs h’55’ puis h’AA’
MOVLW h'AA' ; dans le registre EECON2
MOVWF EECON2

BSF EECON1, WR ; Lancer l’écriture


; mode basse consommation et attendre la fin d’écriture qui provoque un wakeup
SLEEP ; passer en mode de faible consommation en attendant
2STE Lycée Technique Mohamed VI – Azilal [2019/2020] N. EL-GAOUTI Application A T C Page | 46
NOP ; la fin d’écriture, puis continuer sans exécuter d'interruption
BCF EECON1, WREN ; Interdire l’écriture dans l’EEPROM
GOTO test

; lire une adresse de l’EEPROM et recopier le contenu vers le PORTA (Sortie)


read MOVLW 0x02
MOVWF EEADR ; Charger l’adresse EEPROM à lire

BSF STATUS, RP0 ; Aller à la bank1


BSF EECON1, RD ; Lancer la lecture de la donnée

BCF STATUS, RP0 ; Aller à la bank0


MOVF EEDATA,W ; Récupérer la donnée sur EEDATA
MOVWF PORTA ; Déplacer la donnée vers PORTA
GOTO test
END

2STE Lycée Technique Mohamed VI – Azilal [2019/2020] N. EL-GAOUTI Application A T C Page | 47


PIC16F877 – Store Automatisé
Actigramme de la fonction principale du système :

Store automatisé

Tache 0
Proposer un programme en assembleur qui permet de faire la commande manuelle du Store par un PIC 16F84
On adopte le montage minimal suivant :

Situation :
Les cartes d’entée soleil et vent sont endommagées, pour les remplacer on ne dispose que d’un convertisseur
Courant-tension (0->5V) pour le capteur soleil, et un convertisseur fréquence-tension (0->1V).

Tache 1
Peut-on utiliser ces tensions aux entrées du PIC ? Pourquoi ?
Quelle solution doit-on utiliser pour adapter ces signaux ?

Tache 2
Donner un programme en Assembleur pour le μC, qui permet d’acquérir le signal du capteur de soleil sur l’entrée
analogique An1, si cette entrée est supérieure à 0,75V, on déclenche le déroulage du Store (RB0).

Tache 3
Donner un programme sous Flowcode qui permet de faire la même fonction.

Tache 4 (à rendre)
Donner un programme en Assembleur pour le μC, qui permet d’acquérir le signal du capteur de vent sur l’entrée
analogique An1, si cette entrée est supérieure à 2,5V, on déclenche le déroulage du Store (RB1).

2STE Lycée Technique Mohamed VI – Azilal [2019/2020] N. EL-GAOUTI Application A T C Page | 48


MicroContrôleur PIC16F877 (μC) : Aspect Programmation
 Programme 1 : Donner un programme qui permet de
lire une entrée analogique :
 Ve est le signal d’un capteur de température LM35 (0-
1V)
 Le temps entre 2 lectures est 5s
 Allumer la LED si le résultat est supérieur à b’1000 0000
00’ (Ve = 0,5V <- t = 50°)
 Pour économiser sur la consommation d’énergie, le PIC
sera mis en mode SLEEP quand c’est possible (Wake-up
par les interruptions)

Label Instruction Opérande Commentaires Registre

List p=16f877 ; (instruction logiciel) choix du µC à programmer


include "p16f877.inc" ; (instruction logiciel) inclure la librairie du µC
regW res 0x20
regS res 0x21
ORG 0x0000 ; Prog Principal
GOTO deb

; Interruption
ORG ............................
BCF INTCON, GIE
; sauvgarder les registres W et Status
save MOVWF regW
............................ STATUS, 0
MOVWF regS

; routine d’interruption
tst BTFSS ............................ ; tester le bit de poid le plus fort qui correspond à la moitié
GOTO Sifaux de l’échelle = 2.5V
GOTO Sivrai
Sivrai ............................ PORTA, 2
GOTO rec
Sifaux ............................ PORTA, 2
GOTO rec

; récuperer les registres W et Status


rec SWAPF regS, 0
MOVWF STATUS
............................ ............................
............................ regW, 0

BCF ............................
BSF INTCON, GIE
RETFIE
; Sous-prog temporisation
; pour D = 5s on utilise le cycle complet du TIMER1 avec horloge interne et prédiviseur 8
; DTMR1 = [(65535Cycles)*(diviseur8)*(1microSec)] = 0,5s
; avec une boucle de répétition*10 on aura D = 10* DTMR1 = 5s

delai MOVLW d'10' ; initier la boucle de 10 sur registre 0x30


MOVWF 0x30
2STE Lycée Technique Mohamed VI – Azilal [2019/2020] N. EL-GAOUTI Application A T C Page | 49
; cycle du TIMER
tm1 ............................ ............................ ; RAZ du TIMER1
............................ ............................ ;
BCF ............................ ; RAZ du flag de débordement du TIMER1
ts BTFSS ............................ ; test du flag de débordement du TIMER1
GOTO ts ; si faux, répéter le test

DECFSZ 0x30 ; si vrai, décrémenter la boucle, et tester si 0


GOTO tm1 ; si faux, répéter le cycle du TIMER1
RETURN ; si vrai, fin de temporisation

; Programme principal
deb ORG 0x0100
;configurartion
............................ ............................ ; bank0
............................ ............................
............................ ............................
; Config TMR1
MOVLW ............................ ; T1CKPS1-0 = 11 (division /8); T1SCEN =1 (Activer horloge) ;
MOVWF ............................ ; TMR1CS=0 horloge interne) ; TMR1ON =1 (activer le périphérique)

............................ ............................ ; bank1


............................ ............................
............................ ............................
; Configuration de RA2 en sortie
BCF TRISA, 2
; Configuration del’Interruption du convertisseur
MOVLW ............................ ; GIE = 1 (Autoriser les interruption) ............................
MOVWF ............................
BSF ............................ ; (autoriser l’interruption du CAN)
; Configuration du CAN
MOVLW ............................ ; ADFM=1 (justifier à gauche)
MOVWF ............................ ; PCFG3-2-1-0 = 0101 (RA0 analogique, RA2 Sortie numérique,
RA3=Vref)

............................ ............................ ; bank0


............................ ............................
............................ ............................
; Configuration du CAN
MOVLW ............................ ; ADCS2-1-0=011 (horloge du CAN = RC) ;CHS2-1-0=000 (entrée AN0)
MOVWF ............................ ; GO=0 (ne pas lancer) ; ADON=1 Activer le (périphérique)

; utilisation du convertisseur
lancer BSF ADCON0, GO ; lancer conversion
SLEEP ; attendre la fin de conversion
CALL delai ; tempo 5s
GOTO lancer

END

2STE Lycée Technique Mohamed VI – Azilal [2019/2020] N. EL-GAOUTI Application A T C Page | 50


Les organigrammes :
Programme 01 Programme 02 Programme 03

2STE Lycée Technique Mohamed VI – Azilal [2019/2020] N. EL-GAOUTI Application A T C Page | 51


Programme 04 Programme 05 Programme 07

Programme 06

2STE Lycée Technique Mohamed VI – Azilal [2019/2020] N. EL-GAOUTI Application A T C Page | 52


Programme 08 Programme 09/1 Programme 09/2

Programme 09/3 Programme 09/4

2STE Lycée Technique Mohamed VI – Azilal [2019/2020] N. EL-GAOUTI Application A T C Page | 53


Programme 10/1 Programme 10/2

2STE Lycée Technique Mohamed VI – Azilal [2019/2020] N. EL-GAOUTI Application A T C Page | 54


Programme 10/3 Programme 11/1 Programme 11/3

Programme 11/2 Programme 11/4

2STE Lycée Technique Mohamed VI – Azilal [2019/2020] N. EL-GAOUTI Application A T C Page | 55


Programme 11bis/1 Programme 11bis/2 Programme 11bis/3

2STE Lycée Technique Mohamed VI – Azilal [2019/2020] N. EL-GAOUTI Application A T C Page | 56


Programme 12/principal Programme 12/interruption

2STE Lycée Technique Mohamed VI – Azilal [2019/2020] N. EL-GAOUTI Application A T C Page | 57


Programme 13/principal Programme 13/interruption

2STE Lycée Technique Mohamed VI – Azilal [2019/2020] N. EL-GAOUTI Application A T C Page | 58


Programme 14

2STE Lycée Technique Mohamed VI – Azilal [2019/2020] N. EL-GAOUTI Application A T C Page | 59


Programme 15/principal Programme 15/wright

Programme 15/read

2STE Lycée Technique Mohamed VI – Azilal [2019/2020] N. EL-GAOUTI Application A T C Page | 60

Vous aimerez peut-être aussi