< Utiliser les PIC 16F et 18F
fin 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.

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 ). 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...

Définition

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.

Propriété

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 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
Principe

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 !!!).

Fin du principe

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

Exemple
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
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

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)
Remarque

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".

Principe

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 !!!).

Fin du principe

Voici un exemple qui utilise un compteur de boucle :

Exemple
       ; 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
Fin de l'exemple

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

; 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

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.



Cet article est issu de Wikiversity. Le texte est sous licence Creative Commons - Attribution - Partage dans les Mêmes. Des conditions supplémentaires peuvent s'appliquer aux fichiers multimédias.