Bibliothèque technique gratuite ENCYCLOPÉDIE DE LA RADIOÉLECTRONIQUE ET DU GÉNIE ÉLECTRIQUE Programmation modulaire des systèmes de contrôle sur MCS48. Encyclopédie de l'électronique radio et de l'électrotechnique Encyclopédie de l'électronique radio et de l'électrotechnique / microcontrôleurs On sait qu'un même microcontrôleur peut contrôler à la fois un équipement technologique complexe et un moulin à café domestique ou une horloge électronique. L'adaptation à un objet spécifique s'effectue en modifiant le programme du microcontrôleur, le matériel n'est presque pas affecté. L'article proposé est consacré aux techniques de programmation des microcontrôleurs de la série MCS48, qui sont largement utilisés dans les systèmes de contrôle à des fins diverses. Ses principales dispositions sont également valables pour les appareils plus modernes. Le développement et la modernisation des programmes de contrôle sont grandement facilités s'ils sont construits selon un principe modulaire. Dans ce cas, après avoir acquis une certaine expérience, et surtout, notre propre bibliothèque de modules débogués, programmer un nouveau système de contrôle (CS) revient à remplacer certains modules d'un programme déjà existant et débogué et, éventuellement, à le compléter avec des fragments qui tenir compte des spécificités d'un système particulier. Ce principe est intégré dans la structure de nombreux langages de haut niveau (PASCAL, C++), et le programmeur est littéralement obligé de le suivre. Malheureusement, les ASSEMBLEURS (y compris pour MSS48), tout en donnant au programmeur une plus grande liberté de choix des moyens et des méthodes de résolution des problèmes, ne surveillent généralement pas du tout le respect de la discipline de programmation. Cela conduit souvent à la création de programmes si déroutants que même leurs auteurs ne peuvent pas comprendre ce qui a été fait après un certain temps, sans parler de l'utilisation de fragments débogués dans d'autres programmes. L'adhésion consciente aux concepts modulaires communs facilite et accélère grandement la programmation des microcontrôleurs. Un exemple de programme modulaire typique pour CS est donné dans le tableau. Sa syntaxe correspond à l'ASSEMBLAGE tabulaire TASM pour le microprocesseur 8048. Comme vous pouvez le voir, au début du texte du programme, les directives EQU donnent des noms aux constantes et attribuent des valeurs. L'utilisation de constantes nommées est toujours préférable à la spécification de valeurs numériques directement dans les instructions du processeur exécutable. Par exemple, le retard mis en œuvre par l'un des sous-programmes décrits ci-dessous est défini par trois nombres. Ils sont donnés par les constantes N1, N2 et N3. Si vous avez besoin de changer la vitesse d'obturation, il suffit de spécifier de nouvelles valeurs dans les opérateurs EQU. Sinon, il faudrait chercher dans tout le programme des instructions avec des opérandes égaux à ces nombres, décider si chacun d'eux se réfère à une temporisation et indiquer de nouvelles valeurs dans les cas nécessaires. Évidemment, un tel travail demande beaucoup de temps et souvent ne va pas sans erreurs. Cela est particulièrement compliqué par le fait que certaines commandes peuvent ne pas utiliser le nombre entier, mais, par exemple, son octet haut ou bas. ASSEMBER déjà au stade de la traduction du programme est capable de calculer certaines constantes en fonction des valeurs des autres. Cette possibilité est illustrée par le calcul des octets de poids fort (N3N) et de poids faible (N3L) du nombre NXNUMX. Ensuite, le programme alloue de la mémoire pour les variables. Ils le font avec les mêmes directives EQU, mais contrairement aux descriptions de constantes, ils ne spécifient pas les valeurs numériques des variables, mais les adresses des cellules mémoire qu'elles occupent. Si l'ASSEMBLEUR le permet, la possibilité d'utiliser des macros ne doit pas être négligée. Chacun d'eux est en quelque sorte une nouvelle instruction qui effectue une opération non directement prévue par le système d'instructions du processeur. Décrivant une instruction macro, le programmeur lui donne un nom (qui, bien sûr, ne coïncide avec le nom d'aucune des instructions "réelles") et spécifie les actions requises sous la forme d'une séquence d'instructions machine. Chaque fois qu'il rencontre une instruction macro dans un programme, l'ASSEMBLEUR la remplace par la séquence spécifiée. Dans cet exemple, deux macros sont utilisées. L'un d'eux transfère le contenu de l'accumulateur à la cellule de mémoire de données spécifiée par le paramètre macro, et l'autre - en retour. Après la mise sous tension (ou l'envoi d'un signal de réinitialisation), le microcontrôleur commence à exécuter le programme à partir de l'adresse zéro. Cette adresse est généralement utilisée pour écrire une commande de saut inconditionnel au point de départ réel du programme (dans ce cas, l'étiquette START). Cela est nécessaire car les interruptions matérielles transfèrent toujours le contrôle aux adresses fixes 3 et 7 (pour d'autres types de microcontrôleurs, les adresses peuvent être différentes, mais elles sont toujours situées au début de la mémoire programme). Les commandes de transition inconditionnelle vers les routines de service des interruptions correspondantes situées à ces adresses doivent être "contournées" par le programme principal. L'étape suivante consiste à définir les modes de fonctionnement du contrôleur (par exemple, sélectionner les banques de mémoire et les registres), à initialiser les variables et les périphériques externes. Une erreur typique des programmeurs novices est de supposer qu'immédiatement après le démarrage du programme, les variables ont déjà des valeurs définies. Cette idée fausse est renforcée par le fait que certains langages de haut niveau (comme le BASIC) définissent automatiquement toutes les variables à une valeur initiale de zéro. Dans les programmes en langage assembleur (et dans de nombreux autres langages), le programmeur lui-même doit veiller à ce qu'avant la première lecture de la valeur d'une variable, quelque chose ait déjà été écrit dans la cellule mémoire qui lui est allouée. Un bon style de programmation nécessite que des valeurs initiales soient attribuées aux variables au tout début du programme. Dans ce cas, cela est fait par le sous-programme 1INIT. La section d'initialisation de l'appareil externe ressemble généralement à un appel alternatif aux sous-programmes, chacun réinitialisant l'un d'eux (convertisseur analogique-numérique, indicateur LED, clavier, etc.) et peut être facilement remplacé lors de la finalisation et de l'amélioration du système. Souvent, ces mêmes routines vérifient la santé des appareils. Ensuite, la plupart des programmes de contrôle entrent dans une boucle principale qui se répète sans fin, dont l'exécution n'est suspendue que pour gérer les interruptions. Le cycle se compose de sous-programmes pour interroger le clavier et d'autres capteurs, vérifier les drapeaux définis par les sous-programmes de gestion des interruptions (par exemple, le drapeau pour l'expiration d'un intervalle de temps spécifié ou la fin du convertisseur analogique-numérique), traiter les informations reçues conformément à l'algorithme de contrôle spécifié, transmettant des actions de contrôle aux actionneurs , affichant des informations sur l'état du processus technologique sur un écran à cristaux liquides ou d'autres indicateurs. La sortie de la boucle principale n'est généralement prévue qu'en cas d'urgence, par exemple si, pour éliminer les conséquences d'une panne, il est nécessaire de répéter l'initialisation de toutes les variables et périphériques externes, ainsi que lors du traitement des interruptions. Ainsi, un programme construit sur une base modulaire est un ensemble de sous-programmes. Si, par exemple, un clavier différent est utilisé dans le nouveau système de contrôle, il suffira de remplacer le sous-programme BUTT. Pour qu'un tel remplacement soit simple et indolore, certaines règles doivent être élaborées et toujours respectées. Les sous-programmes, si possible, doivent enregistrer le contenu de tous les registres du contrôleur, recevoir les données initiales et émettre les résultats dans les mêmes registres et cellules de mémoire, utiliser le même codage de caractères, etc. Il faut lutter contre le désir naturel (surtout pour les programmeurs qui ont surmonté les premières difficultés et commencent à se sentir comme des professionnels) de simplifier le programme en s'éloignant des règles strictes et en utilisant des techniques non standard. Apparemment, à première vue, une complication injustifiée sera pleinement payante en facilitant le débogage et en retravaillant le programme dans son ensemble. Considérons quelques caractéristiques des sous-programmes. I NCREM et DESREM effectuent le nécessaire dans de nombreux cas, l'opération d'augmentation ou de diminution d'une valeur donnée d'un nombre binaire de 16 bits (ses octets haut et bas sont respectivement dans les registres R6 et R5). Les constantes qui spécifient la quantité d'incrément sont décrites au début du programme. Étant donné que tout microcontrôleur fonctionne beaucoup plus rapidement que les équipements technologiques, il est très important de pouvoir organiser le délai dans le programme. Dans ce cas, le compteur/timer interne du processeur est utilisé. Il a une capacité limitée et déborde en millisecondes. Chaque débordement génère une demande d'interruption. La routine de service d'interruption de minuterie (TIME) les compte et, lorsque le nombre spécifié est atteint, définit l'indicateur de temporisation FLT sur un. Tous les sous-programmes dont le travail dépend du temps, il reste à analyser l'état de ce drapeau. Il est donc possible de réaliser des vitesses d'obturation de plusieurs secondes voire minutes. Pour commencer à compter un nouvel intervalle, il est nécessaire d'entrer les valeurs initiales dans les cellules de travail du sous-programme TIME et d'activer la minuterie. Le sous-programme SET2M, par exemple, fixe la temporisation à 2 minutes. Le calcul des valeurs initiales comporte plusieurs subtilités. On sait que dans les microcontrôleurs de la série MSS48, les impulsions arrivent à l'entrée du compteur/timer interne à une fréquence 480 fois inférieure à la fréquence de l'oscillateur à quartz. Par exemple, avec une fréquence de résonateur à quartz de 7 MHz, le nombre écrit dans le compteur change toutes les 480/7000000 = 0,00006857 s = 68,57 µs. Ainsi, le compteur débordera (et générera une demande d'interruption) en 68,57 -(256-N1) µs, où N1 est le nombre écrit à l'origine dans le compteur. Si à chaque fois que vous démarrez un nouveau comptage à partir de ce nombre, alors N0,1 = 2 0,1/[7000000 (1480-N256)] les débordements se produiront en 1 s (délai minimum). Évidemment, le même retard temporel peut être obtenu avec différents N1 et N2, mais comme ces nombres ne peuvent pas être fractionnaires, il sera implémenté avec une certaine erreur. La tâche consiste à sélectionner une telle paire de valeurs pour laquelle l'erreur est minime. Dans le cas considéré, la meilleure option est N1 = 13, N2 = 6. Une temporisation de 2 min est obtenue en répétant la procédure décrite N3 = 1200 fois. Il est souvent nécessaire d'utiliser différentes procédures pour traiter les mêmes interruptions matérielles dans différents modes de fonctionnement du programme. Une manière de procéder est illustrée par le sous-programme INTER. Il analyse le code de type d'interruption entré par le programme principal dans la cellule INTT et, selon sa valeur, appelle l'une des routines de service d'interruption ISR1 ou ISR2. Notez que les deux se terminent par RET, pas RETR. Il est facile d'augmenter le nombre d'options de traitement et même de faire en sorte que pour une certaine valeur de code, plusieurs sous-programmes différents soient appelés les uns après les autres. Il n'est pas nécessaire d'écrire tous les sous-programmes nécessaires dans le fichier texte du programme principal. Les modules débogués et utilisés à plusieurs reprises dans différents programmes peuvent être situés dans des fichiers séparés et connectés au programme principal à l'aide des directives INCLUDE. Chaque fichier inclus peut contenir une ou plusieurs routines. L'inconvénient de cette méthode est que les noms des variables, des constantes et des étiquettes dans tous les modules utilisés ne doivent pas être répétés. Privée de ce défaut, la méthode de traduction séparée des modules avec leur fusion ultérieure au niveau du code objet n'est malheureusement pas prise en charge par l'ASSEMBLAGE TASM. Auteur : D. Ryzhov, Vladimir Voir d'autres articles section microcontrôleurs. Lire et écrire utile commentaires sur cet article. Dernières nouvelles de la science et de la technologie, nouvelle électronique : Inauguration du plus haut observatoire astronomique du monde
04.05.2024 Contrôler des objets à l'aide des courants d'air
04.05.2024 Les chiens de race pure ne tombent pas malades plus souvent que les chiens de race pure
03.05.2024
Autres nouvelles intéressantes : ▪ Dispositif de mesure des caractéristiques des matériaux diélectriques et magnétiques ▪ Porte sur le monde des rêves ▪ Capteur de température TMP117 ▪ Un dîner tardif endommage la mémoire Fil d'actualité de la science et de la technologie, nouvelle électronique
Matériaux intéressants de la bibliothèque technique gratuite : ▪ section du site Expériences en chimie. Sélection d'articles ▪ article Junker Schmidt veut se suicider avec un pistolet. Expression populaire ▪ serveur d'articles. Description de l'emploi
Laissez votre commentaire sur cet article : Toutes les langues de cette page Page principale | bibliothèque | Articles | Plan du site | Avis sur le site www.diagramme.com.ua |