Vous êtes sur la page 1sur 5

ENET’com Sfax AU 2016/2017

TD / TP Microcontrôleur N°2

Réalisé par :
Les Boucles de retard et les
Dalia Fendri
Interruptions 
Soulaimen Smaoui

Objectif :
 Utilisation de temporisation avec boucle de retard (avantages et inconvenants).
 Implémentation des interruptions

Sujet :
On désire réaliser un compteur décimal à deux chiffres (figure 1). Nous choisissons le port C pour
designer la valeur à afficher sur deux afficheurs 7 segments. Pour simplifier le montage nous utiliserons
des afficheurs DCB. L’incrémentation du nombre affiché est effectuée chaque cycle d’animation d’un
ensemble de 8 LED connectées au port D et qui forme une barre de progression. Le rythme de
l’animation est cadencé par des boucles de retard. Un bouton poussoir branché sur la broche RB0 est
envisagé pour la mise à zéro du compteur.

Figure 1 : Compteur décimal à deux chiffres

1
ENET’com Sfax AU 2016/2017

Travail demandé :
1- Donner un sous-programme en assembleur « Delay » qui permet de créer un retard de 500ms
sachant que l’horloge du PIC est de 1MHz.

2- Donner un sous-programme en assembleur qui permet d’animer l’allumage des diodes LED qui
sont branchées au port D. l’animation est une barre de progression qui allume les LED une par
une jusqu’à avoir toutes les LED allumer. Utiliser le sous-programme Delay pour ralentir
l’animation.

3- Donner un sous-programme en assembleur qui permet d’incrémenter et d’afficher une valeur


décimale sur deux chiffres. Le premier chiffre qui constitue les unités est affecté au quatre bit de
poids faible du port C. Le deuxième chiffre qui constitue les dizaines est affecté aux quatre bits
de poids fort du port C.

4- Donner une première version du programme principale qui teste l’état du bit RB0, s’il est égale
à 1 il réinitialise le compteur à 00 (reset du port C)

5- Simuler le programme avec le schéma fourni dans le fichier de projet ISIS « ResetCounter.dsn »

6- Déterminer le problème de cette configuration.

7- Donner une solution à ce problème en utilisant l’interruption externe sur RB0.

8- Simuler le programme de nouveau sur ISIS.

2
ENET’com Sfax AU 2016/2017

Solution :
#include "p16f877.inc"

; __config 0xFFFB
__CONFIG _FOSC_EXTRC & _WDTE_OFF & _PWRTE_OFF & _CP_OFF & _BOREN_ON & _LVP_ON &
_CPD_OFF & _WRT_ON

AN0 EQU 0X70 ; used for the TEMPO


AN1 EQU 0X71 ; used for the TEMPO
w_temp EQU 0x7D ; used for W register saving
status_temp EQU 0x7E ; used for STATUS register saving

org 0x0000 ; processor reset vector


GOTO START ; go to beginning of program

;;;;;;;;;;;;;;; INTERRUPT SERVICE ROUTINE ;;;;;;;;;;;;;;;;


org 0X0004
;------- 1st step: save important registers (W then STATUS) ---------
MOVWF w_temp ; save W register
MOVF STATUS,w ; copy STATUS into W
MOVWF status_temp ; save of STATUS contents

;------- 2nd step: Iterrupt Service Routines ISR ---------


CLRF PORTC
bcf INTCON,INTF ; external interrupt flag cleaned

;------- 3rd step: restore pre-ISR registers (STATUS then W) --------


MOVF status_temp,w ; retrieve copy of STATUS
MOVWF STATUS ; restore STATUS register contents
SWAPF w_temp,f
SWAPF w_temp,w ; restore pre-ISR W register contents
RETFIE ; return from interrupt

START BSF STATUS,RP0


BCF STATUS,RP1
BSF TRISB,0
CLRF TRISC
CLRF TRISD
BCF STATUS,RP0
CLRF PORTC
CLRF PORTD

;;;;;;;;;;;;;;; INTERRUPTION ACTIVATION ;;;;;;;;;;;;;;;;


movlw 0x90
movwf INTCON ; Activate external interrupt on RB0 (INTE bit)
; and the Global Interrupt Enable bit (GIE bit)

3
ENET’com Sfax AU 2016/2017

;;;;;;;;;;;;;; MAIN LOOP WITH INTERRUPTION ;;;;;;;;;;;;;;;


LOOP CALL ROT
CALL TEMPO
CALL INC
GOTO LOOP

;;;;;;;;;;;;;; MAIN LOOP WITHOUT INTERRUPTION ;;;;;;;;;;;;;;;


;LOOP BTFSC PORTB,0
; CLRF PORTC
; CALL ROT
; CALL INC
; GOTO LOOP

;;;;;;;;;;;;;;; LED ANIMATION SUB_PROGRAM ;;;;;;;;;;;;;;;;;


ROT CLRF PORTD
LOOPR CALL TEMPO
BSF STATUS,C
RLF PORTD,F
BTFSS PORTD,7
GOTO LOOPR
RETURN

;;;;;;;;;;;;;;; INCREMENT PORTC SUB_PROGRAM ;;;;;;;;;;;;;;;;


INC MOVLW B'00001111' ; Units mask
ANDWF PORTC,W ; Units extraction
SUBLW 0X09 ; Units comparison with 9
BTFSC STATUS,Z ; Verification if units are equal to 9
GOTO U_CLR ; Z=1: Go to unit clear and then increment decades
INCF PORTC ; Z=0: Unit increment
RETURN
U_CLR MOVLW B'11110000' ; Decades mask
ANDWF PORTC,F ; Units reset
MOVLW 0X90
SUBWF PORTC,W ; Decades comparison with 9
BTFSC STATUS,Z ; Verification if decades are equal to 9
GOTO D_CLR ; Go to decades clear or all PORTC clear
MOVLW 0X10 ; Decades increment (addition of 16)
ADDWF PORTC,F
RETURN
D_CLR CLRF PORTC ; Clear PORTC (this case is when PORTC = 99)
RETURN

;;;;;;;;;;;;;;;;; Delay loop ;;;;;;;;;;;;;;;;;;


TEMPO MOVLW 0XA2
MOVWF AN1
LOOPT DECFSZ AN0,F
GOTO LOOPT
DECFSZ AN1,F
GOTO LOOPT
RETURN

4
ENET’com Sfax AU 2016/2017

end

Vous aimerez peut-être aussi