Utiliser les PIC 16F et 18F/Exercices/Les structures de contrôle et l'Arithmétique
Exercice 1
modifier1°) Sur combien de bits est l'adresse de destination du GOTO ? À comparer avec les 1k d'adresse mémoire du 16F84.
2°) Le PIC 16F877 possède 8k de mémoire programme et la même architecture que le 16F84 (mêmes instructions). Comment peut-on réaliser un saut de la première adresse vers la dernière ?
3°) Assembler le programme du TD 2 utilisant un GOTO.
1°) ceci est expliqué dans la partie cours. kkk kkkk kkkk représente 11 bits (il suffit de compter les k).
1k représente 10 bits donc le saut dans un 16F84 vaut toujours 0kk kkkk kkkk !
2°) on a 11 bits dans l'instruction et il en faut 13 pour 8k : il faut donc compléter l'adresse contenue dans l'instruction par 2 bits qui sont trouvés dans PCLATH, comme expliqué dans la partie cours.
3°) On a déjà donné ailleurs :
0000 00007 org 0x000 ; Adresse de départ après reset 0000 018E 00008 clrf somme 0001 080C 00009 movf donnee1,w ;donnee1 dans W 0002 070D 00010 addwf donnee2,w ;W <- W + donnee2 0003 008E 00011 movwf somme ;W -> somme 0004 00012 boucle 0004 2804 00013 goto boucle 00014 END
ce qui répond à la question
Exercice 2
modifier1°) On cherche à additionner deux valeurs 8 bits égales à 255 (0xFF). Quel est le résultat de la somme? Ce résultat tient-il dans une variable 8 bits ?
2°) Écrire un programme qui additionne quatre valeurs valeurs 8 bits pour mettre le résultat dans deux variables 8 bits("somme_pdsfort" et "somme_pdsfaible"). On vous donne la structure de données associée :
CBLOCK 0x00C ; début de la zone variables
somme_pdsfort :1 ; Zone de 1 byte
somme_pdsfaible : 1 ; zone de 1 bytes
val1 :1 ; zone de 1 byte 1ere valeur
val2 :1 ; zone de 1 byte 2eme valeur
val3 :1 ; zone de 1 byte 3eme valeur
val4 :1 ; zone de 1 byte 4eme valeur
ENDC ; Fin de la zone
CBLOCK 0x00C ; début de la zone variables
somme_pdsfort :1 ; Zone de 1 byte
somme_pdsfaible : 1 ; zone de 1 bytes
val1 :1 ; zone de 1 byte 1ere valeur
val2 :1 ; zone de 1 byte 2eme valeur
val3 :1 ; zone de 1 byte 3eme valeur
val4 :1 ; zone de 1 byte 4eme valeur
ENDC ; Fin de la zone
ORG 0x000
debut
clrf somme_pdsfort
clrf somme_pdsfaible
movf Val1,W ; Val1 -> W
addwf Val2,W ; W<- W + Val2
btfsc STATUS,C ; test si pas retenue
incf somme_pdsfort,f ; sinon incremente somme_pdsfort
addwf Val3,W ; W<- W + Val3
btfsc STATUS,C ; test si pas retenue
incf somme_pdsfort,f ; sinon incremente somme_pdsfort
addwf Val4,W ; W<- W + Val4
btfsc STATUS,C ; test si pas retenue
incf somme_pdsfort,f ; sinon incremente somme_pdsfort
boucle
goto boucle
END
Exercice 3
modifierUtiliser les opérations de décalage pour ajouter un calcul de la moyenne pour l'exercice 2.
CBLOCK 0x00C ; début de la zone variables
somme_pdsfort :1 ; Zone de 1 byte
somme_pdsfaible : 1 ; zone de 1 bytes
val1 :1 ; zone de 1 byte 1ere valeur
val2 :1 ; zone de 1 byte 2eme valeur
val3 :1 ; zone de 1 byte 3eme valeur
val4 :1 ; zone de 1 byte 4eme valeur
moyenne:1 ;zone un octet
ENDC ; Fin de la zone
ORG 0x000
debut
clrf somme_pdsfort
clrf somme_pdsfaible
movf Val1,W ; Val1 -> W
addwf Val2,W ; W<- W + Val2
btfsc STATUS,C ; test si pas retenue
incf somme_pdsfort,f ; sinon incremente somme_pdsfort
addwf Val3,W ; W<- W + Val3
btfsc STATUS,C ; test si pas retenue
incf somme_pdsfort,f ; sinon incremente somme_pdsfort
addwf Val4,W ; W<- W + Val4
btfsc STATUS,C ; test si pas retenue
incf somme_pdsfort,f ; sinon incremente somme_pdsfort
; calcul de la moyenne
bcf STATUS,C ;C<-0
rrf somme_pdsfort,f ;division par 2
rrf somme_pdsfaible,f ;division par 2
bcf STATUS,C ;C<-0
rrf somme_pdsfort,f ;division par 2
rrf somme_pdsfaible,f ;division par 2
; on a la moyenne dans somme_pdsfaible
movf somme_pdsfaible , w ; on charge la valeur obtenue dans w
movwf moyenne,f ;on range en moyenne comme demandé
boucle
goto boucle
END
Exercice 4
modifier(extraits de l'exercice 2 du Devoir Surveillé de 2010)
Structure for ... (rappel de cours)
modifierSi l’on sait combien de fois on exécute une boucle on peut utiliser la technique suivante :
;for (compteur=0;compteur<5;compteur++)
movlw 0x5 ; charger 5 dans w
movwf compteur ; initialiser compteur
boucle ; étiquette
;******* action 5 fois ici ***********
decfsz compteur , f ; décrémenter compteur et tester valeur
goto boucle ; si compteur pas 0, on boucle
;****** sortie de la boucle ici ***********
Question
modifierRéaliser un programme qui vient chercher six fois des valeurs (8 bits) sur le PORTB et les additionne dans une variable "Somme" (8 bits). On vous demande de gérer la somme sur 8 bits seulement sans gérer la retenue.
Indication
modifier movf PORTB,W ; PORTB -> W
L'instruction ci-dessus lit un registre qui s’appelle PORTB pour mettre sa valeur dans l’accumulateur W.
CBLOCK 0x00C ; début de la zone variables
compteur :1 ; Zone de 1 byte pour compter les boucles
somme : 1 ; zone de {{Unité|1|octets}} pour ranger la somme
ENDC ; Fin de la zone
ORG 0x000
clrf somme
;for (compteur=0;compteur<6;compteur++)
movlw 0x06 ;0x06 -> W
movwf compteur ;W -> compteur
boucle
movf PORTB,w ; PORTB -> W
addwf somme,f ; W+somme -> somme
decfsz compteur,f
goto boucle
...