Utiliser les PIC 16F et 18F/Les structures de contrôle et l'Arithmétique en assembleur

Début de la boite de navigation du chapitre

Dans ce chapitre, nous allons d’abord continuer à présenter les instructions liées à l'arithmétique avant de nous intéresser plus en détail aux structures de contrôles.

Les structures de contrôle et l'Arithmétique en assembleur
Icône de la faculté
Chapitre no 4
Leçon : Utiliser les PIC 16F et 18F
Chap. préc. :Arithmétique et assembleur
Chap. suiv. :Les sous-programmes en assembleur

Exercices :

Les structures de contrôle et l'Arithmétique
fin de la boite de navigation du chapitre
En raison de limitations techniques, la typographie souhaitable du titre, « Utiliser les PIC 16F et 18F : Les structures de contrôle et l'Arithmétique en assembleur
Utiliser les PIC 16F et 18F/Les structures de contrôle et l'Arithmétique en assembleur
 », n'a pu être restituée correctement ci-dessus.

Le cas particulier des multiplications et des divisions modifier

La division comme la multiplication sont des opérations coûteuses qui n'existent pas dans le jeu d'instructions de la série des PICs 16FXXX. Dans certains cas particuliers, elles peuvent se faire par des décalages (multilication ou division par  ). Voici les opérations de décalage correspondantes.

Opérations orientées octets entre registre et mémoire (File en anglais)
Mnémonique

Opérande

Description Cycles 14 bits Opcode status affected notes
RLF f,d Rotation gauche avec la retenue 1 00 1101 dfff ffff C 1,2
RRF f,d Rotation droite avec la retenue 1 00 1100 dfff ffff C 1,2

Quelques instructions de contrôles modifier

L'exécution d'un programme se fait instructions après instructions. Comme on utilise une ligne par instruction, cela veut dire qu'un programme se déroule ligne après ligne, sauf si...

Les instructions de contrôle sont destinées à réaliser des sauts dans les programmes. Ces sauts peuvent être conditionnels ou pas.

Instruction GOTO modifier

L'instruction GOTO est une instruction de saut inconditionnel que l’on a déjà rencontré dans le chapitre précédent.

Opérations orientées bits sur les registres
Mnémonique

Opérande

Description Cycles 14 bits Opcode status affected notes
GOTO k aller à l'adresse 2 10 1kkk kkkk kkkk

Voici en résumé le fonctionnement du goto :

  • L’adresse de saut sur 11 bits est chargée dans le compteur programme,
  • Les 2 bits manquants sont chargés depuis le registre PCLATH (b3 et b4),
  • Le résultat donne l’adresse sur 13 bits
  • La suite du programme s’effectue à la nouvelle adresse du compteur programme.

Cas particulier du 16F84 modifier

Les adresses de la mémoire morte sont seulement sur 10 bits pour le 16F84. Le registre PCLATH ne sera donc pas utilisé en complément. De même, le onzième bit (de l'instruction) ne sera pas pris en compte.

On peut donc reprendre l'instruction goto du 16F84 de la manière suivante :

Opérations orientées bits sur les registres
Mnémonique

Opérande

Description Cycles 14 bits Opcode status affected notes
GOTO k aller à l'adresse 2 10 1xkk kkkk kkkk

où l’on voit apparaître un x comme onzième bit de la destination puisque ce onzième bit ne peut pas être pris en compte.

Positionner et tester des bits modifier

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. Évidemment les bits sont choisis parmi 8 bits, et portent ainsi un numéro compris entre 0 (pour le poids faible) et 7 (pour le poids fort). Ainsi ce numéro de bit sera sur trois bits notés "bbb" pour ces deux types d'instructions.

Opérations orientées bits sur les registres
Mnémonique

Opérande

Description Cycles 14 bits Opcode status affected notes
BCF f,b mise à 0 du bit b dans f 1 01 00bb bfff ffff 1,2
BSF f,b mise à 1 du bit b dans f 1 01 01bb bfff ffff 1,2
BTFSC f,b test du bit b 0 de f saute si 0 1,(2) 01 10bb bfff ffff 1,2
BTFSS f,b test du bit b 0 de f saute si 1 1,(2) 01 11bb bfff ffff 1,2
Début d’un principe
Fin du principe


Voici un exemple dans lequel on doit exécuter une seule instruction supplémentaire si le bit vaut 1 :

Début de l'exemple
Fin de l'exemple


Que faire si les traitements nécessitent plusieurs instructions ? Et bien, on combine les sauts conditionnels avec les saut inconditionnels (par exemple goto).

On présente maintenant les structures de contrôle dans le cas du PIC (16FXXX).

Structure si-alors-sinon modifier

Cette structure est réalisée par deux instructions élémentaires de base btfsc et btfss.

Structure for (boucle avec compteur) modifier

On utilise l'une des deux instructions suivantes :

Opérations orientées octets entre registre et mémoire (File en anglais)
Mnémonique

Opérande

Description Cycles 14/16 bits Opcode status affected notes
DECFSZ f,d

DECFSZ f,d,a

Décrémente f (saute si 0) 1,(2) 00 1011 dfff ffff

0010 11da ffff ffff

Z 1,2,3
INCFSZ f,d

INCFSZ f,d,a

Incrémente f (saute si 0) 1,(2) 00 1111 dfff ffff

0011 11da ffff ffff

Z 1,2,3

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.

a est le RAM access bit :

  • 0 l'emplacement mémoire est en access RAM
  • 1 l'emplacement mémoire est en banked (déterminé par le registre BSR)
Début d’un principe
Fin du principe

Voici un exemple qui utilise un compteur de boucle :

Début de l'exemple
Fin de l'exemple


Structure répéter ... tant que ... et structure tant que... modifier

Nous ne traiterons pas le problème dans le cas général mais donnons seulement quelques exemples

; tant que C=0 on boucle
       movlw 0x5            ; charger 5 dans w 
boucle                      ; étiquette 
       addwf mavariable , f ; ajouter 5 à ma variable 
       btfsc STATUS,C    ; tester si le bit C du registre STATUS vaut 0 
	  goto suite        ; non (C=1), alors aller à suite 
       goto boucle       ; oui, on boucle 
suite
       movf mavariable , w  ; on charge la valeur obtenue dans w

On peut mieux faire avec un seul goto :

	; tant que C=0 on boucle
       movlw 0x5            ; charger 5 dans w 
boucle                      ; étiquette 
       addwf mavariable , f ; ajouter 5 à ma variable 
       btfss STATUS,C    ; tester si le bit C du registre STATUS vaut 1
	  goto boucle       ; non (C=0), alors aller à boucle
       movf mavariable , w  ; on charge la valeur obtenue dans w

Architecture du processeur pour les sauts modifier

La décomposition d'un processeur en chemin de données et unité de contrôle est abordée dans un autre projet, et si cela vous intéresse, lisez particulièrement le chapitre 4 et le chapitre 5.

 
Architecture simplifiée pour réaliser les sauts

Nous allons examiner dans cette section les conséquences de la présence des instructions de contrôle sur l'architecture des Microcontrôleurs.

Le schéma présenté simplifie encore une fois l'architecture à l'extrême. On y voit apparaître un chemin entre la sortie de la mémoire programme et l'entrée du compteur (en vert). Ce chemin est essentiel pour amener la partie destination de l'instruction de saut dans le compteur programme. Nous parlons de schéma simplifié car une telle architecture est incapable de prendre en compte les sauts conditionnels qui ajoutent soit 1 soit 2 au compteur programme, suivant le résultat du test. Nous en resterons là pour le moment.