{"id":929,"date":"2015-03-28T14:53:27","date_gmt":"2015-03-28T18:53:27","guid":{"rendered":"https:\/\/ve2cuy.wordpress.com\/?page_id=929"},"modified":"2015-03-28T14:53:27","modified_gmt":"2015-03-28T18:53:27","slug":"calculer-le-temps-dexecution-dune-instruction-sous-pic-18f","status":"publish","type":"page","link":"https:\/\/ve2cuy.com\/blog\/index.php\/calculer-le-temps-dexecution-dune-instruction-sous-pic-18f\/","title":{"rendered":"Calculer le temps d&rsquo;ex\u00e9cution d&rsquo;une instruction sous PIC 18F"},"content":{"rendered":"<h1>Mise en situation<\/h1>\n<p><strong><br \/>\n\u00c9tant donn\u00e9 la boucle suivante:<\/strong><\/p>\n<p>[sourcecode language=\u00a0\u00bbcpp\u00a0\u00bb]<br \/>\nStart:<br \/>\n         PORTD = 1<br \/>\n         PORTD = 0<br \/>\nAllerA   Start<br \/>\n[\/sourcecode]<\/p>\n<p><span style=\"color:#993300;\"><em>Quel sera la fr\u00e9quence pr\u00e9sent\u00e9e \u00e0 la broche RD0?<\/em><\/span><\/p>\n<p>Si nous connaissons la fr\u00e9quence de Fosc et le nombre de cycles requis pour ex\u00e9cuter une instruction alors cela ne devrait \u00eatre qu&rsquo;un simple exercice de math\u00e9matique&#8230;<\/p>\n<p><a href=\"http:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/labo-02-test03.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-784 size-large\" src=\"http:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/labo-02-test03.png?w=630\" alt=\"Labo-02.test03\" width=\"630\" height=\"129\" srcset=\"https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/labo-02-test03.png 1920w, https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/labo-02-test03-300x62.png 300w, https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/labo-02-test03-1024x211.png 1024w, https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/labo-02-test03-768x158.png 768w, https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/labo-02-test03-1536x317.png 1536w\" sizes=\"auto, (max-width: 630px) 100vw, 630px\" \/><\/a><\/p>\n<p><!--more--><\/p>\n<h1>Petit rappel<\/h1>\n<p>Les microntroleurs PIC de la famille 18F ex\u00e9cutent une instruction en 4 cycles d\u2019horloge. Il y a des exceptions comme par exemple, l\u2019instruction \u2018goto\u2019 qui doit lire l\u2019adresse de destination sur 4 octets, ce qui n\u00e9cessite 8 cycles d\u2019horloge.<\/p>\n<p>Pour simplifier la d\u00e9monstration, disons que toutes les instructions sont ex\u00e9cut\u00e9es en 4 (4 hz) cycles d\u2019horloge.<\/p>\n<p>Si notre PIC a une fr\u00e9quence d\u2019oscillateur (<strong>Fosc<\/strong>) de 8mHz alors 8 000 000 \/ 4 permet de calculer le nombre d\u2019instructions \u00e0 la seconde.<\/p>\n<p>Ici, cela donne <span style=\"text-decoration:underline;\">2 millions d\u2019instructions \u00e0 la seconde<\/span>. Ou si vous pr\u00e9f\u00e9rez, 2 MIPS.<\/p>\n<p>Certains modes de configuration de l\u2019horloge permettent de pr\u00e9senter <strong>Fosc\/4<\/strong> sur la broche <strong>OSC2<\/strong> du PIC.<\/p>\n<h1>Directives<\/h1>\n<p>Pour ce labo, nous utiliserons le montage pr\u00e9sent\u00e9 <a href=\"http:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/labo_01.png\">ici<\/a>, avec l&rsquo;horloge interne programm\u00e9e \u00e0 8mHz:<\/p>\n<p>[sourcecode language=\u00a0\u00bbcpp\u00a0\u00bb]<br \/>\n#pragma config FOSC = INTOSC_EC<br \/>\n#define VITESSE_8MHZ 0b01110000<br \/>\n&#8230;<br \/>\nOSCCON = VITESSE_8MHZ;<br \/>\n[\/sourcecode]<\/p>\n<hr \/>\n<h1>Code source du projet<\/h1>\n<p>[sourcecode language=\u00a0\u00bbcpp\u00a0\u00bb]<br \/>\n\/*<br \/>\n* Project: Tester l&rsquo;horloge interne du 18F4553 sous MPLAB X IDE v2.10 et XC8<br \/>\n* Labo: 02<br \/>\n* Auteur: Alain Boudreault<br \/>\n* Date: 2014.06.15<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 le temps d&rsquo;ex\u00e9cution des instructions<br \/>\n* du PIC<br \/>\n*<br \/>\n* le PORTD.RD0 sera utilis\u00e9 pour produire un signal qui sera<br \/>\n* par la suite mesur\u00e9 grace \u00e0 un scope digital.<br \/>\n* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br \/>\n* Test no 1: Horloge interne \u00e0 8mhz<br \/>\n* Boucle sur PORTD.RD0, on\/off en utilisant tout PORTD<br \/>\n*<br \/>\n* PORTD = ON;<br \/>\n  PORTD = OFF;<\/p>\n<p>61 007FF6 l9:<br \/>\n62<br \/>\n63 ;main.c: 52: PORTD = 1;<br \/>\n64 007FF6 0E01 movlw 1<br \/>\n65 007FF8 6E83 movwf 3971,c ;volatile<br \/>\n66<br \/>\n67 ;main.c: 54: PORTD = 0;<br \/>\n68 007FFA 0E00 movlw 0<br \/>\n69 007FFC 6E83 movwf 3971,c ;volatile<br \/>\n70 007FFE D7FB goto l9<br \/>\n*<br \/>\n* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br \/>\n* Test no 2: Horloge interne \u00e0 8mhz<br \/>\n* Boucle sur PORTD.RD0, on\/off en utilisant PORTDbits<br \/>\n*<br \/>\n* PORTDbits.RD0 = ON;<br \/>\n  PORTDbits.RD0 = OFF;<\/p>\n<p>61 007FFA l9:<br \/>\n62<br \/>\n63 ;main.c: 52: PORTDbits.RD0 = 1;<br \/>\n64 007FFA 8083 bsf 3971,0,c ;volatile<br \/>\n65<br \/>\n66 ;main.c: 53: PORTDbits.RD0 = 0;<br \/>\n67 007FFC 9083 bcf 3971,0,c ;volatile<br \/>\n68 007FFE D7FD goto l590<br \/>\n* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br \/>\n* Test no 3: Horloge interne \u00e0 8mhz<br \/>\n* Boucle sur PORTD.RD0, on\/off en utilisant PORTDbits et<br \/>\n* des NOP<br \/>\n61 007FEE l590:<br \/>\n62<br \/>\n63 ;main.c: 64: PORTDbits.RD0 = 1;<br \/>\n64 007FEE 8083 bsf 3971,0,c ;volatile<br \/>\n65 007FF0 F000 nop ;#<br \/>\n66 007FF2 F000 nop ;#<br \/>\n67 007FF4 F000 nop ;#<br \/>\n68 007FF6 F000 nop ;#<br \/>\n69<br \/>\n70 ;main.c: 69: PORTDbits.RD0 = 0;<br \/>\n71 007FF8 9083 bcf 3971,0,c ;volatile<br \/>\n72 007FFA F000 nop ;#<br \/>\n73 007FFC F000 nop ;#<br \/>\n74 007FFE D7F7 goto l590<\/p>\n<p>*<br \/>\n*\/<\/p>\n<p>#include &quot;pic18F4553.h&quot;<\/p>\n<p>#define test01<br \/>\n\/\/#define test02<br \/>\n\/\/#define test03<\/p>\n<p>#define ON 1<br \/>\n#define OFF 0<br \/>\n#define END_OF_TIME 1<br \/>\n#define SORTIE 0<br \/>\n#define VITESSE_8MHZ 0b01110000<br \/>\n#pragma config FOSC = INTOSC_EC \/\/ Horloge interne avec fz\/4 sur OSC2<\/p>\n<p>void main(void) {<br \/>\nTRISD = SORTIE; \/\/ Broche pour le mesure de fr\u00e9quence<br \/>\nOSCCON = VITESSE_8MHZ; \/\/ Renseigner l&rsquo;horloge \u00e0 8mHz<br \/>\nwhile (END_OF_TIME) {<\/p>\n<p>\/\/ Test01 &#8211; \u00c9criture sur le PORTD complet<br \/>\n#ifdef test01<br \/>\nPORTD = ON;<br \/>\nPORTD = OFF;<br \/>\n#endif<\/p>\n<p>\/\/ Test02 &#8211; \u00c9criture sur seulement un bit du PORTD<br \/>\n#ifdef test02<br \/>\nPORTDbits.RD0 = ON;<br \/>\nPORTDbits.RD0 = OFF;<br \/>\n#endif<\/p>\n<p>\/\/ Test03 &#8211;<br \/>\n#ifdef test03<br \/>\nPORTDbits.RD0 = ON;<br \/>\nasm(&quot;NOP&quot;);<br \/>\nasm(&quot;NOP&quot;);<br \/>\nasm(&quot;NOP&quot;);<br \/>\nasm(&quot;NOP&quot;);<br \/>\nPORTDbits.RD0 = OFF;<br \/>\nasm(&quot;NOP&quot;);<br \/>\nasm(&quot;NOP&quot;);<br \/>\n#endif<\/p>\n<p>} \/\/ while<br \/>\n} \/\/ main()<br \/>\n[\/sourcecode]<\/p>\n<p><!--more--><\/p>\n<hr \/>\n<h3>\u00a0Test 01 &#8211; \u00c9criture sur le PORTD<\/h3>\n<p>[sourcecode language=\u00a0\u00bbcpp\u00a0\u00bb]<br \/>\n#define test01<br \/>\n#ifdef test01<br \/>\n        PORTD = ON;<br \/>\n        PORTD = OFF;<br \/>\n#endif<br \/>\n[\/sourcecode]<\/p>\n<p>Le compilateur produira le code assembleur suivant:<\/p>\n<p>[sourcecode language=\u00a0\u00bbcpp\u00a0\u00bb]<br \/>\n007FF6 l9:<\/p>\n<p>007FF6 0E01 movlw 1       ; PORTD = 1<br \/>\n007FF8 6E83 movwf 3971,c<\/p>\n<p>007FFA 0E00 movlw 0       ; PORTD = 0<br \/>\n007FFC 6E83 movwf 3971,c<\/p>\n<p>007FFE D7FB goto l9<br \/>\n[\/sourcecode]<\/p>\n<p><strong>Note: il est important de le consulter si nous voulons connaitre le nombre d&rsquo;instructions de notre programme.<\/strong><\/p>\n<p>&nbsp;<\/p>\n<p>R\u00e9sultat au scope digital<\/p>\n<p><a href=\"http:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/labo-02-test01.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-787\" src=\"http:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/labo-02-test01.png?w=630\" alt=\"Labo-02.test01\" width=\"630\" height=\"109\" srcset=\"https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/labo-02-test01.png 1005w, https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/labo-02-test01-300x52.png 300w, https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/labo-02-test01-768x133.png 768w\" sizes=\"auto, (max-width: 630px) 100vw, 630px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<h3>Explications<\/h3>\n<p>Le premier canal du scope digital pr\u00e9sente le signal pr\u00e9sent \u00e0 la broche <strong>OSC2<\/strong>, donc <strong>Fosc\/4<\/strong>. \u00a0Chaque <span style=\"color:#993300;\"><strong>cycle<\/strong><\/span> de ce signal repr\u00e9sente le temps requis pour ex\u00e9cuter une instruction. \u00a0Notre programme comporte 5 instructions + 1 (goto).<\/p>\n<p>Il faut donc 6 <strong><span style=\"color:#993300;\">cycles<\/span><\/strong> pour compl\u00e9ter la boucle ou 24hz (6*4) impulsions de Fosc.<\/p>\n<p>Les deux (2) premiers <strong><span style=\"color:#993300;\">cycles<\/span><\/strong> du graph repr\u00e9sente le temp requis pour renseigner\u00a0PORTD \u00e0 0.<\/p>\n<p>Les quatre (4) suivants, le temps requis pour retourner au d\u00e9but de la boucle puis renseigner PORTD \u00e0 1.<\/p>\n<p>Le signal pr\u00e9sent sur RD0 est de 333.33kHz avec un duty cycle de 25%.<\/p>\n<p>La valeur de lecture du signal de RD0 permet de calculer la vitesse d&rsquo;horloge du PIC:<\/p>\n<p>333.33k * 6 instructions * 4 cycles = \u00a08mHz.<\/p>\n<p>La boucle est ex\u00e9cut\u00e9e en 6 instructions * 4 <strong><span style=\"color:#993300;\">cycles<\/span><\/strong> \/ 8mHz = 0,000003 sec (3 uSec)<\/p>\n<p>\u00c0 une vitesse d&rsquo;horloge de 8mhz, nous pouvons conclure qu&rsquo;une instruction est ex\u00e9cut\u00e9e en 0,5 uSec.<\/p>\n<hr \/>\n<h3>Test 02 &#8211; \u00c9criture sur seulement un bit du PORTD<\/h3>\n<p>[sourcecode language=\u00a0\u00bbcpp\u00a0\u00bb]<br \/>\n#define test02<br \/>\n#ifdef test02<br \/>\n        PORTDbits.RD0 = ON;<br \/>\n        PORTDbits.RD0 = OFF;<br \/>\n#endif[\/sourcecode]<\/p>\n<p>R\u00e9sultat au scope digital<br \/>\n<a href=\"http:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/labo-02-test02.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-786\" src=\"http:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/labo-02-test02.png?w=630\" alt=\"Labo-02.test02\" width=\"630\" height=\"120\" srcset=\"https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/labo-02-test02.png 1005w, https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/labo-02-test02-300x57.png 300w, https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/labo-02-test02-768x147.png 768w\" sizes=\"auto, (max-width: 630px) 100vw, 630px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<h3>Explications<\/h3>\n<p>\u00c0 venir&#8230;<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<h3>Test 03 &#8211; Insertion de \u00a0NOPs, pour obtenir\u00a0un rapport 0\/1 de 50% (duty cycle)<\/h3>\n<p>[sourcecode language=\u00a0\u00bbcpp\u00a0\u00bb]<br \/>\n#ifdef test03<br \/>\n       PORTDbits.RD0 = ON;<br \/>\n       asm(&quot;NOP&quot;);<br \/>\n       asm(&quot;NOP&quot;);<br \/>\n       asm(&quot;NOP&quot;);<br \/>\n       asm(&quot;NOP&quot;);<br \/>\n       PORTDbits.RD0 = OFF;<br \/>\n       asm(&quot;NOP&quot;);<br \/>\n       asm(&quot;NOP&quot;);<br \/>\n#endif<br \/>\n[\/sourcecode]<\/p>\n<p>R\u00e9sultat au scope digital<\/p>\n<p><a href=\"http:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/labo-02-test03.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-784\" src=\"http:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/labo-02-test03.png?w=630\" alt=\"Labo-02.test03\" width=\"630\" height=\"129\" srcset=\"https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/labo-02-test03.png 1920w, https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/labo-02-test03-300x62.png 300w, https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/labo-02-test03-1024x211.png 1024w, https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/labo-02-test03-768x158.png 768w, https:\/\/ve2cuy.com\/blog\/wp-content\/uploads\/2014\/06\/labo-02-test03-1536x317.png 1536w\" sizes=\"auto, (max-width: 630px) 100vw, 630px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<h3>Explications<\/h3>\n<p>\u00c0 venir&#8230;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mise en situation \u00c9tant donn\u00e9 la boucle suivante: [sourcecode language=\u00a0\u00bbcpp\u00a0\u00bb] Start: PORTD = 1 PORTD = 0 AllerA Start [\/sourcecode] Quel sera la fr\u00e9quence pr\u00e9sent\u00e9e \u00e0 la broche RD0? Si nous connaissons la fr\u00e9quence de Fosc et le nombre de cycles requis pour ex\u00e9cuter une instruction alors cela ne devrait \u00eatre qu&rsquo;un simple exercice de [&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-929","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/ve2cuy.com\/blog\/index.php\/wp-json\/wp\/v2\/pages\/929","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=929"}],"version-history":[{"count":0,"href":"https:\/\/ve2cuy.com\/blog\/index.php\/wp-json\/wp\/v2\/pages\/929\/revisions"}],"wp:attachment":[{"href":"https:\/\/ve2cuy.com\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=929"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}