* NIP - Core Independent Peripherals dans les microcontrôleurs Microchip, également connu sous le nom de CIP - Core Independent Peripheral.
Partie 4
Les articles précédents [
1 ], [
2 ] et [
3 ] étaient consacrés aux microcontrôleurs Microchip de périphériques indépendants du noyau (NEV): cellules logiques configurables, ports d'entrée / sortie avec fonction de limitation de courant et ADC avec un ordinateur; certaines caractéristiques de ces périphériques ont été présentées. Permettez-moi de vous rappeler que l'indépendance ne découle pas du type de cœur PIC des microcontrôleurs (BaseLine, milieu de gamme, milieu de gamme amélioré, PIC18, 16, 32 bits), mais du fonctionnement du cœur, c'est-à-dire exécution indépendante des tâches affectées à la périphérie de l'état de la CPU. De tels périphériques, et en particulier la possibilité de le configurer pour la collaboration et la synthèse des fonctions matérielles, sont conçus pour décharger la partie logicielle et réduire la consommation d'énergie.
Dans ce court article, je veux montrer des exemples de la mise en œuvre de la réception d'interfaces de communication «personnalisées» non standard utilisant les périphériques indépendants du noyau.
Le codage PWM des informations est très courant lorsque des signaux discrets, log.1 et log.0, sont codés par la largeur d'impulsion. Envisagez la possibilité de recevoir et de décoder de tels signaux à l'aide des contrôleurs PIC indépendants du noyau périphérique.
Décodage PWM du signal du capteur AM2302
Dans les projets de bricolage, le capteur de température et d'humidité DHT22 (AM2302) est souvent utilisé. Le capteur dispose de 3 sorties, les informations sont transmises via un seul fil. En réponse à une demande (niveau bas d'une durée d'environ 1 ms), le capteur répond par un bit de départ, puis une séquence de 40 bits, où les informations sont codées dans la durée d'impulsion: log. "0" - impulsion 30mk sec, log. "1" - 70 mk sec (valeurs typiques). La réponse du capteur contient 5 octets: 2 octets de données d'humidité, 2 octets de température et 1 octet de contrôle.
Fig.1. Explications du principe de génération du signal du capteur DHT22.Le réseau a de nombreux exemples de travail avec de tels capteurs sur Arduino. Certaines implémentations de bibliothèque utilisent des constructions telles que:
loopCnt = TIMEOUT; while(PIN) { if(--loopCount == 0) return ErrorTimeout; } if (loopCnt < cntOne) { // bit =1 … } else { // bit =0 … }
Dans ces implémentations, je vois les problèmes suivants:
- le programme pour tout le temps de mesure (> 5 ms) «se bloque» dans le code de mesure;
- l'apparition d'une interruption suffisamment longue perturbe la lecture des données du capteur;
- problèmes potentiels de travail à une fréquence d'horloge basse du microcontrôleur;
L'algorithme du programme de telles solutions a approximativement la forme suivante (voir Fig.2)
Fig. 2. Un algorithme pour recevoir et décoder par programmation les signaux des capteurs.Ci-dessous est considérée une variante de la réception / décodage matériel du protocole avec un minimum de surcharge logicielle.
L'idée est d'isoler les impulsions d'horloge du flux binaire, suivies de la direction du signal d'origine et des impulsions d'horloge vers le module matériel SPI. Dans ce cas, le programme du microcontrôleur ne peut prendre séquentiellement que 5 octets de données du SPI.
Une partie du CIP est un temporisateur avec la possibilité de déclencher des événements (changements d'état de l'entrée ou d'autres périphériques). C'est-à-dire la modification de l'état d'entrée peut déclencher une minuterie, voir signal TMR6 sur la figure 3. Lorsque le temporisateur atteint la valeur définie, son comptage s'arrête et le temporisateur est dans l'état TMR6 = PR6 (PR - registre de période). L'état du temporisateur peut être une entrée pour une cellule logique configurable (CLC, voir partie 1).
Ainsi, en utilisant un temporisateur et des cellules logiques, nous pouvons générer un signal approprié pour être appliqué à l'entrée d'horloge du SCK du module SPI. Pour extraire des informations, la durée d'un tel bloc doit avoir une valeur moyenne entre la durée de zéro et un. SPI peut alors fixer le bit en fonction de la décroissance du bloc (voir Fig. 3 signal SCK).
Le signal du capteur aura de fausses impulsions générées à partir de la demande et des impulsions de démarrage. Pour que ces impulsions n'interfèrent pas avec le fonctionnement, vous devez activer SPI uniquement pendant la durée des impulsions d'information, ou couper les impulsions inutiles. Nous pouvons également résoudre ce problème en utilisant CIP.
Un autre temporisateur agit comme un compteur d'impulsions avec commutation sur la récession: écrivez le nombre 2 dans le registre de période, le temporisateur compte les 2 premières impulsions (voir le signal TMR4 sur la figure 3) et arrête le comptage (voir le signal EN sur la figure 3), qui à travers le bloc de cellules logiques permet l'émission des impulsions restantes à l'entrée SPI.
Fig.3. Diagrammes expliquant la réception du signal du capteur DHT22.La fonction logique de génération de signal SCK est implémentée sur une cellule logique (CLC), le circuit complet dans la configuration ET-OU est représenté sur la figure 4.
La sortie de la cellule logique est connectée à l'entrée SCK et le signal du capteur DHT22 est connecté à la MOSI du module SPI. Toutes les connexions sont effectuées à l'intérieur du microcontrôleur (Fig. 5). Pour la surveillance et le débogage, des signaux peuvent être émis vers les ports du microcontrôleur.
Fig.4. Configuration des cellules logiques CLC dans le microcontrôleur PIC.Fig. 5. La structure complète de la configuration de la périphérie.S'il semble que 2 minuteries pour la tâche de décodage du protocole du capteur soient une perte de ressources, alors un compteur jusqu'à deux peut être «collecté» sur des cellules logiques CLC libres.
Au total, la tâche de décodage se résume à un algorithme très simple: le microcontrôleur et ses périphériques sont initialisés, si nécessaire, le module SPI est allumé et une demande de mesure est générée (log. "0" pendant ~ 1ms).
Il reste à lire les données du tampon lorsqu'une interruption de SPI se produit.
Fig.6. L'algorithme pour travailler avec le capteur DHT22 lors de l'utilisation du moignon.
Fig.7. Signaux des ports du microcontrôleur. Signal SSP1IF - interruptions à la réception d'un octet par le module SPI.La figure 7 montre les diagrammes de signaux, où:
DHT (dat) - signal sur la ligne de signal du capteur - alimente l'entrée du module MOSI SPI;
TMR6! = RP6 - horloge dédiée - envoi au SCK du module SPI;
SSP1IF - signal d'interruption (disponibilité des données dans le tampon SPI) - en fait, ce signal indique la charge du cœur du microcontrôleur - lecture des données de résultat.
Décodage d'autres protocoles PWM
Des protocoles PWM "unifilaires" similaires sont utilisés dans les télécommandes IR pour les appareils électroménagers. Souvent pendant la transmission IR, le codage par la position de l'impulsion est utilisé lorsque la durée est constante et la pause est variable. Cette option est également appelée «Encodage à pause variable». En fait, c'est le même encodage PWM, mais avec un signal inversé. En présence de cellules logiques, l'inversion n'est pas un problème, de plus, les récepteurs IR inversent le signal reçu. Dans la fig. La figure 8 montre les signaux reçus par le récepteur de deux consoles différentes.

Fig.8. Options de codage pour les télécommandes IR.Les deux télécommandes ont des protocoles différents, mais ces protocoles sont facilement décodés de la manière décrite ci-dessus, la seule chose est qu'il est nécessaire de déterminer le début de l'envoi pour synchroniser l'inclusion de SPI, car le récepteur IR peut intercepter les interférences.

Fig. 9. Signaux décodés à l'aide de SPI.Toutes les télécommandes IR n'ont pas d'encodage PWM. Certains protocoles, par exemple RC5, ont un codage de phase (le code de Manchester, «0» est transmis comme 10 et «1» comme 01) [4]. Le décodage du code de Manchester en utilisant la périphérie d'un noyau indépendant que nous avons déjà envisagé précédemment dans la première partie [1].
Résumé
Au lieu de presque 100% de la charge CPU du microcontrôleur pour la tâche de décodage du protocole PWM dans la version Arduino (oui, je sais, le problème peut être résolu plus efficacement en utilisant des modules de capture ou d'autres périphériques), nous avons transféré la réception du paquet d'informations au matériel. L'avant du signal d'entrée démarre le temporisateur, l'état du temporisateur détermine la sortie du bloc de cellules logiques, la sortie de la cellule logique est envoyée au SPI.
L'utilisation de périphériques indépendants du cœur permet d'optimiser l'utilisation des ressources, de transférer certaines tâches vers le matériel, de simplifier le code et de réduire la consommation.
Littérature
1.
Cellules logiques configurables dans les contrôleurs PIC.2.
50 nuances de moignon. Ports d'entrée / sortie3.
50 nuances de moignon. ADC et ADC avec ordinateur à microcontrôleur Microchip4.
sbprojects.com/knowledge/ir/rc5.php