12.07.2015 Views

microprocesseur

microprocesseur

microprocesseur

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

MICROPROCESSEURCours« Microcontrôleurs»3 ème partie : BASIC-52Burkhard KainkaNous avons utilisé l’assembleur dans les deux premières parties de cecours ; passons maintenant à un langage évolué : BASIC-52.< Return/Enter > est pressée. Lafenêtre de texte inférieure est un terminaldirect. Tous les caractèresintroduits sont immédiatementenvoyés au contrôleur. Les réponsesdu système apparaissent aussi danscette fenêtre.Après un Reset (réinitialisation),BASIC-52 s’initialise puis vérifie laRAM présente dans le système. L’interpréteurattend ensuite un caractèreespace du terminal. Ce caractèresert à déterminer automatiquementle nombre de bauds utilisés et àpositionner en conséquence l’interfacesérielle du microcontrôleur. Il nefaut donc pas presser d’autre toucheque la touche « espace » (ASCII 20h).BASIC-52 répond par le messaged’activation :Figure 1. Téléchargement de l’interpréteur Basic.Cet interpréteur pour contrôleurs 8052, bienconnu de nombreux utilisateurs expérimentésde microcontrôleurs et apprécié de tous,se trouve sur la disquette de programmes dela carte sous forme de fichier programmeBASIC-52.hex en format Hex Intel. Il suffitde télécharger (download) ce fichier dans lemicrocontrôleur au moyen du programmeMicroFlash.exe (figure 1). L’interpréteur,qui fait 8 Koctets, est transmis en un peu plusd’une minute.Pour utiliser l’interpréteur, il faut disposerd’un programme de terminal qui puisse transmettreles commandes et les programmes aucontrôleur par l’interface sérielle. Ona fait appel au programmeBASIC.EXE de H. - J. Berndt. Il fautajuster le port COM1 ou COM2 utiliséavant la première mise enmarche. La communication entre lesystème microcontrôleur et le PCs’effectue via l’embase K1. Le programme(figure 2) possède2 fenêtres de texte. La fenêtre supérieuresert à éditer le code sourceBasic. Chaque ligne peut être éditéesans limitations et n’est envoyée aucontrôleur que lorsque la touche*MCS-51(tm) BASIC V1.1*READY>On peut à présent introduire descommandes ou des lignes de programme.La demande Print MTOPfournit l’adresse la plus élevée de laRAM incluse et reconnue (MemoryTop), dans notre cas 32 767 pour 32 Kde RAM. Les mots-clés introduitssont indépendants de la casse, maiscomme l’interpréteur transmettoutes les lettres en majuscules, ellesapparaissent ainsi dans les listagesde programmes. On peut s’enconvaincre à l’aide d’un petit pro-26 Elektor 3/2002


MICROPROCESSEURMCS BASIC-52 1.3Cette nouvelle mise à jour de l’interpréteur d’origine par H.-J. Böhling et D. Wulf à déjà étéprésentée en février 2001 dans Elektor. Cet interpréteur a aussi été testé avec succès avecla carte flash. Le programme offre des instructions spéciales pour programmer et effacerdes EEPROM. Plusieurs programmes Basic peuvent être placés dans l’EEPROM et lancésspécifiquement. Toutes les étapes ont été vérifiées avec une EEPROM de 8 Koctets.1. Écrivons un programme.2. Programmons ce programme dans l’EEPROM avec XFER.3. Chargeons d’autres programmes avec XFER.4. PROG fournit le nombre de programmes enregistrés (disons 12)5. La commande ROM commute en EEPROM.6. ROM 2 permet d’activer le deuxième programme.7. PROG2 définit le premier programme dans l’EEPROM comme celui qui démarreautomatiquementLe premier programme en EEPROM est lancé automatiquement par chaque redémarragesans qu’on ait besoin d’un terminal.gramme a été lancé par RUN. Un signal rectangulaired’une fréquence d’environ 200 Hzapparaît sur P1.0. Le niveau sur P1.7 changeenviron chaque seconde, ce qui permet decommander directement une LED. Le programmecomparable en assembleur, qui comportaitpourtant une boucle de délai supplémentaire,était quelque peu plus rapide. Lesprogrammes en Basic tournent de 100 à1 000 fois plus lentement que les programmeséquivalents en assembleur. Mais cela n’a riend’étonnant : Basic-52 est un interpréteur,donc un programme assez complexe quiinterprète et exécute mot à mot la source enBasic. La complexité de cette tâche se reconnaîtdéjà à la taille de l’interpréteur : 8 Koctets.On n’atteint même pas 100 octets en rassemblanttous les exemples en assembleurdes 2 premières parties du cours. Les programmesétaient très simples et leur déroulementplutôt linéaire. La liste de tâchesaccomplies par l’interpréteur est, par contre,impressionnante. Pour exécuter un programmeen Basic, il doit reconnaître et évaluerles mots-clés. En outre, le traitement parl’interpréteur de toutes les valeurs numériquessous forme de nombres réels est bienplus complexe que celui de simples octets.Diviseur de fréquence en BasicChargeons maintenant Basic-52 d’effectuerune tâche concrète : la détection continued’impulsions d’entrée. Une sortie est commutéeaprès 10 impulsions puis remise àl’état initial après 20 impulsions au total. Leprogramme constitue donc en fait un diviseurde fréquence par 20 : il effectue une fonctiondont se chargent normalement quelques circuitsintégrés. Il sera intéressant de voir dansquelle mesure cela fonctionne.Basic-52 n’offre aucune possibilitésimple d’adresser les bits individuelsd’un port. Il faut donc toujours lire etécrire toutes les données du port. Onobtient l’information sur un état spécifiqueen appliquant la fonctionlogique ET à l’état total du port(masquage). Basic-52 offre la fonctionlogique .AND. appliquée à desoctets. Les 2 points précédant et suivantle AND indiquent que le traitementdoit être effectué sur les bits etnon pas comme une combinaisonlogique d’expressions (If condition1AND condition2 …). Ce masquageest effectué aux lignes 110 et 130 dulistage. Une seule opération permetde combiner 8 états de bits avec8 autres par un ET logique. Le résultatn’est égal à 1 que lorsque 2 bitscorrespondants sont tout deuxégaux à 1. Voici d’ailleurs2 exemples :10101010 .AND.00000001 =——————0000000011110001 .AND.00000001 =——————00000001On voit qu’un ET logique avec00000001b = 01h = 1 ne peut donnerque 1 ou 0. Seul le bit 0 du port estsurveillé, les autres bits sont ignorés.Tout se passe donc comme si onappliquait un masque au port qui nelaisse apercevoir que le bit choisicomme entrée. On pourrait d’ailleursutiliser la même méthode en assembleur,mais ce serait inutile car onpeut interroger directement un bitunique.100 COUNT=0110 INP=PORT1.AND.1120 IF INP=1 THEN GOTO 110130 INP=PORT1.AND.1140 IF INP=0 THEN GOTO 130150 COUNT=COUNT+1 :REM PRINT COUNT160 IF COUNT=10 THENGOTO 200170 IF COUNT=20 THENGOTO 250180 GOTO 110200 REM Output low210 PORT1=253:REM P1.1 = 0220 GOTO 110250 REM Output high260 PORT1=255:REM P1.1 = 1270 COUNT=0280 GOTO 110(divide.bas)Les programmes Basic comportentsouvent un grand nombre de sautspar GOTO, ce qui complique leur lecture,particulièrement lorsqu’il s’agitde gros projets. On parle souvent de« code spaghetti » pour désigner cegenre d’enchevêtrement difficile àdémêler. Le programme de divisionde fréquence en offre un bonexemple. Mais il montre aussi que cestyle est approprié pour de petitstravaux. Il est par contre indispensablede mieux structurer les programmesde plus grande taille, parexemple en faisant appel à des sousprogrammes.Le programme fait appel à unevariable Count comme compteurd’impulsions et à une variable INPpour l’état d’entrée du port 1.0.Count est initialisé à 0. Le programmeparcourt ensuite 2 bouclesdans lesquelles l’état du port estcontinuellement lu et évalué. Leslignes 110 et 120 sont parcouruestant que l’état est haut. Leslignes 130 et 140 en sont l’équivalentpour l’état bas. Ce n’est que lorsqu’unenouvelle transition au niveauhaut a lieu que la boucle se bouclepar un saut de la ligne 180 à laligne 110. Mais le compteur a étéincrémenté au passage à la28 Elektor 3/2002


MICROPROCESSEURligne 150. Les lignes 160 et 170 serventà déterminer si un des 2 étatsdu compteur (10 ou 20) a été atteint ;si oui, le programme saute à la partiecorrespondante dans laquelle lasortie est commutée. Le code à partirde la ligne 200 commute à l’état bas,à partir de la ligne 250 à l’état haut.Dans ce dernier cas, le compteur estaussi remis à 0.Le test de conditions provoquant ounon un saut déterminé forme unepart importante de la logique du programme.IF... THEN GOTO ...signifie donc : si la condition indiquéeest remplie, sauter à la lignetelle et telle, sinon exécuter simplementla ligne suivante. La conditionde la ligne 120 est INP=1. La comparaisoneffectuée est vraie lorsquel’entrée se trouvait justement dansl’état haut lors de l’interrogation duport à la ligne précédente.Le programme contient quelquescommentaires qui commencent parREM et dont le but est d’améliorer lalisibilité. Une ligne peut contenir plusieursinstructions qui doivent alorsêtre séparées par un caractère deuxpoints(:). Basic facilite la recherchedes erreurs en permettant d’insérerune instruction Print « juste en cas »pour visualiser un résultat intermédiaire.La ligne 150 contient les« débris » d’un test de ce genre.Print Count a été introduit pourvérifier le fonctionnement du compteur.Cela permettait de tester trèssimplement le traitement correct desimpulsions d’entrée. Et, en effet, uneerreur a été démasquée dans la versioninitiale du programme. Laremise à 0 du compteur (ligne 270)avait été oubliée lors du développement,ce qui faisait fonctionner à videla comparaison avec des états déterminésdu compteur (lignes 160, 170).Une fois les choses remises en état,l’instruction Print pouvait être « miseentre parenthèses » par REM, pourainsi dire débranchée. On pourraitbien entendu la supprimer complètementmais si jamais d’autres testsrequièrent la même instruction desortie, il suffit de supprimer REM pourse retrouver dans l’état précédent.Mais venons-en à une question intéressante,la fréquence limite atteintepar le diviseur. On a raccordé ungénérateur de fonctions au port P1.0et observé la sortie P1.1 avec unoscilloscope. Grosse déception deprime abord : alors que de simplescircuits intégrés TTL LS s’acquittentsans peine de cette tâche à une fréquencede 50 MHz, ce diviseur enBasic atteint déjà ses limites à 50 Hz.Ce programme est donc environ unmillion de fois plus lent. Si la fréquenced’entrée dépasse 50 Hz, desimpulsions d’entrée disparaissentsans laisser de trace, car le programmen’atteint pas à temps laligne où s’effectue l’interrogation.Mais c’est toujours un peu plusrapide que le comptage manuel.La comparaison avec une solutionpurement électronique ou manuellen’est toutefois pas particulièrementéquitable. La bonne question seraitplutôt : dans quels cas la solution enBasic est-elle la bonne ? Touts lesdomaines où des événements lentsdoivent être évalués offrent desapplications potentielles. On pourraitpar exemple concevoir une bobineusedont le moteur doit être arrêtéaprès exactement 1 650 tours. Larapidité et la simplicité de modificationdu programme Basic se révèlealors être un avantage, ainsi que lefait que l’échelle des nombres n’estpas limitée par le matériel.Démarrage automatiquede BASIC-52Les programmes en assembleur présententl’avantage de pouvoirdémarrer automatiquement (Autostart)en même temps que la carte. Ilscommencent donc à fonctionnerautomatiquement dès que le systèmeest mis en marche. De primeabord, Basic-52 n’offre malheureusementpas la même possibilité car leprogramme est mémorisé en RAMsous forme d’octets de données. Plusde tension de fonctionnement – plusde programme. Même avec uneRAM sauvegardée par batterie, leprogramme gardé en mémoire nedémarrerait pas automatiquement :il serait complètement effacé par l’interpréteurBasic lors de la mise enmarche car Basic-52 préfère que laRAM soit vide au départ.Mais les réalisateurs de l’interpréteuront prévu dès le début des fonctionspermettant de garder enEPROM un programme dans ledomaine d’adressage à partir de8000h. On peut faire appel à la mêmeméthode avec une EEPROM adjointeRAM1 1 28 282 2 WR 27 273 3 26 26EEPROM28C644 4 25 255 5 24 246 6 23 238 8 21 219 9 CS 20 2010 10 19 1911 11 18 1812 12 17 1713 13 16 1614 14 15 15dans ce domaine d’adressage. Il existe 2 possibilitésd’extension : on peut se servir du bussystème au connecteur à picots K8. Mais onpeut aussi souder un second socle d’extensionsur la RAM. Presque toutes les brochescorrespondent, seules les lignes CS(broche 20) et WR (broche 27) nécessitent untraitement spécial (figure 4).La RAM occupe le domaine d’adressagede 0 à 8FFFh. Le décodage d’adresse est trèssimple car seule la ligne A15 est reliée au CSde la RAM. Chaque fois que A15 est auniveau haut, c’est-à-dire pour les accèsd’adresses supérieures à 8000h, la RAM estinactive. Il suffit donc d’inverser le signald’adressage A15 avant l’entrée CS de l’EE-PROM supplémentaire. L’EEPROM sera bloquéedans le domaine inférieur et occupera ledomaine supérieur à 8000h.Les expériences effectuées jusqu’ici avec desEEPROM ont montré que le contenu de lamémoire pouvait être légèrement modifié lorsde la mise sous tension. Il s’agit vraisemblablementde l’effet d’une impulsion brève surWR. L’EEPROM ne sert alors pas à grandchose car le démarrage automatique ne réussitque si le programme mémorisé ne contientaucune erreur. Un cavalier qui permet d’empêchertoute programmation « sauvage » del’EEPROM fournit la solution. La figure 4reproduit la modification complète dans lecas d’une EEPROM 8 Koctets 28C64 avecinverseur et protection contre l’écriture.Basic-52 en version originale peut programmersa propre EPROM. Mais il est alors10k+5V7 7 22 22 1 / 474HC00Figure 4. Câblage de l’EEPROM.010208 - 4 - 143/2002 Elektor29


MICROPROCESSEURnécessaire de faire appel à un matériel spécialqui n’est pas disponible ici. Pas d’affolement,le processus de programmation del’EEPROM est si simple qu’il est à la portéed’un petit programme en Basic. Le programmeauxiliaire ci-dessous s’en chargera.Il sera chargé avec un programme existant(ici : lignes de 10 à 40) et lancé par GOTO9000. Il copie simplement tous les octets duprogramme à partir de l’adresse 200h de laRAM dans l’EEPROM à partir del’adresse 8011h. Trois octets supplémentairesse chargent d’assurer le démarrage automatiqueen transmettant au système d’exploitationles informations importantes telles quele nombre de bauds. Pour assurer un bonfonctionnement, il importe aussi de spécifierla limite supérieure de la RAM avec MTOP.10 FOR N=1 TO 25520 PORT1=N30 NEXT N40 GOTO 109000 N=200h : E=8011H9010 D=XBY(N)9020 PRINT N,D9025 XBY(E)=D9030 N=N+1 : E=E+19040 FOR T=1 TO 10 :NEXT T9050 IF D1 THENGOTO 90109100 XBY(8000H)=32H9105 FOR T=1 TO 10 :NEXT T9110 XBY(8001H)=0FFH9115 FOR T=1 TO 10 :NEXT T9120 XBY(8002H)=0DCH9125 FOR T=1 TO 10 :NEXT T9130 XBY(8010H)=055Hmtop = 8191goto 9000Dès que l’EEPROM est programmée,on peut commuter dans le domained’adressage supérieur au moyen dela commande ROM. Un programmeenregistré peut être lancé tout à faitnormalement par RUN et arrêté parCtrl C, mais ne peut pas être édité.RAM permet de revenir au domainemémoire normal. Il est donc possiblede faire résider 2 programmes indépendantsen mémoire.Le programme en EEPROM est lancéautomatiquement à chaque misesous tension. Si le programme estdestiné à une utilisation de longuedurée, il est préférable de retirer lecavalier de programmation pour éviterune reprogrammation accidentelle.Après cette courte introduction àl’emploi de Basic-52, le prochainarticle sera consacré à celui de C. Onpourra donc comparer 3 langages deprogrammation importants.(010208-4)30 Elektor 3/2002

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!