<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://wiki.electroniciens.cnrs.fr/index.php?action=history&amp;feed=atom&amp;title=Microchip_%3A_Demo_Finite_State_Machine</id>
	<title>Microchip : Demo Finite State Machine - Historique des versions</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.electroniciens.cnrs.fr/index.php?action=history&amp;feed=atom&amp;title=Microchip_%3A_Demo_Finite_State_Machine"/>
	<link rel="alternate" type="text/html" href="https://wiki.electroniciens.cnrs.fr/index.php?title=Microchip_:_Demo_Finite_State_Machine&amp;action=history"/>
	<updated>2026-05-02T01:01:27Z</updated>
	<subtitle>Historique des versions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://wiki.electroniciens.cnrs.fr/index.php?title=Microchip_:_Demo_Finite_State_Machine&amp;diff=3301&amp;oldid=prev</id>
		<title>Arnauld.biganzoli le 3 janvier 2017 à 15:00</title>
		<link rel="alternate" type="text/html" href="https://wiki.electroniciens.cnrs.fr/index.php?title=Microchip_:_Demo_Finite_State_Machine&amp;diff=3301&amp;oldid=prev"/>
		<updated>2017-01-03T15:00:07Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=Introduction aux microcontrôleurs PIC32=&lt;br /&gt;
Pour tous ceux qui démarre dans la mise en oeuvre de système embarqué et pour ceux qui souhaiteraient découvrir la famille PIC32MX des microcontrôleurs PIC, voici une première prise en main indispensable pour comprendre comment utiliser par la suite [[Microchip : Les outils de developpement|les outils de Microchip]].&lt;br /&gt;
&lt;br /&gt;
En effet, la mise en oeuvre de [https://fr.wikipedia.org/wiki/Automate_fini machine à états] est la base de la construction d&amp;#039;un programme ([https://fr.wikipedia.org/wiki/Firmware firmware]). Nous pouvons nous en passer pour des codes simples mais dans la majorité des cas il est préférable de les utiliser. Vous pouvez n&amp;#039;avoir qu&amp;#039;une machine d&amp;#039;états ou bien plusieurs afin de rendre votre programme plus structuré (en ayant une machine d&amp;#039;états par fonctionnalité pour votre application embarqué). Cela permet aussi de rendre votre code plus lisible, mais surtout si vous respectez le faites de ne jamais réaliser de code bloquant, cela le rend plus fluide et plus robuste, voir [http://ww1.microchip.com/downloads/en/DeviceDoc/Volume%20III%20-%20MPLAB%20Harmony%20Development_v109.pdf State Machine Programming Model (page 11)]&lt;br /&gt;
&lt;br /&gt;
Avant de nous lancer dans cette implémentation, découvrons d&amp;#039;abord la famille PIC32MX :&lt;br /&gt;
&lt;br /&gt;
* [http://microchip.wikidot.com/32bit:summary-table PIC32 Device Summary Table]&lt;br /&gt;
* [http://microchip.wikidot.com/32bit:pic32mx-block-diagram PIC32MX Block Diagram]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Configuration du module d&amp;#039;horloge=&lt;br /&gt;
&lt;br /&gt;
Oscillator module, &amp;quot;[http://ww1.microchip.com/downloads/en/DeviceDoc/61112H.pdf Section 6. Oscillators]&amp;quot;:&lt;br /&gt;
[[Fichier:mchp_pic32mx_posc_ex.png|center|600px|link=http://microchip.wikidot.com/32bit:mx-osc|PIC32MX Oscillator]]&lt;br /&gt;
&lt;br /&gt;
A partir du choix de la source d&amp;#039;horloge et si l&amp;#039;on ne considère pas la partie de la branche d&amp;#039;horloge du module USB, on peut dire que le système d&amp;#039;horloge de la famille PIC32MX est divisé en 2 branches, l&amp;#039;une pour le cœur du processeur et l&amp;#039;autre pour les périphériques :&lt;br /&gt;
*SYSCLK (CPU and Select Peripherals)&lt;br /&gt;
*PBCLK (Peripherals)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:mchp_pic32_osc_config.png|center|800px|link=http://microchip.wikidot.com/32bit:osc-overview|PIC32 oscillator configuration spreadsheet]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Mise en oeuvre d&amp;#039;un Timer par interruption =&lt;br /&gt;
Sur la [https://reference.digilentinc.com/chipkit_wf32:chipkit_wf32: carte chipKIT WF32], nous vous proposons de réaliser un programme simple, à partir de l&amp;#039;utilisation des outils de base de l&amp;#039;IDE MPLAB X, afin de faire clignoter la LED LD6 (pin 13 sur le connecteur J7 compatible Arduino) sans intervention de la fonction main. Le changement d&amp;#039;état de LD6 se fera par interruption du Timer 2 toutes les 100 ms.&lt;br /&gt;
&amp;lt;center&amp;gt;[[Fichier:blink_100ms.png|380px|link=|]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce premier programme vous permettra de découvrir le code minimum pour l&amp;#039;architecture PIC32MX, ainsi que la mise en oeuvre des Timer et l&amp;#039;implémentation des interruptions :&lt;br /&gt;
&lt;br /&gt;
* [http://microchip.wikidot.com/32bit:tmr-overview PIC32 Timer Overview]&lt;br /&gt;
* [http://microchip.wikidot.com/32bit:int-overview PIC32 Interrupts Overview]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Fichier:mchp_pic32_timer.png|300px|link=http://microchip.wikidot.com/32bit:tmr-overview|PIC32 Timer Overview|]]     [[Fichier:timer_period_interrupt.png|500px|link=http://microchip.wikidot.com/32bit:int-overview|PIC32 Interrupts Overview|]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Code source du programme ===&lt;br /&gt;
Voici le contenu du fichier &amp;quot;&amp;#039;&amp;#039;&amp;#039;main.c&amp;#039;&amp;#039;&amp;#039;&amp;quot; à ajouter dans un nouveau projet. Vous pouvez aussi télécharger le projet complet depuis &amp;quot;&amp;#039;&amp;#039;&amp;#039;Exercise Files&amp;#039;&amp;#039;&amp;#039;&amp;quot; sur la page &amp;quot;[http://microchip.wikidot.com/32bit:mx-code-examples-interrupt-usage Interrupt Code Example in C using chipKIT™ WF32]&amp;quot;, déplacez alors le dossier &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font face=&amp;quot;Courier New&amp;quot; size=&amp;quot;3&amp;quot; color=#000000&amp;gt;interrupt-usage&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;quot; dans votre répertoire &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font face=&amp;quot;Courier New&amp;quot; size=&amp;quot;3&amp;quot; color=#000000&amp;gt;C:\microchip\projects&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
** main.c&lt;br /&gt;
**&lt;br /&gt;
** Project: 	interrupt-example&lt;br /&gt;
**&lt;br /&gt;
** Date:    	04/06/2015&lt;br /&gt;
** Revision:	12/12/2016&lt;br /&gt;
** Author:  	DC&lt;br /&gt;
**&lt;br /&gt;
** Comments:    Timer 2 driven ISR used to toggle LED LD6 every 100 ms&lt;br /&gt;
**&lt;br /&gt;
** Hardware Design Reference:&lt;br /&gt;
**  &amp;quot;chipKIT WF32 Rev B.0&amp;quot; http://www.microchip.com/developmenttools/productdetails.aspx?partno=tdgl021&lt;br /&gt;
**&lt;br /&gt;
** Dependencies:&lt;br /&gt;
**  None&lt;br /&gt;
**&lt;br /&gt;
** User Guide:&lt;br /&gt;
**  http://microchip.wikidot.com/32bit:mx-code-examples-interrupt-usage&lt;br /&gt;
**&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
/*******************************************************************************&lt;br /&gt;
&lt;br /&gt;
SOFTWARE AND DOCUMENTATION ARE PROVIDED &amp;quot;AS IS&amp;quot; WITHOUT WARRANTY OF ANY KIND,&lt;br /&gt;
EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF&lt;br /&gt;
MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.&lt;br /&gt;
IN NO EVENT SHALL MICROCHIP TECHNOLOGY INC OR ITS LICENSORS BE LIABLE OR OBLIGATED&lt;br /&gt;
UNDER CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY,&lt;br /&gt;
OR OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES&lt;br /&gt;
INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR&lt;br /&gt;
CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF&lt;br /&gt;
SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES&lt;br /&gt;
(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.&lt;br /&gt;
&lt;br /&gt;
*******************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/** INCLUDES ******************************************************************/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;xc.h&amp;gt;             /* contains Vector Name/Number Macros */&lt;br /&gt;
#include &amp;lt;sys/attribs.h&amp;gt;    /* contains __ISR() Macros */&lt;br /&gt;
&lt;br /&gt;
/** CONFIGURATION *************************************************************/&lt;br /&gt;
&lt;br /&gt;
// Key Settings:&lt;br /&gt;
// OSCILLATOR: 8 MHz XT Oscillator w. PLL&lt;br /&gt;
// SYSCLK = 80 MHz (set in config bits), PBCLK = 10 MHz (= SYSCLK/8 - set in config bits))&lt;br /&gt;
// JTAG PORT: Disabled&lt;br /&gt;
// WATCHDOG TIMER: Disabled&lt;br /&gt;
// DEBUG/PGM PINS: PGEC2/PGED2&lt;br /&gt;
&lt;br /&gt;
// DEVCFG3&lt;br /&gt;
// USERID = No Setting&lt;br /&gt;
#pragma config FSRSSEL = PRIORITY_7     // SRS Select (SRS Priority 7)&lt;br /&gt;
#pragma config FMIIEN = ON              // Ethernet RMII/MII Enable (MII Enabled)&lt;br /&gt;
#pragma config FETHIO = ON              // Ethernet I/O Pin Select (Default Ethernet I/O)&lt;br /&gt;
#pragma config FUSBIDIO = ON            // USB USID Selection (Controlled by the USB Module)&lt;br /&gt;
#pragma config FVBUSONIO = ON           // USB VBUS ON Selection (Controlled by USB Module)&lt;br /&gt;
&lt;br /&gt;
// DEVCFG2&lt;br /&gt;
#pragma config FPLLIDIV = DIV_2         // PLL Input Divider (2x Divider)&lt;br /&gt;
#pragma config FPLLMUL = MUL_20         // PLL Multiplier (20x Multiplier)&lt;br /&gt;
#pragma config UPLLIDIV = DIV_12        // USB PLL Input Divider (12x Divider)&lt;br /&gt;
#pragma config UPLLEN = OFF             // USB PLL Enable (Disabled and Bypassed)&lt;br /&gt;
#pragma config FPLLODIV = DIV_1         // System PLL Output Clock Divider (PLL Divide by 1)&lt;br /&gt;
&lt;br /&gt;
// DEVCFG1&lt;br /&gt;
#pragma config FNOSC = PRIPLL           // Oscillator Selection Bits (Primary Osc (XT,HS,EC) w. PLL)&lt;br /&gt;
#pragma config FSOSCEN = OFF            // Secondary Oscillator Enable (Disabled)&lt;br /&gt;
#pragma config IESO = ON                // Internal/External Switch Over (Enabled)&lt;br /&gt;
#pragma config POSCMOD = XT             // Primary Oscillator Configuration (XT osc mode)&lt;br /&gt;
#pragma config OSCIOFNC = OFF           // CLKO Output Signal Active on the OSCO Pin (Disabled)&lt;br /&gt;
#pragma config FPBDIV = DIV_8           // Peripheral Clock Divisor (Pb_Clk is Sys_Clk/8)&lt;br /&gt;
#pragma config FCKSM = CSDCMD           // Clock Switching and Monitor Selection (Clock Switch Disable, FSCM Disabled)&lt;br /&gt;
#pragma config WDTPS = PS1048576        // Watchdog Timer Postscaler (1:1048576)&lt;br /&gt;
#pragma config FWDTEN = OFF             // Watchdog Timer Enable (WDT Disabled (SWDTEN Bit Controls))&lt;br /&gt;
&lt;br /&gt;
// DEVCFG0&lt;br /&gt;
#pragma config DEBUG = OFF              // Background Debugger Enable (Debugger is disabled)&lt;br /&gt;
#pragma config ICESEL = ICS_PGx2        // ICE/ICD Comm Channel Select (ICE EMUC2/EMUD2 pins shared with PGC2/PGD2)&lt;br /&gt;
#pragma config PWP = OFF                // Program Flash Write Protect (Disable)&lt;br /&gt;
#pragma config BWP = OFF                // Boot Flash Write Protect bit (Protection Disabled)&lt;br /&gt;
#pragma config CP = OFF                 // Code Protect (Protection Disabled)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/** VARIABLES *****************************************************************/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/** LOCAL MACROS **************************************************************/&lt;br /&gt;
&lt;br /&gt;
#define SYS_CLK_FREQUENCY   (80000000ull)           // Fsys = 80 MHz&lt;br /&gt;
#define PB3_CLK_FREQUENCY   SYS_CLK_FREQUENCY/8     // Fpb  = 10 MHz&lt;br /&gt;
&lt;br /&gt;
// LED_LD6 (RG6)&lt;br /&gt;
#define LED_LD6       	LATGbits.LATG6&lt;br /&gt;
#define TRIS_LED_LD6  	TRISGbits.TRISG6&lt;br /&gt;
#define LED_LD6_SET()   LATGSET = _LATG_LATG6_MASK;&lt;br /&gt;
#define LED_LD6_CLR()   LATGCLR = _LATG_LATG6_MASK;&lt;br /&gt;
#define LED_LD6_INV()   LATGINV = _LATG_LATG6_MASK;&lt;br /&gt;
&lt;br /&gt;
/** LOCAL PROTOTYPES **********************************************************/&lt;br /&gt;
&lt;br /&gt;
void InitializeSystem(void);    // Initialize hardware and global variables&lt;br /&gt;
&lt;br /&gt;
/** main() ********************************************************************/&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    InitializeSystem();&lt;br /&gt;
&lt;br /&gt;
    while(1);&lt;br /&gt;
    &lt;br /&gt;
} // main()&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Function:        void InitializeSystem(void)&lt;br /&gt;
 *&lt;br /&gt;
 * PreCondition:    None&lt;br /&gt;
 *&lt;br /&gt;
 * Input:           None&lt;br /&gt;
 *&lt;br /&gt;
 * Output:          None&lt;br /&gt;
 *&lt;br /&gt;
 * Side Effects:    None&lt;br /&gt;
 *&lt;br /&gt;
 * Overview:        This routine takes care of all of the system&lt;br /&gt;
 *                  initialization that is required.&lt;br /&gt;
 *&lt;br /&gt;
 * Note:&lt;br /&gt;
 *&lt;br /&gt;
 *****************************************************************************/&lt;br /&gt;
void InitializeSystem(void)&lt;br /&gt;
{&lt;br /&gt;
    // PIC32MX CPU Speed Optimizations (Cache/Wait States/Peripheral Bus Clks)&lt;br /&gt;
    // On reset, and after c-startup:&lt;br /&gt;
    // - Prefetch Buffer is disabled,&lt;br /&gt;
    // - I Cache is disabled,&lt;br /&gt;
    // - PFM wait States set to max setting (7 = too slow!!!)&lt;br /&gt;
    // - Data Memory SRAM wait states set to max setting (1 = too slow!!!)&lt;br /&gt;
    &lt;br /&gt;
    // PBCLK - already set to SYSCLK/8 via config settings&lt;br /&gt;
    &lt;br /&gt;
    // Data Memory SRAM wait states: Default Setting = 1; set it to 0&lt;br /&gt;
    BMXCONbits.BMXWSDRM = 0;&lt;br /&gt;
&lt;br /&gt;
    // Flash PM Wait States: MX Flash runs at 2 wait states @ 80 MHz&lt;br /&gt;
    CHECONbits.PFMWS = 2;&lt;br /&gt;
&lt;br /&gt;
    // Prefetch-cache: Enable prefetch for cacheable PFM instructions&lt;br /&gt;
    CHECONbits.PREFEN = 1;&lt;br /&gt;
&lt;br /&gt;
    // PIC32MX695-Specific&lt;br /&gt;
    // JTAG: Disable on PORTA&lt;br /&gt;
    DDPCONbits.JTAGEN = 0;&lt;br /&gt;
    &lt;br /&gt;
    /* Initialize LED LD6 */&lt;br /&gt;
    LED_LD6 = 0;&lt;br /&gt;
    TRIS_LED_LD6 = 0;&lt;br /&gt;
&lt;br /&gt;
    /* Initialize Timer 2 Peripheral Settings */&lt;br /&gt;
    // Turn off the timer&lt;br /&gt;
    T2CONbits.TON = 0;&lt;br /&gt;
    // Pre-Scale = 1:256 (T2Clk: 39062.5Hz)&lt;br /&gt;
    T2CONbits.TCKPS = 7;&lt;br /&gt;
    // Set T2 period ~ 100mS&lt;br /&gt;
    PR2 = 3906;&lt;br /&gt;
    // Clear counter&lt;br /&gt;
    TMR2 = 0;&lt;br /&gt;
&lt;br /&gt;
    /* Initialize Timer 2 Interrupt Controller Settings */&lt;br /&gt;
    // Set the interrupt priority to 4&lt;br /&gt;
    IPC2bits.T2IP = 7;&lt;br /&gt;
    // Reset the Timer 2 interrupt flag&lt;br /&gt;
    IFS0bits.T2IF = 0;&lt;br /&gt;
    // Enable interrupts from Timer 2&lt;br /&gt;
    IEC0bits.T2IE = 1;&lt;br /&gt;
  &lt;br /&gt;
    /* Set Interrupt Controller for multi-vector mode */&lt;br /&gt;
    INTCONSET = _INTCON_MVEC_MASK;&lt;br /&gt;
&lt;br /&gt;
    /* Enable Interrupt Exceptions */&lt;br /&gt;
    // set the CP0 status IE bit high to turn on interrupts globally&lt;br /&gt;
    __builtin_enable_interrupts();&lt;br /&gt;
&lt;br /&gt;
    /* Enable the peripheral */&lt;br /&gt;
    T2CONbits.TON = 1;&lt;br /&gt;
&lt;br /&gt;
} // InitializeSystem()&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************&lt;br /&gt;
  Function:&lt;br /&gt;
	void __ISR(_TIMER_2_VECTOR, IPL4SRS) T2Interrupt(void);&lt;br /&gt;
&lt;br /&gt;
  Description:&lt;br /&gt;
	Toggles LED LD6 when the Timer 2 interrupt occurs.&lt;br /&gt;
&lt;br /&gt;
  Precondition:&lt;br /&gt;
        Peripheral interrupt config must set to matching ISR&amp;#039;s IPL &lt;br /&gt;
&lt;br /&gt;
  Parameters:&lt;br /&gt;
	None&lt;br /&gt;
&lt;br /&gt;
  Returns:&lt;br /&gt;
  	None&lt;br /&gt;
  ***************************************************************************/&lt;br /&gt;
&lt;br /&gt;
void __ISR (_TIMER_2_VECTOR, IPL7SRS) T2Interrupt(void)&lt;br /&gt;
{&lt;br /&gt;
	// Toggle LED LD6&lt;br /&gt;
	LED_LD6_INV();&lt;br /&gt;
&lt;br /&gt;
	// Reset interrupt flag&lt;br /&gt;
	IFS0bits.T2IF = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Configuration Bits ===&lt;br /&gt;
Il est possible de visualiser, modifier puis importer les valeurs des [http://microchip.wikidot.com/32bit:special-features-config-registers-mx registres de configuration du PIC32MX] depuis la fenêtre &amp;quot;&amp;#039;&amp;#039;&amp;#039;Configuration Bits&amp;#039;&amp;#039;&amp;#039;&amp;quot; :&lt;br /&gt;
[[Fichier:mchp_configuration_bits.png|900px|center|link=http://microchip.wikidot.com/mplabx:view-and-set-configuration-bits|]]&lt;br /&gt;
&lt;br /&gt;
Une fois que vous aurez modifié les registres de configuration depuis cette fenêtre, il vous faudra générer le code source (bouton &amp;quot;Generate Source Code to Output&amp;quot;), puis copier-coller le contenu de la fenêtre &amp;quot;Output&amp;quot; dans le fichier main.c.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Mise en d&amp;#039;une machine à états =&lt;br /&gt;
&lt;br /&gt;
=== Instructions de commutation : Switch Case ===&lt;br /&gt;
*[http://microchip.wikidot.com/tls2101:switch-statements Switch Statements]&lt;br /&gt;
*[http://microchip.wikidot.com/harmony:state-machine-model State Machine Model and Blocking Code]&lt;br /&gt;
*[http://microchip.wikidot.com/harmony:state-machine-defined What is a State Machine?]&lt;br /&gt;
*voir aussi &amp;quot;[http://microchip.wikidot.com/an2039:firmware Firmware Implementation]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Exercice ===&lt;br /&gt;
Ajoutez dans le répertoire &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font face=&amp;quot;Courier New&amp;quot; size=&amp;quot;3&amp;quot; color=#000000&amp;gt;C:\microchip\projects&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;quot; un dossier &amp;quot;&amp;#039;&amp;#039;&amp;#039;firmware_state_machine&amp;#039;&amp;#039;&amp;#039;&amp;quot;, vous y placerez un nouveau projet &amp;quot;&amp;#039;&amp;#039;&amp;#039;state_machine&amp;#039;&amp;#039;&amp;#039;&amp;quot; que vous créerez avec MPLAB X (voir &amp;quot;[http://microchip.wikidot.com/mplabx:projects-standalone Create a Standalone Project]&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Ajoutez un fichier &amp;quot;&amp;#039;&amp;#039;&amp;#039;main.c&amp;#039;&amp;#039;&amp;#039;&amp;quot; que vous placerez dans votre répertoire source &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font face=&amp;quot;Courier New&amp;quot; size=&amp;quot;3&amp;quot; color=#000000&amp;gt;C:\microchip\projects\firmware_state_machine\src&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;quot; que vous aurez également ajouter au dossier principale de votre projet.&lt;br /&gt;
&lt;br /&gt;
Voici quelques éléments pour vous guider, l&amp;#039;objectif est de réaliser un programme qui allume chacune des LEDs (LD5, LD4 et LD3), une par état, en respectant la durée de chaque état.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable alternance centre&amp;quot; style=&amp;quot;text-align:left;&amp;quot;&lt;br /&gt;
 | &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    while ( 1 )&lt;br /&gt;
    {&lt;br /&gt;
        /* Pseudo code algorithm */&lt;br /&gt;
&lt;br /&gt;
        // What is the value of the variable &amp;quot;counter_100ms&amp;quot; ?&lt;br /&gt;
        //&lt;br /&gt;
        // if counter_100ms &amp;lt;= 5&lt;br /&gt;
        // --&amp;gt; go to step 1&lt;br /&gt;
        //&lt;br /&gt;
        // if counter_100ms &amp;gt; 5 &amp;amp; &amp;lt;= 10&lt;br /&gt;
        // --&amp;gt; go to step 2&lt;br /&gt;
        //&lt;br /&gt;
        // if counter_100ms &amp;gt; 10&lt;br /&gt;
        // --&amp;gt; go to step 3&lt;br /&gt;
        //&lt;br /&gt;
        // if counter_100ms = 20&lt;br /&gt;
        // --&amp;gt; reset counter_100ms &amp;amp; go to step 1&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    switch ( app_state )&lt;br /&gt;
    {&lt;br /&gt;
        case 1:&lt;br /&gt;
            // do something when &amp;quot;app_state&amp;quot; equals 1: &lt;br /&gt;
            break;&lt;br /&gt;
&lt;br /&gt;
        case 2:&lt;br /&gt;
            // do something when &amp;quot;app_state&amp;quot; equals 2&lt;br /&gt;
            break;&lt;br /&gt;
&lt;br /&gt;
        case 3:&lt;br /&gt;
            // do something when &amp;quot;app_state&amp;quot; equals 3&lt;br /&gt;
            break;&lt;br /&gt;
&lt;br /&gt;
        default:&lt;br /&gt;
            // if nothing else matches, do the default&lt;br /&gt;
            // default is optional&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Durant notre formation [[Interface microcontrôleur PIC32 et IHM Python]], nous profitons de ce premier exercice pour montrer les différents fonctionnalités de l&amp;#039;IDE MPLAB X, comme par exemple le [http://microchip.wikidot.com/mplabx:project-configurations gestionnaire de projet], mais aussi comment mieux implémenter en C vos différentes routines et les méthodes pour le passage de paramètre ou la lecture de valeur, voir [http://ww1.microchip.com/downloads/en/DeviceDoc/Volume%20III%20-%20MPLAB%20Harmony%20Development_v109.pdf Modularity Guidelines (page 22)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= [http://microchip.wikidot.com/harmony:bsp Board Support Package (BSP)] =&lt;br /&gt;
Vous pouvez ajouter à votre projet dans le dossier &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;lt;font face=&amp;quot;Courier New&amp;quot; size=&amp;quot;3&amp;quot; color=#000000&amp;gt;C:\microchip\projects\firmware_state_machine\src&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;quot; le fichier &amp;quot;&amp;#039;&amp;#039;&amp;#039;chipkit_wf32.h&amp;#039;&amp;#039;&amp;#039;&amp;quot; avec le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef _CHIPKIT_WF32_H&lt;br /&gt;
#define _CHIPKIT_WF32_H&lt;br /&gt;
&lt;br /&gt;
/* LED_LD3 (RA0) */&lt;br /&gt;
#define LED_LD3       	LATAbits.LATA0&lt;br /&gt;
#define TRIS_LED_LD3  	TRISAbits.TRISA0&lt;br /&gt;
#define LED_LD3_SET()   LATASET = _LATA_LATA0_MASK;&lt;br /&gt;
#define LED_LD3_CLR()   LATACLR = _LATA_LATA0_MASK;&lt;br /&gt;
#define LED_LD3_INV()   LATAINV = _LATA_LATA0_MASK;&lt;br /&gt;
&lt;br /&gt;
/* LED_LD4 (RA1) */&lt;br /&gt;
#define LED_LD4       	LATAbits.LATA1&lt;br /&gt;
#define TRIS_LED_LD4  	TRISAbits.TRISA1&lt;br /&gt;
#define LED_LD4_SET()   LATASET = _LATA_LATA1_MASK;&lt;br /&gt;
#define LED_LD4_CLR()   LATACLR = _LATA_LATA1_MASK;&lt;br /&gt;
#define LED_LD4_INV()   LATAINV = _LATA_LATA1_MASK;&lt;br /&gt;
&lt;br /&gt;
/* LED_LD5 (RF0) */&lt;br /&gt;
#define LED_LD5       	LATFbits.LATF0&lt;br /&gt;
#define TRIS_LED_LD5  	TRISFbits.TRISF0&lt;br /&gt;
#define LED_LD5_SET()   LATFSET = _LATF_LATF0_MASK;&lt;br /&gt;
#define LED_LD5_CLR()   LATFCLR = _LATF_LATF0_MASK;&lt;br /&gt;
#define LED_LD5_INV()   LATFINV = _LATF_LATF0_MASK;&lt;br /&gt;
&lt;br /&gt;
/* LED_LD6 (RG6) */&lt;br /&gt;
#define LED_LD6       	LATGbits.LATG6&lt;br /&gt;
#define TRIS_LED_LD6  	TRISGbits.TRISG6&lt;br /&gt;
#define LED_LD6_SET()   LATGSET = _LATG_LATG6_MASK;&lt;br /&gt;
#define LED_LD6_CLR()   LATGCLR = _LATG_LATG6_MASK;&lt;br /&gt;
#define LED_LD6_INV()   LATGINV = _LATG_LATG6_MASK;&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme vous pouvez le remarque l&amp;#039;ensemble de ces définitions fournit une interface simple entre votre programme et la partie bas niveau permettant de contrôler les broches du microcontrôleur pour le pilotage des LEDs de la carte. Mais si nous devions écrire ce code pour différentes cartes il serait plus judicieux d&amp;#039;utiliser des noms génériques comme &amp;#039;&amp;#039;&amp;#039;&amp;lt;font face=&amp;quot;Courier New&amp;quot; size=&amp;quot;3&amp;quot; color=#000000&amp;gt;BSP_LED_1On()&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; ou &amp;#039;&amp;#039;&amp;#039;&amp;lt;font face=&amp;quot;Courier New&amp;quot; size=&amp;quot;3&amp;quot; color=#000000&amp;gt;BSP_LED_1Off()&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; et non propre à la carte.&lt;br /&gt;
Nous avons donc montré pendant cette semaine comment ajouter une nouvelle configuration pour inclure une 2ème carte dans un même projet en utilisant l&amp;#039;écriture standardisé comme proposé avec l&amp;#039;utilisation du &amp;quot;[http://microchip.wikidot.com/harmony:bsp-api Board Support Package (BSP) Library Interface]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable alternance centre&amp;quot; style=&amp;quot;text-align:left;&amp;quot;&lt;br /&gt;
 |----&lt;br /&gt;
 ! chipkit_wf32/bsp.h !! scope=&amp;quot;col&amp;quot; | chipkit_wifire/bsp.h&lt;br /&gt;
 |----&lt;br /&gt;
 | &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef _CHIPKIT_WF32_H&lt;br /&gt;
#define _CHIPKIT_WF32_H&lt;br /&gt;
&lt;br /&gt;
/*** Application Defined Pins ***/&lt;br /&gt;
// https://reference.digilentinc.com/chipkit_wf32/chipkit_wf32&lt;br /&gt;
&lt;br /&gt;
/*** Functions for BSP_LED_1 pin ***/&lt;br /&gt;
#define BSP_LED_1Toggle()       LATAINV = _LATA_LATA0_MASK;&lt;br /&gt;
#define BSP_LED_1On()           LATASET = _LATA_LATA0_MASK;&lt;br /&gt;
#define BSP_LED_1Off()          LATACLR = _LATA_LATA0_MASK;&lt;br /&gt;
#define BSP_LED_1StateGet()     LATAbits.LATA0&lt;br /&gt;
#define BSP_LED_1Initialize()   TRISAbits.TRISA0 = 0;&lt;br /&gt;
    &lt;br /&gt;
/*** Functions for BSP_LED_2 pin ***/&lt;br /&gt;
#define BSP_LED_2Toggle()       LATAINV = _LATA_LATA1_MASK;&lt;br /&gt;
#define BSP_LED_2On()           LATASET = _LATA_LATA1_MASK;&lt;br /&gt;
#define BSP_LED_2Off()          LATACLR = _LATA_LATA1_MASK;&lt;br /&gt;
#define BSP_LED_2StateGet()     LATAbits.LATA1&lt;br /&gt;
#define BSP_LED_2Initialize()   TRISAbits.TRISA1 = 0;&lt;br /&gt;
&lt;br /&gt;
/*** Functions for BSP_LED_3 pin ***/&lt;br /&gt;
#define BSP_LED_3Toggle()       LATFINV = _LATF_LATF0_MASK;&lt;br /&gt;
#define BSP_LED_3On()           LATFSET = _LATF_LATF0_MASK;&lt;br /&gt;
#define BSP_LED_3Off()          LATFCLR = _LATF_LATF0_MASK;&lt;br /&gt;
#define BSP_LED_3StateGet()     LATFbits.LATF0&lt;br /&gt;
#define BSP_LED_3Initialize()   TRISFbits.TRISF0 = 0;&lt;br /&gt;
&lt;br /&gt;
/*** Functions for BSP_LED_4 pin ***/&lt;br /&gt;
#define BSP_LED_4Toggle()       LATGINV = _LATG_LATG6_MASK;&lt;br /&gt;
#define BSP_LED_4On()           LATGSET = _LATG_LATG6_MASK;&lt;br /&gt;
#define BSP_LED_4Off()          LATGCLR = _LATG_LATG6_MASK;&lt;br /&gt;
#define BSP_LED_4StateGet()     LATGbits.LATG6&lt;br /&gt;
#define BSP_LED_4Initialize()   TRISGbits.TRISG6 = 0;&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef _CHIPKIT_WIFIRE_H&lt;br /&gt;
#define _CHIPKIT_WIFIRE_H&lt;br /&gt;
&lt;br /&gt;
/*** Application Defined Pins ***/&lt;br /&gt;
// https://reference.digilentinc.com/chipkit_wifire/chipkit_wifire&lt;br /&gt;
&lt;br /&gt;
/*** Functions for BSP_LED_1 pin ***/&lt;br /&gt;
#define BSP_LED_1Toggle()       LATGINV = _LATG_LATG6_MASK;&lt;br /&gt;
#define BSP_LED_1On()           LATGSET = _LATG_LATG6_MASK;&lt;br /&gt;
#define BSP_LED_1Off()          LATGCLR = _LATG_LATG6_MASK;&lt;br /&gt;
#define BSP_LED_1StateGet()     LATGbits.LATG6&lt;br /&gt;
#define BSP_LED_1Initialize()   TRISGbits.TRISG6 = 0;&lt;br /&gt;
&lt;br /&gt;
/*** Functions for BSP_LED_2 pin ***/&lt;br /&gt;
#define BSP_LED_2Toggle()       LATDINV = _LATD_LATD4_MASK;&lt;br /&gt;
#define BSP_LED_2On()           LATDSET = _LATD_LATD4_MASK;&lt;br /&gt;
#define BSP_LED_2Off()          LATDCLR = _LATD_LATD4_MASK;&lt;br /&gt;
#define BSP_LED_2StateGet()     LATDbits.LATD4&lt;br /&gt;
#define BSP_LED_2Initialize()   TRISDbits.TRISD4 = 0;&lt;br /&gt;
&lt;br /&gt;
/*** Functions for BSP_LED_3 pin ***/&lt;br /&gt;
#define BSP_LED_3Toggle()       LATBINV = _LATB_LATB11_MASK;&lt;br /&gt;
#define BSP_LED_3On()           LATBSET = _LATB_LATB11_MASK;&lt;br /&gt;
#define BSP_LED_3Off()          LATBCLR = _LATB_LATB11_MASK;&lt;br /&gt;
#define BSP_LED_3StateGet()     LATBbits.LATB11&lt;br /&gt;
#define BSP_LED_3Initialize()   TRISBbits.TRISB11 = 0;&lt;br /&gt;
&lt;br /&gt;
/*** Functions for BSP_LED_4 pin ***/&lt;br /&gt;
#define BSP_LED_4Toggle()       LATGINV = _LATG_LATG15_MASK;&lt;br /&gt;
#define BSP_LED_4On()           LATGSET = _LATG_LATG15_MASK;&lt;br /&gt;
#define BSP_LED_4Off()          LATGCLR = _LATG_LATG15_MASK;&lt;br /&gt;
#define BSP_LED_4StateGet()     LATGbits.LATG15&lt;br /&gt;
#define BSP_LED_4Initialize()   TRISGbits.TRISG15 = 0;&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Arnauld.biganzoli</name></author>
	</entry>
</feed>