SYSTEME DE CONTROLE D`ACCES ELA CT 1000+L SEQUENCE

publicité
SYSTEME DE CONTROLE D’ACCES ELA CT 1000+L
SEQUENCE 3
1- Notion d’assembleur :
1.1- Comment le micro contrôleur exécute-t-il un programme ? (comprendre ce qui suit, ne
pas l’apprendre…)
Le micro contrôleur est un circuit électronique, il ne comprend donc que des signaux
électriques.
MOVLW 10011111B et TRIS PORTB sont des instructions écrites en assembleur, le PIC ne
comprend pas l’assembleur.
Il faut d’abord traduire ces instructions en code opération donc en mots de 12 bits implantés
dans l’EEPROM du PIC pour que celui-ci puisse les exécuter
Pour que le µC exécute les instructions MOVLW 10011111B et TRIS PORTB il faut que la
mémoire programme contienne les code opération des instructions à réaliser.
Le contenu de l’EPROM doit être le suivant :
000h
110010011111
001h
000000000110
7FFh
101000000000
Analyse :
A la mise sous tension, la première instruction exécutée est celle implantée à l’adresse 7FFh
(vecteur de reset)
Le µC exécute donc l’instruction dont le code opération est 101000000000 (soit sur
le bus d’instruction 5V,0V,5V,0V, 0V, 0V, 0V, 0V, 0V, 0V, 0V, 0V)
Ces signaux sont interprétés par le décodeur d’instructions
101 est le code opération de l’instruction GOTO (voir page 54/56) qui est une
instruction de saut à l’adresse donnée par les 9 bits suivant le code 101 soit les 9 bits
000000000 auxquels on ajoute les bits PA1 et PA0 de STATUS en poids fort
(lesquels sont mis à 0 lors d’un reset ou à la mise sous tension : voir table 6.1 page
52/56) ce qui nous donne l’adresse sur 11 bits 00000000000B soit 000h
Le µC exécute alors l’instruction implantée à l’adresse 000h dont le code opération est
110010011111
1100 est le code opération de l’instruction MOVLW (charger W avec un littéral soit
une donnée de 8 bits)
Le littéral est 10011111
Après cette instruction on a 10011111 dans W et le compteur de programme est
augmenté de 1 et pointe donc l’instruction implantée à l’adresse 001h qui est déjà
chargée.
Le µC exécute alors l’instruction dont le code opération est 000000000110
000000000 est le code opération de l’instruction TRIS (charge un registre TRIS avec
le contenu de W)
Révisé le 14/12/2006
Page 1/10
Romuald REBECK
SYSTEME DE CONTROLE D’ACCES ELA CT 1000+L
SEQUENCE 3
Rappel séquence 2 : Une circuiterie de sélection est prévue directement depuis l’unité
de calcul pour ces 3 registres, la sélection s’effectue selon que l’on ajoute PORTA
(= 5 ou 5h) ou PORTB (=6 ou 6h ou PORTC (= 7 ou 7h) à l’instruction TRIS
Soit TRIS 05 en décimal ou TRIS 05h en hexadécimal pour charger le registre
TRISA
TRIS 06 ou TRIS 06h pour charger le registre TRISB
TRIS 07 ou TRIS 07h pour charger le registre TRISC
110 est l’adresse du registre tris à charger soit TRISB puisque 110B = 6 = 6h =
PORTB
Nous venons de voir ce qui se passe concrètement dans le PIC lors de l’exécution de 3
instructions.
1.2- Un peu d’histoire (pour votre culture personnelle) :
Dans les premiers ordinateurs (années 40), il n’y avait pas de ROM, pas de clavier, pas
d’écran mais des voyants puis des afficheurs, le programme était inscrit sur des cartes
perforées, soit uniques, soit multiples en accordéon, ou sur des bandes de papier. Un trou
représentait un 1 par exemple et une absence de trou un 0.
Nos instructions MOVLW et TRIS auraient eu l’allure suivante (les sont des trous, les +
des « non trous ») :
++ ++
++++++++ +
+
Des cellules photoélectriques ou des capteurs mécaniques (au début) transformaient les trous
en +V et les « non trous » restaient des 0V (ou le contraire)
Imaginez la difficulté du codage des instructions… (machine à perforer)
Même si l’on pouvait imaginer une machine à écrire qui transformait directement un
mnémonique (comme MOVLW) par l’appui d’une touche en
+ +, il restait à coder la
donnée en binaire ou en hexadécimal (là se serait le top du top).
Je ne suis pas un spécialiste de la préhistoire de l’informatique, mais je pense que les
premières cartes perforées étaient codées bit par bit.
La carte était ensuite introduite dans le lecteur, comme dans un orgue de barbarie et avançait
d’une ligne à chaque instruction.
Encore plus rigolo, les premières RAM étaient des mémoire à tube à vide (les fameuses
lampes des anciennes télés). Le transistor n’avait pas encore été inventé et il fallait 2 tubes
pour faire 1 bascule élémentaire soit un bit de mémoire (un octet devait alors tenir sur une
ligne de 35 cm de long , 2 cm de large et 5 de haut environ, pour un tube de 2cm de diamètre)
Révisé le 14/12/2006
Page 2/10
Romuald REBECK
SYSTEME DE CONTROLE D’ACCES ELA CT 1000+L
SEQUENCE 3
Après, sont apparues les mémoires vives à tore. Un tore est un anneau fait dans un matériau
qui reste aimanté après qu’on ait fait passer un courant dans un fil qui le traverse.
Le tore faisait un peu plus d’un millimètre de diamètre, il fallait un tore pour un bit.
Outre le travail de couture pour faire la matrice de fils qui traversaient les tores, la lecture
d’un tore était destructive. Pour lire un tore, il fallait envoyer un courant qui en détruisait le
contenu, il fallait alors réécrire son contenu après la lecture. Ce n’était pas parfait comme
système, mais bien moins cher que les tubes et ça ne consommait pratiquement rien, la donnée
étant conservée sous la forme d’une aimantation rémanente (alors que les tubes contiennent
un filament qui doit être chauffé en permanence)
Un des premiers calculateurs, l’ENIAC (1946) pesait 30 tonnes, comprenait 17 468 tubes,
7 200 diodes à cristal, 1500 relais, 70 000 résistances 10 000 condensateurs et environ 5
millions de joints soudés à la main, il était refroidi par plusieurs ventilateurs de 30CV et
occupait une salle de plus de 150 mètres carrés. Il fallait constamment changer les tubes
grillés (plusieurs par jour), si bien qu’il était plus souvent en panne, qu’opérationnel. Cet
ordinateur était toutefois capable de multiplier 2 nombres d’une dizaine de chiffres en
quelques ms, le programme était entré par câblage d’armoires électriques.
Allez faire un tour sur ce site, ça vaut le coup (photos de l’Eniac) :
http://histoire.info.online.fr/eniac.html
Puis sont apparues les transistors (1947) et ainsi les RAM et les ROM et les micro
processeurs, mais pas tout de suite...
1.3- Comment écrire un programme dans une PROM ?
Au plus simple, on peut programmer une PROM avec des interrupteurs pour faire les 0 ou 1,
case par case.
Par exemple pour une PROM 512 octets, 8 interrupteurs 2 positions (0 ou 1) pour les données
et 7 interrupteurs pour l’adresse.
Ainsi on positionne les 7 interrupteurs pour choisir l’adresse, on positionne les 8 interrupteurs
de la donnée à inscrire à cette adresse et on envoie l’impulsion de programmation.
Ce n’est pas rapide mais j’ai déjà programmé ainsi sur une plaque LABDEC avec des fils
pour interrupteurs, pour quelques dizaines d’octets, vu que je n’avais pas de programmateur.
Heureusement, en même temps que les PROM sont apparus les programmateurs de PROM,
d’abord autonomes, avec un clavier hexadécimal et des afficheurs (il fallait alors encore
programmer en code opération), ils ont rapidement évolué en se connectant à un microordinateur.
C’est alors qu’est apparue la puissance de l’assembleur.
1.4- L’assembleur :
L’assembleur est un langage créé à partir du code opération des instructions.
Au lieu d’écrire 110010011111 puis 000000000110 dans l’ EPROM du PIC en binaire ou
en hexadécimal , bit par bit avec des interrupteurs ou octet par octet avec un clavier en binaire
ou en hexadécimal, on allume le PC, on lance l’éditeur du programme d’assemblage et on
écrit :
Révisé le 14/12/2006
Page 3/10
Romuald REBECK
SYSTEME DE CONTROLE D’ACCES ELA CT 1000+L
MOVLW
TRIS
SEQUENCE 3
10011111B
6
Ensuite on lance la commande d’assemblage et l’assembleur traduit MOVLW par 1100,
rajoute la donnée 10011111B puis traduit TRIS par 000000000 et rajoute l’adresse 110 (il
traduit directement 6 décimal en 110 en binaire)
On obtient alors automatiquement le code opération de ces deux instructions sous forme d’un
listing :
110010011111
000000000110
Si l’on a défini l’adresse de début d’implantation du programme par exemple l’adresse 000h,
ce qui se fait avec la directive d’assemblage ORG 000h, qu’il suffit de placer ainsi :
ORG
MOVLW
TRIS
000h
10011111B
6
Après assemblage on a le listing suivant avec l’adresse d’implantation des instructions :
000h 110010011111
001h 000000000110
La 1ère instruction qui suit ORG 000h est placée à l’adresse 000h, la 2ème est placée à l’adresse
suivante soit 001h
Si l’on veut écrire ce mini programme dans l’EPROM du PIC, on connecte le programmateur
de PIC à l’ordinateur, on place le PIC sur son support et on lance la programmation.
Toutes les instructions sont écrites dans l’EPROM, le résultat est :
000h
110010011111
001h
000000000110
7FFh
Ainsi on a plus à s’occuper des codes opération, c’est l’assembleur qui s’en occupe, donc
à la fin du chapitre assembleur, on n’en parlera plus (ouf !!!), sauf au début de la
description des instructions...
On a maintenant des informations électriques correspondant à des instructions dans l’EPROM
(seules informations que le PIC peut comprendre)
Remarque, on n’a pas le contenu de l’EPROM vu au 1.1-, il manque le vecteur de reset.
Révisé le 14/12/2006
Page 4/10
Romuald REBECK
SYSTEME DE CONTROLE D’ACCES ELA CT 1000+L
SEQUENCE 3
Pour avoir le vecteur de reset il faudrait écrire en assembleur :
ORG
GOTO
7FFh
000h
ORG
MOVLW
TRIS
000h
10011111B
6
000h
110010011111
001h
7FFh
000000000110
MOVLW
TRIS
10011111B
6
101000000000
GOTO
000h
Remarque: la directive ORG, comme toutes les directives d’assemblage, n’est pas une
instruction, elle ne donne pas de code opération et n’apparaît pas dans l’EPROM.
Les directives d’assemblage ont pour but de faciliter l’écriture du programme en assembleur
et pour la directive ORG, de définir l’adresse absolue de manière définitive pour
l’implantation des différentes parties du programme.
2- Directives d’assemblage :
Outre la directive ORG que nous venons de voir, il en existe plusieurs autres que nous allons
examiner successivement.
2.1- Mais nous allons d’abord étudier la structure d’une ligne de programme en assembleur :
Le programme assembleur comporte 3 champs voir page 41/56
Dénomination
Champ étiquette
Champ instruction
Champ commentaire
Début
MOVLW 10011111B
; config ESSEEEEE
TRIS
; initialisation de PORTB
Exemple
6
L’étiquette est facultative et correspond à un mot au choix
Le champ commentaire est facultatif, un commentaire commence par un point virgule
On peut écrire une ligne de programme ne comprenant qu’un commentaire
Pour comprendre l’intérêt de l’étiquette reprenons le programme précédent :
ORG
GOTO
7FFh
000h
ORG
MOVLW
TRIS
000h
10011111B
6
Si l’on utilise une étiquette ce programme peut s’écrire :
Révisé le 14/12/2006
Page 5/10
Romuald REBECK
SYSTEME DE CONTROLE D’ACCES ELA CT 1000+L
Début
ORG
GOTO
7FFh
Début
ORG
MOVLW
TRIS
000h
10011111B
6
SEQUENCE 3
Début représente donc l’adresse de l’instruction MOVLW 10011111B soit 000h
On gagne en clarté !!! (trouver le mot « Début », c’est plus facile que trouver l’instruction
suivant la directive ORG 000h)
Avec des commentaires, le programme devient encore plus clair
Début
ORG
GOTO
7FFh
Début
; vecteur de reset
; saut au début du prog. (si power on ou reset)
ORG
MOVLW
TRIS
000h
10011111B
6
; implantation du prog. à partir de l’adresse 0
; configuration ESSEEEEE (E :entrée S :sortie)
; initialisation de PORTB
2.2- Avec la directive EQU (EQUATE) on simplifie encore l’écriture :
EQU signifie égal
Par exemple si l’on écrit PORTB
EQU 6 on indique à l’assembleur que lorsqu’on écrit
PORTB dans une instruction, on se réfère au registre d’adresse 6 (en décimal, ou 06h en
hexadécimal ou 00110 en binaire sur 5 bits qui est le format f f f f f des adresses dans les
instructions sans oublier qu’il faut rajouter les bits 6 et 5 de FSR pour la page de registres
mais là ça n’est pas important car les adresses 1100110 (=66h) ou 1000110 (=46h) ou
0100110 (=26h) renvoient toutes à la page 0, soit à l’adresse 0000110 (=06h)
Révisé le 14/12/2006
Page 6/10
Romuald REBECK
SYSTEME DE CONTROLE D’ACCES ELA CT 1000+L
SEQUENCE 3
Rappel séquence 2 :
Toutes ces adresses
renvoient à la page 0
26h
46h
66h
Et dans le cas d’une instruction TRIS c’est encore moins important, car l’instruction ne prend
en compte que les 3 bits de poids faible de l’adresse :
opcode
Donc écrire :
PORTB
EQU 6 (PORTB = 6) indique à l’assembleur que lorsqu’on écrit PORTB
dans une instruction c’est comme si l’on écrivait 6, le PIC comprend 6 (00110) c’est une
adresse d’un registre, par contre le mot PORTB, il ne le connaît pas. Il faudra donc
définir chaque registre au début du programme en écrivant :
….
STATUS
EQU 3 (voir page 51/56)
FSR
EQU 4
….
PORTC
EQU 7
Pour les registres spéciaux du PIC
Et
PARASI
EQU 08 (voir page 34/56)
NERROR
EQU 09
….
DATO1485 EQU 92
….
Pour les registres à usage général définis par l’utilisateur
(vérifier la définition des registres page 30/56)
Révisé le 14/12/2006
Page 7/10
Romuald REBECK
SYSTEME DE CONTROLE D’ACCES ELA CT 1000+L
SEQUENCE 3
Avec ce que nous venons de dire on peut écrire le programme précédent sous la forme:
PORTB
Début
EQU
6
; définition de l’adresse PORTB
ORG
GOTO
7FFh
Début
; vecteur de reset
; saut au début du prog. (si power on ou reset)
ORG
MOVLW
TRIS
000h
10011111B
PORTB
; implantation du prog. à partir de l’adresse 0
; configuration ESSEEEEE (E :entrée S :sortie)
; initialisation de PORTB
Ainsi on écrit l’adresse de PORTB une fois pour toute au début par la directive EQU et
chaque fois que l’assembleur trouvera PORTB dans une instruction, il remplacera PORTB par
6, ainsi les adresses des registres n’apparaissent plus dans le programme, il ne reste plus que
leur nom, ce qui est beaucoup plus clair (TRIS PORTB c’est mieux que TRIS 6)
Outre des adresses de registres, on peut définir des constantes avec la directive EQU
PORTB
ConfigPB
Début
2.3-
EQU
EQU
6
10011111B
; définition de l’adresse PORTB
; constante de configuration ESSEEEEE
ORG
GOTO
7FFh
Début
; vecteur de reset
; saut au début du prog. (si power on ou reset)
ORG
MOVLW
TRIS
000h
configPB
PORTB
; implantation du prog. à partir de l’adresse 0
; chargement constante de config PORTB
; initialisation de PORTB
Directive MACRO (déjà vue à la séquence 2) :
Cette directive permet de déclarer une série d’instructions comme une seule «super
instruction»
Exemple vu à la séquence 2 :
PAGREG0
MACRO
BCF FSR,6
BCF FSR,5
ENDM
; macro instruction pour sélectionner la page 0 des registres
En fait PAGREG0 n’est pas une nouvelle instruction pour le PIC .
Simplement, chaque fois que l’assembleur trouve la macro PAGREG0 dans le
programme, il va la remplacer à l’assemblage par les 2 instructions BCF FSR,6
et BCF FSR,5 ce qui permet d’écrire un programme assembleur moins long et plus
simple à comprendre.
Les macro instructions sont surtout utilisées pour des groupes d’instructions fréquemment
répétés dans le programme.
Révisé le 14/12/2006
Page 8/10
Romuald REBECK
SYSTEME DE CONTROLE D’ACCES ELA CT 1000+L
SEQUENCE 3
Il n’en reste pas moins qu’après la phase d’assemblage, chaque macro instruction remplira
autant d’emplacements dans l’ EPROM quelle comprend d’instructions. Le programme dans
l’EPROM sera donc aussi long que si l’on avait pas utilisé de macro instruction.
Ecrivons le programme précédent avec une macro instruction :
PORTB
ConfigPB
EQU
EQU
INITPORTB MACRO
MOVLW
TRIS
ENDM
ORG
GOTO
Début
6
; définition de l’adresse PORTB
10011111B ; constante de configuration ESSEEEEE
configPB
PORTB
; chargement constante de config PORTB
; initialisation de PORTB
7FFh
Début
; vecteur de reset
; saut au début du prog.(si power on ou reset)
ORG
000h
INITPORTB
; implantation du prog. à partir de l’adresse 0
; macro instruction d’initialisation de PORTB
Encore une fois cette version du programme se traduit toujours par le même contenu dans
l’EPROM :
000h
110010011111
001h
000000000110
7FFh
101000000000
Maintenant je pense que le principe de la programmation et l’assembleur ne doivent plus vous
effrayer.
L’assembleur, ce n’est pas compliqué et cela permet de manipuler les instructions sans se
soucier des codes opération, ni des adresses, à condition de les avoir définies au début par la
directive EQU, après on ne manipule plus que des noms de registres (et des noms de
constantes éventuellement)
2.4-
Dernière directive, #DEFINE :
Cette directive permet de nommer un bit d’un registre
Par exemple
#DEFINE
FLAGZERO
STATUS,2
Cette directive assigne au bit 2 du registre STATUS, le nom FLAGZERO
On peut écrire FLAGZERO à la place de STATUS,2 dans une instruction
Révisé le 14/12/2006
Page 9/10
Romuald REBECK
SYSTEME DE CONTROLE D’ACCES ELA CT 1000+L
SEQUENCE 3
Rappel : (voir powerpoint PIC n°2, registres spéciaux)
STATUS
PA1
PA0
Z
C
Si le résultat d’une opération est 0, le bit FLAGZERO sera à 1
En effet, le bit 2 du registre d’état STATUS est le « drapeau » (flag) de zéro, il est à 1 quand
une opération arithmétique donne le résultat 0, sinon il est à 0.
De même, on peut écrire :
#DEFINE
FLAGCARRY
STATUS,0
Si une opération arithmétique génère une retenue, le bit FLAGCARRY sera à 1
En effet, le bit 0 du registre d’état STATUS est le « drapeau » (flag) de retenue, il est à 1
quand une opération arithmétique (par exemple une addition), donne un résultat supérieur à
255, sinon il est à 0.
Ou comme dans le programme du clavier :
page 30/56, ligne 21 #DEFINE LED_V PORTC,0
En effet la LED verte est connectée sur RC0, donc gérée par le bit 0 du PORTC
Ainsi, à la ligne 116 page 33/56 on a l’instruction BSF LED_V qui équivaut à BSF PORTC,0
BSF : bit Set f (mise à 1 d’un bit du registre f), déjà vu pour les macro PAGREGX et PAGX
BSF PORTC,0 met le bit 0 du port C à 1 et donc la broche 18 (RC0) à 5V, ce qui allume la
DEL verte et là on est déjà dans le programme ! On avait déjà vu l’initialisation des
registres TRIS (page 31/56, lignes 47 à 51), maintenant on vient d’allumer la DEL verte.
Révisé le 14/12/2006
Page 10/10
Romuald REBECK
This document was created with Win2PDF available at http://www.win2pdf.com.
The unregistered version of Win2PDF is for evaluation or non-commercial use only.
This page will not be added after purchasing Win2PDF.
Téléchargement