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

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.

## Le cas particulier des multiplications et des divisions

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 $2^{n}$). 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

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...
On appelle saut ou rupture de séquence une réalisation de programme pour lequel un saut de lignes est réalisé. Les sauts peuvent se faire vers l'avant ou vers l'arrière. Un saut sera conditionnel s'il dépend d'une condition booléenne.
Les instructions de contrôle sont destinées à réaliser des sauts dans les programmes. Ces sauts peuvent être conditionnels ou pas.

### Instruction GOTO

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

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.
Souvenez-vous, que pour le 16F84 : Adresse de saut = adresse réelle.
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

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 | 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 |
Les instructions sauts conditionnels 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 (et une seule !!!).
Voici un exemple dans lequel on doit exécuter une seule instruction supplémentaire si le bit vaut 1 :
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

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

### Structure for (boucle avec compteur)

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)
Vous pouvez voir dans ce tableau des Opcode sur 14 ou 16 bits. Les premiers concernent la série 16F tandis que les deuxièmes concernent la série 18F. Ainsi "a" n'est présent que dans les 18F et c’est seulement pour cette série qu’il est nécessaire de distinguer la mémoire "access RAM" de la "mémoire banked".
Rappel : les instructions sauts conditionnels 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 (et une seule !!!).
Voici un exemple qui utilise un compteur de boucle :

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

Nous ne traiterons pas le problème dans le cas général mais donnons seulement quelques exemples
On peut mieux faire avec un seul goto :

## Architecture du processeur pour les sauts

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.
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.
| Arithmétique et assembleur | Les sous-programmes en assembleur |