Pour conclure cette série sur le microcontrôleur Propeller 2 de Parallax, nous allons présenter la fonction « smart pin » (ou broche intelligente en français), qui permet des configurations universelles et flexibles pour les broches d'E/S. Nous allons également nous intéresser aux résistances de rappel haut et bas des broches d'E/S. Et ce n'est pas tout....

Les E/S GPIO du microcontrôleur Propeller 2

Comme les broches du Propeller 2 possèdent davantage de fonctions que celles que l'on trouve habituellement dans d'autres microcontrôleurs, un examen plus approfondi pourrait révéler des informations intéressantes. Pour établir une sorte de référence, nous allons d'abord jeter un coup d'œil à la structure GPIO d'un ATmega328P de Microchip Technology. Ensuite, nous passerons au Propeller 2 pour voir s'il y a des différences et comment elles pourraient être utiles ultérieurement. Au final, la lecture de l'état de quelques boutons devrait être assez facile.

Fonctionnement des broches d'E/S sur d'autres microcontrôleurs

Les lecteurs familiers avec l'ATmega328P savent que les broches d'E/S ont pour l'essentiel quatre états : entrée, entrée avec rappel au niveau haut, sortie à niveau bas et sortie à niveau haut. Les fonctions analogiques occupent spécifiquement quelques broches sur l'ATmega328P et ne seront pas abordées ici. D'après la fiche technique, la figure 1 montre comment est construite une broche d'E/S.
 

ATmega328 I/O block.
Figure 1 : Partie de la fiche technique consacrée au bloc d'E/S ATmega328.

En rouge, un certain nombre de sections ayant un intérêt spécifique. Nous avons essentiellement un mécanisme de commande pour une résistance de rappel au niveau haut, d'une valeur comprise entre 20 kΩ et 50 kΩ, composée d'un FET et de la résistance elle-même, et d'une logique de commande pour activer le FET (comme le montre la partie de la figure 2).

Output path for ATmega328.
Figure 2 : Transistor FET de l'ATmega328 pour le rappel au niveau haut.

Dans la partie inférieure de la figure 1, vous pouvez voir une porte de transmission (figure 3) qui joue le rôle de commutateur à commande numérique permettant le passage de tensions analogiques.
 

Transmission Gate.
Figure 3 : Porte de transmission.

Ce qui est intéressant, c'est le signal SLEEP, car il désactive la porte de transmission et ramène en même temps sa sortie à la masse avec un FET qui lui est propre. Ceci est dû au trigger de Schmitt, situé à la sortie de la porte de transmission. Il sert à transformer un niveau de tension analogique en valeur binaire zéro ou un. Au centre de la figure 4, se trouve l'étage de sortie avec activation.

ATmega328 FET for pull-up.
Figure 4 : FET de l'ATmega328 pour le rappel au niveau haut.

Si le signal enable n'est pas actif, l'étage de sortie sera déconnecté ou il produira un niveau bas ou haut, selon l'entrée appliquée. Nous donnons beaucoup d'explications pour une simple activation ou désactivation, même s'il s'agit surtout de décrire l'essentiel. La fonction de rappel au niveau haut va être très pratique pour une bonne raison. Nous ne pouvons mettre toutes les broches en sommeil que simultanément (comme d'autres parties de l'ATmega328). Si nous voulons qu'une broche soit inutilisée et ne fasse rien, son entrée sera flottante. Dans ce cas, elle capte du bruit aléatoire que le trigger de Schmitt convertit en zéro ou un binaire. Comme l'entrée est aléatoire, le trigger de Schmitt et la logique interne vont basculer rapidement entre zéro et un. Ainsi, à chaque transition, nous avons besoin d'un peu d'énergie. La broche étant inutilisée, ce n'est pas souhaitable et cela gaspille de l'énergie, Cette approche est à éviter, surtout si le dispositif fonctionne sur batterie. L'utilisation du rappel au niveau haut va donc fixer la tension à l'entrée à VCC et la commutation aléatoire de l'entrée ne se produira pas. Cette introduction d'une fonction simple était un peu longue, mais nous allons maintenant nous concentrer sur la mise en œuvre du microcontrôleur Propeller 2.

Broches intelligentes du Propeller 2

Comme je l'ai déjà mentionné, il n'y a pas de broches d'E/S simples sur le Propeller 2. En ce qui concerne les fonctions d'E/S de base, un coup d'œil à la fiche technique préliminaire du microcontrôleur révèle que nous avons plus de quatre choix, même pour une configuration simple d'entrée et de sortie. Toutes les broches peuvent fonctionner en mode d'entrée ou de sortie numérique ou analogique. Commençons par le mode numérique. Pour l'entrée, si vous vous souvenez de l'ATmega328, tout était simple avec une porte de transmission et un trigger de Schmitt pour lire le signal. Dans le cas présent, nous avons un peu plus d'intelligence à l'intérieur de la broche. La figure 5 montre la voie d'entrée numérique, ou les autres voies possibles, avec la seule broche que nous avons.

Input paths for Propeller 2 I/O pin.
Figure 5 : Voies d'entrée pour les broches d'E/S du Propeller 2.

La première chose étrange est que nous avons deux sélecteurs d'entrée parmi lesquels choisir. Vous pouvez ainsi sélectionner la broche actuelle et +/- trois broches proches pour chacune de ces entrées. Une fois cette sélection effectuée, nous pouvons utiliser le signal inversé ou non inversé, ce qui donne un terme A ou B. Ces termes A et B sont ensuite introduits dans une deuxième partie où il est possible d'effectuer des opérations logiques ou des filtrages. Le résultat final sélectionné est ensuite présenté comme signal d'entrée (IN) du système. Ainsi, les broches standard sont un peu plus compliquées mais aussi un peu plus polyvalentes que celles d'un ATmega328P. Pour la sortie numérique, les choses sont simples : nous avons une sortie au niveau bas et au niveau haut. Rien d'extraordinaire à première vue.

Vous vous souvenez de la résistance de rappel au niveau haut dont nous avons parlé au début ? Le Propeller 2 en a plusieurs et peut aussi appliquer un rappel vers le haut et vers le bas. Les combinaisons possibles sont assez simples :

  • 1,5 kΩ
  • 15 kΩ
  • 150 kΩ
  • 19 Ω
  • 1 mA
  • 100 µA
  • 10 µA
  • État flottant

Comme nous pouvons choisir d'avoir des résistances de rappel vers le niveau haut ou le niveau bas ou des sources de courant, les broches sont très flexibles même pour les différents bus dont nous pouvons avoir besoin ou avec lesquels nous voulons interagir.

Les rappels vers le haut ou le bas ne sont pas réalisés comme dans l'ATmega328 avec un FET spécial qui les active ou les désactive. Ces résistances agissent plutôt comme une force de commande, comme si elles se situaient entre l'étage de commande et la sortie de la broche. Pour utiliser les rappels vers le haut ou vers le bas, vous basculez la broche en mode sortie, avec la résistance donnée, et vous appliquez le niveau haut ou bas pour un rappel correspondant. Mais l'histoire ne s'arrête pas là, comme le montre la figure 6, qui donne un aperçu de la structure détaillée d'une broche.
 

Low level description for Propeller 2 pin.
Figure 6 : Description détaillée d'une broche du Propeller 2.

Nous avons également un CN/A (convertisseur numérique-analogique) et un CA/N (convertisseur analogique-numérique) pour chaque broche qui peut également être utilisée en mode analogique. Comme je l'ai écrit dans un article précédent, la documentation n'est pas encore complète. Il manque notamment la description de certains domaines pour quelques configurations d'E/S, surtout lorsqu'il s'agit de configurations détaillées. Pour une première expérience pratique avec un composant électronique de pré-production, c'est assez courant. La figure 7 propose un aperçu du registre de configuration des broches intelligentes. Et nous en avons fini avec la théorie pour le moment.
 

Smart pin configuration register.
Figure 7 : Registre de configuration des broches intelligentes.

Mise en pratique

Pour notre premier test dans le monde réel, nous allons utiliser nos quatre boutons d'entrée. Nous pouvons par exemple allumer une LED en appuyant sur un bouton. Pour cela, nous allons étendre notre code Spin2 existant et utiliser toutes les capacités que nous avons, comme la commande d'une LED à l'aide d'une broche d'E/S et la fonction prints() pour écrire des chaînes de caractères dans un UART. Ce que nous voulons réaliser doit être très simple. Nous lisons l'état de la broche, et nous le reproduisons sur la LED, quatre fois seulement, une fois pour chaque LED et bouton présent. De plus, si un bouton est actionné ou relâché, nous émettons une chaîne correspondante. Commençons par la configuration de l'entrée. Comme les boutons matériels ne possèdent pas leurs propres résistances de rappel au niveau haut ou bas, nous devons utiliser les résistances internes de la puce. À partir de la figure 8 et de la figure 7, nous devons calculer la valeur du registre de configuration.
 

Propeller 2 pin modes overview.
Figure 8 : Vue d'ensemble des modes de fonctionnement des broches du Propeller 2.

En gardant la figure 5 à l'esprit, nous n'aurons à la fin que le niveau logique présenté par notre broche. Nous sélectionnons donc les entrées A et B pour qu'elles soient identiques, non inversées et vers la sortie A, sans aucune logique ou filtrage appliqués. D'après la fiche technique du Propeller 2, cela donne 0000 0000 000 000 010 010 00 00000 en binaire ou 0x900 en hexadécimal si nous voulons utiliser une résistance de rappel au niveau haut de 15 kΩ.

Pour notre code, cela signifie que nous ajoutons maintenant quatre entrées et utilisons quatre sorties en connectant notre petite carte d'extension (figure 9) à la carte d'évaluation Propeller 2.
 

Propeller 2 with attached buttons.
Figure 9 : Propeller 2 avec la platine des boutons raccordée.

Dans le listage 1, vous pouvez voir le code Spin2 modifié pour configurer nos quatre broches d'entrée avec des rappels au niveau haut ainsi que la configuration de sortie pour nos broches de sortie LED.
 

Listing 1

Nous utilisons quatre variables globales pour stocker le dernier niveau de broche lu et envoyer un message série, uniquement si une broche a changé. Nous étendons le code que nous avons utilisé avec deux fonctions, la première pour initialiser les LED et la seconde pour initialiser nos entrées. Dans le listage 2, vous pouvez voir quatre octets déclarés pour stocker l'état des quatre interrupteurs connectés à la carte.

Listing 2

Vous pouvez également voir que le code a été modifié avec les deux fonctions d'initialisation (listage 3).

Lisitng 3


La magie du  fonctionnement des entrées avec la capacité de rappel au niveau haut est enfouie dans les bits décrits dans le listage 4.
 

Lisitng 4

Nous configurons l'entrée et la sortie pour qu'elles soient pilotées à l'aide d'une résistance de 15 kΩ. Avec la dernière ligne, nous configurons nos quatre broches d'entrée pour qu'elles soient fixées au niveau bas, car nous les utilisons effectivement comme sorties.

Une fois l'initialisation effectuée, la fonction read_switch() est appelée à plusieurs reprises afin que nous puissions examiner de plus près le code qui se déroule dans cette fonction. Comme on le voit dans le listage 5, le code utilise un certain nombre de constructions IF et IF-ELSE après avoir lu les états des broches dans les variables a à d.
 

Listing 5

La première chose à faire est de détecter si une broche a changé en comparant l'ancien état mémorisé avec le nouvel état lu. Si ces valeurs diffèrent, nous pouvons supposer que l'état de l'entrée de la broche a changé et déterminer si c'est parce que l'interrupteur correspondant a été actionné ou relâché. En fonction de l'état actuel de la broche, nous utilisons la fonction prints() pour afficher la mention « Switch pressed » (commutateur actionné) ou « Switch released » (commutateur relâché). Le listage 5 montre comment notre fonction read_switch() se présente et fonctionne, avec de simples chemins IF-THEN-ELSE pour chaque interrupteur utilisé. Vous pouvez également y lire que l'état des LED est modifié en fonction du nouvel état détecté.

Pour l'instant, nous en avons fait assez avec les broches et nous espérons que cela vous a donné un petit aperçu de leur fonctionnement. Nous arrivons, pour le moment, avec cet article, à la fin de cette série. Le Propeller 2 n'est pas loin de mon banc de développement, et ce ne sera pas la dernière fois que nous écrirons à son sujet ou que nous ferons une courte vidéo. Comme le logiciel et l'IDE sont appelés à évoluer, nous allons laisser à ce microcontrôleur le temps de grandir. En attendant, vous pouvez accéder au code développé pour cette série dans notre référentiel GitHub.

Première impression finale

Après avoir travaillé avec le Propeller 2, je peux dire qu'il s'agit d'un puissant microcontrôleur qui nécessite sans aucun doute d'accorder plus d'attention à ses détails qu'un Raspberry Pi Pico. L'utilisation du langage Spin2 et de l'assembleur est particulière, et rend impossible la réutilisation du code C existant. Personnellement, je pense que ce ne sera pas mon microcontrôleur de prédilection pour les projets courants, mais cette puce pourra certainement être utile pour un certain nombre d'applications de niche.

Qu'en est-il des interfaces SPI, I²C et HDMI mentionnées au début de cette série d'articles ? Au fur et à mesure des évolutions apportées aux chaînes d'outils, il serait intéressant de les finaliser et de passer à des outils améliorés. Si vous ne voulez pas attendre le prochain chapitre sur le Propeller 2, envoyez-nous un e-mail ou utilisez l'un de vos canaux de réseaux sociaux préférés pour nous envoyer un message.

(200479-E-01)