Vous êtes sur la page 1sur 9

UNIVERSITE DE TUNIS

Département de Génie Electrique


rôleur

Matière : Microprocesseur & microcontrôleur


Classe : 1ère Année Ingénieur GE

Les microcontrôleurs

Exercice 1
- Ecrire un programme avec l’instruction ADDWF permettant l’addition du contenu de l’adresse
mémoire 1C avec le contenu de l’adresse mémoire 1D et stocker le résultat de l’addition dans la mémoire
d’adresse 1F - déterminer le code machine du programme.

Exercice 2 (examen mai 2013)


Comparer le contenu de la mémoire d’adresses 1E Hex avec le contenu de la mémoire d’adresses
1F Hex et,
- si le contenu est le même, mettre 0 dans la mémoire d’adresses 1E Hex et mettre FF Hex dans
la mémoire d’adresses 1F Hex,
- et si le contenu est différent, échanger les données, c’est-à-dire : le contenu de la mémoire
d’adresses 1E Hex dans la mémoire d’adresses 1F Hex et inversement.

Exercice 3
- Ecrire un programme qui met à zéro 32 cases mémoires de l’adresse 10 à 2F
- Ecrire un programme qui fait le transfert du contenu de 16 cases mémoires de l’adresse 10 à 1F
vers les cases mémoires de l’adresse 20 à 2F

Exercice 4
Dans cet exercice on utilise le port A en entrée et le port B en sortie ( le port A est relié à 5
interrupteurs I4 … I0 et le port B à 8 Leds L7 … L0 ).
1- Allumer L0 si I2 actionné.
2- Allumer L4 si I0 et I1 actionnés.
3- Allumer L5 si I3 ou I4 actionné.
4- Ecrire un programme qui réalise une temporisation d’une seconde.
5- Allumer alternativement L0 et L2 toutes les secondes.
6- Ecrire un programme qui réalise un chenillard (allumage successif des leds à la cadence d’une
seconde)

Exercice 5
5-1- Donner l'organigramme et écrire un programme permettant d'allumer une Led (RB0=1) à la
1ère action sur un bouton (RA4 passe de 0 à 1) et éteindre la Led (RB0=0) au 2ème appui sur le bouton
poussoir (RA4 passe de 0 à 1).

Page : 1/9
5-2- En utilisant le mode compteur des impulsions sur RA4, Donner l'organigramme et écrire un
programme permettant d'afficher en binaire sur le portB (RB7…RB0) le nombre d'impulsions reçues sur

l'entrée RA4 (on utilise le front descendant pour le comptage des impulsions; et on suppose que le nombre
des impulsions ne dépassent pas 255).
Tableau des instructions du PIC16F84

Page : 2/9
Tableau des registres du PIC16F84

Page : 3/9
UNIVERSITE DE TUNIS

Département de Génie Electrique


rôleur

Matière : Microprocesseur & microcontrôleur


Classe : 1ère Année Ingénieur GE

Les microcontrôleurs

Exercice 1

Org 0x100
……….. BCF STATUS,RP0 ; Sélection du Bank 0
……….. MOVF 0x1C,W ; W←[0x1C]
……….. ADDWF 0x1D,W ; W←W+[0x1D]
……….. MOVWF 0x1F ; [0x1F]←W
……….. End.

Exercice 2
Comparer le contenu de la mémoire d’adresses 1E Hex avec le contenu de la mémoire d’adresses 1F Hex et,
• si le contenu est le même, mettre 0 dans la mémoire d’adresses 1E Hex et mettre FF Hex dans la mémoire
d’adresses 1F Hex,
• et si le contenu est différent, échanger les données, c’est-à-dire : le contenu de la mémoire d’adresses 1E
Hex dans la mémoire d’adresses 1F Hex et inversement.
Org 0x100
……….. BCF STATUS,RP0 ; Sélection du Bank 0
……….. MOVF 0x1E,w ; W←[0x1E]
……….. SUBWF 0x1F,w ; W←[0x1F]-W
……….. BTFSZ STATUS, Z ; Si flag Z=1 sauter l’instruction suivante
……….. GOTO ADR1 ; Aller à l’adresse Adr1 ([0x1E]≠ [0x1F])
……….. CLRF 0x1E ; [0x1E]← 0
……….. CLRF 0x1F ; [0x1F]← 0
……….. COMF 0x1F,f ̅̅̅̅̅̅̅̅̅
; [0x1F]← [0𝑥1𝐹]
……….. GOTO end ; sauter vers la fin du programme
ADR1 : MOVF 0x1E,w ; W←[0x1E]
……….. MOVWF 0x1D ; Sauvegarder une copie de [0x1E]
……….. MOVF 0x1F,w ; W←[0x1F]
……….. MOVWF 0x1E ; [0x1E] ←W
……….. MOVF 0x1D,w ; W←[0x1D] : restauration de la copie de 1E
……….. MOVWF 0x1F ; [0x1F] ←W
……….. End.

Page : 4/9
Exercice 3

Rappelle :
Adressage indirect est réalisé par deux registres :
- FSR : pour pointer l’adresse, on dit que FSR est un "pointeur".
- INDF : Mémoire du registre pointé par le registre FSR

Exemple 1:
On cherche à récupérer une information sauvegardée dans la mémoire, l’adresse de
cette information est donnée par le registre d’adresse 1Eh. Après avoir récupérer
l’information, on va la sauvegarder à l’adresse 1Fh.

Org 0x100
……….. BCF STATUS,RP0 ; Sélection du Bank 0
……….. MOVF 0x1E,w ; W←[0x1E]
……….. MOVWF FSR ; FSR ←W
……….. MOVF INDF,w ; W← INDF : charger w par le
contenu ; du registre pointé par FSR
……….. MOVWF 0x1F ; [0x1F] ←W
……….. End.

Exemple 2:
Sauvegarder l’état logique du port B dans l’adresse donnée par le registre d’adresse 1Eh.

Org 0x100
……….. BCF STATUS,RP0 ; Sélection du Bank 0
……….. MOVF 0x1E,w ; W←[0x1E]
……….. MOVWF FSR ; FSR ←W : pointer le registre cible
……….. MOVF PORTB,w ; W← PORTB
……….. MOVWF INDF ; INDF ←W : charger le registre pointé
; par le contenu de l'accumulateur W
……….. End.

• Ecrire un programme qui met à zéro 32 cases mémoires de l’adresse 10 à 2F.


Org 0x100
……….. BCF STATUS,RP0 ; Sélection du Bank 0
……….. MOVLW 0x10 ; W←10h
Adr1 : MOVWF FSR ; FSR ←W : pointer le registre cible
……….. CLRF INDF ; [FSR]← 0
……….. INCF FSR,f ; Incrémenter le contenu du pointeur FSR
……….. MOVLW 0x30 ; W←(2F+1)
……….. SUBWF FSR,w ; W← FSR - W : vérification si fin
……….. BTFSZ STATUS, Z ; Si oui (flag Z=1) sauter vers fin
……….. GOTO Adr1 ; Si non, passer à l’adresse suivante
……….. End. ; fin

Page : 5/9
• Ecrire un programme qui fait le transfert du contenu de 16 cases mémoires de l’adresse 10 à 1F vers les
cases mémoires de l’adresse 20 à 2F.

Var EQU 0x30 ; Réservation d’une case mémoire pour le


; sauvegarde temporaire des données
ADRDEP EQU 0x31 ; Réservation d’une case mémoire pour le
; sauvegarde de l’adresse de départ
ADRDES EQU 0x32 ; Réservation d’une case mémoire pour le
; sauvegarde de l’adresse de destination
Org 0x100
……….. BCF STATUS,RP0 ; Sélection du Bank 0
……….. MOVLW 0x10 ; W←10h
……….. MOVWF ADRDEP ; Initialisation du support de l'adresse de départ
……….. MOVLW 0x20 ; W←20h
……….. MOVWF ADRDES ; Initialisation du support de l'adresse de destination

Loop : MOVF ADRDEP,w ; W ← [ADRDEP]


……….. MOVWF FSR ; FSR ←W : pointer le registre de départ
……….. MOVF INDF,w ; W ← [FSR]
……….. MOVWF Var ; Sauvegarder une copie de l’information
……….. MOVF ADRDES,w ; W ← [ADRDES]
……….. MOVWF FSR ; FSR ←W : pointer le registre de destination
……….. MOVF Var,w ; W ← Var
……….. MOVWF INDF ; [FSR] ←W : transférer l’information

……….. INCF ADRDEP ; Incrémenter des adresses


……….. INCF ADRDES

……….. MOVLW 0x20 ; W←(1Fh+1)


……….. SUBWF ADRDEP,w ; W←[ ADRDEP]-W : vérification si fin
……….. BTFSZ STATUS, Z ; Si oui (flag Z=1) sauter vers fin
……….. GOTO Loop ; Si non, passer à l’adresse suivante
……….. End. ; fin

Exercice 4
Dans cet exercice on utilise le port A en entrée et le port B en sortie ( le port A est relié à 5 interrupteurs I4 … I0 et
le port B à 8 Leds L7 … L0 ).
4.1- Allumer L0 si I2 actionné.

Org 0x100
……….. BCF STATUS,RP0 ; Sélection du Bank 0
……….. CLRF TRISB ; Configuration du port B en sortie
……….. MOVLW 0xFF ; W←FFh
……….. MOVWF TRISA ; Configuration du port A en entrée

Loop : BTFSS PORTA,2 ; Test si pin 2 du port A est à l’état logique « H »


……….. BCF PORTB,0 ; Si non : L0←0
……….. BSF PORTB,0 ; Si oui : L0←1
……….. GOTO Loop ; Reboucler
……….. End. ; fin

Page : 6/9
4.2- Allumer L4 si I0 et I1 actionnés.
Org 0x100
……….. BCF STATUS,RP0 ; Sélection du Bank 0
……….. CLRF TRISB ; Configuration du port B en sortie
……….. MOVLW 0xFF ; W←FFh
……….. MOVWF TRISA ; Configuration du port A en entrée
CLRF PORTB ; Initialisation du port B : PORTB←0

Eteint : BCF PORTB,4


Loop : BTFSS PORTA,0 ; Test si pin 0 du port A est à l’état logique « H »
……….. GOTO Eteint ; Si non : éteindre L4
……….. BTFSS PORTA,1 ; Si oui : vérifier si Pin1 est aussi à l’état « H »
GOTO Eteint ; Si non : éteindre L4
BSF PORTB,4 ; Si oui : Allumer L4
……….. GOTO Loop ; Reboucler
……….. End. ; fin

4.3- Allumer L5 si I3 ou I4 actionné.


Org 0x100
……….. BCF STATUS,RP0 ; Sélection du Bank 0
……….. CLRF TRISB ; Configuration du port B en sortie
……….. MOVLW 0xFF ; W←FFh
……….. MOVWF TRISA ; Configuration du port A en entrée
CLRF PORTB ; Initialisation du port B : PORTB←0

Allumer : BSF PORTB,5


Loop : BTFSZ PORTA,3 ; Test si pin 3 du port A est à l’état logique « L »
……….. GOTO Allumer ; Si non : Allumer L5
……….. BTFSZ PORTA,4 ; Si oui : vérifier si Pin 4 est aussi à l’état « L »
GOTO Allumer ; Si non : Allumer L5
BCF PORTB,4 ; Si oui : éteindre L5
……….. GOTO Loop ; Reboucler
……….. End. ; fin

4.4- Ecrire un programme qui réalise une temporisation d’une seconde.


On suppose que le µC est cadencé par une horloge de fréquence 4Mhz. En effet, la durée d’un
4
cycle d’instruction est : 𝑇 = 4000000 = 1µ𝑠 (chaque instruction, hormis les sauts, dure 4 cycles
d’horloge). Pour réaliser une temporisation d’une seconde on doit charger le µc par 1000 000
cycles d’instructions d’où le sous-programme de temporisation : Delay_1s

CMP1 EQU 0x30 ; Déclaration d’un compteur


CMP2 EQU 0x31 ; Déclaration d’un deuxième compteur
CMP3 EQU 0x32 ; Déclaration d’un troisième compteur
Delay_1s ; Nom du souprogramme
……….. BCF STATUS,RP0 ; Sélection du Bank 0 : 1 cycle
……….. MOVLW 99 ; W←99 : 1 cycle
……….. MOVWF CMP1 ; Initialisation des compteurs : 1 cycle
MOVLW 40 ; W←40 : 1 cycle
……….. MOVWF CMP2 ; 1 cycle
……….. MOVLW 50 ; 1 cycle
……….. MOVWF CMP3 ; 1 cycle : Total 7 cycles

Page : 7/9
Loop NOP ; Ne rien faire : 1 cycle
……….. NOP ; Ne rien faire : 1 cycle
……….. DECFSZ CMP1,f ; CMP1 ← CMP1-1 et test si égale à 0 : 1 cycle
……….. GOTO Loop ; Si non sauter vers Loop : 2 cycles
; Total boucle 1 : 5 cycles
; Si oui
……….. MOVLW 99 ; W←99 : Rechargement du compteur 1 :1 cycle
……….. MOVWF CMP1 ; 1 cycle
……….. DECFSZ CMP2,f ; CMP2 ← CMP2-1 et test si égale à 0 :1 cycle
……….. GOTO Loop ; Si non sauter vers Loop : 2 cycles
; Total boucle 2 : 5 cycles + 1 cycle de DECFSZ CMP1,f
; Si oui
……….. MOVLW 40 ; W←40 : Rechargement du compteur 2 :1 cycle
……….. MOVWF CMP2 ; 1 cycle
……….. DECFSZ CMP3,f ; Si oui CMP3 ← CMP3-1 et test si égale à 0 :1 cycle
……….. GOTO Loop ; Si non sauter vers Loop : 2 cycles
; Total boucle 3 : 5 cycles + 1 cycle de DECFSZ CMP2,f
……….. RETURN ; 2 cycles + 1 cycle de DECFSZ CMP3,f

Donc si on initialise CMP1 par 99, CMP2 par 40 et CMP3 par 50, on aura une temporisation de :

𝑇𝑜𝑡𝑎𝑙 = 7 𝑐𝑦𝑐𝑙𝑒𝑠 + ([(𝐶𝑀𝑃1 ∗ 5 𝑐𝑦𝑐𝑙𝑒𝑠 + 6 𝑐𝑦𝑐𝑙𝑒𝑠) ∗ 𝐶𝑀𝑃2 + 6 cycles] ∗ 𝐶𝑀𝑃3)


+ 2 𝑐𝑦𝑐𝑙𝑒𝑠
𝑇𝑜𝑡𝑎𝑙 = 7 𝑐𝑦𝑐𝑙𝑒𝑠 + (1002300 𝑐𝑦𝑐𝑙𝑒𝑠) + 3 𝑐𝑦𝑐𝑙𝑒𝑠 ≅ 1𝑠

NB : On peut utiliser un timer comme une solution de temporisation matérielle.

4.5- Allumer alternativement L0 et L2 toutes les secondes.


Org 0x100
……….. BCF STATUS,RP0 ; Sélection du Bank 0
……….. CLRF TRISB ; Configuration du port B en sortie
……….. CLRF PORTB ; Initialisation du port B : PORTB←0
Loop BCF PORTB,0 ; éteindre L0
……….. BSF PORTB,2 ; Allumer L2
……….. CALL Delay_1s ; Appelle de sous-programme Delay_1s
……….. BCF PORTB,2 ; éteindre L2
……….. BSF PORTB,0 ; Allumer L0
……….. CALL Delay_1s ; Appelle de sous-programme Delay_1s
……….. GOTO Loop ; Reboucler
……….. End. ; fin

Page : 8/9
4.6- Ecrire un programme qui réalise un chenillard (allumage successif des leds à la cadence d’une seconde).

Org 0x100
……….. BCF STATUS,RP0 ; Sélection du Bank 0
……….. CLRF TRISB ; Configuration du port B en sortie
……….. CLRF PORTB ; Initialisation du port B : PORTB←0
BSF STATUS,C ; Set du flag C
Loop RLF PORTB,f ; Rotation de contenu du port B avec le flag C
……….. CALL Delay_1s ; Appelle de sous-programme Delay_1s
……….. GOTO Loop ; Reboucler
……….. End. ; fin

Exercice 5
5-1- Donner l'organigramme et écrire un programme permettant d'allumer une Led (RB0=1) à la 1ère action sur un
bouton (RA4 passe de 0 à 1) et éteindre la Led (RB0=0) au 2ème appui sur le bouton poussoir (RA4 passe de 0 à 1).

5-2- En utilisant le mode compteur des impulsions sur RA4, Donner l'organigramme et écrire un programme
permettant d'afficher en binaire sur le portB (RB7…RB0) le nombre d'impulsions reçues sur l'entrée RA4 (on utilise
le front descendant pour le comptage des impulsions; et on suppose que le nombre des impulsions ne dépassent
pas 255).

Page : 9/9

Vous aimerez peut-être aussi