Comment le MCU pilote l'écran LCD et les considérations de conception
Classification et application du micro-ordinateur monopuce
Selon son type de mémoire, le MCU peut être divisé en deux types sans ROM sur puce et avec ROM sur puce. Pour les puces sans ROM intégrée, elles doivent être connectées à une EPROM externe (généralement 8031) ; les puces avec ROM sur puce sont divisées en EPROM sur puce (généralement 87C51), ROM de masque sur puce MASK (généralement 87C51) La puce est 8051), type Flash sur puce (la puce typique est 89C51) et d'autres types.
Selon le but, il peut être divisé en usage général et usage spécial ; selon la largeur du bus de données et la longueur des octets de données pouvant être traités en même temps, il peut être divisé en MCU de 8, 16 et 32 bits.
À l'heure actuelle, le marché national des applications MCU est le plus largement utilisé dans le domaine de l'électronique grand public, suivi par le domaine industriel et le marché de l'électronique automobile. L'électronique grand public comprend, entre autres, les appareils électroménagers, les téléviseurs, les consoles de jeux et les systèmes audio et vidéo. Les domaines industriels comprennent la maison intelligente, l’automatisation, les applications médicales ainsi que la production et la distribution d’énergie nouvelle. Le domaine automobile comprend les groupes motopropulseurs automobiles et les systèmes de contrôle de sécurité, etc.
Shenzhen Hongjia Technology Co., Ltd. se spécialise dans la R&D, la production et la vente d'écrans LCD et d'écrans tactiles de 1,14 à 10,1 pouces, qui peuvent être personnalisés et fournissent des écrans MCU pris en charge, y compris l'interface SPI, l'interface MCU, l'interface RVB, Interface MIPI, etc. Il existe de nombreuses tailles et modèles, un écran tactile résistif et un écran tactile capacitif correspondant peuvent également être fournis.
La fonction de base du micro-ordinateur monopuce
Pour la plupart des MCU, les fonctions suivantes sont les plus courantes et les plus basiques. Pour différents MCU, la description peut être différente, mais ils sont fondamentalement les mêmes :
1. TImer (timer) : Bien qu'il existe de nombreux types de TImer, ils peuvent être classés en deux catégories : l'une est TImer avec un intervalle de temps fixe, c'est-à-dire que le timing est défini par le système et que le programme utilisateur ne peut pas être contrôlé. Seuls plusieurs intervalles de temps fixes sont fournis aux programmes utilisateur, tels que 32 Hz, 16 Hz, 8 Hz, etc. Ce type de minuterie est plus courant dans les MCU 4 bits, il peut donc être utilisé pour implémenter des fonctions connexes telles que l'horloge et la synchronisation. .
L'autre type est Programmable Timer (minuterie programmable). Comme son nom l'indique, le temps de synchronisation de ce type de minuterie peut être contrôlé par le programme de l'utilisateur. Les méthodes de contrôle comprennent : la sélection de la source d'horloge, la sélection de la division de fréquence (pré-échelle) et le réglage du nombre préfabriqué, etc. Certains MCU ont les trois en même temps, tandis que d'autres peuvent en avoir un ou deux. Ce type d'application Timer est très flexible et son utilisation réelle est également en constante évolution. L'une des applications les plus courantes consiste à l'utiliser pour réaliser une sortie PWM.
Puisque la source d'horloge peut être librement sélectionnée, ces minuteries sont généralement combinées avec des compteurs d'événements.
2. Ports IO : tout MCU possède un certain nombre de ports IO. Sans ports IO, le MCU perdra le canal de communication avec le monde extérieur. Selon la configuration du port IO, il peut être divisé dans les types suivants :
Port d'entrée pure ou de sortie pure : ce type de port IO est déterminé par la conception matérielle du MCU. Il ne peut s'agir que d'une entrée ou d'une sortie et ne peut pas être défini par logiciel en temps réel.
Lire et écrire directement les ports IO : par exemple, les ports IO du MCS-51 appartiennent à ce type de ports IO. Lors de l'exécution de l'instruction de lecture du port IO, il s'agit d'un port d'entrée ; lors de l’exécution d’une instruction d’écriture sur le port IO, il s’agit automatiquement d’un port de sortie.
Programmation du programme pour définir la direction d'entrée et de sortie : l'entrée ou la sortie de ce type de port IO est définie par le programme en fonction des besoins réels, l'application est relativement flexible et certaines applications au niveau du bus peuvent être réalisées, telles que I2C. bus, divers écrans LCD, bus de contrôle des pilotes de LED, etc.
Pour l'utilisation du port IO, il faut garder à l'esprit le point important : pour le port d'entrée, il doit y avoir un signal de niveau clair pour garantir qu'il ne peut pas être flottant (cela peut être obtenu en ajoutant un pull-up ou un pull- résistance vers le bas); pour le port de sortie, sa sortie Le niveau d'état doit prendre en compte sa connexion externe, et il faut s'assurer qu'il n'y a pas de source ou de puits de courant en état de veille ou statique.
3. Interruption externe : L'interruption externe est également une fonction de base de la plupart des MCU. Il est généralement utilisé pour le déclenchement de signaux en temps réel, l'échantillonnage de données et la détection d'état. Il existe plusieurs types d'interruptions : déclenchement sur front montant, déclenchement sur front descendant et déclenchement par niveau. Les interruptions externes sont généralement implémentées via les ports d'entrée. S'il s'agit d'un port IO, la fonction d'interruption ne sera activée que lorsqu'elle est définie sur entrée ; s'il s'agit d'un port de sortie, la fonction d'interruption externe sera automatiquement désactivée (il existe quelques exceptions dans la série ATiny d'ATmel, le port de sortie peut également déclencher la fonction d'interruption). L'application de l'interruption externe est la suivante :
Détection de signaux de déclenchement externes : l'une est basée sur des exigences en temps réel, telles que le contrôle de redresseurs contrôlés par silicium, la détection de signaux de rafale, etc., et l'autre est la nécessité d'économiser de l'énergie.
Mesure de la fréquence du signal : Afin de garantir que le signal ne soit pas manqué, une interruption externe est le choix idéal.
Décodage des données : Dans le domaine des applications de contrôle à distance, afin de réduire le coût de conception, il est souvent nécessaire d'utiliser un logiciel pour décoder diverses données codées, comme le décodage du codage Manchester et PWM.
Détection de clé et réveil du système : pour un MCU qui entre en état de veille, il doit généralement être réveillé via une interruption externe. La forme la plus élémentaire est une clé, et le changement de niveau est généré par l'action de la clé.
4. Interface de communication : l'interface de communication fournie par MCU comprend généralement l'interface SPI, l'UART, l'interface I2C, etc., qui sont décrites comme suit :
Interface SPI : ce type d'interface est la méthode de communication la plus basique fournie par la plupart des MCU. Sa transmission de données est contrôlée par une horloge synchrone. Les signaux incluent : SDI (entrée de données série), SDO (sortie de données série), SCLK (horloge série) et signal Ready ; dans certains cas, il se peut qu'il n'y ait pas de signal Prêt ; ce type d'interface peut fonctionner en mode Maître ou en mode Esclave, le dicton populaire est de voir qui fournit le signal d'horloge, la partie qui fournit l'horloge est le Maître, et la partie opposée est ensuite l'Esclave.
UART (Universal Asynchronous Receiver Transmit) : Il s’agit de l’interface de transmission asynchrone la plus basique. Ses lignes de signal sont uniquement Rx et Tx. Le format de données de base est : Bit de démarrage + Bit de données (7 bits/8 bits) + Bit de parité (Pair, Impair ou Aucun) + Bit d'arrêt (1 ~ 2 bits). Le temps pris par un bit de données est appelé Baud Rate (débit en bauds).
Pour la plupart des MCU, la longueur des bits de données, la méthode de vérification des données (vérification impaire, vérification paire ou pas de vérification), la longueur du bit d'arrêt (Stop Bit) et le débit en bauds peuvent être définis de manière flexible via la programmation. Certainement. Le moyen le plus couramment utilisé pour ce type d'interface est de communiquer avec le port série du PC.
Interface I2C : I2C est un protocole de transmission de données développé par Philips, qui est également implémenté par deux signaux : SDAT (entrée et sortie de données série) et SCLK (horloge série). Son plus grand avantage est que plusieurs appareils peuvent être connectés à ce bus, qui peuvent être identifiés et accessibles via des adresses ; L'un des plus grands avantages du bus I2C est qu'il est très pratique d'utiliser un logiciel pour le réaliser via le port IO, et son débit de transmission est entièrement contrôlé par SCLK. Pour le contrôler, il peut être rapide ou lent, contrairement à l'interface UART. , qui a des exigences de vitesse strictes.
5. Watchdog (minuterie de surveillance) : Watchdog est également une configuration de base de la plupart des MCU (certains MCU 4 bits peuvent ne pas avoir cette fonction), et la plupart des Watchdogs de MCU peuvent uniquement autoriser les programmes à les réinitialiser et ne peuvent pas les réinitialiser. Il est fermé (certains sont définis lorsque le programme est gravé, comme le MCU de la série Microchip PIC), et certains MCU déterminent s'il faut l'ouvrir d'une manière spécifique, comme la série KS57 de Samsung, tant que le programme accède au registre Watchdog. , est automatiquement allumé et ne peut plus être éteint. D'une manière générale, l'heure de réinitialisation du chien de garde peut être définie par programme. L'application la plus basique de Watchdog est de fournir une capacité d'auto-récupération pour que le MCU tombe en panne en raison de pannes inattendues.
Programmation du microcontrôleur
Il existe une grande différence entre la programmation des programmes MCU et la programmation des programmes PC. Bien que les outils de développement MCU basés sur C deviennent de plus en plus populaires, pour un code de programme efficace et un concepteur qui aime utiliser l'assembleur, le langage assembleur reste le langage de programmation le plus concis et le plus efficace.
Pour la programmation MCU, son cadre de base peut être considéré comme à peu près le même, généralement divisé en trois parties : la partie initialisation (c'est la plus grande différence entre la programmation MCU et la programmation PC), le corps de la boucle du programme principal et le programme de traitement des interruptions, qui sont respectivement expliqué comme suit :
1. Initialisation : pour la conception de tous les programmes MCU, l'initialisation est l'étape la plus fondamentale et la plus importante, comprenant généralement les éléments suivants :
Masquez toutes les interruptions et initialisez le pointeur de pile : la partie initialisation ne souhaite généralement pas qu'aucune interruption se produise.
Clear the RAM area of the system and display Memory: Although sometimes it may not be completely necessary, from the perspective of reliability and consistency, especially to prevent accidental errors, it is recommended to develop good programming habits.
Initialisation du port IO : selon les exigences d'application du projet, définissez le mode d'entrée et de sortie du port IO concerné. Pour le port d'entrée, vous devez définir sa résistance de pull-up ou de pull-down ; pour le port de sortie, vous devez définir son niveau de sortie initial, pour éviter des erreurs inutiles.
Paramètres d'interruption : pour toutes les sources d'interruption qui doivent être utilisées dans le projet, elles doivent être activées et les conditions de déclenchement des interruptions doivent être définies, tandis que pour les interruptions redondantes qui ne sont pas utilisées, elles doivent être désactivées.
Initialisation d'autres modules fonctionnels : pour tous les modules fonctionnels périphériques du MCU qui doivent être utilisés, les paramètres correspondants doivent être effectués en fonction des exigences d'application du projet, tels que la communication UART, le débit en bauds, la longueur des données, la méthode de vérification et l'arrêt. Le bit doit être défini. La longueur, etc., et pour le minuteur du programmeur, vous devez définir sa source d'horloge, sa division de fréquence et ses données de recharge, etc.
Initialisation des paramètres : après avoir terminé l'initialisation du matériel et des ressources du MCU, l'étape suivante consiste à initialiser certaines variables et données utilisées dans le programme. L'initialisation de cette partie doit être conçue en fonction du projet spécifique et de la disposition globale du programme. Pour certaines applications qui utilisent l'EEPROM pour sauvegarder les données préfabriquées du projet, il est recommandé de copier les données pertinentes dans la RAM du MCU lors de l'initialisation pour améliorer la vitesse d'accès du programme aux données et réduire la consommation électrique du système (en principe , l'accès à l'EEPROM externe augmentera la consommation électrique de l'alimentation).
2. Le corps de la boucle du programme principal : la plupart des MCU fonctionnent en continu pendant une longue période, de sorte que le corps du programme principal est essentiellement conçu de manière cyclique. Pour les applications avec plusieurs modes de fonctionnement, il peut y avoir plusieurs corps de boucle convertis entre eux via le drapeau d'état. Pour le corps principal du programme, les modules suivants sont généralement organisés :
Programme de calcul : Le programme de calcul est généralement chronophage, il s'oppose donc fermement à tout traitement d'interruption, notamment les opérations de multiplication et de division.
Programmes de traitement avec de faibles exigences en temps réel ou aucune exigence en temps réel ;
Programme de transmission d'affichage : principalement pour les applications avec pilote LED et LCD externe.
3. Programme de traitement des interruptions : le programme d'interruption est principalement utilisé pour traiter des tâches et des événements avec des exigences élevées en temps réel, telles que la détection de signaux soudains externes, la détection et le traitement des clés, le comptage de synchronisation, le balayage de l'affichage LED, etc.
En général, le programme d'interruption doit garder le code aussi concis et court que possible. Pour les fonctions qui n'ont pas besoin d'être traitées en temps réel, vous pouvez définir l'indicateur de déclenchement dans l'interruption, puis le programme principal exécutera la transaction spécifique, ce qui est très important. En particulier pour les MCU à faible consommation et à faible vitesse, il est nécessaire de garantir une réponse rapide à toutes les interruptions.
4. Pour la disposition des différents corps de tâches, différents MCU ont différentes méthodes de traitement :
Par exemple, pour les applications MCU à faible vitesse et à faible consommation (Fosc = 32 768 Hz), étant donné que ces projets sont tous des appareils portables et utilisent des écrans LCD ordinaires, la réponse aux boutons et aux écrans nécessite des performances en temps réel élevées, donc généralement des interruptions temporisées. sont utilisés pour traiter les actions des boutons et l'affichage des données ; et pour les MCU à grande vitesse, tels que les applications Fosc> 1 MHz, étant donné que le MCU a suffisamment de temps pour exécuter le corps de la boucle du programme principal à ce moment-là, il ne peut être interrompu que dans les différents indicateurs de déclenchement correspondants et mettre toutes les tâches dans le corps principal du programme à exécuter.
5. Dans la conception de la programmation du MCU, un autre point qui nécessite une attention particulière est :
Pour empêcher l'accès ou le réglage simultané de la même variable ou des mêmes données dans l'interruption et dans le corps du programme principal. Une méthode préventive efficace consiste à organiser le traitement de ces données dans un module et à déterminer s'il convient d'exécuter l'opération pertinente sur les données en évaluant l'indicateur de déclenchement ; tandis que dans d'autres corps de programme (principalement des interruptions), les données qui doivent être traitées. Le lieu de traitement ne définit que l'indicateur déclenché. - Cela garantit que l'exécution des données est prévisible et unique.
Compétences en développement de microcontrôleurs
1. Comment réduire les bugs dans le programme
Pour savoir comment réduire les bogues du programme, vous devez d'abord considérer les paramètres de gestion des dépassements suivants qui doivent être pris en compte pendant le fonctionnement du système.
Paramètres physiques : Ces paramètres sont principalement les paramètres d'entrée du système, notamment les paramètres d'excitation, les paramètres de fonctionnement lors de l'acquisition et du traitement, et les paramètres de résultat en fin de traitement.
Paramètres de ressources : ces paramètres sont principalement les ressources des circuits, des périphériques et des unités fonctionnelles du système, telles que la capacité de mémoire, la longueur de l'unité de stockage et la profondeur d'empilement.
Paramètres d'application : ces paramètres d'application représentent souvent les conditions d'application de certains micro-ordinateurs et unités fonctionnelles monopuces. Paramètres de processus : fait référence aux paramètres qui changent de manière ordonnée pendant le fonctionnement du système.
2. Comment améliorer l'efficacité du code de programmation en langage C
C'est une tendance inévitable dans le développement et l'application de micro-ordinateurs monopuces d'utiliser le langage C pour concevoir le programme de micro-ordinateur monopuce. Si vous souhaitez obtenir la plus grande efficacité lors de la programmation en C, il est préférable de vous familiariser avec le compilateur C que vous utilisez. Testez d'abord le nombre de lignes d'instruction en langage assembleur correspondant à chaque langage C compilé, afin de connaître clairement l'efficacité. Lors de la programmation future, utilisez l'instruction avec la plus grande efficacité de compilation. Chaque compilateur C aura certaines différences, donc l'efficacité de la compilation sera également différente. La longueur du code et le temps d'exécution d'un excellent compilateur C de système embarqué ne sont que 5 à 20 % plus longs que le même niveau de fonction écrit en langage assembleur.
Pour les projets complexes avec un temps de développement serré, le langage C peut être utilisé, mais le principe est que vous soyez très familier avec le langage C et le compilateur C du système MCU, et que vous accordiez une attention particulière aux types de données et aux algorithmes utilisés par le système de compilateur C. peut soutenir. Bien que le langage C soit le langage de haut niveau le plus courant, les systèmes de compilation en langage C des différents fabricants de MCU sont différents, notamment dans le fonctionnement de certains modules de fonctions spéciaux. Donc, si vous ne comprenez pas ces fonctionnalités, il y aura de nombreux problèmes de débogage, ce qui entraînera une efficacité d'exécution inférieure à celle du langage assembleur.
3. Comment résoudre le problème anti-interférence du micro-ordinateur monopuce. Le moyen le plus efficace d'éviter les interférences est de supprimer la source d'interférence et de couper le chemin des interférences, mais il est souvent difficile de le faire, cela ne dépend donc que de si la capacité anti-interférence du micro-ordinateur monopuce est suffisamment forte. Tout en améliorant la capacité anti-brouillage du système matériel, l'anti-brouillage logiciel se caractérise par sa conception flexible,