td pic
TRANSCRIPT
![Page 1: TD PIC](https://reader035.vdocuments.pub/reader035/viewer/2022073103/55cf94e7550346f57ba5375d/html5/thumbnails/1.jpg)
TD : les microcontrôleurs PIC 1ELT
Lycée Alkhaouarizmy 1 A.Taouni
Exercice 1 :
L'instruction mov dans tous ses états
L'instruction mov existe sous plusieurs formes que nous nous proposons d'examiner maintenant.
a) adressage Immédiat ou littéral (Immediate)
C'est l'adressage est le plus facile. L'opérande se trouve directement dans le programme derrière le code de
l'instruction.
Exercice 2 : 1°) Calculer la valeur de chacune des étiquettes "w_temp", "montableau" et "mavaraible", puis assembler
l'instruction movf du programme ci-dessus.
2°) On donne le contenu de la RAM correspondant à la directive.
Sauf spécification contraire, d vaut toujours, au choix : - 0 la destination est W et le contenu de l’emplacement mémoire n’est pas modifié. - 1 la destination est f (la lettre f) : dans ce cas le résultat est stocké dans l’emplacement mémoire.
Exemple :
; 64 octets en access RAM
CBLOCK 0x0C
w_temp :1 ; Zone de 1 byte
montableau : 8 ; zone de 8 bytes
mavariable :1 ; zone de 1 byte
ENDC ; Fin de la zone
...
movf mavariable ,0 ;movf mavariable ,W <=> (mavariable) -> W
![Page 2: TD PIC](https://reader035.vdocuments.pub/reader035/viewer/2022073103/55cf94e7550346f57ba5375d/html5/thumbnails/2.jpg)
TD : les microcontrôleurs PIC 1ELT
Lycée Alkhaouarizmy 2 A.Taouni
Quelle sera la valeur de l'étiquette mavariable (en hexadécimal) ?
Une instruction
movf mavariable ,w ;(mavariable) -> W
est exécutée, quelle valeur est chargée dans W (W, registre de travail 8 bits) ?
3°) Assemblez l'instruction de la question 2°)
4°) On ajoute l'instruction
movwf PORTA ; W -> PORTA
en fin de programme. Que fait cette instruction ? Assemblez cette instruction en vous servant de
l'architecture mémoire pour trouver la valeur de PORTA.
Exercice 3 : La directive utilisée pour réserver la mémoire RAM dans cet exercice est
CBLOCK 0x0C ; début de la zone variables en ACCESS RAM
somme_pdsfort :1 ; Zone de 1 byte
somme_pdsfaible : 1 ; zone de 1 bytes
compteur :1 ; zone de 1 byte
moyenne :1 ; le resultat sera ici
ENDC ; Fin de la zone
On donne les états (connaissance partielle : on ne connaît pas tout, mais c'est suffisant) suivants :
Exercice 4 : Écrire un programme qui transfert la valeur qui est dans "w_temp" dans la variable "mavariable".
Les instructions arithmétiques du 16F84 Nous présentons les instructions qui de près ou de loin, ont un rapport avec les calculs arithmétiques.
![Page 3: TD PIC](https://reader035.vdocuments.pub/reader035/viewer/2022073103/55cf94e7550346f57ba5375d/html5/thumbnails/3.jpg)
TD : les microcontrôleurs PIC 1ELT
Lycée Alkhaouarizmy 3 A.Taouni
Exercice 5 :
La directive utilisée pour réserver la mémoire RAM dans cet exercice est
CBLOCK 0x0C ; début de la zone variables en ACCESS RAM
data1 :1 ; zone de 1 byte
data2 :1 ; le resultat sera ici
ENDC ; Fin de la zone
On donne l'état (connaissance partielle : on ne connaît pas tout, mais c'est suffisant) suivant :
1°) D'après le schéma donné ci-dessus, désassembler la partie utile du code à l'aide du tableau d'instructions
précédents.
2°) Exécuter ensuite les instructions que vous pouvez et donner les états successifs.
Plus loin avec l'assembleur Après un reset ou un démarrage le PIC (16F84) démarre en adresse 0. L'adresse 0x004 étant réservée aux
interruptions, un programme aura une structure org 0x000 ; Adresse de départ après reset
goto start ; Adresse 0: initialiser
...
org 0x005 ; >=5 ici
start
END
start est une étiquette. Tout programme se termine par la directive END. Voici un programme complet qui
utilise une instruction goto facile à expliquer et présentée dans le TD suivant.
![Page 4: TD PIC](https://reader035.vdocuments.pub/reader035/viewer/2022073103/55cf94e7550346f57ba5375d/html5/thumbnails/4.jpg)
TD : les microcontrôleurs PIC 1ELT
Lycée Alkhaouarizmy 4 A.Taouni
; 64 octets en access RAM
CBLOCK 0x0C ; début de la zone variables sur 16F84
w_temp :1 ; Zone de 1 byte
status_temp : 1 ; zone de 1 byte
mavariable : 1 ; je déclare ma variable
ENDC ; Fin de la zone
org 0x000 ; Adresse de départ après reset
goto start; Adresse 0: initialiser
org 0x005 ; après l'interruption
start
clrf mavariable
boucle
incf mavariable,1 ;incf mavariable,f ->f
goto boucle
END
On distingue dans ce programme deux étiquettes (start et boucle), une définition symbolique des variables,
un commentaire et la définition de l'origine du programme.
Exercice 6 : Écrire un programme qui additionne deux valeurs en RAM ("donnee1" et "donnee2") et met le résultat dans
une variable 8 bits "somme".
Les tests : Nous présentons quatre instructions qu'il ne faut pas confondre. Les deux premières positionnent un
bit tandis que les deux dernières testent la valeur d'un bit.
Les instructions de tests fonctionnent toujours de la même manière sur les PICs. Si le test est négatif
on exécute la ligne suivante, sinon on saute une ligne.
Voici un exemple dans lequel on doit exécuter une seule instruction supplémentaire si
le bit vaut 1 :
btfsc STATUS,C ; tester si le bit C du registre STATUS vaut 0
bsf mavariable,2 ; non (C=0), alors bit 2 de mavariable mis à 1
xxxx ; la suite du programme est ici dans les 2 cas
Que faire si les traitements nécessitent plusieurs instructions ? Et bien, on combine les sauts conditionnels
avec les saut inconditionnels (par exemple goto).
Structure si-alors-sinon Cette structure est réalisée par deux instructions élémentaires de base btfsc et btfss :
Structure for (boucle avec compteur)
![Page 5: TD PIC](https://reader035.vdocuments.pub/reader035/viewer/2022073103/55cf94e7550346f57ba5375d/html5/thumbnails/5.jpg)
TD : les microcontrôleurs PIC 1ELT
Lycée Alkhaouarizmy 5 A.Taouni
On utilise l'une des deux instructions suivantes :
Voici un exemple qui utilise un compteur de boucle :
; boucler trois fois
movlw 3 ; charger 3 dans w
movwf compteur ; initialiser compteur
movlw 0x5 ; charger 5 dans w
boucle ; étiquette
addwf mavariable , 1 ; ajouter 5 à ma variable
decfsz compteur , 1 ; décrémenter compteur et tester sa valeur
goto boucle ; si compteur pas 0, on boucle
movf mavariable , 0 ; on charge la valeur obtenue dans w
Exercice 7 : Structure for Si l'on sait combien de fois on exécute une boucle on peut utiliser la technique suivante :
Technique utilisée par la suite
;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
Ré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 : movf PORTB,W ; PORTB -> W