Affichage du bus de données de multiplexage avec sortie parallèle et port série Arduino.
L'article décrit la méthode de multiplexage de l'utilisation du port D du microprocesseur ATMEL 328P (Arduino NANO) afin de fournir une sortie d'octets alternative à l'affichage et à l'échange via le canal série.
J'ai en quelque sorte assemblé un appareil pour surveiller le niveau de monoxyde de carbone (CO) à partir d'éléments inutiles - un écran de Nokia N95, Arduino NANO avec de mauvais ports (D3 et D11, cassé en raison d'un court-circuit infructueux à +400 volts lors du débogage d'un générateur haute tension), des cartes jouer des extraits sonores et capteur de monoxyde de carbone MQ7. Tous ces détails à un degré ou à un autre étaient défectueux (à l'exception du capteur) et ne pouvaient être trouvés dans aucun autre projet. Curieusement, il s'est avéré que l'appareil est très utile lors de l'utilisation d'un poêle dans le pays. L'été 2019 s'est avéré ne pas être chaud et j'ai chauffé le poêle presque tous les jours pendant quelques semaines en juillet, combinant agréable (méditation sur la flamme) avec utile (recyclage des ordures sciées). Il s'est avéré très facile de contrôler les régimes de combustion, toutes les manipulations avec les volets se sont immédiatement reflétées dans les lectures de l'appareil, ce qui a permis de contrôler intelligemment le poêle. L'appareil n'est pas décrit dans cet article; il existe de nombreux appareils de ce type sur Internet pour tous les goûts. Une caractéristique distinctive de mon appareil est la fonction de surveillance continue de la santé du capteur de CO basée sur une comparaison de la courbe de référence stockée et obtenue en temps réel, ainsi que la vitesse de réaction élevée aux changements du niveau de CO obtenue en comparant les données stockées dans le cycle précédent avec les données actuelles.
L'objectif de cet article est d'augmenter la vitesse du processeur et de l'affichage avec l'échange de données en octets parallèles.
L'écran a un échange d'octets parallèle et, malgré l'utilisation de toutes les méthodes que je connais pour augmenter le taux de change, la sortie s'est avérée plutôt lente. La raison principale est la nécessité de sortir bit par bit un octet de données vers différents bits de différents ports, car Arduino Nano n'a pas un seul port à part entière d'une largeur d'un octet. Ce mode de sortie nécessite environ 8 fois plus de temps que l'écriture d'un octet dans un registre. NANO possède un seul port à part entière D, mais ses bits les moins significatifs sont utilisés pour le port série matériel, via lequel les esquisses sont chargées dans le processeur et l'esquisse est échangée avec la machine hôte.
J'ai trouvé un moyen relativement simple d'utiliser la sortie d'affichage octet par ligne. Cette méthode consiste à utiliser alternativement le port D pour sortir des données sur un écran et à échanger des données sur un canal série.
La méthode proposée permet d'augmenter considérablement la vitesse d'échange intégral avec l'écran (environ 3 fois selon mes mesures). Le mot «intégrale» signifie que les temps totaux d'exécution des opérations de rendu d'écran au niveau macro ont été mesurés. Il est probable que la mesure du temps au niveau des E / S atomiques donnerait un gain significativement plus important (dans la région du même ordre).
Les mesures ont été effectuées sur un modèle spécialement assemblé (voir figure 1) de la manière suivante:
- Dans le programme de test, des horodatages ont été placés avec la sortie vers la machine hôte.
- L'écran était connecté aux broches D2 - D9, un programme de test était chargé, dans lequel l'octet était sorti en distribuant l'octet par bits.
- L'afficheur était connecté aux bornes D0 - D7, un programme de test était chargé, dans lequel l'octet était sorti en utilisant la commande PORTD = data.

Figure 1. Photos de la disposition pour tester le multiplexage de sortieLes programmes sont exactement les mêmes, la commutation de la méthode de sortie a été effectuée en changeant les noms des routines SendDat et SendCom respectivement en SendDat1 et SendCom1.
La sortie du programme vers le moniteur série intégré a été enregistrée dans OneNote et analysée.
Figure 2. Mesure du temps nécessaire à l'affichage en mode sortie octet
Figure 3. Mesure du temps d'écran en mode sortie bitLes résultats des mesures sont résumés dans le tableau 1.
Tableau 1. Gain intégré du taux de changeLes inconvénients de la méthode proposée sont la nécessité d'utiliser des commandes supplémentaires pour changer de mode d'affichage et échanger via un port série.
Vous pouvez également vous attendre à quelques difficultés lors de la réception de données de la machine hôte, la réception n'est possible qu'avec l'inclusion explicite du mode de canal série, ce qui nécessite une organisation temporelle claire des processus dans l'esquisse.
L'étude du manuel du processeur a donné les informations suivantes: l'inclusion du mode port série intercepte le contrôle des jambes D0 et D1 au niveau matériel. Cela signifie que les tentatives de contrôle des jambes à partir de l'esquisse ne donneront pas le résultat souhaité.
Une étude plus approfondie du problème a montré que si vous n'incluez pas le port série dans l'esquisse avec la commande Serial.open (), l'intégralité du port D reste à la disposition de l'utilisateur. Vous pouvez mettre le port en mode de sortie sur toutes les jambes avec la commande DDRD = 0xFF et sortir tout l'octet avec la commande PORTD = data en même temps, où la variable de données contient les données de sortie.
Mettre le port D en mode de sortie suffit une fois (dans la configuration). L'activation / désactivation ultérieure du mode de communication série n'affecte pas le mode du port D - il reste en mode de sortie parallèle 8 bits. Lorsque le mode d'échange série est activé, les terminaux D0 et D1 passeront respectivement en modes de réception et d'émission. "1" apparaîtra sur la broche D1, quel que soit l'état précédent du bit D1, et ce "1" sera sur cette broche tout le temps pendant que le mode de transmission série est activé, à l'exception des moments de la transmission de symboles. Lorsque le mode de transmission série est désactivé, les sorties D0 et D1 passent à l'état de sortie et les signaux du registre de sortie y apparaissent. Si dans le registre de sortie à la place de D1 il y a "0", alors un front négatif sera généré à la sortie, ce qui conduira à la transmission du caractère parasite au canal série.
Examinons maintenant la question - mais une telle utilisation du port D empêchera-t-elle le téléchargement de programmes? Lorsque le programme se charge, le processeur est réinitialisé par l'impulsion générée par le contrôleur de port USB FT232RL (ou son analogique CH340) lorsque le signal DTR est défini. Le signal DTR passe de 1 à 0 et une chute négative à travers le condensateur réinitialise le processeur. Après une réinitialisation, le processeur active le port série, démarre le chargeur de démarrage et reçoit le code du programme. Ainsi, la modification du mode de fonctionnement du port D n'interfère pas avec le chargement normal de l'esquisse.
Si l'esquisse nécessite une sortie sur le port série, la commande Serial.open () suffit avant les commandes de sortie.
Cependant, il y a de la subtilité. Il consiste en ce que l'entrée RxD de la puce FT232RL reste connectée à la sortie TxD et les données allant à l'affichage sont reçues et envoyées ensuite à la machine hôte. Ces données ressemblent à du bruit, bien qu'en réalité elles ne le soient pas (figure 4).
Figure 4. Vue d'écran en mode de sortie d'octets sans blocageIl existe deux façons de gérer ce signal inutile.
La première est le logiciel. Elle consiste dans le fait que l'esquisse avant la sortie utilise la commande Serial.println () pour créer une nouvelle ligne avant la sortie des informations utiles. Cela permettra à la machine hôte d'analyser plus facilement les lignes entrantes et de mettre en évidence les informations utiles de l'esquisse.
La deuxième façon est le matériel. L'entrée RxD du FT232RL est connectée à la sortie TxD via une résistance de 1 kΩ. Pour bloquer le transfert d'informations, il suffit de connecter l'entrée RxD FT232RL à "1". Pour en faire le moyen le plus simple est l'une des conclusions gratuites d'Arduino. J'ai utilisé la sortie de D8. Pour effectuer cette action, j'ai soudé à la borne 7 de la résistance RP1B avec une valeur nominale de 1 kOhm de fils avec un connecteur à la fin, en le passant à travers les trous de la carte pour la fixation mécanique. Sur la figure 5, cette connexion est représentée par une ligne rouge, la figure 6 montre une photographie du point de soudure.
Figure 5. Partie du circuit Arduino Nano
Figure 6. Lieu de soudure d'un fil supplémentaire dans Arduino NANOCe mécanisme fonctionne comme ceci: après réinitialisation, la jambe D8 est en mode d'entrée haute impédance et la carte Arduino n'interfère pas avec le fonctionnement normal du mécanisme de chargement de programme dans la carte.
Lorsqu'il est nécessaire de commencer à contrôler l'affichage dans l'esquisse, la broche D8 passe en mode broche active, elle est réglée sur «1» (cela bloque le transfert de données de la broche TxD Atmel328P à la broche RxD FT232RL) et ensuite la commande Serial.end () est exécutée;. La procédure est importante, car après avoir désactivé le mode de transmission série, le bit D1 apparaît sur la broche TxD, qui est stocké dans le registre de sortie du port D à partir de l'enregistrement d'octets précédent sur ce port. Si le bit D1 était à "0", alors lorsque le mode de transmission série est désactivé, la branche du processeur passera de "1" à "0" et cela générera une transmission de caractères parasites sur le canal série.
Au cours du débogage, il s'est également avéré que nous devions attendre la fin du transfert de la totalité du tampon vers la machine hôte avant de bloquer le canal série, sinon certaines des données transmises seraient perdues.
Lorsqu'un croquis doit permettre le transfert de données via le port série, il est nécessaire d'activer le mode de transfert série et de désactiver le blocage de la transmission de données série en définissant le mode de lecture sur la broche D8.
Pour effectuer ces tâches, deux routines ont été ajoutées au croquis:
void s_begin() { Serial.begin(115200); // TxD USART. TxD "1", RxD pinMode(8, INPUT); // RxD FT232RL "1", RxD FT232RL }
void s_end() { Serial.flush(); // pinMode(8, OUTPUT); // FT232RL "1" . D8_High; // Serial.end(); // . TxD RxD D0(RxD) D1(TxD) D }
Un programme de test complet peut être suivi
ici .