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.