{"id":514,"date":"2014-01-03T18:07:19","date_gmt":"2014-01-03T16:07:19","guid":{"rendered":"http:\/\/pila.fr\/wordpress\/?p=514"},"modified":"2014-06-24T10:27:51","modified_gmt":"2014-06-24T08:27:51","slug":"sevenseg-utilisation-dafficheurs-7-segments-doubles-sur-microcontroleurs-pics","status":"publish","type":"post","link":"https:\/\/pila.fr\/wordpress\/archives\/514","title":{"rendered":"SevenSeg : utilisation d&rsquo;afficheurs 7 segments doubles sur microcontr\u00f4leurs PICs"},"content":{"rendered":"<p style=\"text-align: justify;\">Lorsqu&rsquo;il est n\u00e9cessaire de communiquer des informations \u00e0 l&rsquo;utilisateur, l&rsquo;ami le plus fid\u00e8le des microcontr\u00f4leurs est souvent un afficheur LCD, et particuli\u00e8rement ceux dot\u00e9s d&rsquo;un contr\u00f4leur HD44780. Ces \u00e9crans, dont la taille varie de 8 caract\u00e8res pour les plus petits, \u00e0 plus de 4 lignes de 20 caract\u00e8res pour les plus grands, sont particuli\u00e8rement ais\u00e9 \u00e0 utiliser gr\u00e2ce \u00e0 leur contr\u00f4leur, qui utilise un protocole de communication tr\u00e8s simple. Mais je ne m&rsquo;\u00e9tendrai pas sur le sujet, celui-ci ayant d\u00e9j\u00e0 fait l&rsquo;objet de l&rsquo;article <a title=\"Librairie pour afficheurs LCD hd44780 sur PIC avec le compilateur hi-tech PICC\" href=\"http:\/\/pila.fr\/wordpress\/?p=40\" target=\"_blank\">suivant<\/a>.<\/p>\n<p style=\"text-align: justify;\">Cependant, dans certains projets, l&rsquo;utilisation de ces \u00e9crans reviendrait \u00e0 utiliser un Hummer pour se rendre au travail : \u00e7a passe difficilement les virages, \u00e7a se gare de justesse, et on fini par se demander si on a r\u00e9ellement besoin de tant pour effectuer ces simples trajets quotidiens. C&rsquo;est par exemple le cas lorsqu&rsquo;on souhaite juste afficher une temp\u00e9rature : l\u00e0 o\u00f9 2 caract\u00e8res sont n\u00e9cessaires, le plus petit afficheur LCD en propose 8. Un peu \u00ab\u00a0overshoot\u00a0\u00bb, non ?<\/p>\n<div style=\"width: 500px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/pila.fr\/content\/PIC_7segment\/LCDvs7segments.jpg\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"  \" src=\"http:\/\/pila.fr\/content\/PIC_7segment\/LCDvs7segments_redux.jpg\" alt=\"illustration LCD vs 7 segments\" width=\"500\" height=\"144\" \/><\/a><p class=\"wp-caption-text\">Afficheur LCD vs Afficheur 7 segments<\/p><\/div>\n<p style=\"text-align: justify;\">Travaillant justement sur un de ces projets qui ne requi\u00e8rent que l&rsquo;affichage d&rsquo;un nombre \u00e0 2 chiffres, j&rsquo;ai mis au point quelques fonctions simples afin de faciliter l&rsquo;utiliser de ces afficheurs. Ces fonctions sont pr\u00e9vues pour fonctionner avec un afficheur double ( 2 chiffres ) qu&rsquo;il soit \u00e0 anode commune, ou cathode commune, mais elles fonctionneront telles quelles avec un afficheur simple ( 1 chiffre ) et ne demanderont que des modifications simples pour fonctionner avec des afficheurs avec plus de chiffres. L&rsquo;ensemble du code est \u00e9crit pour le compilateur XC8 de Microchip, mais devrait fonctionner sans difficult\u00e9s sur d&rsquo;autres afficheurs.<\/p>\n<p style=\"text-align: justify;\"><!--more--><\/p>\n<h2 style=\"text-align: justify;\">Introduction aux afficheurs 7 segments<\/h2>\n<p style=\"text-align: justify;\">Mais commen\u00e7ons par le d\u00e9but, en revenant sur le principe de fonctionnement des afficheurs 7 segments : il s&rsquo;agit ni plus ni moins de 7 leds, reli\u00e9es ensemble par l&rsquo;une de leur broche. Si ce sont les cathodes (cot\u00e9 n\u00e9gatif) des leds qui sont reli\u00e9es ensemble, on parle d&rsquo;afficheur \u00e0 cathode commune. L&rsquo;inverse ( leds reli\u00e9es par leurs anodes) est bien entendu nomm\u00e9 anode commune :<\/p>\n<div style=\"width: 500px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/pila.fr\/content\/PIC_7segment\/7segmentsillustration.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\" \" src=\"http:\/\/pila.fr\/content\/PIC_7segment\/7segmentsillustration_redux.png\" alt=\"afficheur principe\" width=\"500\" height=\"400\" \/><\/a><p class=\"wp-caption-text\">Afficheur 7 segment, anode commune, cathode commune<\/p><\/div>\n<p>Il a souvent une led en plus, qui correspond au point d\u00e9cimal. Pour utiliser cet afficheur avec un microcontr\u00f4leur PIC, rien de plus simple, la broche \u00ab\u00a0commune\u00a0\u00bb est reli\u00e9e \u00e0 la masse dans le cas d&rsquo;un afficheur \u00e0 cathode commune, et au +5V du PIC pour un afficheur a anode commune. Les broches restantes sont alors reli\u00e9es \u00e0 un port du PIC, chacune \u00e0 travers une r\u00e9sistance de 1kohms, et c&rsquo;est parti !<\/p>\n<p>Oui, mais maintenant on souhaiterait utiliser un afficheur \u00e0 2 chiffres. On peut bien sur appliquer la m\u00eame m\u00e9thode, en utilisant 2 ports du PIC, un pour chaque afficheur. Mais \u00e7a commence \u00e0 faire un sacr\u00e9 nombre de broches, et on risque de ne plus pouvoir faire grand chose d&rsquo;autre de notre PIC. D&rsquo;ailleurs, les afficheurs \u00e0 plusieurs chiffres du commerces ne sont pas con\u00e7us comme \u00e7a. En fait, les chiffres sont c\u00e2bl\u00e9s en parall\u00e8le, et seule la broche commune \u00e0 tous les segments d&rsquo;un m\u00eame chiffre permet de s\u00e9lectionner ce chiffre :<\/p>\n<div style=\"width: 500px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/pila.fr\/content\/PIC_7segment\/LTC4620_internalcircuitdiagram.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\" \" src=\"http:\/\/pila.fr\/content\/PIC_7segment\/LTC4620_internalcircuitdiagram_redux.png\" alt=\"schema LTC4620HG\" width=\"500\" height=\"228\" \/><\/a><p class=\"wp-caption-text\">Illustration tir\u00e9e de la documentation du quadruple afficheur LTC4620HG<\/p><\/div>\n<p>Comme il s&rsquo;agit d&rsquo;un afficheur tir\u00e9 d&rsquo;un appareil qui affichait l&rsquo;heure, les leds UC et LC correspondent aux doubles points centraux.<\/p>\n<p>Pour allumer une led, faut s\u00e9lectionner son chiffre (\u00ab\u00a0digit\u00a0\u00bb), puis le segment. Par exemple, pour allumer la led B du digit 2, on relie la broche 8 au +5V, puis la broche 10 \u00e0 la masse \u00e0 travers un r\u00e9sistance. Simple non ?<\/p>\n<p>Mais je sens une question pointer : \u00ab\u00a0Avec ce syst\u00e8me, comment fais-tu pour allumer la led B du digit 2 ET la led C du digit 1 sans allumer les autres ? \u00ab\u00a0.<\/p>\n<p>La r\u00e9ponse est simple, on ne peut tout simplement pas. C&rsquo;est une des limites de ce syst\u00e8me. Cependant, il permet de piloter 32 leds avec seulement 12 pins, il faut bien qu&rsquo;il y ait un inconv\u00e9nient quelque part.<\/p>\n<p>\u00ab\u00a0Mais pourtant, n&rsquo;importe quel r\u00e9veil num\u00e9rique est bien capable d&rsquo;afficher 4 chiffres diff\u00e9rents en m\u00eame temps\u00a0\u00bb.<\/p>\n<p style=\"text-align: justify;\">En fait, pas exactement en m\u00eame temps, et c&rsquo;est l\u00e0 toute l&rsquo;astuce ! Il n&rsquo;y a qu&rsquo;un chiffre d&rsquo;allum\u00e9 \u00e0 la fois, et m\u00eame un seul segment sur certains appareils. La seule contrainte est d&rsquo;alterner assez rapidement entre les chiffres pour que ceux-ci semblent fixes pour l&rsquo;oeil humain, typiquement un clignotement \u00e0 50 Hz est quasiment imperceptible. En dessous de 30Hz, les chiffres commencent \u00e0 scintiller visiblement, et si on ralentit encore, la lecture de l&rsquo;afficheur devient p\u00e9nible.<\/p>\n<p style=\"text-align: justify;\">Maintenant que les bases sont pos\u00e9es, rentrons dans le vif du sujet : l&rsquo;utilisation d&rsquo;un afficheur double avec un microcontr\u00f4leur PIC :<\/p>\n<h2 style=\"text-align: justify;\">Sch\u00e9ma de c\u00e2blage<\/h2>\n<p>Le sch\u00e9ma varie l\u00e9g\u00e8rement en fonction du type (Anode ou Cathode commune) de l&rsquo;afficheur :<\/p>\n<div style=\"width: 500px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/pila.fr\/content\/PIC_7segment\/schematicBothCommon.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\" \" src=\"http:\/\/pila.fr\/content\/PIC_7segment\/schematicBothCommon_redux.png\" alt=\"Schema montages\" width=\"500\" height=\"229\" \/><\/a><p class=\"wp-caption-text\">Montages pour les deux types d&rsquo;afficheurs<\/p><\/div>\n<p>Les diff\u00e9rences entre les deux sch\u00e9mas sont : le type des transistors, NPN pour l&rsquo;afficheur \u00e0 Cathode commune, et PNP pour celui \u00e0 Anode commune, et la tension pr\u00e9sente sur l&rsquo;\u00e9metteur des transistors (la masse dans un cas, et le +5V dans l&rsquo;autre).<\/p>\n<p>Pour les r\u00e9sistances, si vous ne souhaitez pas les calculer pr\u00e9cis\u00e9ment, une valeur de 1kohms pour toutes les r\u00e9sistances devrait convenir dans la plupart des cas. Pour les transistors, des mod\u00e8les courant, comme le 2N2222 (NPN) et le 2N2907 (PNP) sont tout indiqu\u00e9s.<\/p>\n<div style=\"width: 500px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/pila.fr\/content\/PIC_7segment\/testBoard.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\" \" src=\"http:\/\/pila.fr\/content\/PIC_7segment\/testBoard_redux.png\" alt=\"Image montage\" width=\"500\" height=\"281\" \/><\/a><p class=\"wp-caption-text\">Mon montage de test, je n&rsquo;avais pas d&rsquo;afficheur double sous la main, seulement un quadruple. On note que m\u00eame l&rsquo;appareil photo \u00ab\u00a0voit\u00a0\u00bb les 2 chiffres allum\u00e9s en m\u00eame temps, alors qu&rsquo;un seul chiffre \u00e0 la fois est \u00e9clair\u00e9.<\/p><\/div>\n<p>Les broches du PIC sont donn\u00e9es \u00e0 titre indicatif, il s&rsquo;agit de la configuration par d\u00e9faut pour le code pr\u00e9sent\u00e9 plus loin. Il est tout \u00e0 fait possible d&rsquo;utiliser d&rsquo;autres broches, mais un port complet doit \u00eatre d\u00e9di\u00e9 \u00e0 l&rsquo;afficheur (ici le port B).<\/p>\n<h2>Le code : ma biblioth\u00e8que SevenSeg<\/h2>\n<p>Parler de biblioth\u00e8que est ici un peu exag\u00e9r\u00e9, puisqu&rsquo;il n&rsquo;y a en tout et pour tout que 5 fonctions :<\/p>\n<ul>\n<li><strong>void sevenSegRefreshDisplay(void)<\/strong> : cette fonction doit \u00eatre appel\u00e9e r\u00e9guli\u00e8rement, l&rsquo;id\u00e9al \u00e9tant de l&rsquo;appeler depuis une interruption g\u00e9n\u00e9r\u00e9e par le d\u00e9bordement d&rsquo;un timer. Chaque appel de cette fonction alterne l&rsquo;affichage entre le chiffre des unit\u00e9 et celui des dizaines. Il faut l&rsquo;appeler au minimum 60 fois par seconde pour \u00e9viter un scintillement trop visible de l&rsquo;afficheur, l&rsquo;id\u00e9al \u00e9tant plus de 100 fois par seconde. Les variables <em>sevenSegUnitValue<\/em> et <em>sevenSegDigitValue<\/em> indiquent quels segments de chaque digit doit s&rsquo;allumer, chaque bit correspondant \u00e0 un segment, dans l&rsquo;ordre a b c d e f g dp.<\/li>\n<li><strong>void sevenSegSetRawValue(unsigned char decade, unsigned char unit)<\/strong> : cette fonction permet de modifier directement les variables <em>sevenSegUnitValue<\/em> et <em>sevenSegDigitValue<\/em> qui indiquent quels segments de chaque digit doivent d&rsquo;allumer.<\/li>\n<li><strong>void sevenSegSetNumber(unsigned char valueToDisplay)<\/strong> : cette fonction permet d&rsquo;afficher un nombre, compris entre 0 et 99 inclus, pass\u00e9 en param\u00e8tre. Tout nombre sup\u00e9rieur \u00e0 99 provoque l&rsquo;affichage des lettres \u00ab\u00a0HI\u00a0\u00bb.<\/li>\n<li><strong>void sevenSegSetUnitDigit(unsigned char digitValue)<\/strong> : cette fonction permet d&rsquo;afficher un chiffre sur le digit des unit\u00e9s. Le chiffre affich\u00e9 correspond \u00e0 la valeur de la variable <em>digitValue<\/em> modulo 10.<\/li>\n<li><strong>void sevenSegSetDecadeDigit(unsigned char digitValue)<\/strong> : cette fonction permet d&rsquo;afficher un chiffre sur le digit des dizaines. Le chiffre affich\u00e9 correspond \u00e0 la valeur de la variable <em>digitValue<\/em> modulo 10.<\/li>\n<\/ul>\n<h3>Configuration<\/h3>\n<p>Toute la configuration se fait est \u00e9ditant la section <em>SETTINGS<\/em> du fichier <em>7segment.h<\/em>.<\/p>\n<p>Par d\u00e9faut, les signaux g\u00e9n\u00e9r\u00e9s correspondent \u00e0 un afficheur a Cathode commune. Si un afficheur \u00e0 Anode commune est utilis\u00e9e, il faut d\u00e9-commenter la ligne suivante :<\/p>\n<pre lang=\"c\">\/\/#define sevenSegCommonAnode<\/pre>\n<p>Il est \u00e9galement possible de configurer les I\/O utilis\u00e9es pour l&rsquo;afficheur, le seul imp\u00e9ratif \u00e9tant l&rsquo;utilisation d&rsquo;un port complet pour le pilotage des segments de l&rsquo;afficheur. Il aurait \u00e9t\u00e9 possible de pouvoir utiliser 8 broches s\u00e9par\u00e9es \u00e0 cet effet, mais cela demanderait beaucoup de calculs inutiles au PIC.<\/p>\n<h3>Utilisation<\/h3>\n<p>Ajouter les fichiers<em> 7segment.h<\/em> et<em> 7segment.c<\/em> au projet MPLAB, et inclure 7segment.h dans les fichiers o\u00f9 l&rsquo;on souhaite pouvoir utiliser les fonctions de la biblioth\u00e8que.<\/p>\n<p>Le fichier Demo.c inclus le code n\u00e9cessaire au test de l&rsquo;affichage, pour un PIC16F628A, mais devrait faire l&rsquo;affaire pour beaucoup d&rsquo;autres PICs de la s\u00e9rie 16F (commenter la ligne CMCON=0x07; au besoin).<\/p>\n<h3>T\u00e9l\u00e9chargement<\/h3>\n<p>L&rsquo;archive contenant les fichier cit\u00e9s pr\u00e9c\u00e9demment est t\u00e9l\u00e9chargeable <a href=\"http:\/\/pila.fr\/content\/PIC_7segment\/7segment.zip\" target=\"_blank\">ICI<\/a>.<\/p>\n<h2>Conclusion<\/h2>\n<p>Cette biblioth\u00e8que, bien que toute petite, permet de mettre rapidement en place une interface \u00e0 base d&rsquo;afficheurs 7 segments, en offrant les fonctions qui me semblent indispensables, notamment l&rsquo;affichage directe de nombres. Elle ne g\u00e8re pour l&rsquo;instant que les afficheurs doubles, mais peut \u00eatre \u00e9tendue facilement aux afficheurs triples, quadruples, etc&#8230; ,facilement.<\/p>\n<p>&nbsp;<\/p>\n<p>Un exemple en vid\u00e9o du r\u00e9sultat possible, affichage de la valeur d&rsquo;une variable incr\u00e9ment\u00e9e de 0 \u00e0 128 :<\/p>\n<p style=\"text-align: center;\"><iframe loading=\"lazy\" src=\"\/\/www.youtube-nocookie.com\/embed\/xrgVQRu_cA8\" width=\"560\" height=\"315\" frameborder=\"0\">allowfullscreen=\u00a0\u00bballowfullscreen\u00a0\u00bb><\/iframe><\/p>\n<p>Comme d&rsquo;habitude, n&rsquo;h\u00e9sitez pas \u00e0 me faire part de vos remarques, questions, etc&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Lorsqu&rsquo;il est n\u00e9cessaire de communiquer des informations \u00e0 l&rsquo;utilisateur, l&rsquo;ami le plus fid\u00e8le des microcontr\u00f4leurs est souvent un afficheur LCD, et particuli\u00e8rement ceux dot\u00e9s d&rsquo;un contr\u00f4leur HD44780. Ces \u00e9crans, dont la taille varie de 8 caract\u00e8res pour les plus petits, \u00e0 plus de 4 lignes de 20 caract\u00e8res pour les plus grands, sont particuli\u00e8rement ais\u00e9 &hellip; <\/p>\n<p><a class=\"more-link btn\" href=\"https:\/\/pila.fr\/wordpress\/archives\/514\">Lire la suite<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7,8],"tags":[70,26,24,72,33,22,71],"class_list":["post-514","post","type-post","status-publish","format-standard","hentry","category-electronique","category-prog","tag-7-segments","tag-afficheur","tag-bibliotheque","tag-microchip","tag-microcontroleur","tag-pic","tag-xc8","item-wrap"],"_links":{"self":[{"href":"https:\/\/pila.fr\/wordpress\/wp-json\/wp\/v2\/posts\/514","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pila.fr\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pila.fr\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pila.fr\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pila.fr\/wordpress\/wp-json\/wp\/v2\/comments?post=514"}],"version-history":[{"count":58,"href":"https:\/\/pila.fr\/wordpress\/wp-json\/wp\/v2\/posts\/514\/revisions"}],"predecessor-version":[{"id":785,"href":"https:\/\/pila.fr\/wordpress\/wp-json\/wp\/v2\/posts\/514\/revisions\/785"}],"wp:attachment":[{"href":"https:\/\/pila.fr\/wordpress\/wp-json\/wp\/v2\/media?parent=514"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pila.fr\/wordpress\/wp-json\/wp\/v2\/categories?post=514"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pila.fr\/wordpress\/wp-json\/wp\/v2\/tags?post=514"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}