Bonjour. Nous continuons le cours Comprendre les microcontrôleurs. Et c'est aujourd'hui de résistances de tirage que nous allons parler. Qu'est-ce que c'est que ce mot bizarre? Peut-être les connaissez-vous déjà sous le nom pull-up resistors. Nous allons rappeler le principe et l'utilité de ces résistances de tirage. Nous allons ensuite parler plus en détail des résistances de tirage qui sont intégrées dans un grand nombre de microcontrôleurs et nous allons regarder plus en détail comment c'est implémenté sur les AVR et sur les MSP430. Une fois n'est pas coutume, nous allons commencer cette leçon par un quizz. Vous avez ce schéma. Il est très simple. Il vous semble peut-être un peu bizarre puisque cette patte est connectée à rien du tout. Elle est en l'air. Ici, on a simplement une LED comme on a l'habitude de les utiliser. Le programme correspondant, dans sa partie setup, met la LED rouge en sortie. On a l'habitude de cette syntaxe. Dans la boucle principale, on a une variable qui est la valeur qui est lue sur l'entrée digitalRead sur l'entrée P 1 souligné 3 et cette même valeur val est copiée avec un digitalWrite sur la diode lumineuse. Donc on a un programme qui, en permanence, copie l'entrée sur la sortie. Alors ma question : Avec ce montage et ce programme, que va-t-on voir sur la LED? Pensez-vous qu'elle va rester éteinte? Pensez-vous qu'elle va, par exemple, être allumée? Pensez-vous, au contraire, qu'elle va peut-être clignoter ou que son état va fluctuer? Et si, pour une fois, nous laissions le matériel nous répondre. Regardez cette petite vidéo. Vous remarquez donc le petit fil qui a été connecté sur l'entrée P 1 point 3. Vous remarquez qu'un certain nombre de choses changent. La diode lumineuse change, on sent qu'il y a des mouvements. Ces mouvements, on voit qu'ils sont faits par une main. Voyez ici mon doigt qui se rapproche mais qui ne touche pas ce petit fil et vous voyez que la sortie change à certains moments. Essayons de comprendre ce qui s'est passé. Nous utilisons des microcontrôleurs qui utilisent la technologie C-MOS et les C-MOS présentent des entrées à haute impédance. Et par conséquent, une entrée non connectée capte toutes sortes de parasites, toutes sortes d'influences électro-magnétiques, toutes sortes de charges statiques même très faibles qui vont lui faire changer d'état d'une manière qui semble un peu aléatoire. On ne peut donc pas laisser une entrée non connectée. Il faut absolument éviter ces entrées en l'air. Quelles solutions peut-on proposer pour résoudre ce problème? Ce qu'on cherche, c'est à diminuer l'impédance du système et une résistance qui doit être liée à une des alimentations va assurer un potentiel connu au moment où l'entrée est en l'air. Alors deux schémas sont possibles puisqu'on a deux alimentations. La solution avec le tirage vers le haut, en anglais Pull-up et on voit bien que la résistance est connectée vers l'alimentation positive et la solution avec le tirage vers le bas, Pull-down en anglais, et on voit que la résistance est connectée vers le 0 volt vers la masse Dans les deux cas, entre un point d'alimentation et l'entrée de notre système, on a une résistance qui évite donc ce problème de la haute impédance des entrées de nos microcontrôleurs. En fait, cette technique est bien connue des électroniciens. Et il nous reste à nous poser la question : Y a-t-il, entre ces deux solutions Pull-up et Pull-down une qui est préférable à l'autre? Alors tout de suite, je vais vous dire que celle qui est la plus utilisée, et de loin, c'est la Pull-up. Comment puis-je justifier le fait qu'on utilisera plutôt une Pull-up qu'une Pull-down? Prenons le cas assez simple d'un interrupteur de fin de course qui va se trouver à une certaine distance physique de la carte électronique qui contient le microcontrôleur. On a donc un bouton-poussoir, et ce bouton-poussoir doit être relié à notre carte électronique avec, dans ce cas-là, une connexion sur l'entrée et une connexion vers la masse. Dans l'autre cas, on a toujours notre bouton-poussoir. On a toujours une connexion vers l'entrée et cette fois, la deuxième connexion doit se faire vers le plus. En admettant que ce câble, ou que ce câble sont des câbles relativement longs et qu'ils se promènent le long du bâti de notre machine, quelle solution va-t-on préférer? Transférer le signal et la tension positive ou au contraire transférer le signal et la tension négative, c'est-à-dire la masse. Eh bien on préférera cette solution puisque généralement la masse est effectivement connectée au bâti de la machine et les électroniciens ont l'habitude d'utiliser ce schéma-là et d'ailleurs, un certain nombre de microcontrôleurs proposent des résistances de Pull-up intégrées alors qu'ils sont plus rares ceux qui proposent à la fois une résistance de Pull-up et une résistance de Pull-down. En effet, beaucoup de fabricants intègrent des résistances de tirage directement dans les microcontrôleurs. La valeur de cette résistance est généralement d'environ 50 kOhm. Donc on voit bien ici sur ce schéma que la résistance n'est pas placée ici à l'extérieur mais qu'elle est placée à l'intérieur. Bien évidemment, elle ne doit pas être connectée en permanence et il va falloir trouver un mécanisme pour enclencher ou déclencher cette résistance de tirage. Malheureusement, il n'y a pas une méthode unique pour enclencher ces résistances de tirage. Chaque fabricant propose une technique. Je vais prendre l'exemple pour les processeurs AVR de la société Atmel. Je pense que vous vous souvenez de ce tableau. Nous en avions parlé lorsque nous avons parlé des entrées et sorties. Vous vous souvenez que dans le registre Dir, pour chaque patte, le bit correspondant est utilisé soit pour avoir une entrée lorsqu'il est à 0, soit pour avoir une sortie lorsqu'il est à 1. Dans ce cas-là, c'est le registre Out qui permet de mettre la sortie à 0 et de mettre la sortie à 1. Par contre, il faut remarquer que ces 2 lignes sont identiques et le fait que le Out soit à 0 ou qu'il soit à 1 lorsque le Dir est à 0 n'a en fait pas d'importance. Et certains fabricants ont justement eu l'idée de distinguer ces 2 cas en disant dans le cas où DDR est à 0, si Port est à 0 alors c'est une entrée normale à haute impédance. Par contre, si Port est à 1, toujours avec le DDR qui est à 0, alors on passe à une entrée avec Pull-up. Donc ce sera extrèmement facile d'enclencher l'entrée. Il suffira d'activer le bit correspondant du Port pour autant qu'on ait le DDR qui est à 0. Je vous rappelle que sur les Atmel, le port de direction s'appelle DDR, data direction register et que le port de sortie s'appelle tout simplement Port donc, on aurait, par exemple DDR B si c'est le Port B et puis Port B correspondant. J'aurais pu vous montrer le schéma interne des AVR. Il est fort compliqué mais on y reconnaît quand même même ici cette résistance de tirage. On voit qu'elle est actionnée par un transistor P connecté au plus. On a donc bien une résistance de pull-up qui peut être enclenchée. Ici, on a un inverseur qui correspond à l'inversion de ce transistor. On a donc ici une fonction logique, une porte ET pour qu'on ait un 1 ici et par conséquent, que le transistor conduise et que la résistance soit active, on doit avoir ici la valeur 1 puisqu'il n'y a pas de petit rond. On doit avoir ici, par contre, la valeur 0, où il doit y avoir un petit rond. Cette valeur 1 ici correspond au Port. Cette valeur 0 ici correspond au DDR. Donc on se trouve bien dans la logique que je viens de vous expliquer lorsque DDR, le bit correspondant est à 0. et que le bit du port correspondant est à 1, ces deux conditions, on a le et logique, entraînent l'enclenchement de notre résistance de Pull Up. Un autre microcontrôleur, une autre manière, toute différente de gérer les résistances de rappel. Le MSP430, lui, offre pull-up et pull-down sur chaque patte. C'est nouveau, c'est intéressant dans certains cas, c'est vrai qu'on utilise beaucoup plus souvent le pull-up que le pull-down, mais il y a certainement des applications intéressantes pour le pull-down. Dans ce cas-là, un registre supplémentaire, un registre spécial a été utilisé, il a le nom particulier de REN, qui veut dire Resistor Enable, donc enclenchement de la résistance, et lorsqu'on a décidé d'enclencher la résistance, on choisit si c'est un pull-up ou un pull-down avec la valeur de OUT. Donc je vous rappelle dans ce tableau, lorsque DIR est à 0, on a toujours une entrée, lorsque DIR est à 1, on a toujours une sortie, lorsqu'il s'agit d'une sortie, elle peut être à 0 ou à 1 en fonction du OUT, rien n'a changé. Par contre, l'entrée est à haute impédance et dans l'état normal lorsque le OUT est à 0 et que le REN est aussi à 0. Par contre, on enclenche l'une ou l'autre des résistances avec le REN à 1, ce sera un pull-up avec le 1, un pull-down avec le 0. Je vous signale qu'il faut être prudent si on utilise des valeurs qui sont différentes de celles qui sont citées dans cette sorte de table de vérité que je viens de vous dessiner. Prenons un exemple, je n'ai pas parlé du cas où on aurait un 1 sur le Resistor Enable et un 1 sur le DIR. Qu'est-ce qui va se passer? Je ne peux pas vous donner la réponse, la réponse se trouve dans la documentation du fabricant, elle va varier d'un fabricant à l'autre, bien évidemment, mais soyez extrêmement prudents d'utiliser les modes qui sont prévus par le fabricant. Bien évidemment, tout ça est décrit dans les documents que les fabricants nous donnent et qui décrivent avec beaucoup de précision, mais dans un très grand nombre de pages, le fonctionnement exact de toutes les parties des microcontrôleurs. Prenons un exemple. En fait, nous avons déjà vu ce programme, mais il y avait deux lignes qui n'avaient pas été très clairement expliquées. Essayons de les lire, d'abord la seconde, ici dans le registre REN, je vais activer le bit 2 et le bit 3, je vais donc bel et bien enclencher les résistances. Maintenant, je décide, en agissant avec un setbit également sur le bit 2 et sur le bit 3, de choisir des résistances du type pull-up. Est-ce que l'Arduino ne pourrait pas résoudre notre problème? Dans un certain sens, oui, puisque la primitive, la fonction pinMode que nous connaissons permet non seulement de mettre une patte en sortie, OUTPUT, ou une patte en entrée, mais, je vous l'apprends aujourd'hui, il est aussi possible de la mettre en mode INPUT_PULLUP, c'est-à-dire une entrée avec une résistance de rappel vers le haut. Malheureusement, ils n'ont pas prévu la résistance pull-down, donc cette ligne va fonctionner parfaitement bien sur un AVR d'Atmel, sur un MSP430 avec l'environnement Energia, mais on ne pourra pas utiliser le pull-down, qui est pourtant physiquement disponible sur un MSP430. Mais c'est tout de même intéressant, ça permet d'avoir une syntaxe qui fonctionne sur tous les microcontrôleurs qui disposent de résistances de rappel vers le haut, de résistances de pull-up. En résumé, nous venons de voir que les résistances de tirage sont indispensables chaque fois qu'une patte risque de se trouver en l'air, nous avons vu aussi que beaucoup de microcontrôleurs intègrent ces résistances de tirage à l'intérieur du circuit intégré, et nous avons aussi noté que chaque fabricant propose sa propre implémentaion pour ces mécanismes de pull-up, et éventuellement de pull-down.