You are on page 1of 5

Droulement sance mardi 06/mars/2017 :

Objectif : TD programmation assembleur 16F84

Exercice 1 :
Enonc : crire un programme qui :
- Dclare trois variables (var1, var2 et somme).
- Additionne ces deux valeurs.
- Met le rsultat dans une variable "somme".
Correction :

CBLOCK 0x00C
variable1 : 1
variable2 : 1
somme : 1
ENDC
movf variable1,w
addwf variable2,w
movwf somme

Remarques :

- movlw mavariable movlw 0x0E ; 0x0E est l@ mmoire de mavariable et non le contenu

On appelle a adressage immdiat.

- movf mavariable , wcontenu de l@ mmoire de mavariable dans w

On appelle a adressage direct.

Exercice 2 : On veut crire un programme assembleur qui permet de faire clignoter une
diode led connecte au pin RA4 ; Proposer un schma de montage.

Start

Bcf portA,4

Call tempo

Bsf portA,4

Call tempo

end

1
Remarque: Sortie collecteur ouvert:

-lorsque la logique interne place le niveau haut (1L) au pinle transist est satur Vs=0V.

-lorsque la logique interne place le niveau bas (0L) au pinle transist est bloqu Vs=Z
(Etat haute impdance : ninfluence pas le reste).

Vdd

1K
RA4

Exercice 3:

Exemple dapplication 1 :

En partant de ce schma, nous dsirons allumer la LED lorsque nous pressons le bouton, et
lteindre lorsque nous le relchons.

2

;********************************************************
LIST p=16F84 ; Dfinition de processeur
#include <p16F84.inc> ; Dfinitions de variables

#DEFINE LED1 PORTA,2 ; Led rouge1

#DEFINE BOUTON1 PORTB,2 ; bouton-poussoir1

;**** ASSIGNATIONS **********************************


OPTIONVAL EQU H'0000' ; Valeur registre option

org 0x000 ; Adresse de dpart aprs reset

bsf STATUS,RP0 ; slectionner banque 1


movlw OPTIONVAL ; charger masque
movwf OPTION_REG ; initialiser registre option
; rsistance de rappel en service
bcf TRISA , 2
bsf TRISB , 2

bcf STATUS,RP0 ; repasser banque 0


;********************************************************
; PROGRAMME PRINCIPAL *
;********************************************************
boucle ; tiquette dbut de la boucle principale
btfss PORTB , 2 ; tester RB2, sauter si vaut 1
bsf PORTA , 2 ; RB2 vaut 0, donc on allume la LED
btfsc PORTB , 2 ; tester RB2, sauter si vaut 0
bcf PORTA , 2 ; RB2 vaut 1, donc LED teinte
goto boucle ; et on recommence
END ; directive fin de programme

Exemple dapplication 2 :

Nous voulons faire clignoter notre LED une frquence de 1Hz (1 clignotement par seconde)
.

;********************************************************

LIST p=16F84 ; Dfinition de processeur

3
#include <p16F84.inc> ; Dfinitions de variables

#DEFINE LED PORTA,2 ; Led rouge

;*********** DECLARATIONS DE VARIABLES *********************

CBLOCK 0x00C ; dbut de la zone variables

cmpt1 : 1 ; compteur de boucles 1

cmpt2 : 1 ; compteur de boucles 2

cmpt3 : 1 ; compteur de boucles 3

ENDC ; Fin de la zone

org 0x000 ; Adresse de dpart aprs reset

bsf STATUS,RP0 ; slectionner banque 1

;**** initialisations spcifiques*****

bsf STATUS , RP0 ; on passe en banque 1

bcf TRISA , 2

bcf STATUS,RP0 ; repasser banque 0

goto start ; sauter au programme principal

;********************************************************

; SOUS-ROUTINE DE TEMPORISATION

;********************************************************

;---------------------------------------------------------------------

; Cette sous-routine introduit un retard de 500.000 s.Elle ne reoit aucun


paramtre et n'en retourne aucun

;---------------------------------------------------------------------

tempo

movlw 2 ; pour 2 boucles

movwf cmpt3 ; initialiser compteur3

boucle3

clrf cmpt2 ; effacer compteur2

boucle2

clrf cmpt1 ; effacer compteur1

boucle1

4
nop ; perdre 1 cycle

decfsz cmpt1,f ; dcrmenter compteur1

goto boucle1 ; si pas 0, boucler

decfsz cmpt2,f ; si 0, dcrmenter compteur 2

goto boucle2 ; si cmpt2 pas 0, recommencer boucle1

decfsz cmpt3,f ; si 0, dcrmenter compteur 3

goto boucle3 ; si cmpt3 pas 0, recommencer boucle2

return ; retour de la sous-routine

;********************************************************

; PROGRAMME PRINCIPAL *

;********************************************************

start

bsf LED ; allumer la LED

call tempo ; appeler la tempo de 0.5s

bcf LED ; teindre LED (LEDOFF)

call tempo ; appeler la tempor de 0.5s

goto start ; boucler

END ; directive fin de programme

Exercice 4: Commander un chenillard (projet faire avec MPLAB et ISIS)

Un C 16F84 est reli via le port B 6 diodes Leds cathode commune. On dsire raliser
un jeu de lumire dont la squence est la suivante :
- Initialement toutes les leds sont teintes
- Une seule diode sallume sur RB0
- Le point lumineux se dplace vers RB1, puis vers RB2 jusqu RB5.
Le cycle se rpte indfiniment.
a. Donner le montage du circuit.
b. Donner le programme en assembleur.