# Utiliser les PIC 16F et 18F/Architecture du 16F84
## Architecture générale
### Architecture mémoire

La donnée de base de PIC (16FXXX) est l’octet. L’octet comporte 8 bits. Le bit b0 est le bit de poids faible et le bit b7 est le bit de poids fort.
Mémoire programme (ou mémoire morte) : la mémoire programme du PIC 16F84 de Microchip est organisée en mots de 14 bits. Le bit b0 est aussi le bit de poids faible et le bit b13 est le bit de poids fort. L'adressage de cette mémoire programme se fait sur 10 bits. La mémoire mémoire programme comporte donc 1k x 14 bits.
Mémoire EEPROM : le PIC (16F84) dispose de 64 octets de mémoire EEPROM.
Mémoire donnée (ou RAM) : le PIC (16F84) dispose de deux banques de mémoire RAM (sélectionnées par le bit RP0 du registre STATUS) subdivisées en deux parties :
* cases mémoires spéciales (registres spéciaux)
* cases mémoires libres que vous pouvez utiliser à votre guise.
La mémoire du 16FXXX est organisée en banques sélectionnées par le(s) bit(s) RP0 (et RP1) du registre STATUS. Seul RP0 est utilisé pour le 16F84, soit deux banques. Seul RP0 est utilisé pour le 16F84, soit deux banques.

#### RAM et Registres du 16F84

    Adr.Banque0Banque1Adr. 00hIndirect addr.Indirect addr.80h 01hTMR0OPTION_REG 02hPCLPCL82h 03hSTATUSSTATUS 04hFSRFSR84h 05hPORTATRISA 06hPORTBTRISB86h 07h---- 08hEEDATAEECON188h 09hEEADREECON2 0AhPCLATHPCLATH8Ah 0BhINTCONINTCON 0Ch - 4Fh68 cases mémoiresidem banque 08Ch - CFH 50h - 7FhinutiliséinutiliséD0H - FFH
La première partie de cette mémoire (les registres) est parfois appelée banc de registres.
On appellera dans la suite banc registres/RAM (ou BR/RAM) l’ensemble des données ci-dessus. Le mot anglais correspondant est File mais sa traduction par le mot "fichier" risque de porter à confusion.

### Le modèle de programmation du PIC (16F84)

Le modèle de programmation d'un processeur désigne l’ensemble des registres et l’Unité Arithmétique et Logique (ALU) : c’est ce qu’il faut connaître pour faire de la bonne programmation.
Il peut être présenté de la manière très simplifiée suivante :
Remarquez les bits du registre de Status :
* Z : zéro
* C : retenue (Carry)
* DC : demi-retenue (demi-carry)
* IRP : sélection Banque en adressage indirect
* PD : Power Down
* RP1 : sélection banque
* RP0: sélection banque
* TO : Timer Overflow
On appelle drapeau (flag en anglais) les bits spéciaux de certains registres, manipulés par le matériel. Z et C, bits du registre Status sont des drapeaux importants car ils sont utilisés pour des tests.
Certains drapeaux sont manipulés d'une certaine manière par le matériel et d'une autre par le logiciel, mais tout cela sera abordé plus loin dans ce livre.
Le pointeur de pile n'est manipulé directement par aucune instruction. Il ne comporte qu'une profondeur de 8 niveaux. Cette fonctionnalité manquante complique la réalisation de compilateurs de langage évolué (C par exemple).
Le compteur programme est en fait composé de deux registres 8 bits :
* PCL (02h/82h) pour les 8 bits de poids faibles (accessible en lecture/écriture)
* PCLATH (0Ah/8Ah) pour les 5 bits de poids forts (accessible en lecture/écriture)
Le 16F84 gère seulement 10 bits des 13 bits du PC comme le montre la figure ci-dessus. Pour utiliser les 13 bits il faut utiliser un 16F877, comme l'indique aussi la figure.
Le modèle de programmation complet est plus complexe, en particulier à cause des registres. Ces registres ont été présentés dans la section précédente.

## Réalisations de programmes assembleurs

Nous allons commencer doucement à présenter quelques instructions du PIC 16F84.

### L'instruction mov dans tous ses états

L'instruction mov est une instruction destinée à transférer une donnée d'un point source vers un point destination. La source peut être : mémoire programme, le banc de registres et mémoire RAM (noté BR/RAM dans la suite), ou l’accumulateur W. La destination peut être BR/RAM, ou le registre W (qui ne fait pas partie du BR/RAM).
Les différentes sources définissent les modes d'adressage que nous nous proposons d'examiner maintenant.

#### 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. La source est donc la mémoire programme.
Opérations littérales (adressage immédiat) et de contrôles pour 16FXXX :
| Mnémonique Opérande | Description | Cycles | 14 bits Opcode | status affected | notes |
| MOVLW k | chargement du littéral dans W | 1 | 11 00xx kkkk kkkk | | |
Vous avez dans ce tableau, à gauche le nom de l'instruction, puis une courte description en français suivie d'un nombre de cycle (pas très important pour la suite) enfin le code binaire de l'instruction (appelé aussi Opcode).
Ce tableau comporte assez d'information pour préciser que k est sur 8 bits. Il permet aussi de définir quelques notions.
* L'action qui permet de passer du mnémonique aux mots binaires (ou code machine) s’appelle assembler et le logiciel qui effectue cette opération un assembleur.
* L'action qui fait l'opération inverse s’appelle desassembler et le logiciel correspondant un déassembleur.

#### Adressage Direct

L'adresse de l'opérande se trouve dans l'instruction.
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 |
| MOVF f,d | déplacement de f vers W si d=0. Si d=1 déplacement F→F mais en positionnant Z | 1 | 00 1000 dfff ffff | Z | 1,2 |
| MOVWF f | déplacement de W vers f | 1 | 00 0000 1fff ffff | | |
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.
CBLOCK est une directive qui permet de réserver de la mémoire RAM pour les calculs. C'est ce que l’on appelle des variables. Comme toutes les variables, elles sont caractérisées par un nom, une taille, un contenu et une adresse. Il faut bien préciser la taille en octets de la ou des variables. Cette directive se termine toujours avec ENDC.
Cet exemple montre comment utiliser des noms symboliques pour les variables. La première variable se trouve toujours à l'adresse du CBLOCK.

### Bien comprendre le modèle de programmation

Il est important de bien comprendre le fonctionnement général d'un Microcontrôleur pour bien se persuader qu'une connaissance parfaite d'un état permet de trouver ses états suivants. Pour un micro-contrôleur, on appelle état, la connaissance (partielle) des valeurs des registres et des mémoires. Pour travailler sur ce modèle, il vous faut repérer le compteur programme et sa valeur, puis commencer à déassembler à partir de cette valeur.
| Introduction | Arithmétique et assembleur |