{"id":925,"date":"2015-03-28T14:51:45","date_gmt":"2015-03-28T18:51:45","guid":{"rendered":"https:\/\/ve2cuy.wordpress.com\/?page_id=925"},"modified":"2015-03-28T14:51:45","modified_gmt":"2015-03-28T18:51:45","slug":"comment-programmer-lhorloge-dun-pic-18f","status":"publish","type":"page","link":"https:\/\/ve2cuy.com\/blog\/index.php\/comment-programmer-lhorloge-dun-pic-18f\/","title":{"rendered":"Comment programmer l&rsquo;horloge d&rsquo;un pic 18F"},"content":{"rendered":"<h1>Mise en situation<\/h1>\n<p><a href=\"http:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/squarewave.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-809\" style=\"margin-right:20px;margin-top:10px;\" src=\"http:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/squarewave.png\" alt=\"squarewave\" width=\"261\" height=\"213\" \/><\/a>Lorsque nous commen\u00e7ons nos premiers balbutiements avec les microcontr\u00f4leurs, un des premiers obstacles rencontr\u00e9s est assur\u00e9ment le choix d\u2019une source d\u2019horloge de cadence du microcontr\u00f4leur ainsi que ses param\u00e8tres de configuration.<\/p>\n<p>Pour les membres de la famille des PIC 18F, il y a quatre choix possibles pour cadencer la puce, soit \u00e0 partir:<\/p>\n<p>&#8211; d\u2019un signal d\u2019horloge externe,<br \/>\n&#8211; d\u2019un circuit oscillant RC (r\u00e9sistance\/condensateur) externe,<br \/>\n&#8211; d\u2019un cristal externe,<br \/>\n&#8211; ou de l\u2019horloge interne du microcontr\u00f4leur.<\/p>\n<p>Dans les montages effectu\u00e9s par les bricoleurs maisons, le choix se situe habituellement entre l\u2019horloge interne et le cristal externe.<\/p>\n<h1>L\u2019horloge interne du PIC 18F<\/h1>\n<p>Le PIC 18F4553 poss\u00e8de une horloge interne qui peut \u00eatre utilis\u00e9e pour cadencer ce dernier. C\u2019est une solution \u00e9conomique \u2013 pas de pi\u00e8ces suppl\u00e9mentaires \u00e0 ajouter au montage \u2013 qu\u2019on utilisera si une valeur maximale de 8 MHZ convient et qu\u2019une impr\u00e9cision d\u2019environ +- 2% de la fr\u00e9quence n\u2019aura pas d\u2019impact sur le syst\u00e8me.<\/p>\n<p>L\u2019horloge interne offre les cadences suivantes\u00a0:<\/p>\n<p><!--more--><\/p>\n<pre><strong>8 MHz \u2013 (111) *\n4 MHz \u2013 (110)\n2 MHz \u2013 (101)\n1 MHz \u2013 (100)\n500 kHz \u2013 (011)\n250 kHz \u2013 (010)\n125 kHz \u2013 (001)\n31.25 kHz \u2013 (000)<\/strong><\/pre>\n<p style=\"text-align:right;\"><strong>tableau 1<\/strong><\/p>\n<p>* Les valeurs entre parenth\u00e8ses seront utilis\u00e9es dans nos programmes pour renseigner la vitesse de l\u2019horloge interne.<\/p>\n<h1>Comment programmer l\u2019horloge interne du PIC 18F4553?<\/h1>\n<p>La source de l\u2019horloge &#8211; interne, cristal, RC \u2026 &#8211; est s\u00e9lectionn\u00e9e via les bits de configuration <strong>FOSC (fr\u00e9quence de l&rsquo;oscillateur)<\/strong>.<\/p>\n<p>La fa\u00e7on la plus simple, sous MPLAB X IDE et XC8, est d\u2019utiliser la directive de compilation suivante dans notre\u00a0programme\u00a0:<\/p>\n<pre><strong>#pragma config FOSC = INTOSC_EC\n\n<\/strong><\/pre>\n<p>Sans autre configuration, le microcontr\u00f4leur sera cadenc\u00e9 \u00e0 8 MHz par l\u2019horloge interne du PIC.<\/p>\n<p>De plus, la fr\u00e9quence de l&rsquo;oscillateur\u00a0divis\u00e9e par 4 (<strong>Fosc\/4<\/strong>) sera pr\u00e9sent\u00e9e \u00e0 la broche 14 (<strong>OSC2\/CLK0\/RA6<\/strong>) du PIC.<\/p>\n<p>Cela sera utile pour prendre des lectures de fr\u00e9quences lors de nos exp\u00e9rimentations.<\/p>\n<p><em>Note: Le PIC 18F ex\u00e9cute ses instructions en quatre (4) cycles d&rsquo;horloge. Fosc\/4 permet donc de synchroniser les circuits externes avec la cadence d\u2019ex\u00e9cution d\u2019une instruction.<\/em><\/p>\n<h2>Plan des broches (Pin-out) du PIC 18F4553<\/h2>\n<p><a href=\"http:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/18f4553-pinout.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-734\" src=\"http:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/18f4553-pinout.png?w=630\" alt=\"18F4553-pinout\" width=\"630\" height=\"380\" srcset=\"https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/18f4553-pinout.png 789w, https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/18f4553-pinout-300x181.png 300w, https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/18f4553-pinout-768x464.png 768w\" sizes=\"auto, (max-width: 630px) 100vw, 630px\" \/><\/a><\/p>\n<p style=\"text-align:right;\"><strong>Image\u00a01<\/strong><\/p>\n<p><strong>\u00a0<\/strong><\/p>\n<p>&nbsp;<\/p>\n<h2>Le diagramme de bloc du PIC 18F4553<\/h2>\n<p><a href=\"http:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/pic18f4553-block-diag.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-753\" src=\"http:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/pic18f4553-block-diag.png?w=630\" alt=\"PIC18F4553-block-diag\" width=\"630\" height=\"852\" srcset=\"https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/pic18f4553-block-diag.png 774w, https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/pic18f4553-block-diag-222x300.png 222w, https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/pic18f4553-block-diag-757x1024.png 757w, https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/pic18f4553-block-diag-768x1039.png 768w\" sizes=\"auto, (max-width: 630px) 100vw, 630px\" \/><\/a><\/p>\n<p style=\"text-align:right;\">\u00a0<strong>Image 2<\/strong><\/p>\n<p>&nbsp;<\/p>\n<h1>Pr\u00e9parons le montage suivant<\/h1>\n<p><a href=\"http:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/img_0008.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-724\" src=\"http:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/img_0008.jpg?w=630\" alt=\"IMG_0008\" width=\"630\" height=\"470\" \/><\/a><\/p>\n<p style=\"text-align:right;\">\u00a0<strong>Image 3<\/strong><\/p>\n<p style=\"text-align:left;\">Note: Les deux condensateurs, sur l&rsquo;image pr\u00e9c\u00e9dente, \u00a0serviront au Labo avec un cristal externe.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/labo_01.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-756\" src=\"http:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/labo_01.png?w=630\" alt=\"Labo_01\" width=\"630\" height=\"469\" srcset=\"https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/labo_01.png 1287w, https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/labo_01-300x224.png 300w, https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/labo_01-1024x764.png 1024w, https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/labo_01-768x573.png 768w\" sizes=\"auto, (max-width: 630px) 100vw, 630px\" \/><\/a><\/p>\n<p style=\"text-align:right;\"><strong>Image 4<\/strong><\/p>\n<h1>Le code source<\/h1>\n<p>[sourcecode language=\u00a0\u00bbc\u00a0\u00bb]<\/p>\n<p>\/*<br \/>\n * Project: Tester l&rsquo;horloge interne du 18F4553 sous MPLAB X IDE v2.10 et XC8<br \/>\n * Auteur:  Alain Boudreault<br \/>\n * Date:    2014.06.14<br \/>\n * &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\n * Description:<br \/>\n *<br \/>\n * Le but de ce projet est de tester toutes les combinaisons de IRCFn<br \/>\n * pour faire varier la vitesse de l&rsquo;horloge interne et<br \/>\n * de mesurer fz\/4 sur OSC2.<br \/>\n *<br \/>\n * Des LEDs, sur PORTD, sont utilis\u00e9s comme r\u00e9troaction visuelle<br \/>\n * aux changements de la vitesse.<br \/>\n *<br \/>\n * La plage horloge s&rsquo;\u00e9tend de 31.25 kHz \u00e0 8 MHz.<br \/>\n *<br \/>\n * Le PORTB &#8211; 3 bits seront requis &#8211; est utilis\u00e9 en entr\u00e9es<br \/>\n * pour composer les valeurs possibles.<br \/>\n *<br \/>\n * Ce port a l&rsquo;avantage d&rsquo;avoir des r\u00e9sistances pull-UP internes ce qui<br \/>\n * all\u00e8ge le montage physique.<br \/>\n *<br \/>\n * Pour activer les pull-UP:  RBPU = 0;<br \/>\n *<br \/>\n * Il est possible d&rsquo;ajuster finement la fr\u00e9quence d&rsquo;horloge avec OSCTUNE<br \/>\n *<br \/>\n *  011111 Fr\u00e9quence maximale<br \/>\n *  000000 Fr\u00e9quence centre<br \/>\n *  111111<br \/>\n *  100000 Fr\u00e9quence minimum<br \/>\n *  Par exemple,  OSCTUNE = 0b00000111;<br \/>\n *<br \/>\n *\/<\/p>\n<p>#include &quot;pic18F4553.h&quot;<\/p>\n<p>#define LED_TRIS  TRISAbits.TRISA1<br \/>\n#define LED_PIN   PORTAbits.RA1<\/p>\n<p>#define LECTURE0   PORTBbits.RB0<br \/>\n#define LECTURE1   PORTBbits.RB1<br \/>\n#define LECTURE2   PORTBbits.RB2<\/p>\n<p>#define VITE    0b01110000<br \/>\n#define LENT    0b00000000<br \/>\n#define ENTREE  1<br \/>\n#define SORTIE  0<br \/>\n#define END_OF_TIME 1<\/p>\n<p>#pragma config FOSC = INTOSC_EC     \/\/ Horloge interne avec fz\/4 sur OSC2<br \/>\n#pragma config PBADEN = OFF         \/\/ PORTB&lt;4:0&gt; broches configur\u00e9es en digital I\/O sur Reset<\/p>\n<p>unsigned char i = 0;<\/p>\n<p>void delay() {<br \/>\n    long int counter = 0;<br \/>\n    for (counter = 0; counter&lt;500; counter++) {  asm(&quot;NOP&quot;);   }<br \/>\n} \/\/ delay<\/p>\n<p>void main(void) {<\/p>\n<p>    TRISC0 = SORTIE;<br \/>\n    TRISD = 0;          \/\/ LEDs pour la r\u00e9troaction visuelle<br \/>\n    LED_TRIS = 0;<\/p>\n<p>    \/\/ Activer les pull-up du PORTB<br \/>\n    RBPU = 0;<\/p>\n<p>    while (END_OF_TIME) {<\/p>\n<p>         \/\/ Ajuster la vistesse de l&rsquo;horloge en fonction des pins de configuration<br \/>\n         OSCCONbits.IRCF0\t= !LECTURE0;<br \/>\n         OSCCONbits.IRCF1\t= !LECTURE1;<br \/>\n         OSCCONbits.IRCF2\t= !LECTURE2;<\/p>\n<p>         \/\/ Allumer le LED t\u00e9moin si vitesse horloge &gt;= 1 MHz<br \/>\n         if (!LECTURE2 == 1 )<br \/>\n            LED_PIN = 1;<br \/>\n         else<br \/>\n            LED_PIN = 0;<\/p>\n<p>        \/\/ Afficher la s\u00e9quence des LEDs t\u00e9moins<br \/>\n        PORTD = i++;<br \/>\n        delay();<br \/>\n    } \/\/ while<br \/>\n} \/\/ main()<\/p>\n<p>[\/sourcecode]<\/p>\n<h1>Explications du code<\/h1>\n<p>&nbsp;<\/p>\n<p>[sourcecode language=\u00a0\u00bbcss\u00a0\u00bb]<br \/>\n\u00c0 suivre &#8230;<br \/>\n[\/sourcecode]<\/p>\n<hr \/>\n<h1>R\u00e9sultats du montage<\/h1>\n<h2>Lecture de la broche 14 &#8211; OSC2\/CLK0\/RA6:<\/h2>\n<p><strong><span style=\"color:#008000;\">Test 1 &#8211; Le montage est sous tension et les broches Rb0, RB1 et RB2 sont connect\u00e9es \u00e0 VDD (ground).<\/span><\/strong><\/p>\n<p>Note: Le programme va inverser l&rsquo;\u00e9tat de ces broches, par exemple,\u00a0!LECTURE0.<\/p>\n<p>Pourquoi proc\u00e9der ainsi? \u00a0Parce que nous utilisons les &lsquo;pull-up&rsquo; interne du PORTB. \u00a0La valeur par d\u00e9faut des broches du PORTB est donc \u00e0 logique &lsquo;1&rsquo;. \u00a0Pour changer l&rsquo;\u00e9tat, il faut donc passer \u00e0 logique &lsquo;0&rsquo;.<\/p>\n<p>Donc, nous obtiendrons 111 comme valeur de lecture pour RB:2..0.<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"text-decoration:underline;\">Avec<strong>\u00a0IRCF:111 = Fosc\/4 = 2mHz<\/strong><\/span><\/p>\n<p><a href=\"http:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/8mhz-osc2-2mhz.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-735\" src=\"http:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/8mhz-osc2-2mhz.png?w=630\" alt=\"8mhz-osc2-2mhz\" width=\"630\" height=\"145\" srcset=\"https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/8mhz-osc2-2mhz.png 721w, https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/8mhz-osc2-2mhz-300x69.png 300w\" sizes=\"auto, (max-width: 630px) 100vw, 630px\" \/><\/a><\/p>\n<p style=\"text-align:right;\"><strong>Image 5<\/strong><\/p>\n<p><span style=\"color:#ff0000;\"><strong>R\u00e9sultat:<\/strong><\/span><\/p>\n<p>Le PIC est cadenc\u00e9 \u00e0 <strong>8mHz<\/strong>, il ex\u00e9cute <strong>2 millions d&rsquo;instructions par seconde<\/strong> et une impulsion cadenc\u00e9e \u00e0 <strong>2mHz<\/strong> est pr\u00e9sente \u00e0 la broche <strong>RA6<\/strong>.<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<p><span style=\"color:#008000;\"><strong>Test 2 &#8211; Le montage est sous tension et seulement la broche RB2 est connect\u00e9e \u00e0 VDD (ground).<\/strong>\u00a0<\/span><\/p>\n<p><span style=\"text-decoration:underline;\">Avec<strong>\u00a0IRCF:100 = Fosc\/4 = 252.63kHz<\/strong><\/span><\/p>\n<p><a href=\"http:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/1mhz-osc2-252mhz.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-748\" src=\"http:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/1mhz-osc2-252mhz.png?w=630\" alt=\"1mhz-osc2-.252mhz\" width=\"630\" height=\"128\" srcset=\"https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/1mhz-osc2-252mhz.png 836w, https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/1mhz-osc2-252mhz-300x61.png 300w, https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/1mhz-osc2-252mhz-768x157.png 768w\" sizes=\"auto, (max-width: 630px) 100vw, 630px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color:#ff0000;\"><strong>R\u00e9sultat:<\/strong><\/span><\/p>\n<p>Le PIC est cadenc\u00e9 \u00e0 1mHz (lecture r\u00e9elle \u00e0 1.01mHz &#8211; souvenez-vous de l\u2019impr\u00e9cision de +- 2%), il ex\u00e9cute 252 milles\u00a0instructions par seconde et une impulsion cadenc\u00e9e \u00e0 252kHz est pr\u00e9sente \u00e0 la broche RA6<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<p><span style=\"color:#008000;\"><strong>Test 3 &#8211; Le montage est sous tension et aucune\u00a0broche n&rsquo;est connect\u00e9e \u00e0 VDD (ground).\u00a0<\/strong>\u00a0<\/span><\/p>\n<p><span style=\"text-decoration:underline;\">Avec<strong>\u00a0IRCF:000 = Fosc\/4 = 7.84kHz<\/strong><\/span><\/p>\n<p><a href=\"http:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/31-25khz-osc2-7-8khz.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-750\" src=\"http:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/31-25khz-osc2-7-8khz.png?w=630\" alt=\"31.25kHz-osc2-.7.8kHz\" width=\"630\" height=\"121\" srcset=\"https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/31-25khz-osc2-7-8khz.png 845w, https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/31-25khz-osc2-7-8khz-300x58.png 300w, https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/31-25khz-osc2-7-8khz-768x148.png 768w\" sizes=\"auto, (max-width: 630px) 100vw, 630px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color:#ff0000;\"><strong>R\u00e9sultat:<\/strong><\/span><\/p>\n<p>Le PIC est cadenc\u00e9 \u00e0 32.5kHz, il ex\u00e9cute 7800\u00a0instructions par seconde et une impulsion cadenc\u00e9e \u00e0 7.8kHz est pr\u00e9sente \u00e0 la broche RA6<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<p>Voici le r\u00e9sultat vid\u00e9o du projet avec changement en temps r\u00e9el de <strong>Fosc<\/strong> en faisant varier la valeur des broches <strong>33- RB0, \u00a034 &#8211; RB1 et 35 -RB2<\/strong><\/p>\n<p>&nbsp;<\/p>\n<p>[youtube=http:\/\/www.youtube.com\/watch?v=WaoQdw7j-qM]<\/p>\n<p>&nbsp;<\/p>\n<p>R\u00e9f\u00e9rence Microchip &#8211; <a href=\"http:\/\/ww1.microchip.com\/downloads\/en\/DeviceDoc\/39887c.pdf\">18F4553<\/a>, <a href=\"http:\/\/ww1.microchip.com\/downloads\/en\/DeviceDoc\/39632e.pdf\">18F4550<\/a><\/p>\n<hr \/>\n<p style=\"text-align:right;\">Article r\u00e9dig\u00e9 par Alain Boudreault (aka:VE2CUY, aka:puyansude) 2014.06.15<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mise en situation Lorsque nous commen\u00e7ons nos premiers balbutiements avec les microcontr\u00f4leurs, un des premiers obstacles rencontr\u00e9s est assur\u00e9ment le choix d\u2019une source d\u2019horloge de cadence du microcontr\u00f4leur ainsi que ses param\u00e8tres de configuration. Pour les membres de la famille des PIC 18F, il y a quatre choix possibles pour cadencer la puce, soit \u00e0 [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"open","ping_status":"open","template":"","meta":{"footnotes":""},"class_list":["post-925","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/ve2cuy.com\/blog\/index.php\/wp-json\/wp\/v2\/pages\/925","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ve2cuy.com\/blog\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ve2cuy.com\/blog\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ve2cuy.com\/blog\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/ve2cuy.com\/blog\/index.php\/wp-json\/wp\/v2\/comments?post=925"}],"version-history":[{"count":0,"href":"https:\/\/ve2cuy.com\/blog\/index.php\/wp-json\/wp\/v2\/pages\/925\/revisions"}],"wp:attachment":[{"href":"https:\/\/ve2cuy.com\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=925"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}