IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Embarqué Discussion :

Montage de sa propre clé USB


Sujet :

Embarqué

  1. #61
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 273
    Points : 150
    Points
    150
    Par défaut
    La suite :

    usb_config.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    /********************************************************************
     FileName:     	usb_config.h
     Dependencies: 	Always: GenericTypeDefs.h, usb_device.h
                   	Situational: usb_function_hid.h, usb_function_cdc.h, usb_function_msd.h, etc.
     Processor:		PIC18 or PIC24 USB Microcontrollers
     Hardware:		The code is natively intended to be used on the following
     				hardware platforms: PICDEM? FS USB Demo Board, 
     				PIC18F87J50 FS USB Plug-In Module, or
     				Explorer 16 + PIC24 USB PIM.  The firmware may be
     				modified for use on other USB platforms by editing the
     				HardwareProfile.h file.
     Complier:  	Microchip C18 (for PIC18) or C30 (for PIC24)
     Company:		Microchip Technology, Inc.
    
     Software License Agreement:
    
     The software supplied herewith by Microchip Technology Incorporated
     (the ?Company?) for its PIC® Microcontroller is intended and
     supplied to you, the Company?s customer, for use solely and
     exclusively on Microchip PIC Microcontroller products. The
     software is owned by the Company and/or its supplier, and is
     protected under applicable copyright laws. All rights are reserved.
     Any use in violation of the foregoing restrictions may subject the
     user to criminal sanctions under applicable laws, as well as to
     civil liability for the breach of the terms and conditions of this
     license.
    
     THIS SOFTWARE IS PROVIDED IN AN ?AS IS? CONDITION. NO WARRANTIES,
     WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED
     TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
     PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT,
     IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR
     CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
    
    ********************************************************************
     File Description:
    
     Change History:
      Rev   Date         Description
      1.0   11/19/2004   Initial release
      2.1   02/26/2007   Updated for simplicity and to use common
                         coding style
     *******************************************************************/
    
    /*********************************************************************
     * Descriptor specific type definitions are defined in: usbd.h
     ********************************************************************/
    
    #ifndef USBCFG_H
    #define USBCFG_H
    
    /** DEFINITIONS ****************************************************/
    #define USB_EP0_BUFF_SIZE		8	// Valid Options: 8, 16, 32, or 64 bytes.
    								// Using larger options take more SRAM, but
    								// does not provide much advantage in most types
    								// of applications.  Exceptions to this, are applications
    								// that use EP0 IN or OUT for sending large amounts of
    								// application related data.
    									
    #define USB_MAX_NUM_INT     	1   // For tracking Alternate Setting
    #define USB_MAX_EP_NUMBER	    2
    
    //Device descriptor - if these two definitions are not defined then
    //  a ROM USB_DEVICE_DESCRIPTOR variable by the exact name of device_dsc
    //  must exist.
    #define USB_USER_DEVICE_DESCRIPTOR &device_dsc
    #define USB_USER_DEVICE_DESCRIPTOR_INCLUDE extern ROM USB_DEVICE_DESCRIPTOR device_dsc
    
    //Configuration descriptors - if these two definitions do not exist then
    //  a ROM BYTE *ROM variable named exactly USB_CD_Ptr[] must exist.
    #define USB_USER_CONFIG_DESCRIPTOR USB_CD_Ptr
    #define USB_USER_CONFIG_DESCRIPTOR_INCLUDE extern ROM BYTE *ROM USB_CD_Ptr[]
    
    //Make sure only one of the below "#define USB_PING_PONG_MODE"
    //is uncommented.
    #define USB_PING_PONG_MODE USB_PING_PONG__NO_PING_PONG
    //#define USB_PING_PONG_MODE USB_PING_PONG__FULL_PING_PONG
    //#define USB_PING_PONG_MODE USB_PING_PONG__EP0_OUT_ONLY
    //#define USB_PING_PONG_MODE USB_PING_PONG__ALL_BUT_EP0		//NOTE: This mode is not supported in PIC18F4550 family rev A3 devices
    
    
    #define USB_POLLING
    
    /* Parameter definitions are defined in usb_device.h */
    #define USB_PULLUP_OPTION USB_PULLUP_ENABLE
    //                        USB_PULLUP_DISABLED
    
    #define USB_TRANSCEIVER_OPTION USB_INTERNAL_TRANSCEIVER
    //                             USB_EXTERNAL_TRANSCEIVER
    
    #define USB_SPEED_OPTION USB_FULL_SPEED
    //                       USB_LOW_SPEED (not valid option for PIC24F devices)
    
    
    /** DEVICE CLASS USAGE *********************************************/
    #define USB_SUPPORT_DEVICE
    #define USB_USE_MSD
    #define USB_USE_HID
    
    /** ENDPOINTS ALLOCATION *******************************************/
    
    /* MSD */
    #define MSD_INTF_ID             0x00
    #define MSD_IN_EP_SIZE          64
    #define MSD_OUT_EP_SIZE         64
    #define MAX_LUN 0
    #define MSD_DATA_IN_EP          1
    #define MSD_DATA_OUT_EP         1
    #define MSD_BUFFER_ADDRESS      0x600
    
    /* HID */
    #define HID_INTF_ID             0x01
    #define HID_EP 					2
    #define HID_INT_OUT_EP_SIZE     3
    #define HID_INT_IN_EP_SIZE      3
    #define HID_NUM_OF_DSC          1
    #define HID_RPT01_SIZE          29
    /** DEFINITIONS ****************************************************/
    
    #endif //USBCFG_H
    FSconfig.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    /******************************************************************************
     *
     *                Microchip Memory Disk Drive File System
     *
     ******************************************************************************
     * FileName:        FSconfig.h
     * Dependencies:    None
     * Processor:       PIC18/PIC24/dsPIC30/dsPIC33
     * Compiler:        C18/C30
     * Company:         Microchip Technology, Inc.
     * Version:         1.0.0
     *
     * Software License Agreement
     *
     * The software supplied herewith by Microchip Technology Incorporated
     * (the ?Company?) for its PICmicro® Microcontroller is intended and
     * supplied to you, the Company?s customer, for use solely and
     * exclusively on Microchip PICmicro Microcontroller products. The
     * software is owned by the Company and/or its supplier, and is
     * protected under applicable copyright laws. All rights are reserved.
     * Any use in violation of the foregoing restrictions may subject the
     * user to criminal sanctions under applicable laws, as well as to
     * civil liability for the breach of the terms and conditions of this
     * license.
     *
     * THIS SOFTWARE IS PROVIDED IN AN ?AS IS? CONDITION. NO WARRANTIES,
     * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED
     * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
     * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT,
     * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR
     * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
     *
    *****************************************************************************/
    
    
    #ifndef _FS_DEF_
    
    
    #include "HardwareProfile.h"
    
    /***************************************************************************/
    /*   Note:  There are likely pin definitions present in the header file    */
    /*          for your device (SP-SPI.h, CF-PMP.h, etc).  You may wish to    */
    /*          specify these as well                                          */
    /***************************************************************************/
    
    // The FS_MAX_FILES_OPEN #define is only applicable when Dynamic
    // memeory allocation is not used (FS_DYNAMIC_MEM not defined).
    // Defines how many concurent open files can exist at the same time.
    // Takes up static memory. If you do not need to open more than one
    // file at the same time, then you should set this to 1 to reduce
    // memory usage
    #define FS_MAX_FILES_OPEN 	3
    /************************************************************************/
    
    // The size of a sector
    // Must be 512, 1024, 2048, or 4096
    // 512 bytes is the value used by most cards
    #define MEDIA_SECTOR_SIZE 		512
    /************************************************************************/
    
    
    
    /* *******************************************************************************************************/
    /************** Compiler options to enable/Disable Features based on user's application ******************/
    /* *******************************************************************************************************/
    
    
    // Uncomment this to use the FindFirst, FindNext, and FindPrev
    #define ALLOW_FILESEARCH
    /************************************************************************/
    /************************************************************************/
    
    // Comment this line out if you don't intend to write data to the card
    #define ALLOW_WRITES
    /************************************************************************/
    
    // Comment this line out if you don't intend to format your card
    // Writes must be enabled to use the format function
    #define ALLOW_FORMATS
    /************************************************************************/
    
    // Uncomment this definition if you're using directories
    // Writes must be enabled to use directories
    #define ALLOW_DIRS
    /************************************************************************/
    
    // Allows the use of FSfopenpgm, FSremovepgm, etc with PIC18
    #if defined(__18CXX)
        #define ALLOW_PGMFUNCTIONS
    #endif
    /************************************************************************/
    
    // Allows the use of the FSfprintf function
    // Writes must be enabled to use the FSprintf function
    //#define ALLOW_FSFPRINTF
    /************************************************************************/
    
    // If FAT32 support required then uncomment the following
    #define SUPPORT_FAT32
    /* ******************************************************************************************************* */
    
    
    
    
    // Select how you want the timestamps to be updated
    // Use the Real-time clock peripheral to set the clock
    // You must configure the RTC in your application code
    //#define USEREALTIMECLOCK
    // The user will update the timing variables manually using the SetClockVars function
    // The user should set the clock before they create a file or directory (Create time),
    // and before they close a file (last access time, last modified time)
    //#define USERDEFINEDCLOCK
    // Just increment the time- this will not produce accurate times and dates
    #define INCREMENTTIMESTAMP
    
    
    #ifdef USE_PIC18
    	#ifdef USEREALTIMECLOCK
    		#error The PIC18 architecture does not have a Real-time clock and calander module
    	#endif
    #endif
    
    #ifdef ALLOW_PGMFUNCTIONS
    	#ifndef USE_PIC18
    		#error The pgm functions are unneccessary when not using PIC18
    	#endif
    #endif
    
    #ifndef USEREALTIMECLOCK
        #ifndef USERDEFINEDCLOCK
            #ifndef INCREMENTTIMESTAMP
                #error Please enable USEREALTIMECLOCK, USERDEFINEDCLOCK, or INCREMENTTIMESTAMP
            #endif
        #endif
    #endif
    
    /************************************************************************/
    // Define FS_DYNAMIC_MEM to use malloc for allocating
    // FILE structure space.  uncomment all three lines
    /************************************************************************/
    #if 0
    	#define FS_DYNAMIC_MEM
    	#ifdef USE_PIC18
    		#define FS_malloc	SRAMalloc
    		#define FS_free		SRAMfree
    	#else
    		#define FS_malloc	malloc
    		#define FS_free		free
    	#endif
    #endif
    
    
    // Function definitions
    // Associate the physical layer functions with the correct physical layer
    #ifdef USE_SD_INTERFACE_WITH_SPI       // SD-SPI.c and .h
    
        #define MDD_MediaInitialize     MDD_SDSPI_MediaInitialize
        #define MDD_MediaDetect         MDD_SDSPI_MediaDetect
        #define MDD_SectorRead          MDD_SDSPI_SectorRead
        #define MDD_SectorWrite         MDD_SDSPI_SectorWrite
        #define MDD_InitIO              MDD_SDSPI_InitIO
        #define MDD_ShutdownMedia       MDD_SDSPI_ShutdownMedia
        #define MDD_WriteProtectState   MDD_SDSPI_WriteProtectState
        #define MDD_ReadSectorSize      MDD_SDSPI_ReadSectorSize
        #define MDD_ReadCapacity        MDD_SDSPI_ReadCapacity
    
    #elif defined USE_CF_INTERFACE_WITH_PMP       // CF-PMP.c and .h
    
        #define MDD_MediaInitialize     MDD_CFPMP_MediaInitialize
        #define MDD_MediaDetect         MDD_CFPMP_MediaDetect
        #define MDD_SectorRead          MDD_CFPMP_SectorRead
        #define MDD_SectorWrite         MDD_CFPMP_SectorWrite
        #define MDD_InitIO              MDD_CFPMP_InitIO
        #define MDD_ShutdownMedia       MDD_CFPMP_ShutdownMedia
        #define MDD_WriteProtectState   MDD_CFPMP_WriteProtectState
        #define MDD_CFwait              MDD_CFPMP_CFwait
        #define MDD_CFwrite             MDD_CFPMP_CFwrite
        #define MDD_CFread              MDD_CFPMP_CFread
    
    #elif defined USE_MANUAL_CF_INTERFACE         // CF-Bit transaction.c and .h
    
        #define MDD_MediaInitialize     MDD_CFBT_MediaInitialize
        #define MDD_MediaDetect         MDD_CFBT_MediaDetect
        #define MDD_SectorRead          MDD_CFBT_SectorRead
        #define MDD_SectorWrite         MDD_CFBT_SectorWrite
        #define MDD_InitIO              MDD_CFBT_InitIO
        #define MDD_ShutdownMedia       MDD_CFBT_ShutdownMedia
        #define MDD_WriteProtectState   MDD_CFBT_WriteProtectState
        #define MDD_CFwait              MDD_CFBT_CFwait
        #define MDD_CFwrite             MDD_CFBT_CFwrite
        #define MDD_CFread              MDD_CFBT_CFread
    
    #elif defined USE_USB_INTERFACE               // USB host MSD library
    
        #define MDD_MediaInitialize     USBHostMSDSCSIMediaInitialize
        #define MDD_MediaDetect         USBHostMSDSCSIMediaDetect
        #define MDD_SectorRead          USBHostMSDSCSISectorRead
        #define MDD_SectorWrite         USBHostMSDSCSISectorWrite
        #define MDD_InitIO();              
        #define MDD_ShutdownMedia       USBHostMSDSCSIMediaReset
        #define MDD_WriteProtectState   USBHostMSDSCSIWriteProtectState
    
    #endif
    
    #endif
    usb_ch9.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    /*******************************************************************************
    
        USB Chapter 9 Protocol (Header File)
    
    Description:
        This file defines data structures, constants, and macros that are used to
        to support the USB Device Framework protocol described in Chapter 9 of the
        USB 2.0 specification.
    
    *******************************************************************************/
    //DOM-IGNORE-BEGIN
    /*******************************************************************************
    
    * FileName:        usb_ch9.h
    * Dependencies:    None
    * Processor:       PIC18/PIC24/PIC32MX microcontrollers with USB module
    * Compiler:        C18 v3.13+/C30 v2.01+/C32 v0.00.18+
    * Company:         Microchip Technology, Inc.
    * File Description:
    * This file contains the definitions and prototypes used for
    * specification chapter 9 compliance.
    
    Software License Agreement
    
    The software supplied herewith by Microchip Technology Incorporated
    (the “Company”) for its PICmicro® Microcontroller is intended and
    supplied to you, the Company’s customer, for use solely and
    exclusively on Microchip PICmicro Microcontroller products. The
    software is owned by the Company and/or its supplier, and is
    protected under applicable copyright laws. All rights are reserved.
    Any use in violation of the foregoing restrictions may subject the
    user to criminal sanctions under applicable laws, as well as to
    civil liability for the breach of the terms and conditions of this
    license.
    
    THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES,
    WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED
    TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
    PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT,
    IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR
    CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
    
    *******************************************************************************/
    //DOM-IGNORE-END
    
    //DOM-IGNORE-BEGIN
    #ifndef _USB_CH9_H_
    #define _USB_CH9_H_
    //DOM-IGNORE-END
    
    
    // *****************************************************************************
    // *****************************************************************************
    // Section: USB Descriptors
    // *****************************************************************************
    // *****************************************************************************
    
    #define USB_DESCRIPTOR_DEVICE           0x01    // bDescriptorType for a Device Descriptor.
    #define USB_DESCRIPTOR_CONFIGURATION    0x02    // bDescriptorType for a Configuration Descriptor.
    #define USB_DESCRIPTOR_STRING           0x03    // bDescriptorType for a String Descriptor.
    #define USB_DESCRIPTOR_INTERFACE        0x04    // bDescriptorType for an Interface Descriptor.
    #define USB_DESCRIPTOR_ENDPOINT         0x05    // bDescriptorType for an Endpoint Descriptor.
    #define USB_DESCRIPTOR_DEVICE_QUALIFIER 0x06    // bDescriptorType for a Device Qualifier.
    #define USB_DESCRIPTOR_OTHER_SPEED      0x07    // bDescriptorType for a Other Speed Configuration.
    #define USB_DESCRIPTOR_INTERFACE_POWER  0x08    // bDescriptorType for Interface Power.
    #define USB_DESCRIPTOR_OTG              0x09    // bDescriptorType for an OTG Descriptor.
    
    // *****************************************************************************
    /* USB Device Descriptor Structure
    
    This struct defines the structure of a USB Device Descriptor.  Note that this
    structure may need to be packed, or even accessed as bytes, to properly access
    the correct fields when used on some device architectures.
    */
    typedef struct __attribute__ ((packed)) _USB_DEVICE_DESCRIPTOR
    {
        BYTE bLength;               // Length of this descriptor.
        BYTE bDescriptorType;       // DEVICE descriptor type (USB_DESCRIPTOR_DEVICE).
        WORD bcdUSB;                // USB Spec Release Number (BCD).
        BYTE bDeviceClass;          // Class code (assigned by the USB-IF). 0xFF-Vendor specific.
        BYTE bDeviceSubClass;       // Subclass code (assigned by the USB-IF).
        BYTE bDeviceProtocol;       // Protocol code (assigned by the USB-IF). 0xFF-Vendor specific.
        BYTE bMaxPacketSize0;       // Maximum packet size for endpoint 0.
        WORD idVendor;              // Vendor ID (assigned by the USB-IF).
        WORD idProduct;             // Product ID (assigned by the manufacturer).
        WORD bcdDevice;             // Device release number (BCD).
        BYTE iManufacturer;         // Index of String Descriptor describing the manufacturer.
        BYTE iProduct;              // Index of String Descriptor describing the product.
        BYTE iSerialNumber;         // Index of String Descriptor with the device's serial number.
        BYTE bNumConfigurations;    // Number of possible configurations.
    } USB_DEVICE_DESCRIPTOR;
    
    
    // *****************************************************************************
    /* USB Configuration Descriptor Structure
    
    This struct defines the structure of a USB Configuration Descriptor.  Note that this
    structure may need to be packed, or even accessed as bytes, to properly access
    the correct fields when used on some device architectures.
    */
    typedef struct __attribute__ ((packed)) _USB_CONFIGURATION_DESCRIPTOR
    {
        BYTE bLength;               // Length of this descriptor.
        BYTE bDescriptorType;       // CONFIGURATION descriptor type (USB_DESCRIPTOR_CONFIGURATION).
        WORD wTotalLength;          // Total length of all descriptors for this configuration.
        BYTE bNumInterfaces;        // Number of interfaces in this configuration.
        BYTE bConfigurationValue;   // Value of this configuration (1 based).
        BYTE iConfiguration;        // Index of String Descriptor describing the configuration.
        BYTE bmAttributes;          // Configuration characteristics.
        BYTE bMaxPower;             // Maximum power consumed by this configuration.
    } USB_CONFIGURATION_DESCRIPTOR;
    
    // Attributes bits
    #define USB_CFG_DSC_REQUIRED     0x80                       // Required attribute
    #define USB_CFG_DSC_SELF_PWR    (0x40|USB_CFG_DSC_REQUIRED) // Device is self powered.
    #define USB_CFG_DSC_REM_WAKE    (0x20|USB_CFG_DSC_REQUIRED) // Device can request remote wakup
    
    
    // *****************************************************************************
    /* USB Interface Descriptor Structure
    
    This struct defines the structure of a USB Interface Descriptor.  Note that this
    structure may need to be packed, or even accessed as bytes, to properly access
    the correct fields when used on some device architectures.
    */
    typedef struct __attribute__ ((packed)) _USB_INTERFACE_DESCRIPTOR
    {
        BYTE bLength;               // Length of this descriptor.
        BYTE bDescriptorType;       // INTERFACE descriptor type (USB_DESCRIPTOR_INTERFACE).
        BYTE bInterfaceNumber;      // Number of this interface (0 based).
        BYTE bAlternateSetting;     // Value of this alternate interface setting.
        BYTE bNumEndpoints;         // Number of endpoints in this interface.
        BYTE bInterfaceClass;       // Class code (assigned by the USB-IF).  0xFF-Vendor specific.
        BYTE bInterfaceSubClass;    // Subclass code (assigned by the USB-IF).
        BYTE bInterfaceProtocol;    // Protocol code (assigned by the USB-IF).  0xFF-Vendor specific.
        BYTE iInterface;            // Index of String Descriptor describing the interface.
    } USB_INTERFACE_DESCRIPTOR;
    
    
    // *****************************************************************************
    /* USB Endpoint Descriptor Structure
    
    This struct defines the structure of a USB Endpoint Descriptor.  Note that this
    structure may need to be packed, or even accessed as bytes, to properly access
    the correct fields when used on some device architectures.
    */
    typedef struct __attribute__ ((packed)) _USB_ENDPOINT_DESCRIPTOR
    {
        BYTE bLength;               // Length of this descriptor.
        BYTE bDescriptorType;       // ENDPOINT descriptor type (USB_DESCRIPTOR_ENDPOINT).
        BYTE bEndpointAddress;      // Endpoint address. Bit 7 indicates direction (0=OUT, 1=IN).
        BYTE bmAttributes;          // Endpoint transfer type.
        WORD wMaxPacketSize;        // Maximum packet size.
        BYTE bInterval;             // Polling interval in frames.
    } USB_ENDPOINT_DESCRIPTOR;
    
    
    // Endpoint Direction
    #define EP_DIR_IN           0x80    // Data flows from device to host
    #define EP_DIR_OUT          0x00    // Data flows from host to device
    
    
    // ******************************************************************
    // USB Endpoint Attributes
    // ******************************************************************
    
    // Section: Transfer Types
    #define EP_ATTR_CONTROL     (0<<0)  // Endoint used for control transfers
    #define EP_ATTR_ISOCH       (1<<0)  // Endpoint used for isochronous transfers
    #define EP_ATTR_BULK        (2<<0)  // Endpoint used for bulk transfers
    #define EP_ATTR_INTR        (3<<0)  // Endpoint used for interrupt transfers
    
    // Section: Synchronization Types (for isochronous enpoints)
    #define EP_ATTR_NO_SYNC     (0<<2)  // No Synchronization
    #define EP_ATTR_ASYNC       (1<<2)  // Asynchronous
    #define EP_ATTR_ADAPT       (2<<2)  // Adaptive synchronization
    #define EP_ATTR_SYNC        (3<<2)  // Synchronous
    
    // Section: Usage Types (for isochronous endpoints)
    #define EP_ATTR_DATA        (0<<4)  // Data Endpoint
    #define EP_ATTR_FEEDBACK    (1<<4)  // Feedback endpoint
    #define EP_ATTR_IMP_FB      (2<<4)  // Implicit Feedback data EP
    
    // Section: Max Packet Sizes
    #define EP_MAX_PKT_INTR_LS  8       // Max low-speed interrupt packet
    #define EP_MAX_PKT_INTR_FS  64      // Max full-speed interrupt packet
    #define EP_MAX_PKT_ISOCH_FS 1023    // Max full-speed isochronous packet
    #define EP_MAX_PKT_BULK_FS  64      // Max full-speed bulk packet
    #define EP_LG_PKT_BULK_FS   32      // Large full-speed bulk packet
    #define EP_MED_PKT_BULK_FS  16      // Medium full-speed bulk packet
    #define EP_SM_PKT_BULK_FS   8       // Small full-speed bulk packet
    
    
    // *****************************************************************************
    /* USB OTG Descriptor Structure
    
    This struct defines the structure of a USB OTG Descriptor.  Note that this
    structure may need to be packed, or even accessed as bytes, to properly access
    the correct fields when used on some device architectures.
    */
    typedef struct __attribute__ ((packed)) _USB_OTG_DESCRIPTOR
    {
        BYTE bLength;               // Length of this descriptor.
        BYTE bDescriptorType;       // OTG descriptor type (USB_DESCRIPTOR_OTG).
        BYTE bmAttributes;          // OTG attributes.
    } USB_OTG_DESCRIPTOR;
    
    
    // ******************************************************************
    // Section: USB String Descriptor Structure
    // ******************************************************************
    // This structure describes the USB string descriptor.  The string
    // descriptor provides user-readable information about various aspects of
    // the device.  The first string desriptor (string descriptor zero (0)),
    // provides a list of the number of languages supported by the set of
    // string descriptors for this device instead of an actual string.
    //
    // Note: The strings are in 2-byte-per-character unicode, not ASCII.
    //
    // Note: This structure only describes the "header" of the string
    // descriptor.  The actual data (either the language ID array or the
    // array of unicode characters making up the string, must be allocated
    // immediately following this header with no padding between them.
    
    typedef struct __attribute__ ((packed)) _USB_STRING_DSC
    {
        BYTE   bLength;             // Size of this descriptor
        BYTE   bDescriptorType;     // Type, USB_DSC_STRING
    
    } USB_STRING_DESCRIPTOR;
    
    
    // ******************************************************************
    // Section: USB Device Qualifier Descriptor Structure
    // ******************************************************************
    // This structure describes the device qualifier descriptor.  The device
    // qualifier descriptor provides overall device information if the device
    // supports "other" speeds.
    //
    // Note: A high-speed device may support "other" speeds (ie. full or low).
    // If so, it may need to implement the the device qualifier and other
    // speed descriptors.
    
    typedef struct __attribute__ ((packed)) _USB_DEVICE_QUALIFIER_DESCRIPTOR
    {
        BYTE bLength;               // Size of this descriptor
        BYTE bType;                 // Type, always USB_DESCRIPTOR_DEVICE_QUALIFIER
        WORD bcdUSB;                // USB spec version, in BCD
        BYTE bDeviceClass;          // Device class code
        BYTE bDeviceSubClass;       // Device sub-class code
        BYTE bDeviceProtocol;       // Device protocol
        BYTE bMaxPacketSize0;       // EP0, max packet size
        BYTE bNumConfigurations;    // Number of "other-speed" configurations
        BYTE bReserved;             // Always zero (0)
    
    } USB_DEVICE_QUALIFIER_DESCRIPTOR;
    
    
    // ******************************************************************
    // Section: USB Setup Packet Structure
    // ******************************************************************
    // This structure describes the data contained in a USB standard device
    // request's setup packet.  It is the data packet sent from the host to
    // the device to control and configure the device.
    //
    // Note: Refer to the USB 2.0 specification for additional details on the
    // usage of the setup packet and standard device requests.
    
    typedef struct __attribute__ ((packed)) SetupPkt
    {
        union                           // offset   description
        {                               // ------   ------------------------
            BYTE bmRequestType;         //   0      Bit-map of request type
            struct
            {
                BYTE    recipient:  5;  //          Recipient of the request
                BYTE    type:       2;  //          Type of request
                BYTE    direction:  1;  //          Direction of data X-fer
            };
        }requestInfo;
    
        BYTE    bRequest;               //   1      Request type
        UINT16  wValue;                 //   2      Depends on bRequest
        UINT16  wIndex;                 //   4      Depends on bRequest
        UINT16  wLength;                //   6      Depends on bRequest
    
    } SETUP_PKT, *PSETUP_PKT;
    
    
    // ******************************************************************
    // ******************************************************************
    // Section: USB Specification Constants
    // ******************************************************************
    // ******************************************************************
    
    // Section: Valid PID Values
    //DOM-IGNORE-BEGIN
    #define PID_OUT                                 0x1     // PID for an OUT token
    #define PID_ACK                                 0x2     // PID for an ACK handshake
    #define PID_DATA0                               0x3     // PID for DATA0 data
    #define PID_PING                                0x4     // Special PID PING
    #define PID_SOF                                 0x5     // PID for a SOF token
    #define PID_NYET                                0x6     // PID for a NYET handshake
    #define PID_DATA2                               0x7     // PID for DATA2 data
    #define PID_SPLIT                               0x8     // Special PID SPLIT
    #define PID_IN                                  0x9     // PID for a IN token
    #define PID_NAK                                 0xA     // PID for a NAK handshake
    #define PID_DATA1                               0xB     // PID for DATA1 data
    #define PID_PRE                                 0xC     // Special PID PRE (Same as PID_ERR)
    #define PID_ERR                                 0xC     // Special PID ERR (Same as PID_PRE)
    #define PID_SETUP                               0xD     // PID for a SETUP token
    #define PID_STALL                               0xE     // PID for a STALL handshake
    #define PID_MDATA                               0xF     // PID for MDATA data
    
    #define PID_MASK_DATA                           0x03    // Data PID mask
    #define PID_MASK_DATA_SHIFTED                  (PID_MASK_DATA << 2) // Data PID shift to proper position
    //DOM-IGNORE-END
    
    // Section: USB Token Types
    //DOM-IGNORE-BEGIN
    #define USB_TOKEN_OUT                           0x01    // U1TOK - OUT token
    #define USB_TOKEN_IN                            0x09    // U1TOK - IN token
    #define USB_TOKEN_SETUP                         0x0D    // U1TOK - SETUP token
    //DOM-IGNORE-END
    
    // Section: OTG Descriptor Constants
    
    #define OTG_HNP_SUPPORT                         0x02    // OTG Descriptor bmAttributes - HNP support flag
    #define OTG_SRP_SUPPORT                         0x01    // OTG Descriptor bmAttributes - SRP support flag
    
    // Section: Endpoint Directions
    
    #define USB_IN_EP                               0x80    // IN endpoint mask
    #define USB_OUT_EP                              0x00    // OUT endpoint mask
    
    // Section: Standard Device Requests
    
    #define USB_REQUEST_GET_STATUS                  0       // Standard Device Request - GET STATUS
    #define USB_REQUEST_CLEAR_FEATURE               1       // Standard Device Request - CLEAR FEATURE
    #define USB_REQUEST_SET_FEATURE                 3       // Standard Device Request - SET FEATURE
    #define USB_REQUEST_SET_ADDRESS                 5       // Standard Device Request - SET ADDRESS
    #define USB_REQUEST_GET_DESCRIPTOR              6       // Standard Device Request - GET DESCRIPTOR
    #define USB_REQUEST_SET_DESCRIPTOR              7       // Standard Device Request - SET DESCRIPTOR
    #define USB_REQUEST_GET_CONFIGURATION           8       // Standard Device Request - GET CONFIGURATION
    #define USB_REQUEST_SET_CONFIGURATION           9       // Standard Device Request - SET CONFIGURATION
    #define USB_REQUEST_GET_INTERFACE               10      // Standard Device Request - GET INTERFACE
    #define USB_REQUEST_SET_INTERFACE               11      // Standard Device Request - SET INTERFACE
    #define USB_REQUEST_SYNCH_FRAME                 12      // Standard Device Request - SYNCH FRAME
    
    #define USB_FEATURE_ENDPOINT_HALT               0       // CLEAR/SET FEATURE - Endpoint Halt
    #define USB_FEATURE_DEVICE_REMOTE_WAKEUP        1       // CLEAR/SET FEATURE - Device remote wake-up
    #define USB_FEATURE_TEST_MODE                   2       // CLEAR/SET FEATURE - Test mode
    
    // Section: Setup Data Constants
    
    #define USB_SETUP_HOST_TO_DEVICE                0x00    // Device Request bmRequestType transfer direction - host to device transfer
    #define USB_SETUP_DEVICE_TO_HOST                0x80    // Device Request bmRequestType transfer direction - device to host transfer
    #define USB_SETUP_TYPE_STANDARD                 0x00    // Device Request bmRequestType type - standard
    #define USB_SETUP_TYPE_CLASS                    0x20    // Device Request bmRequestType type - class
    #define USB_SETUP_TYPE_VENDOR                   0x40    // Device Request bmRequestType type - vendor
    #define USB_SETUP_RECIPIENT_DEVICE              0x00    // Device Request bmRequestType recipient - device
    #define USB_SETUP_RECIPIENT_INTERFACE           0x01    // Device Request bmRequestType recipient - interface
    #define USB_SETUP_RECIPIENT_ENDPOINT            0x02    // Device Request bmRequestType recipient - endpoint
    #define USB_SETUP_RECIPIENT_OTHER               0x03    // Device Request bmRequestType recipient - other
    
    // Section: OTG SET FEATURE Constants
    
    #define OTG_FEATURE_B_HNP_ENABLE                3       // SET FEATURE OTG - Enable B device to perform HNP
    #define OTG_FEATURE_A_HNP_SUPPORT               4       // SET FEATURE OTG - A device supports HNP
    #define OTG_FEATURE_A_ALT_HNP_SUPPORT           5       // SET FEATURE OTG - Another port on the A device supports HNP
    
    // Section: USB Endpoint Transfer Types
    
    #define USB_TRANSFER_TYPE_CONTROL               0x00    // Endpoint is a control endpoint.
    #define USB_TRANSFER_TYPE_ISOCHRONOUS           0x01    // Endpoint is an isochronous endpoint.
    #define USB_TRANSFER_TYPE_BULK                  0x02    // Endpoint is a bulk endpoint.
    #define USB_TRANSFER_TYPE_INTERRUPT             0x03    // Endpoint is an interrupt endpoint.
    
    // Section: Standard Feature Selectors for CLEAR_FEATURE Requests
    #define USB_FEATURE_ENDPOINT_STALL              0       // Endpoint recipient
    #define USB_FEATURE_DEVICE_REMOTE_WAKEUP        1       // Device recipient
    #define USB_FEATURE_TEST_MODE                   2       // Device recipient
    
    
    // Section: USB Class Code Definitions
    #define USB_HUB_CLASSCODE                       0x09    //  Class code for a hub.
    
    
    #endif  // _USB_CH9_H_
    /*************************************************************************
     * EOF
     */

  2. #62
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 273
    Points : 150
    Points
    150
    Par défaut
    Encore la suite (y avais trop de caractère pour un message ^^)

    HardwareProfile.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    562
    563
    564
    565
    566
    567
    568
    569
    570
    571
    572
    573
    574
    575
    576
    577
    578
    579
    580
    581
    582
    583
    584
    585
    586
    587
    588
    589
    590
    591
    592
    593
    594
    595
    596
    597
    598
    599
    600
    601
    602
    603
    604
    605
    606
    607
    608
    609
    610
    611
    612
    613
    614
    615
    616
    617
    618
    619
    620
    621
    622
    623
    624
    625
    626
    627
    628
    629
    630
    631
    632
    633
    634
    635
    636
    637
    638
    639
    640
    641
    642
    643
    644
    645
    646
    647
    648
    649
    650
    651
    652
    653
    654
    655
    656
    657
    658
    659
    660
    661
    662
    663
    664
    665
    666
    667
    668
    669
    670
    671
    672
    673
    674
    675
    676
    677
    678
    679
    680
    681
    682
    683
    684
    685
    686
    687
    688
    689
    690
    691
    692
    693
    694
    695
    696
    697
    698
    699
    700
    701
    702
    703
    704
    705
    706
    707
    708
    709
    710
    711
    712
    713
    714
    715
    716
    717
    718
    719
    720
    721
    722
    723
    724
    725
    726
    727
    728
    729
    /********************************************************************
     FileName:     	HardwareProfile.h
     Dependencies:	See INCLUDES section
     Processor:		PIC18 or PIC24 USB Microcontrollers
     Hardware:		The code is natively intended to be used on the following
     				hardware platforms: PICDEM? FS USB Demo Board, 
     				PIC18F87J50 FS USB Plug-In Module, or
     				Explorer 16 + PIC24 USB PIM.  The firmware may be
     				modified for use on other USB platforms by editing this
     				file (HardwareProfile.h).
     Complier:  	Microchip C18 (for PIC18) or C30 (for PIC24)
     Company:		Microchip Technology, Inc.
    
     Software License Agreement:
    
     The software supplied herewith by Microchip Technology Incorporated
     (the ?Company?) for its PIC® Microcontroller is intended and
     supplied to you, the Company?s customer, for use solely and
     exclusively on Microchip PIC Microcontroller products. The
     software is owned by the Company and/or its supplier, and is
     protected under applicable copyright laws. All rights are reserved.
     Any use in violation of the foregoing restrictions may subject the
     user to criminal sanctions under applicable laws, as well as to
     civil liability for the breach of the terms and conditions of this
     license.
    
     THIS SOFTWARE IS PROVIDED IN AN ?AS IS? CONDITION. NO WARRANTIES,
     WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED
     TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
     PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT,
     IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR
     CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
    
    ********************************************************************
     File Description:
    
     Change History:
      Rev   Date         Description
      1.0   11/19/2004   Initial release
      2.1   02/26/2007   Updated for simplicity and to use common
                         coding style
    
    ********************************************************************/
    
    #ifndef HARDWARE_PROFILE_H
    #define HARDWARE_PROFILE_H
    
    //#define DEMO_BOARD USER_DEFINED_BOARD
    #include "usb_config.h"
    // Determines processor type automatically
    #ifdef __18CXX
    	#define USE_PIC18
    #elif defined __PIC24F__
    	#define USE_16BIT
    	#define USE_PIC24F
    #elif defined __PIC24H__
    	#define USE_16BIT
    	#define USE_PIC24H
    #elif defined __dsPIC30F__
    	#define USE_16BIT
    	#define USE_PIC30
    #elif defined __dsPIC33F__
    	#define USE_16BIT
    	#define USE_PIC33
    #else
    #endif
    #if !defined(DEMO_BOARD)
        #if defined(__C30__)
            #if defined(__PIC24FJ256GB110__)
                #define DEMO_BOARD PIC24FJ256GB110_PIM
                #define EXPLORER_16
    			#define PIC24FJ256GB110_PIM
                #define CLOCK_FREQ 32000000
                #define GetSystemClock()        32000000
                #define GetPeripheralClock()    GetSystemClock()
                #define GetInstructionClock()   (GetSystemClock() / 2)
                // Clock values
                #define MILLISECONDS_PER_TICK       10
                #define TIMER_PRESCALER             TIMER_PRESCALER_8   // 8MHz: TIMER_PRESCALER_1
                #define TIMER_PERIOD                20000                // 10ms=20000, 1ms=2000
            #endif
        #endif
    
        #if defined(__18CXX)
            #if defined(__18F4550)
                #define GetSystemClock()        48000000                        // System clock frequency (Hz)
                #define GetPeripheralClock()    GetSystemClock()                // Peripheral clock freq.
                #define GetInstructionClock()   (GetSystemClock() / 4)          // Instruction clock freq.
    
                #define DEMO_BOARD PICDEM_FS_USB
                #define PICDEM_FS_USB
                #define CLOCK_FREQ 48000000
            #elif defined(__18F87J50) || defined(__18F85J50)
                #define GetSystemClock()        48000000                        // System clock frequency (Hz)
                #define GetPeripheralClock()    GetSystemClock()                // Peripheral clock freq.
                #define GetInstructionClock()   (GetSystemClock() / 4)          // Instruction clock freq.
    
                #define DEMO_BOARD PIC18F87J50_PIM
                #define PIC18F87J50_PIM
                #define CLOCK_FREQ 48000000
            #endif
        #endif
    #endif
    
    #if !defined(DEMO_BOARD)
    #endif
    
    //#define ENABLE_CONSOLE
    
    /** TRIS ***********************************************************/
    #define INPUT_PIN           1
    #define OUTPUT_PIN          0
    
    /** USB ************************************************************/
    #if defined(PICDEM_FS_USB)
    	//The PICDEM FS USB Demo Board platform supports the USE_SELF_POWER_SENSE_IO
    	//and USE_USB_BUS_SENSE_IO features.  Uncomment the below line(s) if
    	//it is desireable to use one or both of the features.
    	//#define USE_SELF_POWER_SENSE_IO	
    	//#define USE_USB_BUS_SENSE_IO
    
    	#define PROGRAMMABLE_WITH_USB_MCHPUSB_BOOTLOADER	//Uncomment this to make the output HEX of this project work with the MCHPUSB Bootloader
    
        #define U1ADDR UADDR
        #define U1IE UIE
        #define U1IR UIR
        #define U1EIR UEIR
        #define U1EIE UEIE
        #define U1CON UCON
        #define U1EP0 UEP0
        #define U1CONbits UCONbits
        #define U1EP1 UEP1
        #define U1CNFG1 UCFG
        #define U1STAT USTAT
        #define U1EP0bits UEP0bits
        
        #define tris_usb_bus_sense  TRISAbits.TRISA1    // Input
        
        #if defined(USE_USB_BUS_SENSE_IO)
        #define USB_BUS_SENSE       PORTAbits.RA1
        #else
        #define USB_BUS_SENSE       1
        #endif
        
        #define tris_self_power     TRISAbits.TRISA2    // Input
        
        #if defined(USE_SELF_POWER_SENSE_IO)
        #define self_power          PORTAbits.RA2
        #else
        #define self_power          1
        #endif
        
        // External Transceiver Interface
        #define tris_usb_vpo        TRISBbits.TRISB3    // Output
        #define tris_usb_vmo        TRISBbits.TRISB2    // Output
        #define tris_usb_rcv        TRISAbits.TRISA4    // Input
        #define tris_usb_vp         TRISCbits.TRISC5    // Input
        #define tris_usb_vm         TRISCbits.TRISC4    // Input
        #define tris_usb_oe         TRISCbits.TRISC1    // Output
        
        #define tris_usb_suspnd     TRISAbits.TRISA3    // Output
        
        /** LED ************************************************************/
        #define mInitAllLEDs()      //LATD &= 0xF0; TRISD &= 0xF0;
        
        #define mLED_1              LATDbits.LATD0
        #define mLED_2              LATDbits.LATD1
        #define mLED_3              LATDbits.LATD2
        #define mLED_4              LATDbits.LATD3
        
        #define mLED_1_On()         mLED_1 = 1;
        #define mLED_2_On()         mLED_2 = 1;
        #define mLED_3_On()         mLED_3 = 1;
        #define mLED_4_On()         mLED_4 = 1;
        
        #define mLED_1_Off()        mLED_1 = 0;
        #define mLED_2_Off()        mLED_2 = 0;
        #define mLED_3_Off()        mLED_3 = 0;
        #define mLED_4_Off()        mLED_4 = 0;
        
        #define mLED_1_Toggle()     mLED_1 = !mLED_1;
        #define mLED_2_Toggle()     mLED_2 = !mLED_2;
        #define mLED_3_Toggle()     mLED_3 = !mLED_3;
        #define mLED_4_Toggle()     mLED_4 = !mLED_4;
        
        /** SWITCH *********************************************************/
        #define mInitAllSwitches()  TRISBbits.TRISB4=1;TRISBbits.TRISB5=1;
        #define mInitSwitch2()      TRISBbits.TRISB4=1;
        #define mInitSwitch3()      TRISBbits.TRISB5=1;
        #define sw2                 PORTBbits.RB4
        #define sw3                 PORTBbits.RB5
        
        /** POT ************************************************************/
        #define mInitPOT()          {TRISAbits.TRISA0=1;ADCON0=0x01;ADCON2=0x3C;ADCON2bits.ADFM = 1;}
        
        /** SPI : Chip Select Lines ****************************************/
        #define tris_cs_temp_sensor TRISBbits.TRISB2    // Output
        #define cs_temp_sensor      LATBbits.LATB2
        
        #define tris_cs_sdmmc       TRISBbits.TRISB3    // Output
        #define cs_sdmmc            LATBbits.LATB3
        
        /** SD/MMC *********************************************************/
        #define TRIS_CARD_DETECT    TRISBbits.TRISB4    // Input
        #define CARD_DETECT         PORTBbits.RB4
        
        #define TRIS_WRITE_DETECT   TRISAbits.TRISA4    // Input
        #define WRITE_DETECT        PORTAbits.RA4
    
    #endif
    
    #if defined(PIC18F87J50_PIM)
    //The PIC18F87J50 FS USB Plug-In Module supports the USE_USB_BUS_SENSE_IO
    //feature.  The USE_SELF_POWER_SENSE_IO feature is not implemented on the
    //circuit board, so the USE_SELF_POWER_SENSE_IO define should always be
    //commented for this hardware platform.
    
    //#define USE_SELF_POWER_SENSE_IO
    //#define USE_USB_BUS_SENSE_IO		//JP1 must be in R-U position to use this feature on this board	
    
    	#define PROGRAMMABLE_WITH_USB_HID_BOOTLOADER		//Uncomment this to make the output HEX of this project work with the HID Bootloader
    
        #define U1ADDR UADDR
        #define U1IE UIE
        #define U1IR UIR
        #define U1EIR UEIR
        #define U1EIE UEIE
        #define U1CON UCON
        #define U1EP0 UEP0
        #define U1CONbits UCONbits
        #define U1EP1 UEP1
        #define U1CNFG1 UCFG
        #define U1STAT USTAT
        #define U1EP0bits UEP0bits
        
        #define tris_usb_bus_sense  TRISBbits.TRISB5    // Input
        
        #if defined(USE_USB_BUS_SENSE_IO)
        #define USB_BUS_SENSE       PORTBbits.RB5
        #else
        #define USB_BUS_SENSE       1
        #endif
        
        #define tris_self_power     TRISAbits.TRISA2    // Input
        
        #if defined(USE_SELF_POWER_SENSE_IO)
        #define self_power          PORTAbits.RA2
        #else
        #define self_power          1
        #endif
        
        // External Transceiver Interface
        #define tris_usb_vpo        TRISBbits.TRISB3    // Output
        #define tris_usb_vmo        TRISBbits.TRISB2    // Output
        #define tris_usb_rcv        TRISAbits.TRISA4    // Input
        #define tris_usb_vp         TRISCbits.TRISC5    // Input
        #define tris_usb_vm         TRISCbits.TRISC4    // Input
        #define tris_usb_oe         TRISCbits.TRISC1    // Output
        
        #define tris_usb_suspnd     TRISAbits.TRISA3    // Output
        
        /** LED ************************************************************/
    	#define mInitAllLEDs()      {LATE &= 0xFC; TRISE &= 0xFC; LATD &= 0xF3; TRISD &= 0xF3;}
        
        #define mLED_1              LATEbits.LATE0
        #define mLED_2              LATEbits.LATE1
        #define mLED_3              LATDbits.LATD2
        #define mLED_4              LATDbits.LATD3
        
        #define mLED_1_On()         mLED_1 = 1;
        #define mLED_2_On()         mLED_2 = 1;
        #define mLED_3_On()         mLED_3 = 1;
        #define mLED_4_On()         mLED_4 = 1;
        
        #define mLED_1_Off()        mLED_1 = 0;
        #define mLED_2_Off()        mLED_2 = 0;
        #define mLED_3_Off()        mLED_3 = 0;
        #define mLED_4_Off()        mLED_4 = 0;
        
        #define mLED_1_Toggle()     mLED_1 = !mLED_1;
        #define mLED_2_Toggle()     mLED_2 = !mLED_2;
        #define mLED_3_Toggle()     mLED_3 = !mLED_3;
        #define mLED_4_Toggle()     mLED_4 = !mLED_4;
        
        /** SWITCH *********************************************************/
        #define mInitAllSwitches()  {mInitSwitch2();mInitSwitch3();}
        #define mInitSwitch2()      TRISBbits.TRISB0=1
        #define sw2                 PORTBbits.RB0
        #define mInitSwitch3()      TRISBbits.TRISB4=1;
        #define sw3                 PORTBbits.RB4
        
        /** POT ************************************************************/		
    	#define mInitPOT()          {\
    									ADCON0=0x01;\
    									ADCON1=0x06;\
    									WDTCONbits.ADSHR=1;\
    									ANCON0=0x9E;\
    									ANCON1=0xFE;\
    									WDTCONbits.ADSHR=0;\
    								}
        
        /** I 2 C   T E M P   S E N S E *************************************/
        #define	mInitI2CPins()		TRISC |= 0x18;		// RC3 and RC4 are I2C
    
        
        
        /** SPI : Chip Select Lines ****************************************/
        #define tris_cs_temp_sensor TRISBbits.TRISB2    // Output
        #define cs_temp_sensor      LATBbits.LATB2
        
        #define tris_cs_sdmmc       TRISBbits.TRISB3    // Output
        #define cs_sdmmc            LATBbits.LATB3
        
        /** SD/MMC *********************************************************/
        #define TRIS_CARD_DETECT    TRISBbits.TRISB4    // Input
        #define CARD_DETECT         PORTBbits.RB4
        
        #define TRIS_WRITE_DETECT   TRISAbits.TRISA4    // Input
        #define WRITE_DETECT        PORTAbits.RA4
    
    #endif
    
    
    #if defined(PIC24FJ256GB110_PIM)
    	//#define USE_SELF_POWER_SENSE_IO
    	//#define USE_USB_BUS_SENSE_IO
    
        #define tris_usb_bus_sense  TRISBbits.TRISB5    // Input
    
        #define USB_BUS_SENSE       1
       
        #define tris_self_power     TRISAbits.TRISA2    // Input
    
        #define self_power          1
    
        
        
        /** LED ************************************************************/
        #define mInitAllLEDs()      LATE &= 0xF9; TRISE &= 0xF9;
        
        #define mLED_1              LATEbits.LATE1
        #define mLED_2              LATEbits.LATE2
        
        #define mLED_1_On()         mLED_1 = 1;
        #define mLED_2_On()         mLED_2 = 1;
        
        #define mLED_1_Off()        mLED_1 = 0;
        #define mLED_2_Off()        mLED_2 = 0;
        
        #define mLED_1_Toggle()     mLED_1 = !mLED_1;
        #define mLED_2_Toggle()     mLED_2 = !mLED_2;
        
        /** SWITCH *********************************************************/
        #define mInitAllSwitches()  TRISBbits.TRISB4=1;TRISBbits.TRISB4=1;
        #define mInitSwitch2()      TRISDbits.TRISD6=1;
        #define mInitSwitch3()      TRISBbits.TRISB4=1;
        #define sw2                 PORTDbits.RD6
        #define sw3                 PORTBbits.RB4
        
        /** POT ************************************************************/
        #define mInitPOT()  {\
                                AD1PCFGbits.PCFG5 = 0;\
                                AD1CON2bits.VCFG = 0x0;\
                                AD1CON3bits.ADCS = 0xFF;\
                                AD1CON1bits.SSRC = 0x0;\
                                AD1CON3bits.SAMC = 0b10000;\
                                AD1CON1bits.FORM = 0b00;\
                                AD1CON2bits.SMPI = 0x0;\
                                AD1CHS0          = 0x5;\
                                AD1CON1bits.ADON = 1;\
                            }
        
        /** SPI : Chip Select Lines ****************************************/
        #define tris_cs_temp_sensor TRISBbits.TRISB2    // Output
        #define cs_temp_sensor      LATBbits.LATB2
        
        #define tris_cs_sdmmc       TRISBbits.TRISB3    // Output
        #define cs_sdmmc            LATBbits.LATB3
        
    
    #endif
    
    // Select your interface type
    // This library currently only supports a single physical interface layer
    
    #define USE_SD_INTERFACE_WITH_SPI       // SD-SPI.c and .h
    //#define USE_CF_INTERFACE_WITH_PMP       // CF-PMP.c and .h
    //#define USE_MANUAL_CF_INTERFACE         // CF-Bit transaction.c and .h
    //#define USE_USB_INTERFACE               // USB host MSD library
    
    
    /*********************************************************************/
    /******************* Pin and Register Definitions ********************/
    /*********************************************************************/
    
    /* SD Card definitions: Change these to fit your application when using
       an SD-card-based physical layer                                   */
    
    #ifdef USE_SD_INTERFACE_WITH_SPI
        #ifdef USE_PIC18
        
            // Sample definition for PIC18 (modify to fit your own project)
        
            // Chip Select Signal
            #define SD_CS               PORTBbits.RB3
            #define SD_CS_TRIS          TRISBbits.TRISB3
            
            // Card detect signal
            #define SD_CD               PORTBbits.RB4
            #define SD_CD_TRIS          TRISBbits.TRISB4
            
            // Write protect signal
            #define SD_WE               PORTAbits.RA4
            #define SD_WE_TRIS          TRISAbits.TRISA4
            
            // Registers for the SPI module you want to use
            #define SPICON1             SSP1CON1
            #define SPISTAT             SSP1STAT
            #define SPIBUF              SSP1BUF
            #define SPISTAT_RBF         SSP1STATbits.BF
            #define SPICON1bits         SSP1CON1bits
            #define SPISTATbits         SSP1STATbits
    
            #define SPI_INTERRUPT_FLAG  PIR1bits.SSPIF   
    
    /*
            // Defines for the FS-USB demo board
    
            // Tris pins for SCK/SDI/SDO lines
            #define SPICLOCK            TRISBbits.TRISB1
            #define SPIIN               TRISBbits.TRISB0
            #define SPIOUT              TRISCbits.TRISC7
    
            // Latch pins for SCK/SDI/SDO lines
            #define SPICLOCKLAT         LATBbits.LATB1
            #define SPIINLAT            LATBbits.LATB0
            #define SPIOUTLAT           LATCbits.LATC7
    
            // Port pins for SCK/SDI/SDO lines
            #define SPICLOCKPORT        PORTBbits.RB1
            #define SPIINPORT           PORTBbits.RB0
            #define SPIOUTPORT          PORTCbits.RC7
    */
    
            // Defines for the HPC Explorer board
            #define SPICLOCK            TRISCbits.TRISC3
            #define SPIIN               TRISCbits.TRISC4
            #define SPIOUT              TRISCbits.TRISC5
    
            // Latch pins for SCK/SDI/SDO lines
            #define SPICLOCKLAT         LATCbits.LATC3
            #define SPIINLAT            LATCbits.LATC4
            #define SPIOUTLAT           LATCbits.LATC5
    
            // Port pins for SCK/SDI/SDO lines
            #define SPICLOCKPORT        PORTCbits.RC3
            #define SPIINPORT           PORTCbits.RC4
            #define SPIOUTPORT          PORTCbits.RC5
    
    
            // Will generate an error if the clock speed is too low to interface to the card
            #if (GetSystemClock() < 400000)
                #error System clock speed must exceed 400 kHz
            #endif        
        #elif defined (USE_PIC24F) || defined (USE_PIC24H) //*******  16-bit  *******   	
            // Sample definitions for 16-bit processors (modify to fit your own project)
            #define SD_CS				PORTBbits.RB1
            #define SD_CS_TRIS			TRISBbits.TRISB1
            
            #define SD_CD				PORTFbits.RF0
            #define SD_CD_TRIS			TRISFbits.TRISF0
            
            #define SD_WE				PORTFbits.RF1
            #define SD_WE_TRIS			TRISFbits.TRISF1
            
            // Registers for the SPI module you want to use
            #define SPICON1				SPI1CON1
            #define SPISTAT				SPI1STAT
            #define SPIBUF				SPI1BUF
            #define SPISTAT_RBF			SPI1STATbits.SPIRBF
            #define SPICON1bits			SPI1CON1bits
            #define SPISTATbits			SPI1STATbits
            #define SPIENABLE           SPISTATbits.SPIEN
    #if defined(__PIC24FJ256GB110__)
            // Tris pins for SCK/SDI/SDO lines
            #define SPICLOCK			TRISBbits.TRISB0
            #define SPIIN				TRISDbits.TRISD2
            #define SPIOUT			    TRISFbits.TRISF8
    #else
            // Tris pins for SCK/SDI/SDO lines
            #define SPICLOCK			TRISFbits.TRISF6
            #define SPIIN				TRISFbits.TRISF7
            #define SPIOUT				TRISFbits.TRISF8
    #endif
    
            // Will generate an error if the clock speed is too low to interface to the card
            #if (GetSystemClock() < 100000)
                #error Clock speed must exceed 100 kHz
            #endif    
        #elif defined (USE_PIC32) //*******  32-bit  *******
            #define SD_CS				PORTBbits.RB1
            #define SD_CS_TRIS			TRISBbits.TRISB1
            
            #define SD_CD				PORTFbits.RF0
            #define SD_CD_TRIS			TRISFbits.TRISF0
            
            #define SD_WE				PORTFbits.RF1
            #define SD_WE_TRIS			TRISFbits.TRISF1
            
            // Registers for the SPI module you want to use
            #define SPICON1				SPI1CON
            #define SPISTAT				SPI1STAT
            #define SPIBUF				SPI1BUF
            #define SPISTAT_RBF			SPI1STATbits.SPIRBF
            #define SPICON1bits			SPI1CONbits
            #define SPISTATbits			SPI1STATbits
            #define SPIENABLE           SPICON1bits.ON
            #define SPIBRG			    SPI1BRG
            // Tris pins for SCK/SDI/SDO lines
            #define SPICLOCK			TRISFbits.TRISF6
            #define SPIIN				TRISFbits.TRISF7
            #define SPIOUT				TRISFbits.TRISF8
    
            // Will generate an error if the clock speed is too low to interface to the card
            #if (GetSystemClock() < 100000)
                #error Clock speed must exceed 100 kHz
            #endif    
        
        #endif
    
    #endif
    
    
    
    
    
    #ifdef USE_CF_INTERFACE_WITH_PMP
    
        /* CompactFlash-PMP card definitions: change these to fit your application when
        using the PMP module to interface with CF cards                                */
        
        #ifdef USE_PIC18
            #error The PIC18 architecture does not currently support PMP interface to CF cards
        #elif defined USE_PIC30
        
            // Sample dsPIC30 defines
        	#define CF_PMP_RST		    _RD0		// o CF Reset
        	#define CF_PMP_RESETDIR	    _TRISD0
        	#define CF_PMP_RDY	 	    _RD12		// i CF rdy signal
        	#define CF_PMP_READYDIR	    _TRISD12
        	#define CF_PMP_CD1		    _RC4		// i -CF card detect (w. pull up)
        	#define CF_PMP_CD1DIR	    _TRISC4
        
        #elif defined USE_PIC33
        
            // Sample dsPIC33 defines
        	#define CF_PMP_RST		    _RD0		// o CF Reset
        	#define CF_PMP_RESETDIR	    _TRISD0
        	#define CF_PMP_RDY	 	    _RD12		// i CF rdy signal
        	#define CF_PMP_READYDIR	    _TRISD12
        	#define CF_PMP_CD1		    _RC4		// i -CF card detect (w. pull up)
        	#define CF_PMP_CD1DIR	    _TRISC4
        
        #elif defined USE_16BIT
        
            // Default case for PIC24F and 24H
        	#define CF_PMP_RST		    PORTDbits.RD0		// o CF Reset
        	#define CF_PMP_RESETDIR	    TRISDbits.TRISD0
        	#define CF_PMP_RDY	 	    PORTDbits.RD12		// i CF rdy signal
        	#define CF_PMP_READYDIR	    TRISDbits.TRISD12
        	#define CF_PMP_CD1		    PORTCbits.RC4		// i -CF card detect (w. pull up)
        	#define CF_PMP_CD1DIR	    TRISCbits.TRISC4
        
        #endif
        
        // Defines the PMP data bus direction register
        #define MDD_CFPMP_DATADIR		TRISE
    #endif
    
    
    #ifdef USE_MANUAL_CF_INTERFACE
        // Use these definitions with CF-Bit transaction.c and .h
        // This will manually perform parallel port transactions
        
        #ifdef USE_PIC18
        
        	// Address lines
        	#define ADDBL	LATA	// address bus Low  A0-3
        	#define ADDDIR	TRISA
        	
        	// Data bus
        	#define MDD_CFBT_DATABIN		PORTD				// data bus D0-7
        	#define MDD_CFBT_DATABOUT	LATD
        	#define MDD_CFBT_DATADIR		TRISD
        	
        	// control bus lines
        	#define CF_CE		LATEbits.LATE1		// o -CF card chip select
        	#define CF_CEDIR	TRISEbits.TRISE1
        	#define CF_OE		LATAbits.LATA5		// o -Output Enable
        	#define CF_OEDIR	TRISAbits.TRISA5
        	#define CF_WE		LATAbits.LATA4		// o -Write Enable
        	#define CF_WEDIR	TRISAbits.TRISA4
        	#define CF_BT_RST		LATEbits.LATE0		// o CF Reset
        	#define CF_BT_RESETDIR	TRISEbits.TRISE0
        	#define CF_BT_RDY		PORTEbits.RE2 		// i CF rdy signal
        	#define CF_BT_READYDIR	TRISEbits.TRISE2
        	#define CF_BT_CD1		PORTCbits.RC2		// i -CF card detect (w. pull up)
        	#define CF_BT_CD1DIR	TRISCbits.TRISC2
        
        #elif defined USE_PIC30
        
        	// Address lines
        	#define ADDR0		_LATB15
        	#define	ADDR1		_LATB14
        	#define ADDR2		_LATG9
        	#define ADDR3		_LATG8
        	#define ADRTRIS0	_TRISB15
        	#define ADRTRIS1	_TRISB14
        	#define ADRTRIS2	_TRISG9
        	#define ADRTRIS3	_TRISG8
        	
        	// Data bus
        	#define MDD_CFBT_DATABIN		PORTE				// data bus D0-7
        	#define MDD_CFBT_DATABOUT	PORTE
        	#define MDD_CFBT_DATADIR		TRISE
        	
        	// control bus lines
        	#define CF_CE		_RD11		// o -CF card chip select
        	#define CF_CEDIR	_TRISD11
        	#define CF_OE		_RD5		// o -Output Enable
        	#define CF_OEDIR	_TRISD5	
        	#define CF_WE		_RD4		// o -Write Enable
        	#define CF_WEDIR	_TRISD4
        	#define CF_BT_RST		_RD0		// o CF Reset
        	#define CF_BT_RESETDIR	_TRISD0
        	#define CF_BT_RDY	 	_RD12		// i CF rdy signal
        	#define CF_BT_READYDIR	_TRISD12
        	#define CF_BT_CD1		_RC4		// i -CF card detect (w. pull up)
        	#define CF_BT_CD1DIR	_TRISC4
        
        #elif defined USE_PIC33
        
        	// Address lines
        	#define ADDR0		_LATB15
        	#define	ADDR1		_LATB14
        	#define ADDR2		_LATG9
        	#define ADDR3		_LATG8
        	#define ADRTRIS0	_TRISB15
        	#define ADRTRIS1	_TRISB14
        	#define ADRTRIS2	_TRISG9
        	#define ADRTRIS3	_TRISG8
        	
        	// Data bus
        	#define MDD_CFBT_DATABIN		PORTE				// data bus D0-7
        	#define MDD_CFBT_DATABOUT	PORTE
        	#define MDD_CFBT_DATADIR		TRISE
        	
        	// control bus lines
        	#define CF_CE		_RD11		// o -CF card chip select
        	#define CF_CEDIR	_TRISD11
        	#define CF_OE		_RD5		// o -Output Enable
        	#define CF_OEDIR	_TRISD5	
        	#define CF_WE		_RD4		// o -Write Enable
        	#define CF_WEDIR	_TRISD4
        	#define CF_BT_RST		_RD0		// o CF Reset
        	#define CF_BT_RESETDIR	_TRISD0
        	#define CF_BT_RDY	 	_RD12		// i CF rdy signal
        	#define CF_BT_READYDIR	_TRISD12
        	#define CF_BT_CD1		_RC4		// i -CF card detect (w. pull up)
        	#define CF_BT_CD1DIR	_TRISC4
        
        #elif defined USE_16BIT
        
        	// Address lines
        	#define ADDR0		LATBbits.LATB15
        	#define	ADDR1		LATBbits.LATB14
        	#define ADDR2		LATGbits.LATG9
        	#define ADDR3		LATGbits.LATG8
        	#define ADRTRIS0	TRISBbits.TRISB15
        	#define ADRTRIS1	TRISBbits.TRISB14
        	#define ADRTRIS2	TRISGbits.TRISG9
        	#define ADRTRIS3	TRISGbits.TRISG8
        	
        	// Data bus
        	#define MDD_CFBT_DATABIN		PORTE				// data bus D0-7
        	#define MDD_CFBT_DATABOUT	PORTE
        	#define MDD_CFBT_DATADIR		TRISE
        	
        	// control bus lines
        	#define CF_CE		PORTDbits.RD11		// o -CF card chip select
        	#define CF_CEDIR	TRISDbits.TRISD11
        	#define CF_OE		PORTDbits.RD5		// o -Output Enable
        	#define CF_OEDIR	TRISDbits.TRISD5	
        	#define CF_WE		PORTDbits.RD4		// o -Write Enable
        	#define CF_WEDIR	TRISDbits.TRISD4
        	#define CF_BT_RST		PORTDbits.RD0		// o CF Reset
        	#define CF_BT_RESETDIR	TRISDbits.TRISD0
        	#define CF_BT_RDY	 	PORTDbits.RD12		// i CF rdy signal
        	#define CF_BT_READYDIR	TRISDbits.TRISD12
        	#define CF_BT_CD1		PORTCbits.RC4		// i -CF card detect (w. pull up)
        	#define CF_BT_CD1DIR	TRISCbits.TRISC4
        #endif
    #endif
    
    // Macros for input and output TRIS bits
    #define INPUT_PIN   1
    #define OUTPUT_PIN  0
    
    
    
    #ifdef USE_PIC18
        #include <p18cxxx.h>
        #include <uart2.h>
    #elif defined USE_PIC24F
        #include <p24fxxxx.h>
        #include <uart2.h>
    #elif defined USE_PIC24H
        #include <p24hxxxx.h>
        #include <uart2.h>
    #elif defined USE_PIC30
        #include <p30fxxxx.h>
        #include <uart2.h>
    #elif defined USE_PIC33
        #include <p33fxxxx.h>
        #include <uart2.h>
    #else
        
    #endif
    #endif  //HARDWARE_PROFILE_H
    Merci

  3. #63
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 187
    Points : 11 568
    Points
    11 568
    Par défaut
    Ok, on va y aller par étape car les erreurs dépendent les unes des autres. De plus, rendre local les headers n'est pas la bonne solution, il vaut mieux ajouter le répertoire à la variable PATH de MPLABX

    ps : tu ne m'as pas donné le main.c, je pense que tu as fait un mauvais copier/coller et poster deux fois le même code dans le premier message où tu donnes les sources. Ce n'est pas grave.

    Regardons un peu le résultat de la compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    usb_descriptors.c 
    Compiler.h:134: warning: (111) redefining preprocessor macro "Nop" (C:\Program Files (x86)\Microchip\xc8\v1.35\include\pic18.h: 45)
    Compiler.h:135: warning: (111) redefining preprocessor macro "ClrWdt" (C:\Program Files (x86)\Microchip\xc8\v1.35\include\pic18.h: 40)
    Compiler.h:136: warning: (111) redefining preprocessor macro "Reset" (C:\Program Files (x86)\Microchip\xc8\v1.35\include\pic18.h: 46)
    
    C:\Program Files (x86)\Microchip\xc8\v1.35\include\./USB/usb_device.h:63: error: (141) can't open include file "usb_config.h": No such file or directory
    
    Compiler.h:134: warning: (111) redefining preprocessor macro "Nop" (C:\Program Files (x86)\Microchip\xc8\v1.35\include\pic18.h: 45)
    Compiler.h:135: warning: (111) redefining preprocessor macro "ClrWdt" (C:\Program Files (x86)\Microchip\xc8\v1.35\include\pic18.h: 40)
    Compiler.h:136: warning: (111) redefining preprocessor macro "Reset" (C:\Program Files (x86)\Microchip\xc8\v1.35\include\pic18.h: 46)
    (908) exit status = 1
    make[2]: *** [build/default/production/usb_descriptors.p1] Error 1
    nbproject/Makefile-default.mk:110: recipe for target 'build/default/production/usb_descriptors.p1' failed
    En rouge tu remarqueras que ce sont les mêmes "warning", on dirait que ton compilateur a trouvé un header <pic18.h> et un autre du genre "pic18.h". Est ce que c'est ce que tu as fait ?
    En vert on voit que "usb_config.h" n'a pas été trouvé.

    Le soucis avec cette pratique c'est qu'avec les inclusions multiples on va se planter à coup sur ! Mieux vaut commencer proprement.

    Visiblement MPLABX va chercher par défaut les <headers.h> dans "C:\Program Files (x86)\Microchip\xc8\v1.35\include"
    Si tu vas dans ce répertoire est ce que tu retrouves par exemple les fichiers ?
    - GenericTypeDefs.h
    - usb_config.h
    - usb_device.h
    - usb_function_hid.h
    - usb_function_msd.h

    Le cas échéant, dans quel répertoire sont ces fichiers ? (donne moi le chemin complet)
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  4. #64
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 273
    Points : 150
    Points
    150
    Par défaut
    Citation Envoyé par Vincent PETIT Voir le message
    Ok, on va y aller par étape car les erreurs dépendent les unes des autres. De plus, rendre local les headers n'est pas la bonne solution, il vaut mieux ajouter le répertoire à la variable PATH de MPLABX

    ps : tu ne m'as pas donné le main.c, je pense que tu as fait un mauvais copier/coller et poster deux fois le même code dans le premier message où tu donnes les sources. Ce n'est pas grave.
    Désolé ^^
    Et comment je fait pour ajouter le répertoire a la variable PATH ?

    main.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    /********************************************************************
     FileName:     	usb_descriptors.c
     Dependencies:	See INCLUDES section
     Processor:		PIC18 or PIC24 USB Microcontrollers
     Hardware:		The code is natively intended to be used on the following
     				hardware platforms: PICDEM? FS USB Demo Board, 
     				PIC18F87J50 FS USB Plug-In Module, or
     				Explorer 16 + PIC24 USB PIM.  The firmware may be
     				modified for use on other USB platforms by editing the
     				HardwareProfile.h file.
     Complier:  	Microchip C18 (for PIC18) or C30 (for PIC24)
     Company:		Microchip Technology, Inc.
    
     Software License Agreement:
    
     The software supplied herewith by Microchip Technology Incorporated
     (the ?Company?) for its PIC® Microcontroller is intended and
     supplied to you, the Company?s customer, for use solely and
     exclusively on Microchip PIC Microcontroller products. The
     software is owned by the Company and/or its supplier, and is
     protected under applicable copyright laws. All rights are reserved.
     Any use in violation of the foregoing restrictions may subject the
     user to criminal sanctions under applicable laws, as well as to
     civil liability for the breach of the terms and conditions of this
     license.
    
     THIS SOFTWARE IS PROVIDED IN AN ?AS IS? CONDITION. NO WARRANTIES,
     WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED
     TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
     PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT,
     IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR
     CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
    
    *********************************************************************
    -usb_descriptors.c-
    -------------------------------------------------------------------
    Filling in the descriptor values in the usb_descriptors.c file:
    -------------------------------------------------------------------
    
    [Device Descriptors]
    The device descriptor is defined as a USB_DEVICE_DESCRIPTOR type.  
    This type is defined in usb_ch9.h  Each entry into this structure
    needs to be the correct length for the data type of the entry.
    
    [Configuration Descriptors]
    The configuration descriptor was changed in v2.x from a structure
    to a BYTE array.  Given that the configuration is now a byte array
    each byte of multi-byte fields must be listed individually.  This
    means that for fields like the total size of the configuration where
    the field is a 16-bit value "64,0," is the correct entry for a
    configuration that is only 64 bytes long and not "64," which is one
    too few bytes.
    
    The configuration attribute must always have the _DEFAULT
    definition at the minimum. Additional options can be ORed
    to the _DEFAULT attribute. Available options are _SELF and _RWU.
    These definitions are defined in the usb_device.h file. The
    _SELF tells the USB host that this device is self-powered. The
    _RWU tells the USB host that this device supports Remote Wakeup.
    
    [Endpoint Descriptors]
    Like the configuration descriptor, the endpoint descriptors were 
    changed in v2.x of the stack from a structure to a BYTE array.  As
    endpoint descriptors also has a field that are multi-byte entities,
    please be sure to specify both bytes of the field.  For example, for
    the endpoint size an endpoint that is 64 bytes needs to have the size
    defined as "64,0," instead of "64,"
    
    Take the following example:
        // Endpoint Descriptor //
        0x07,                       //the size of this descriptor //
        USB_DESCRIPTOR_ENDPOINT,    //Endpoint Descriptor
        _EP02_IN,                   //EndpointAddress
        _INT,                       //Attributes
        0x08,0x00,                  //size (note: 2 bytes)
        0x02,                       //Interval
    
    The first two parameters are self-explanatory. They specify the
    length of this endpoint descriptor (7) and the descriptor type.
    The next parameter identifies the endpoint, the definitions are
    defined in usb_device.h and has the following naming
    convention:
    _EP<##>_<dir>
    where ## is the endpoint number and dir is the direction of
    transfer. The dir has the value of either 'OUT' or 'IN'.
    The next parameter identifies the type of the endpoint. Available
    options are _BULK, _INT, _ISO, and _CTRL. The _CTRL is not
    typically used because the default control transfer endpoint is
    not defined in the USB descriptors. When _ISO option is used,
    addition options can be ORed to _ISO. Example:
    _ISO|_AD|_FE
    This describes the endpoint as an isochronous pipe with adaptive
    and feedback attributes. See usb_device.h and the USB
    specification for details. The next parameter defines the size of
    the endpoint. The last parameter in the polling interval.
    
    -------------------------------------------------------------------
    Adding a USB String
    -------------------------------------------------------------------
    A string descriptor array should have the following format:
    
    rom struct{byte bLength;byte bDscType;word string[size];}sdxxx={
    sizeof(sdxxx),DSC_STR,<text>};
    
    The above structure provides a means for the C compiler to
    calculate the length of string descriptor sdxxx, where xxx is the
    index number. The first two bytes of the descriptor are descriptor
    length and type. The rest <text> are string texts which must be
    in the unicode format. The unicode format is achieved by declaring
    each character as a word type. The whole text string is declared
    as a word array with the number of characters equals to <size>.
    <size> has to be manually counted and entered into the array
    declaration. Let's study this through an example:
    if the string is "USB" , then the string descriptor should be:
    (Using index 02)
    rom struct{byte bLength;byte bDscType;word string[3];}sd002={
    sizeof(sd002),DSC_STR,'U','S','B'};
    
    A USB project may have multiple strings and the firmware supports
    the management of multiple strings through a look-up table.
    The look-up table is defined as:
    rom const unsigned char *rom USB_SD_Ptr[]={&sd000,&sd001,&sd002};
    
    The above declaration has 3 strings, sd000, sd001, and sd002.
    Strings can be removed or added. sd000 is a specialized string
    descriptor. It defines the language code, usually this is
    US English (0x0409). The index of the string must match the index
    position of the USB_SD_Ptr array, &sd000 must be in position
    USB_SD_Ptr[0], &sd001 must be in position USB_SD_Ptr[1] and so on.
    The look-up table USB_SD_Ptr is used by the get string handler
    function.
    
    -------------------------------------------------------------------
    
    The look-up table scheme also applies to the configuration
    descriptor. A USB device may have multiple configuration
    descriptors, i.e. CFG01, CFG02, etc. To add a configuration
    descriptor, user must implement a structure similar to CFG01.
    The next step is to add the configuration descriptor name, i.e.
    cfg01, cfg02,.., to the look-up table USB_CD_Ptr. USB_CD_Ptr[0]
    is a dummy place holder since configuration 0 is the un-configured
    state according to the definition in the USB specification.
    
    ********************************************************************/
     
    /*********************************************************************
     * Descriptor specific type definitions are defined in:
     * usb_device.h
     *
     * Configuration options are defined in:
     * usb_config.h
     ********************************************************************/
    #ifndef __USB_DESCRIPTORS_C
    #define __USB_DESCRIPTORS_C
     
    /** INCLUDES *******************************************************/
    #include "GenericTypeDefs.h"
    #include "usb_config.h"
    #include "usb_device.h"
    #include "usb_function_hid.h"
    #include "usb_function_msd.h"
    
    /** CONSTANTS ******************************************************/
    #if defined(__18CXX)
    #pragma romdata
    #endif
    
    /* Device Descriptor */
    ROM USB_DEVICE_DESCRIPTOR device_dsc=
    {
        0x12,    // Size of this descriptor in bytes
        USB_DESCRIPTOR_DEVICE,                // DEVICE descriptor type
        0x0200,                 // USB Spec Release Number in BCD format
        0x00,                   // Class Code
        0x00,                   // Subclass code
        0x00,                   // Protocol code
        USB_EP0_BUFF_SIZE,          // Max packet size for EP0, see usb_config.h
        0x04D8,                 // Vendor ID
        0x0054,                // Product ID: mass storage device demo
        0x0001,                 // Device release number in BCD format
        0x01,                   // Manufacturer string index
        0x02,                   // Product string index
        0x00,                   // Device serial number string index
        0x01                    // Number of possible configurations
    };
    
    /* Configuration 1 Descriptor */
    ROM BYTE configDescriptor1[]={
        /* Configuration Descriptor */
        9,    // Size of this descriptor in bytes
        USB_DESCRIPTOR_CONFIGURATION,                // CONFIGURATION descriptor type
        64,0x00,          // Total length of data for this cfg
        2,                      // Number of interfaces in this cfg
        1,                      // Index value of this configuration
        0,                      // Configuration string index
        _DEFAULT | _SELF,               // Attributes, see usb_device.h
        50,                     // Max power consumption (2X mA)
    							
        /* Interface Descriptor */
        9,   // Size of this descriptor in bytes
        USB_DESCRIPTOR_INTERFACE,               // INTERFACE descriptor type
        MSD_INTF_ID,                      // Interface Number
        0,                      // Alternate Setting Number
        2,                      // Number of endpoints in this intf
        MSD_INTF,               // Class code
        MSD_INTF_SUBCLASS,      // Subclass code
        MSD_PROTOCOL, 		    // Protocol code
        0,                      // Interface string index
        
        /* Endpoint Descriptor */
        7,
        USB_DESCRIPTOR_ENDPOINT,
        _EP01_IN,_BULK,
        MSD_IN_EP_SIZE,0x00,
        0x01,
        
        7,
        USB_DESCRIPTOR_ENDPOINT,
        _EP01_OUT,
        _BULK,
        MSD_OUT_EP_SIZE,0x00,
        0x01,
    
        /* Interface Descriptor */
        0x09,//sizeof(USB_INTF_DSC),   // Size of this descriptor in bytes
        USB_DESCRIPTOR_INTERFACE,               // INTERFACE descriptor type
        HID_INTF_ID,                      // Interface Number
        0,                      // Alternate Setting Number
        2,                      // Number of endpoints in this intf
        HID_INTF,               // Class code
        0,     // Subclass code
        0,     // Protocol code
        0,                      // Interface string index
    
        /* HID Class-Specific Descriptor */
        0x09,//sizeof(USB_HID_DSC)+3,    // Size of this descriptor in bytes RRoj hack
        DSC_HID,                // HID descriptor type
        0x11,0x01,                 // HID Spec Release Number in BCD format (1.11)
        0x00,                   // Country Code (0x00 for Not supported)
        HID_NUM_OF_DSC,         // Number of class descriptors, see usbcfg.h
        DSC_RPT,                // Report descriptor type
        HID_RPT01_SIZE,0x00,//sizeof(hid_rpt01),      // Size of the report descriptor
        
        /* Endpoint Descriptor */
        0x07,/*sizeof(USB_EP_DSC)*/
        USB_DESCRIPTOR_ENDPOINT,    //Endpoint Descriptor
        HID_EP | _EP_IN,                   //EndpointAddress
        _INT,                       //Attributes
        0x40,0x00,                  //size
        0x01,                        //Interval
    
        /* Endpoint Descriptor */
        0x07,/*sizeof(USB_EP_DSC)*/
        USB_DESCRIPTOR_ENDPOINT,    //Endpoint Descriptor
        HID_EP | _EP_OUT,                   //EndpointAddress
        _INT,                       //Attributes
        0x40,0x00,                  //size
        0x01                        //Interval
    };
    
    //Class specific descriptor - HID 
    ROM struct{BYTE report[HID_RPT01_SIZE];}hid_rpt01={
    {
        0x06, 0x00, 0xFF,       // Usage Page = 0xFFFF (Vendor Defined)
        0x09, 0x01,             // Usage 
        0xA1, 0x01,             // Collection (Application, probably not important because vendor defined usage)
        0x19, 0x01,             //      Usage Minimum (Vendor Usage = 0) (minimum bytes the device should send is 0)
        0x29, 0x40,             //      Usage Maximum (Vendor Usage = 64) (maximum bytes the device should send is 64)
        0x15, 0x00,             //      Logical Minimum (Vendor Usage = 0)
        0x26, 0xFF, 0x00, 	  	//      Logical Maximum (Vendor Usage = 255)
        0x75, 0x08,             //      Report Size 8 bits (one full byte) for each report.
        0x95, 0x40,             //      Report Count 64 bytes in a full report.
        0x81, 0x02,             //      Input (Data, Var, Abs)
        0x19, 0x01,             //      Usage Minimum (Vendor Usage = 0)
        0x29, 0x40,             //      Usage Maximum (Vendor Usage = 64)
        0x91, 0x02,             //      Output (Data, Var, Ads)
        0xC0}
    };                  // End Collection
    
    //Language code string descriptor
    ROM struct{BYTE bLength;BYTE bDscType;WORD string[1];}sd000={
        sizeof(sd000),
        USB_DESCRIPTOR_STRING,
        {0x0409
        }
    };
    //Manufacturer string descriptor
    ROM struct{BYTE bLength;BYTE bDscType;WORD string[25];}sd001={
    sizeof(sd001),USB_DESCRIPTOR_STRING,
    {'M','i','c','r','o','c','h','i','p',' ',
    'T','e','c','h','n','o','l','o','g','y',' ','I','n','c','.'
    }};
    
    //Product string descriptor
    ROM struct{BYTE bLength;BYTE bDscType;WORD string[28];}sd002={
    sizeof(sd002),USB_DESCRIPTOR_STRING,
    {'M','i','c','r','o','c','h','i','p',' ','M','a','s','s',' ','S','t','o','r','a','g','e',' ','D','r','i','v','e'
    }};
    
    //Array of configuration descriptors
    ROM BYTE *ROM USB_CD_Ptr[]=
    {
        (ROM BYTE *ROM)&configDescriptor1
    };
    
    //Array of string descriptors
    ROM BYTE *ROM USB_SD_Ptr[]=
    {
        (ROM BYTE *ROM)&sd000,
        (ROM BYTE *ROM)&sd001,
        (ROM BYTE *ROM)&sd002
    };
    
    /** EOF usb_descriptors.c ***************************************************/
    
    #endif
    Regardons un peu le résultat de la compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    usb_descriptors.c 
    Compiler.h:134: warning: (111) redefining preprocessor macro "Nop" (C:\Program Files (x86)\Microchip\xc8\v1.35\include\pic18.h: 45)
    Compiler.h:135: warning: (111) redefining preprocessor macro "ClrWdt" (C:\Program Files (x86)\Microchip\xc8\v1.35\include\pic18.h: 40)
    Compiler.h:136: warning: (111) redefining preprocessor macro "Reset" (C:\Program Files (x86)\Microchip\xc8\v1.35\include\pic18.h: 46)
    
    C:\Program Files (x86)\Microchip\xc8\v1.35\include\./USB/usb_device.h:63: error: (141) can't open include file "usb_config.h": No such file or directory
    
    Compiler.h:134: warning: (111) redefining preprocessor macro "Nop" (C:\Program Files (x86)\Microchip\xc8\v1.35\include\pic18.h: 45)
    Compiler.h:135: warning: (111) redefining preprocessor macro "ClrWdt" (C:\Program Files (x86)\Microchip\xc8\v1.35\include\pic18.h: 40)
    Compiler.h:136: warning: (111) redefining preprocessor macro "Reset" (C:\Program Files (x86)\Microchip\xc8\v1.35\include\pic18.h: 46)
    (908) exit status = 1
    make[2]: *** [build/default/production/usb_descriptors.p1] Error 1
    nbproject/Makefile-default.mk:110: recipe for target 'build/default/production/usb_descriptors.p1' failed
    Citation Envoyé par Vincent PETIT Voir le message
    En rouge tu remarqueras que ce sont les mêmes "warning", on dirait que ton compilateur a trouvé un header <pic18.h> et un autre du genre "pic18.h". Est ce que c'est ce que tu as fait ?
    Je me souviens pas avoir modifié de header pic18...

    Citation Envoyé par Vincent PETIT Voir le message
    En vert on voit que "usb_config.h" n'a pas été trouvé.
    Pourquoi ça ? pourtant je l'ai bien mis en local (vu qu'il était d'office dans le dossier include, je l'ai directement mis en local)

    Citation Envoyé par Vincent PETIT Voir le message
    Le soucis avec cette pratique c'est qu'avec les inclusions multiples on va se planter à coup sur !
    Vu que les ressources des microcontrôleurs sont assez limitées, ça risque d'arriver oui ^^

    Citation Envoyé par Vincent PETIT Voir le message
    Mieux vaut commencer proprement.
    Je demande que ça ! je déteste le travail rafistolé ^^ mais la je voyais pas d'autres solution pour résoudre les (beaucoup !) d'erreurs qui s'affichaient...

    Citation Envoyé par Vincent PETIT Voir le message
    Visiblement MPLABX va chercher par défaut les <headers.h> dans "C:\Program Files (x86)\Microchip\xc8\v1.35\include"
    Si tu vas dans ce répertoire est ce que tu retrouves par exemple les fichiers ?
    - GenericTypeDefs.h
    - usb_config.h
    - usb_device.h
    - usb_function_hid.h
    - usb_function_msd.h

    Le cas échéant, dans quel répertoire sont ces fichiers ? (donne moi le chemin complet)
    Si c'est le cas, ça m'étonne pas qu'il ne les trouve pas, il n'ont jamais été la bas.
    ils étaient plutot dans les fichier de MCHPFSUSB :
    GenericTypeDefs.h - C:\Microchip Solutions\Microchip\Include
    le reste - C:\Microchip Solutions\Microchip\Include\Usb

    Nom : 1.jpg
Affichages : 1111
Taille : 214,5 Ko
    Nom : 2.jpg
Affichages : 1049
Taille : 266,4 Ko

    Merci

  5. #65
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 187
    Points : 11 568
    Points
    11 568
    Par défaut
    Alors.... c'est pas simple pour moi d'expliquer comment faire sous MPLABX car je ne l'ai pas.
    Mais est ce que tu as accès à cette fenêtre ? MPLABX est me semble t-il basé sur Eclipse donc en faisant un click droit sur le projet -> Propriété -> XC8 compiler -> "et il devrait y avoir un truc comme include directories, je pense"

    Nom : Capture du 2015-09-22 00:04:25.png
Affichages : 1136
Taille : 530,6 Ko

    Et ajouter ls chemin :
    C:\Microchip Solutions\Microchip\Include
    (a vérifier car j'ai peut être mal lu tes copies d'écran)
    C:\Microchip Solutions\Microchip\Include\Usb
    (a vérifier car j'ai peut être mal lu tes copies d'écran)

    Fait un essai tout simple pour voir si ça compile :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    /* ça et juste ça pour voir si MPLABX trouve les chemins */ 
    #include <pic18.h>
    #include <usb_config.h>
     
    void main (void)
    {
       ;
    }
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  6. #66
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 273
    Points : 150
    Points
    150
    Par défaut
    Merci pour ta réponse

    Je vais être un peu pris jusqu'à demain soir, je t'envoie le résultat dès que je peux ^^

    Merci

  7. #67
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 273
    Points : 150
    Points
    150
    Par défaut
    Alors voila, j'ai testé ta solution, elle fonctionne très bien ^^
    Pour le problème des includes c'est donc réglé mais apparemment ça ne résous tout de même pas tout...
    Après avoir réglé le paramètres des includes, d'autres erreurs apparaissent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
    make[1]: Entering directory 'C:/Users/Daniel/Documents/MPLABXProjects/tesrt.X'
    make  -f nbproject/Makefile-default.mk dist/default/production/tesrt.X.production.hex
    make[2]: Entering directory 'C:/Users/Daniel/Documents/MPLABXProjects/tesrt.X'
    make[2]: *** [build/default/production/main.o] Error 3
    "C:\Program Files (x86)\Microchip\mplabc18\v3.47\bin\mcc18.exe"  -p18F45K50 -ms -oa-  -I "C:\Program Files (x86)\Microchip\mplabc18\v3.47\bin"\\..\\h  -fo build/default/production/main.o   main.c 
    "C:\Program Files (x86)\Microchip\mplabc18\v3.47\bin\mcc18.exe"  -p18F45K50 -ms -oa-  -I "C:\Program Files (x86)\Microchip\mplabc18\v3.47\bin"\\..\\h  -fo build/default/production/usb_descriptors.o   usb_descriptors.c 
    make[2]: *** Waiting for unfinished jobs....
    C:\Users\Daniel\Documents\MPLABXProjects\tesrt.X\main.c:46:Error [1027] unable to locate 'Compiler.h'
    make[2]: *** [build/default/production/usb_descriptors.o] Error 3
    make[1]: *** [.build-conf] Error 2
    C:\Users\Daniel\Documents\MPLABXProjects\tesrt.X\main.c:49:Error [1027] unable to locate 'USB/usb_device.h'
    make: *** [.build-impl] Error 2
    C:\Users\Daniel\Documents\MPLABXProjects\tesrt.X\main.c:50:Error [1027] unable to locate 'USB/USB.h'
    C:\Users\Daniel\Documents\MPLABXProjects\tesrt.X\HardwareProfile.h:108:Error [1099] "Demo board not defined.  Either define DEMO_BOARD for a custom board or select the correct processor for the demo board."
    nbproject/Makefile-default.mk:110: recipe for target 'build/default/production/main.o' failed
    C:\Users\Daniel\Documents\MPLABXProjects\tesrt.X\usb_descriptors.c:158:Error [1027] unable to locate 'Compiler.h'
    C:\Users\Daniel\Documents\MPLABXProjects\tesrt.X\usb_descriptors.c:160:Error [1027] unable to locate './USB/usb_device.h'
    C:\Users\Daniel\Documents\MPLABXProjects\tesrt.X\usb_descriptors.c:161:Error [1027] unable to locate './USB/usb_function_msd.h'
    C:\Users\Daniel\Documents\MPLABXProjects\tesrt.X\usb_descriptors.c:162:Error [1027] unable to locate './USB/usb_function_hid.h'
    nbproject/Makefile-default.mk:118: recipe for target 'build/default/production/usb_descriptors.o' failed
    make[2]: Leaving directory 'C:/Users/Daniel/Documents/MPLABXProjects/tesrt.X'
    nbproject/Makefile-default.mk:78: recipe for target '.build-conf' failed
    make[1]: Leaving directory 'C:/Users/Daniel/Documents/MPLABXProjects/tesrt.X'
    nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed
    
    BUILD FAILED (exit value 2, total time: 125ms)
    (J'ai utilisé le compilateur C18 plutôt que XC8 en voyant dans les commentaires, il est dit que le code est adapté pour C18, quand j'ai vu que avec XC8 ça marchait pas, je pensais qu'en mettant C18 ça marcherais..)
    (c'est assez embêtant cette histoire de compilateurs... avant j'avais plutôt l'habitude d'un seul compilateur pour le langage que j'utilisais, java avec eclipse, C avec CodeBlocks etc... tu me conseillerais quoi au niveau des compilateurs toi ?)

    Pourquoi tant d'erreurs se manifestent pour un code censé être déjà fonctionnel ?
    (Je devrais sérieusement me mettre à apprendre la programmation spécifique pour les PIC, comme je te l'avais dit, je débute dans la programmation des microcontrôleurs, du coup tu aurais des conseils à me donner de où je pourrais trouver de quoi bien comprendre les PIC comme il faut, et apprendre à les programmer de manière optimale, de sorte à ce que je puisse commencer à battre de mes propres ailes quoi ^^ si t'a un truc ce serait avec plaisir )

    J'ai fait quelques recherches sur internet pour le sujet de mon projet (MSD) et je suis tombé sur ça http://sourceforge.net/projects/pic18fusb/

    J'ai regardé un peu, au premier abord le code à l'air beaucoup moins complexe et marche du premier coup sans aucune erreur de compilation (seul inconvénient : il est adapté au PIC18F4550, du coup c'est surement pour ça que quand je le compile, aucune erreur, mais par contre une fois que la carte démo est programmée avec, rien ^^ même pas détectée quand je la branche...).

    T'en pense quoi ?

    Merci

  8. #68
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 187
    Points : 11 568
    Points
    11 568
    Par défaut
    Ok alors c'est un bon début. Je suppose que tu as pensé à remettre d'équerre tous les #include "blablabla" en #include <blablabla>.

    Alors, il y a des choses qui me paraisse bizarre lorsque je lis ce log.
    Ton fichier main.c fait combien de ligne ?

    Il faut que tu fasses un essai avec un fichier main.c de moins de 10 lignes (un fichier main qui ne sert à rien, serte, mais qui valide que les chemins des bibliothèques sont tous bien renseignés dans l'IDE MPALBX) sinon je ne vais jamais pouvoir t'aider. En plus si tu changes le compilateur on risque de tourner en rond longtemps

    N'oublie pas que quand tu es face à quelque chose de nouveau qui ne fonctionne pas, il est plus simple de se mettre dans la condition minimale où ça fonctionne, ajouter le reste pas à pas pour trouver le ou les problèmes (recherche montante) plutôt que de rester dans une condition où ça ne fonctionne pas et de chercher le ou les problèmes à partir de là (recherche descendante.) Le soucis dans ce dernier cas, c'est qu'il peut y avoir plusieurs problèmes en même temps et bien qu'on en résolve un, ça peut encore dysfonctionner et va faire la différence entre "est ce que j'ai résolu le problème mais il y en peut être d'autres ?" ou bien "Ah bah c'était pas ça qui déconnait, puisque ça ne fonctionne toujours pas, donc je remets le code comme il était !"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
    make[1]: Entering directory 'C:/Users/Daniel/Documents/MPLABXProjects/tesrt.X'
    make  -f nbproject/Makefile-default.mk dist/default/production/tesrt.X.production.hex
    make[2]: Entering directory 'C:/Users/Daniel/Documents/MPLABXProjects/tesrt.X'
    make[2]: *** [build/default/production/main.o] Error 3
    "C:\Program Files (x86)\Microchip\mplabc18\v3.47\bin\mcc18.exe"  -p18F45K50 -ms -oa-  -I "C:\Program Files (x86)\Microchip\mplabc18\v3.47\bin"\\..\\h  -fo build/default/production/main.o   main.c 
    "C:\Program Files (x86)\Microchip\mplabc18\v3.47\bin\mcc18.exe"  -p18F45K50 -ms -oa-  -I "C:\Program Files (x86)\Microchip\mplabc18\v3.47\bin"\\..\\h  -fo build/default/production/usb_descriptors.o   usb_descriptors.c 
    make[2]: *** Waiting for unfinished jobs....
    C:\Users\Daniel\Documents\MPLABXProjects\tesrt.X\main.c:46:Error [1027] unable to locate 'Compiler.h'
    make[2]: *** [build/default/production/usb_descriptors.o] Error 3
    make[1]: *** [.build-conf] Error 2
    C:\Users\Daniel\Documents\MPLABXProjects\tesrt.X\main.c:49:Error [1027] unable to locate 'USB/usb_device.h'
    make: *** [.build-impl] Error 2
    C:\Users\Daniel\Documents\MPLABXProjects\tesrt.X\main.c:50:Error [1027] unable to locate 'USB/USB.h'
    C:\Users\Daniel\Documents\MPLABXProjects\tesrt.X\HardwareProfile.h:108:Error [1099] "Demo board not defined.  Either define DEMO_BOARD for a custom board or select the correct processor for the demo board."
    nbproject/Makefile-default.mk:110: recipe for target 'build/default/production/main.o' failed
    C:\Users\Daniel\Documents\MPLABXProjects\tesrt.X\usb_descriptors.c:158:Error [1027] unable to locate 'Compiler.h'
    C:\Users\Daniel\Documents\MPLABXProjects\tesrt.X\usb_descriptors.c:160:Error [1027] unable to locate './USB/usb_device.h'
    C:\Users\Daniel\Documents\MPLABXProjects\tesrt.X\usb_descriptors.c:161:Error [1027] unable to locate './USB/usb_function_msd.h'
    C:\Users\Daniel\Documents\MPLABXProjects\tesrt.X\usb_descriptors.c:162:Error [1027] unable to locate './USB/usb_function_hid.h'
    nbproject/Makefile-default.mk:118: recipe for target 'build/default/production/usb_descriptors.o' failed
    make[2]: Leaving directory 'C:/Users/Daniel/Documents/MPLABXProjects/tesrt.X'
    nbproject/Makefile-default.mk:78: recipe for target '.build-conf' failed
    make[1]: Leaving directory 'C:/Users/Daniel/Documents/MPLABXProjects/tesrt.X'
    nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed
    
    BUILD FAILED (exit value 2, total time: 125ms)
    Refait un essai avec XC8, le dernier compilateur de Microchip mais avec un main.c très très minimaliste ou tu incluras <compiler.h>, <usb_device.h> etc...

    [A vérifier j'ai une doute] Autre piste : ./USB/usb_device.h ce chemin n'est pas tellement cohérent car on dirait un chemin Linux ! Sur Windows ça ne devrait pas plutôt être .\USB\usb_device.h ? Je ne suis pas vraiment sur mais ça m'interpelle.

    Citation Envoyé par danieldou
    Pourquoi tant d'erreurs se manifestent pour un code censé être déjà fonctionnel ?
    Pour moi, c'est l'environnement MPLAB qui faut bien configurer et ensuite ça devrait rouler. Moi je suis un peu mieux loti car chez Texas j'utilise Eclipse + GCC-MSP430 et c'est sur que déjà lorsque tu connais ton IDE ça va forcément mieux.

    Citation Envoyé par danieldou
    Je devrais sérieusement me mettre à apprendre la programmation spécifique pour les PIC, comme je te l'avais dit, je débute dans la programmation des microcontrôleurs, du coup tu aurais des conseils à me donner de où je pourrais trouver de quoi bien comprendre les PIC comme il faut, et apprendre à les programmer de manière optimale, de sorte à ce que je puisse commencer à battre de mes propres ailes quoi ^^ si t'a un truc ce serait avec plaisir )
    Tu t'y prends de la bonne façon mais sûrement que le projet, en lui même, et trop ambitieux pour faire un bon démarrage. Visiblement tu programmes en C et en JAVA (comme moi enfin presque car je suis entrain d'apprendre JAVA), rappel toi bien la toute première fois où tu as mis les deux pieds dedans. En toute honnêteté, si tu avais démarrer le JAVA, en découvrant Eclipse, en décortiquant un gros soft, utilisant du polymorphisme, de l'héritage, des classes abstraites, etc... est ce que le démarrage n'aurait pas été laborieux ?
    Je pense que si et c'est simplement ce qui se passe ici.

    Si tu veux démarrer la programmation sur micro-contrôleur, il te faut simplement 3 choses :
    La datasheet du micro-contôleur (c'est son mode d'emploi et tout est écrit dedans). Dans cette datasheet, tu as la description de comment tout fonctionne, comment ça se configure, a quoi servent les registres etc...
    Un IDE avec un compilateur et ça tu l'as déjà.
    La doc du compilateur pour au moins savoir si il y a des spécificités.

    Exemple chez Texas Instruments avec le compilateurs GCC-MSP430, un programme d'interruption se déclare de cette façon :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <msp430.h>
    #include <msp430g2553.h>
    #include <signal.h>
     
    #pragma vector = PORT1_VECTOR
    __interrupt void P1_ISR(void)
    {
    	/* tout se que vais écrire ici va être exécuter
     lors d'une interruption sur le port 1*/;
    }
    Ça tu ne peux pas l'inventer, il y a que dans la doc où c'est écrit.

    Commence doucement, en ne brûlant pas les étapes.

    Citation Envoyé par danieldou
    J'ai fait quelques recherches sur internet pour le sujet de mon projet (MSD) et je suis tombé sur ça http://sourceforge.net/projects/pic18fusb/

    J'ai regardé un peu, au premier abord le code à l'air beaucoup moins complexe et marche du premier coup sans aucune erreur de compilation (seul inconvénient : il est adapté au PIC18F4550, du coup c'est surement pour ça que quand je le compile, aucune erreur, mais par contre une fois que la carte démo est programmée avec, rien ^^ même pas détectée quand je la branche...).

    T'en pense quoi ?
    Effectivement ça ne fonctionnera pas car le PIC18F4550 (celui de ma démo board PICDEM FSUSB) à un quartz 20MHZ alors que toi, sur ta démo board, avec le micro PIC18F45K50, il n'y en a pas. Pour que ça fonctionne il faudrait changer :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    /* #include <p18f4550.h> */
    #include <p18f45K50.h>
     
    ...
    ...
    void main(void){
     
    /* puis configurer ici le PIC pour qu'il tourne sur son horloge interne car ton micro sait 
     * le faire contrairement au micro que le concepteur utilise (le 18F4550)
     */
    	TBLPTR = 0;
    	init(); //Run initialize routine (see system.h).
    	check_usb_bus(); //Check usb bus for connectivity (see system.h).
    	while(1);
    }
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  9. #69
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 273
    Points : 150
    Points
    150
    Par défaut
    Citation Envoyé par Vincent PETIT Voir le message
    Ok alors c'est un bon début. Je suppose que tu as pensé à remettre d'équerre tous les #include "blablabla" en #include <blablabla>.
    J'ai tout simplement recollé le code d'origine ^^

    Citation Envoyé par Vincent PETIT Voir le message
    Alors, il y a des choses qui me paraisse bizarre lorsque je lis ce log.
    Ton fichier main.c fait combien de ligne ?
    953 pourquoi ?

    Citation Envoyé par Vincent PETIT Voir le message
    Il faut que tu fasses un essai avec un fichier main.c de moins de 10 lignes (un fichier main qui ne sert à rien, serte, mais qui valide que les chemins des bibliothèques sont tous bien renseignés dans l'IDE MPALBX) sinon je ne vais jamais pouvoir t'aider. En plus si tu changes le compilateur on risque de tourner en rond longtemps

    N'oublie pas que quand tu es face à quelque chose de nouveau qui ne fonctionne pas, il est plus simple de se mettre dans la condition minimale où ça fonctionne, ajouter le reste pas à pas pour trouver le ou les problèmes (recherche montante) plutôt que de rester dans une condition où ça ne fonctionne pas et de chercher le ou les problèmes à partir de là (recherche descendante.) Le soucis dans ce dernier cas, c'est qu'il peut y avoir plusieurs problèmes en même temps et bien qu'on en résolve un, ça peut encore dysfonctionner et va faire la différence entre "est ce que j'ai résolu le problème mais il y en peut être d'autres ?" ou bien "Ah bah c'était pas ça qui déconnait, puisque ça ne fonctionne toujours pas, donc je remets le code comme il était !"
    Oui de toutes façons les notions de programmation restent les mêmes peu importe le langage avant j'utilisais exactement cette méthode quand je programmais en Java ^^

    Citation Envoyé par Vincent PETIT Voir le message
    Refait un essai avec XC8, le dernier compilateur de Microchip mais avec un main.c très très minimaliste ou tu incluras <compiler.h>, <usb_device.h> etc...
    Juste pour tester les includes quoi ^^
    (de manière générale, tu me conseille d'utiliser XC8 ou C18 ?)

    Citation Envoyé par Vincent PETIT Voir le message
    [A vérifier j'ai une doute] Autre piste : ./USB/usb_device.h ce chemin n'est pas tellement cohérent car on dirait un chemin Linux ! Sur Windows ça ne devrait pas plutôt être .\USB\usb_device.h ? Je ne suis pas vraiment sur mais ça m'interpelle.
    C'est vrai.
    Après je me pose pas trop la question parce que quand je tape "<" dans MPLAB X, un menu s'affiche permettant de parcourir les dossiers, une fois un dossier et un .h choisi, le reste du include se complète automatiquement, et ça marche donc ça veux surement dire que c'est comme ça que ça doit être ^^

    Citation Envoyé par Vincent PETIT Voir le message
    Pour moi, c'est l'environnement MPLAB qui faut bien configurer et ensuite ça devrait rouler. Moi je suis un peu mieux loti car chez Texas j'utilise Eclipse + GCC-MSP430 et c'est sur que déjà lorsque tu connais ton IDE ça va forcément mieux.
    Pour ce qui est de la complexité du code (quand je vois celui dont je t'ai envoyé le lien, infiniment plus simple, celui de Microchip est un bazar à coté) j'ai aussi l'impression que le code est beaucoup plus fournis parce qu'il a été prévu pour le PIC18F45K50 mais sur une carte démo, alors que un code à destination d'un PIC18F45K50 simplement, pourrait être beaucoup moins complexe. Tu pense pas ?

    Citation Envoyé par Vincent PETIT Voir le message
    Tu t'y prends de la bonne façon mais sûrement que le projet, en lui même, et trop ambitieux pour faire un bon démarrage. Visiblement tu programmes en C et en JAVA (comme moi enfin presque car je suis entrain d'apprendre JAVA), rappel toi bien la toute première fois où tu as mis les deux pieds dedans. En toute honnêteté, si tu avais démarrer le JAVA, en découvrant Eclipse, en décortiquant un gros soft, utilisant du polymorphisme, de l'héritage, des classes abstraites, etc... est ce que le démarrage n'aurait pas été laborieux ?
    Je pense que si et c'est simplement ce qui se passe ici.
    Bien sûr oui ^^ je me souviens quand j'ai démarré en Java je n'y comprenais strictement rien à ses gros programmes complexes, mais comme je te l'ai dit, ma manière d'apprendre, c'est de me fixer de gros objectifs, par exemple : quand j'ai débuté en Java (Android), je me suis fixé l'objectif de faire une application combinant une messagerie instantanée, des algorithmes pour gérer des images, l'authentification d'utilisateurs, bases de données etc. (pas tellement des trucs de débutants il me semble ) et j'ai énormément appris comme ça, je procédais par étapes, chaque étapes que je passais me faisais gagner de l’expérience et des connaissances supplémentaires, et c'est comme ça que je sais maintenant programmer des applis Android ^^
    Mais... en disant ça, j'ai l'impression que tu sous entend que je ne pourrais pas réussir à finaliser mon projet en procédant comme ça, non ?

    Citation Envoyé par Vincent PETIT Voir le message
    Si tu veux démarrer la programmation sur micro-contrôleur, il te faut simplement 3 choses :
    La datasheet du micro-contôleur (c'est son mode d'emploi et tout est écrit dedans). Dans cette datasheet, tu as la description de comment tout fonctionne, comment ça se configure, a quoi servent les registres etc...
    Un IDE avec un compilateur et ça tu l'as déjà.
    La doc du compilateur pour au moins savoir si il y a des spécificités.
    Aussi simple que ça ? rien de plus ? en gros du moment je connais la syntaxe C, j'ai "juste" à lire les documentations : du compilateur pour les fonctions et manières d'effectuer des actions; du PIC pour savoir comment le programmer selon la fonction de chaque broche etc.. c'est ça ?

    Citation Envoyé par Vincent PETIT Voir le message
    Ça tu ne peux pas l'inventer, il y a que dans la doc où c'est écrit.
    C'est ça l'inconvenient de l'embarqué ^^ le langage C n'est utilisé que pour sa syntaxe, ses modèles etc... sinon toutes les fonctions C sont totalement différentes selon le système à programmer, du coup faut tout apprendre selon le compilateur et le microcontrôleur utilisé.

    Citation Envoyé par Vincent PETIT Voir le message
    Commence doucement, en ne brûlant pas les étapes.
    ça serait quoi brûler les étapes pour toi ? ^^
    tu me conseillerais de suivre quels étapes pour finaliser (assez rapidement, parce que je compte en faire plusieurs, sinon j'apprendrais pas grand chose ^^) ce projet ?

    Citation Envoyé par Vincent PETIT Voir le message
    Effectivement ça ne fonctionnera pas car le PIC18F4550 (celui de ma démo board PICDEM FSUSB) à un quartz 20MHZ alors que toi, sur ta démo board, avec le micro PIC18F45K50, il n'y en a pas. Pour que ça fonctionne il faudrait changer :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    /* #include <p18f4550.h> */
    #include <p18f45K50.h>
     
    ...
    ...
    void main(void){
     
    /* puis configurer ici le PIC pour qu'il tourne sur son horloge interne car ton micro sait 
     * le faire contrairement au micro que le concepteur utilise (le 18F4550)
     */
    	TBLPTR = 0;
    	init(); //Run initialize routine (see system.h).
    	check_usb_bus(); //Check usb bus for connectivity (see system.h).
    	while(1);
    }
    ça je peux le faire avec la configuration de Bits non ? avec la directive #pragma il me semble ^^
    Donc changer l'include pour le bon PIC, et configurer l'horloge interne ^^

    Et donc ? ce code concrètement, t'en pense quoi ? il est valable ?
    Vu qu'il est adapté au PIC18F4550, je me suis dit que je pouvais peut être mettre de coté la carte démo pour l'instant et programmer directement un PIC18F4550 puis le tester sur un montage qui fera office de clé USB (le problème initial...) ma question est donc, est ce que si j'utilise le code que je t'ai envoyé, que je le programme sur un PIC18F4550, et que j'assemble le montage selon ce schéma http://users.wfu.edu/rollins/pic/PIC...-schematic.gif (que tu m'avais validé, surtout qu'il à pas l'air si complexe que ça), théoriquement ça devrais marcher, tu pense quoi de ça toi ?

    Merci

  10. #70
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 187
    Points : 11 568
    Points
    11 568
    Par défaut
    Citation Envoyé par danieldou Voir le message
    Juste pour tester les includes quoi ^^
    (de manière générale, tu me conseille d'utiliser XC8 ou C18 ?)
    Oui, je pense qu'il faut tester simplement ça pour l'instant et voir si MPLAB sait les inclure, ensuite il faut appeler une des fonctions présentes dans un des fichiers d'entêtes (juste une seule) pour voir si MPLAB sait aller chercher le fichier .c (correspondant au .h) et si ça marche alors l'environnement est bien configuré. Autrement dit, MPLAB sait où sont les fichiers .h mais aussi où sont les fichiers .c correspondant pour les linker avec le main.c.

    Si déjà cette étape n'est pas validée, c'est sur que rien ne compilera.

    Citation Envoyé par danieldou Voir le message
    Après je me pose pas trop la question parce que quand je tape "<" dans MPLAB X, un menu s'affiche permettant de parcourir les dossiers, une fois un dossier et un .h choisi, le reste du include se complète automatiquement, et ça marche donc ça veux surement dire que c'est comme ça que ça doit être ^^
    D'accord ! Donc c'est normal.

    Citation Envoyé par danieldou Voir le message
    Pour ce qui est de la complexité du code (quand je vois celui dont je t'ai envoyé le lien, infiniment plus simple, celui de Microchip est un bazar à coté) j'ai aussi l'impression que le code est beaucoup plus fournis parce qu'il a été prévu pour le PIC18F45K50 mais sur une carte démo, alors que un code à destination d'un PIC18F45K50 simplement, pourrait être beaucoup moins complexe. Tu pense pas ?
    Oui, c'est sur qu'il sera plus simple. Microchip a prévu à mon sens beaucoup trop d'options suivant avec quel micro le code d'exemple sera lancé. Il suffit de regarder HardwareProfile.h pour s'en rendre compte
    The code is natively intended to be used on the following
    hardware platforms: PICDEM? FS USB Demo Board,
    PIC18F87J50 FS USB Plug-In Module, or
    Explorer 16 + PIC24 USB PIM. The firmware may be
    modified for use on other USB platforms by editing this
    file (HardwareProfile.h).
    Ce programme de démonstration est prévu pour tourner avec 3 micros différents et ça m'étonne pas qu'on ait une impression de bazarre pas possible !

    Par contre le code dont tu donnes le lien vers sourceforge n'est pas si simple qu'il n'y paraît. Ouvre donc "system.h", tu verras que celui-ci, malgré qu'il soit un fichier d'entête et qu'il devrait contenir des prototypes, des structures, des directives etc... contient des fonctions et du code. J'ai été surpris car personnellement je ne mets jamais de code dans un .h je fais plutôt un .c (je suis d'accord sur le fait que ça fonctionne aussi mais je ne trouve pas ça très propre)
    Je n'ai pas ouvert tous les .h mais a mon avis c'est sûrement pareil et c'est pour ça que tu as l'impression que le code est beaucoup plus simple. Tu vois que des .h !


    Citation Envoyé par danieldou Voir le message
    Bien sûr oui ^^ je me souviens quand j'ai démarré en Java je n'y comprenais strictement rien à ses gros programmes complexes, mais comme je te l'ai dit, ma manière d'apprendre, c'est de me fixer de gros objectifs, par exemple : quand j'ai débuté en Java (Android), je me suis fixé l'objectif de faire une application combinant une messagerie instantanée, des algorithmes pour gérer des images, l'authentification d'utilisateurs, bases de données etc. (pas tellement des trucs de débutants il me semble ) et j'ai énormément appris comme ça, je procédais par étapes, chaque étapes que je passais me faisais gagner de l’expérience et des connaissances supplémentaires, et c'est comme ça que je sais maintenant programmer des applis Android ^^
    Mais... en disant ça, j'ai l'impression que tu sous entend que je ne pourrais pas réussir à finaliser mon projet en procédant comme ça, non ?

    [...] en gros du moment je connais la syntaxe C, j'ai "juste" à lire les documentations : du compilateur pour les fonctions et manières d'effectuer des actions; du PIC pour savoir comment le programmer selon la fonction de chaque broche etc.. c'est ça ?
    Alors... je te crois totalement lorsque tu me dis que cette manière de faire est très efficace pour apprendre un langage. Mais si on prend du recul c'est pas si évident que ça sur un micro, tu vas comprendre.
    Sur ton PC tu as un OS qui te permet de faire une abstraction complète du matériel, cet OS gère les ressources mémoires et tous les périphériques à ta place. Par exemple en Java si tu fais un system.out.println("bonjour"); tu vois apparaître sur la console le mot bonjour et tu n'as pas eu à t'occuper de tout ce qui est en dessous de JAVA et de sa JVM (comment il gère l'écran ? comment il gère ta prise HDMI ou VGA ? qu'est ce qui se passe ton le processeur ?). Les OS étant adaptés aux processeurs et la JVM à l'OS, le langage JAVA sera le même peut importe sur quoi tu programmes et peut importe où. En langage C, c'est un peut la même chose, un printf("bonjour"); fonctionne tout seul car il y a en dessous un appel vers l'OS pour dire que tu veux afficher quelque chose à l'écran et encore une fois tu n'as pas vraiment à t'occupper de comment ça marche en dessous. Lorsque tu apprends un langage informatique avec ta manière de faire sur un PC, tu vas apprendre en réalité, les API, Framework et les fonctions etc... mais pas comment ça fonctionne en dessous d'un point de vu hardware.

    Mais sur un micro-contrôleur.... hé bien tu n'as pas d'OS, à la rigeur du va trouver peut être quelques API ou fonction toute faite mais qu'il faut adapter suivant que tu sois sur tel ou tel micro ! Si tu veux te faire un printf, tu n'as pas d'autre choix que d'aller plonger au coeur de ton micro pour voir comment faire et là tu vas t'appercevoir qu'il y a plein de registres à configurer avant et que tu dois savoir comment ils fonctionnent dans le détail pour bien les utiliser. Si tu essayes de comprendre comment tout fonctionne simplement en décortiquant / bidouillant / modifiant le code de Microchip, tu arriveras sûrement a tes fins mais je te garantie que ne maîtrisera pas ton micro-contrôleur pour autant.

    Prenons un exemple simple avec le modèle ARDUINO (micro-contrôleur Atmel)
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int ledPin = 0;                 // LED connected to digital pin 0
     
    void setup()
    {
      pinMode(ledPin, OUTPUT);      // sets the digital pin as output
    }
     
    void loop()
    {
      digitalWrite(ledPin, HIGH);   // sets the LED on
      delay(1000);                  // waits for a second
      digitalWrite(ledPin, LOW);    // sets the LED off
      delay(1000);                  // waits for a second
    }
    Si tu relis une LED sur le PORT D, broche 0 alors celle ci va clignoter toutes les secondes. Les utilisateurs d'ARDUINO comprennent que pour faire clignoter une LED il faut d'abord mettre en sortie la broche du micro au travers de la fonction pinMode. Ensuite il faut faire un digitalWrite pour mettre à 1 ou à 0 cette broche. Il y a des gens qui maîtrise très bien le langage Arduino, ils savent faire beaucoup de chose avec le micro Atmel car ils connaissent le rôle des fonctions mais pour autant, il ne maîtrise absolument pas tout le micro-contrôleur. Pourquoi ? Car Arduino, comme n'importe quel langage de programmation sur PC, est justement fait pour que tu ne te poses pas de question. Le but étant bien sur de faire abstraction de tout se qui se passe en dessous. Donc si tu apprends à ta manière, tu sera faire plein chose mais sans vraiment maîtriser ce qui se passe en dessous et en l'absence d'OS (et nous sommes dans ce cas là) et bien on ne va pas très loin.

    Voici maintenant le même code mais avec GCC-AVR (en langage C et en configurant les registres)
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <avr/io.h>        // Includes all the definition of register port etc   
    #include <util/delay.h>    //includes delay functions delay_ms and delay_us
     
    int main(void)
    {
    	DDRD|= 0x01; //sets the digital pin as output
     
    	while (1)
    	{
    		PORTD |= 0x01; 	//sets the LED on
     		_delay_ms(1000);//waits for a second	
    		PORTD &= 0x00; 	//sets the LED off
    		_delay_ms(1000);//waits for a second
    	}
    }
    Dans cette exemple on voit DDRD !!! Qu'est ce que c'est que ce truc ? Hé bien dans la datasheet du micro ATMEGA328P, c'est le nom d'un des registres qui gèrent le PORTD (entrée ou sortie). DDRD c'est Direction DATA Register port D. Ensuite on voit qu'on fait PORTD = 1 et PORTD dans la datasheet du micro, c'est aussi le nom de registre qui permet de lire ou d'écrire sur le PORTD.

    Si on résume, l'utilisateur ARDUINO fait la même chose que l'utilisateur qui sert de GCC-AVR sauf que le premier ne se soucis pas des registres et s'arrête à pinMode et digitalWrite alors que le second a compris qu'il y a des registres dans le micro a configurer pour mettre une broche en entrée ou sortie. Pour moi, si tu appliques ta manière d'apprendre sur un micro (rien qu'avec le code de Microhip et sans la datasheet du micro), ça revient a faire du Arduino. Ca va peut être marcher et tu aura qu'une illusion de maîtrise.

    Maintenant regardons ton micro : http://ww1.microchip.com/downloads/e...Doc/30684A.pdf
    Va à la page 135 du document (chapitre 11.0 I/O PORTS) je prends cette page au hasard
    Il est écrit que :

    Le port A est régit par 5 registres déjà ça sans la datashette, c'est impossible de le deviner et même en analysant un programme car encore faut il que le programme en question s'en serve sinon tu passes carrément à côté :
    TRIS(A) = registre de direction du port (entrée ou sortie) chez Atmel ou Texas c'est le registre DDR, et oui tout les micro se ressemble très très très fort
    PORT(A) = registre d'écriture du port, physiquement c'est dans ce registre que tu mettra à 1 ou à 0 les pins ou bien que tu fera des lectures. Tout dépendra de ce que tu fais du registre TRISA !
    LAT(A) = c'est un registre qui te sert lors d'une lecture, imagine que tu as banché dessus un périhérique qui change souvent d'état alors LATA te permet de vérouiller les données même si les états continus de changer
    ANSEL(A) = registre qui te permet de configurer le port A en entrée pour le convertisseur analogique/numérique.
    SLRCON(A) = celui là je ne le connaissais pas (bon micro que tu as là) c'est le contrôle du slew rate. Le slew rate, par exemple sur un AOP, c'est la vitesse/rapidité du front montant ou descendant.

    La doc dit aussi un peu plus loin que la broche RA4 est connectable au TIMER0 de ton micro (te permettant de faire certaine chose), RA7 est connectable à l'oscillateur principal si jamais tu as besoin de sortir le signal d'horloge pour te sychroniser avec un périphérique ou autre.....

    Rien que dans la page 135, il y a une mine d'information sur le port A et juste sur lui seul. Je te garantie que décortiquer un programme tout fait ne te permettra jamais de savoir tout ça. Je te garantie aussi qu'apprendre des fonctions toutes faites ne te permettra pas non plus de maîtriser tout ça.

    Pour moi, apprendre a maîtriser un micro, ne peut pas se faire comme apprendre le JAVA ou le C ou a faire des applications Android, l'approche n'est pas vraiment la même car là il faut plonger dans le micro.
    Je pense que tu vois ce que je veux dire maintenant

    Citation Envoyé par danieldou Voir le message
    C'est ça l'inconvenient de l'embarqué ^^ le langage C n'est utilisé que pour sa syntaxe, ses modèles etc... sinon toutes les fonctions C sont totalement différentes selon le système à programmer, du coup faut tout apprendre selon le compilateur et le microcontrôleur utilisé.
    Tu as tout compris ! et c'est pour cette raison bien précise que l'approche de l'apprentissage d'un micro n'est pas la même que celle d'un nouveau langage.


    Citation Envoyé par danieldou Voir le message
    ça serait quoi brûler les étapes pour toi ? ^^
    tu me conseillerais de suivre quels étapes pour finaliser (assez rapidement, parce que je compte en faire plusieurs, sinon j'apprendrais pas grand chose ^^) ce projet ?
    Pour moi, il faut que tu commences par jouer avec la petite carte qui t'a été fourni avec le PICkit pour que tu comprennes bien comment fonctionne un micro-contrôleur. Sinon tu vas te poser beaucoup trop de question en attaquant la carte PICDEMFSUSB et beaucoup de chose vont t'échapper. Tout d'abord, tu remarquera que ton micro 18F45K50 sait tourner sans Quartz externe et il faudrait regarder la doc pour comprendre le pourquoi et le comment.
    Si tu regardes à la page 352 de la datasheet tu as un chapitre sur l'USB et les registres du micro qui le régissent :
    • USB Control register (UCON)
    • USB Configuration register (UCFG)
    • USB Transfer Status register (USTAT)
    • USB Device Address register (UADDR)
    • Frame Number registers (UFRMH:UFRML)
    • Endpoint Enable registers 0 through 7 (UEPn)
    A mon avis tu retrouveras dans le code de Microchip les mêmes noms et tu comprendras mieux comment tout ça s'articule.

    A la page 31, on cause de horloge interne et externe du micro

    Tu as de la lecture avant de foncer tête baissé et c'est ça que je veux dire par "ne saute pas d'étape" et ça peut aller vite d'apprendre comment fonctionne un micro.
    L'anglais est technique donc plutôt simple a comprendre
    Sur le net tu devrais trouver, je pense, des tuto qui vont t'expliquer différemment comment ça fonctionne.


    Citation Envoyé par danieldou Voir le message
    ça je peux le faire avec la configuration de Bits non ? avec la directive #pragma il me semble ^^
    Donc changer l'include pour le bon PIC, et configurer l'horloge interne ^^
    La aussi, la réponse est dans la doc du micro + la doc du compilateur (si pragma est nécessaire ou non), je ne peux pas te répondre de manière sur car ça fait trop longtemps que je n'ai pas bosser avec Microchip.

    Citation Envoyé par danieldou Voir le message
    Et donc ? ce code concrètement, t'en pense quoi ? il est valable ?
    Vu qu'il est adapté au PIC18F4550, je me suis dit que je pouvais peut être mettre de coté la carte démo pour l'instant et programmer directement un PIC18F4550 puis le tester sur un montage qui fera office de clé USB (le problème initial...) ma question est donc, est ce que si j'utilise le code que je t'ai envoyé, que je le programme sur un PIC18F4550, et que j'assemble le montage selon ce schéma http://users.wfu.edu/rollins/pic/PIC...-schematic.gif (que tu m'avais validé, surtout qu'il à pas l'air si complexe que ça), théoriquement ça devrais marcher, tu pense quoi de ça toi ?
    Oui ça devrait fonctionner.
    Par contre fait super attention le jour où tu portes tout ça sur ton PIC18F45K50 car j'ai l'impression qu'on serait en 3.3V et non plus en +5V comme sur le schéma que je vois là.
    Toujours pareil, pour s'en assurer, il faut ouvrir les datasheets du 18F4550 et celle du 18F45K50 et regarder les parties USB et alimentation pour s'assurer de la compatibilité.

    Pour résumer :
    - Pour devenir autonome sur un micro : datasheet micro + datasheet compilateur
    - On lit la datasheet, on regarder les registres et on essaye périphérique par périphérique (on fait joujoue avec le Timer, avec les GPIO, avec l'ADC etc...)
    - Si vraiment on ne comprend pas alors on trouve un exemple simple sur le net car par moment ça aide à comprendre l'ordre des choses.
    - Question sur des forums.

    C'est très bien si tu arrives a faire ton projet en faisant un copier/coller du schéma et du programme de cette personne mais même si tu modifies son code pour que ça fasse ce que toi tu veux alors ton projet sera au point mais tu n'aura quasiment rien appris pour autant. Si un jour tu fais un autre projet, tu verras que tu sera obligé de repasser par ces étapes là : trouver quelqu'un qui l'a fait avant toi, copier/coller et modification... mais en électronique on ne trouve pas toujours un mec qui l'a fait avant nous
    J'en veux pour preuve que si après ce projet tu ne sais toujours pas comment on configure l'horloge du micro alors c'est comme ci tu avais appri a conduire une voiture mais que tu as besoin de quelqu'un pour te la démarrer

    A+
    Vincent
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  11. #71
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 273
    Points : 150
    Points
    150
    Par défaut
    Citation Envoyé par Vincent PETIT Voir le message
    Microchip a prévu à mon sens beaucoup trop d'options suivant avec quel micro le code d'exemple sera lancé. Il suffit de regarder HardwareProfile.h pour s'en rendre compte

    Ce programme de démonstration est prévu pour tourner avec 3 micros différents et ça m'étonne pas qu'on ait une impression de bazarre pas possible !

    Par contre le code dont tu donnes le lien vers sourceforge n'est pas si simple qu'il n'y paraît. Ouvre donc "system.h", tu verras que celui-ci, malgré qu'il soit un fichier d'entête et qu'il devrait contenir des prototypes, des structures, des directives etc... contient des fonctions et du code. J'ai été surpris car personnellement je ne mets jamais de code dans un .h je fais plutôt un .c (je suis d'accord sur le fait que ça fonctionne aussi mais je ne trouve pas ça très propre)
    Je n'ai pas ouvert tous les .h mais a mon avis c'est sûrement pareil et c'est pour ça que tu as l'impression que le code est beaucoup plus simple. Tu vois que des .h !
    Ha oui je vois ^^ mais il sera tout de même plus simple que celui de Microchip

    Citation Envoyé par Vincent PETIT Voir le message
    Alors... je te crois totalement lorsque tu me dis que cette manière de faire est très efficace pour apprendre un langage. Mais si on prend du recul c'est pas si évident que ça sur un micro, tu vas comprendre.
    Sur ton PC tu as un OS qui te permet de faire une abstraction complète du matériel, cet OS gère les ressources mémoires et tous les périphériques à ta place. Par exemple en Java si tu fais un system.out.println("bonjour"); tu vois apparaître sur la console le mot bonjour et tu n'as pas eu à t'occuper de tout ce qui est en dessous de JAVA et de sa JVM (comment il gère l'écran ? comment il gère ta prise HDMI ou VGA ? qu'est ce qui se passe ton le processeur ?). Les OS étant adaptés aux processeurs et la JVM à l'OS, le langage JAVA sera le même peut importe sur quoi tu programmes et peut importe où. En langage C, c'est un peut la même chose, un printf("bonjour"); fonctionne tout seul car il y a en dessous un appel vers l'OS pour dire que tu veux afficher quelque chose à l'écran et encore une fois tu n'as pas vraiment à t'occupper de comment ça marche en dessous. Lorsque tu apprends un langage informatique avec ta manière de faire sur un PC, tu vas apprendre en réalité, les API, Framework et les fonctions etc... mais pas comment ça fonctionne en dessous d'un point de vu hardware.

    Mais sur un micro-contrôleur.... hé bien tu n'as pas d'OS, à la rigeur du va trouver peut être quelques API ou fonction toute faite mais qu'il faut adapter suivant que tu sois sur tel ou tel micro ! Si tu veux te faire un printf, tu n'as pas d'autre choix que d'aller plonger au coeur de ton micro pour voir comment faire et là tu vas t'appercevoir qu'il y a plein de registres à configurer avant et que tu dois savoir comment ils fonctionnent dans le détail pour bien les utiliser. Si tu essayes de comprendre comment tout fonctionne simplement en décortiquant / bidouillant / modifiant le code de Microchip, tu arriveras sûrement a tes fins mais je te garantie que ne maîtrisera pas ton micro-contrôleur pour autant.
    Oui je comprends, mais tu sais, quand je dit que c'est comme ça que j'apprend, je dit pas que j'apprends uniquement de ça.
    Je suis tout à fait d'accord sur le point qu'il faut bien apprendre d'abord comment fonctionne le microcontrôleur, la seule chose c'est que de manière générale, je comprends facilement la théorie, mais arrivé en pratique c'est tout une autre histoire, c'est pourquoi je me fixe des projets à effectuer pour maitriser le coté pratique du sujet, mais je n'exclus en aucun cas l'apprentissage de l'architecture et du fonctionnement du matériel utilisé !

    J'ai bien compris la différence, on pourrait même tout simplement illustrer ce fait avec la logique des langages de programmation; plus un langage est de bas niveau, plus il est proche de la machine (et donc de la couche matérielle) alors que les langages de hauts niveau permettent de s'occuper uniquement de la partie algorithmique d'un programme, son mode de fonctionnement etc... mais aucun contact avec le matériel, gestion de mémoire etc... (c'est d'ailleurs surement pour ça que le C est utilisé pour 65% des systèmes embarqué, grâce a son bas niveau qui permet donc une meilleure gestion du hardware qu'un autre langage comme Java par exemple).

    Citation Envoyé par Vincent PETIT Voir le message
    Maintenant regardons ton micro : http://ww1.microchip.com/downloads/e...Doc/30684A.pdf
    Va à la page 135 du document (chapitre 11.0 I/O PORTS) je prends cette page au hasard
    Il est écrit que :

    Le port A est régit par 5 registres déjà ça sans la datashette, c'est impossible de le deviner et même en analysant un programme car encore faut il que le programme en question s'en serve sinon tu passes carrément à côté :
    TRIS(A) = registre de direction du port (entrée ou sortie) chez Atmel ou Texas c'est le registre DDR, et oui tout les micro se ressemble très très très fort
    PORT(A) = registre d'écriture du port, physiquement c'est dans ce registre que tu mettra à 1 ou à 0 les pins ou bien que tu fera des lectures. Tout dépendra de ce que tu fais du registre TRISA !
    LAT(A) = c'est un registre qui te sert lors d'une lecture, imagine que tu as banché dessus un périhérique qui change souvent d'état alors LATA te permet de vérouiller les données même si les états continus de changer
    ANSEL(A) = registre qui te permet de configurer le port A en entrée pour le convertisseur analogique/numérique.
    SLRCON(A) = celui là je ne le connaissais pas (bon micro que tu as là) c'est le contrôle du slew rate. Le slew rate, par exemple sur un AOP, c'est la vitesse/rapidité du front montant ou descendant.

    La doc dit aussi un peu plus loin que la broche RA4 est connectable au TIMER0 de ton micro (te permettant de faire certaine chose), RA7 est connectable à l'oscillateur principal si jamais tu as besoin de sortir le signal d'horloge pour te sychroniser avec un périphérique ou autre.....

    Rien que dans la page 135, il y a une mine d'information sur le port A et juste sur lui seul. Je te garantie que décortiquer un programme tout fait ne te permettra jamais de savoir tout ça. Je te garantie aussi qu'apprendre des fonctions toutes faites ne te permettra pas non plus de maîtriser tout ça.

    Pour moi, apprendre a maîtriser un micro, ne peut pas se faire comme apprendre le JAVA ou le C ou a faire des applications Android, l'approche n'est pas vraiment la même car là il faut plonger dans le micro.
    Je pense que tu vois ce que je veux dire maintenant
    Oui je vois très bien, donc le principal c'est la doc en détails (mais prends en compte ce que je t'ai dit par rapport à la théorie et la pratique, ça devrait te permettre de mieux comprendre pourquoi j'apprends tant avec ces projets, c'est surtout pour la pratique que je parle, d'autant plus que même quand je pratique je n'aime pas faire les choses à l'aveugle, si je programme un système j'ai besoin de savoir comment il va fonctionner )

    Citation Envoyé par Vincent PETIT Voir le message
    Pour moi, il faut que tu commences par jouer avec la petite carte qui t'a été fourni avec le PICkit pour que tu comprennes bien comment fonctionne un micro-contrôleur.
    J'ai déjà commencé avec ça ^^, ça m'a permis de faire connaissance avec les LED et les registres, par exemple d'abord positionner le port qui gère les LED en sortie etc.. ^^

    Citation Envoyé par Vincent PETIT Voir le message
    Sinon tu vas te poser beaucoup trop de question en attaquant la carte PICDEMFSUSB et beaucoup de chose vont t'échapper. Tout d'abord, tu remarquera que ton micro 18F45K50 sait tourner sans Quartz externe et il faudrait regarder la doc pour comprendre le pourquoi et le comment.
    Si tu regardes à la page 352 de la datasheet tu as un chapitre sur l'USB et les registres du micro qui le régissent :
    • USB Control register (UCON)
    • USB Configuration register (UCFG)
    • USB Transfer Status register (USTAT)
    • USB Device Address register (UADDR)
    • Frame Number registers (UFRMH:UFRML)
    • Endpoint Enable registers 0 through 7 (UEPn)
    A mon avis tu retrouveras dans le code de Microchip les mêmes noms et tu comprendras mieux comment tout ça s'articule.
    Et bien n'oublions pas que mon actuellement mon objectif est de savoir faire communiquer le matériel avec le PC et comprendre comment faire passer des données de l'un à l'autre. Tout le reste tels que le potentiomètre, les boutons poussoirs etc... ne sont pas mes priorités, du coup quand tu dit que je vais être perdu en arrivant sur la PICDEMFSUSB, je vais pas avoir besoin de tout exploiter pour le moment ^^

    Citation Envoyé par Vincent PETIT Voir le message
    Tu as de la lecture avant de foncer tête baissé et c'est ça que je veux dire par "ne saute pas d'étape" et ça peut aller vite d'apprendre comment fonctionne un micro.
    L'anglais est technique donc plutôt simple a comprendre
    Sur le net tu devrais trouver, je pense, des tuto qui vont t'expliquer différemment comment ça fonctionne.
    J'espère réussir ce projet aussi rapidement que tu le dit

    Citation Envoyé par Vincent PETIT Voir le message
    Oui ça devrait fonctionner.
    Par contre fait super attention le jour où tu portes tout ça sur ton PIC18F45K50 car j'ai l'impression qu'on serait en 3.3V et non plus en +5V comme sur le schéma que je vois là.
    Toujours pareil, pour s'en assurer, il faut ouvrir les datasheets du 18F4550 et celle du 18F45K50 et regarder les parties USB et alimentation pour s'assurer de la compatibilité.
    De toutes façons je pense qu'au final, je m'exerce sur la PICDEMFSUSB (PIC18F45K50 donc) mais j'utiliserais le PIC18F4550, du coup je vérifierais la compatibilité, mais pour le schéma de la clé USB je vais plutôt le respecter a la lettre et donc utiliser le PIC18F4550 (et vu que le programme est fait pour, je pourrais directement l'utiliser dessus, en mettant en pratique ce que j'aurais appris avec la carte démo, en respectant la compatibilité bien sur).

    Citation Envoyé par Vincent PETIT Voir le message
    Pour résumer :
    - Pour devenir autonome sur un micro : datasheet micro + datasheet compilateur
    - On lit la datasheet, on regarder les registres et on essaye périphérique par périphérique (on fait joujoue avec le Timer, avec les GPIO, avec l'ADC etc...)
    - Si vraiment on ne comprend pas alors on trouve un exemple simple sur le net car par moment ça aide à comprendre l'ordre des choses.
    - Question sur des forums.
    Je vois ^^

    Citation Envoyé par Vincent PETIT Voir le message
    mais en électronique on ne trouve pas toujours un mec qui l'a fait avant nous
    Ha ça... c'est les très vastes possibilités de l'électronique qui fait qu'on peut avoir plein de projet ou personne ne s'est jamais aventuré avant

    Citation Envoyé par Vincent PETIT Voir le message
    J'en veux pour preuve que si après ce projet tu ne sais toujours pas comment on configure l'horloge du micro alors c'est comme ci tu avais appri a conduire une voiture mais que tu as besoin de quelqu'un pour te la démarrer
    L'horloge... parlons en ! J'ai lu tout ce que j'ai trouvé dessus et j'ai quand même un peu de mal à comprendre le principe... ce que j'ai compris c'est que l'horloge est cadencée par un oscillateur qui régule donc la vitesse de fonctionnement du périphérique, c'est bien ça ?

    Merci

  12. #72
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 273
    Points : 150
    Points
    150
    Par défaut
    Merci pour ta réponse
    Comme je t'ai dit, j'ai du mal à assimiler la notion d'horloge interne :

    1. A quoi sert elle exactement ?
    2. Parmi ces 12 manière de la cadencer, laquelle peut être préférable selon les besoins, et comment choisi t'on cette même manière ?
    3. Quelle différence entre interne et externe ? Pourquoi il arrive que l'on choisisse externe alors qu'interne ne nécessite pas d'oscillateur supplémentairement ?


    (sur le schéma de la clé que je t'ai envoyé, vu que je vois un oscillateur a gauche, j'en déduit qu'il utilise une manière extérieure non ?)

    Désolé pour toutes ces question, c'est juste que j'ai bien compris que l'horloge est un point fondamental à connaitre dans les microcontrôleurs du coup je veux bien l'assimiler avant d'avancer ^^

    Merci

  13. #73
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 187
    Points : 11 568
    Points
    11 568
    Par défaut
    !!! J'ai supprimer mon message juste au dessus suite à une mauvaise manip, je l'ai envoyé avant de l'avoir terminé. Voici la réponse ci dessous qui je pense va répondre a tes questions !!! Désolé

    Citation Envoyé par danieldou Voir le message
    L'horloge... parlons en ! J'ai lu tout ce que j'ai trouvé dessus et j'ai quand même un peu de mal à comprendre le principe... ce que j'ai compris c'est que l'horloge est cadencée par un oscillateur qui régule donc la vitesse de fonctionnement du périphérique, c'est bien ça ?
    C'est ça. Par exemple, je vais prendre le PIC18F4550 puisque c'est celui là que tu comptes utiliser dans ton projet.

    L'horloge interne du micro peut être cadencée par pas moins de 12 façons différentes (dont certaine sont très similaires à quelques subtilités prés). Grossièrement tu peux diviser en 2 catégories les 12 façons de faire.
    Catégorie 1 : de manière extérieure
    Catégorie 2 : de manière intérieure.

    1. XT Crystal/Resonator : En reliant un quartz souvent inférieur à 4MHz au micro
    2. XTPLL Crystal/Resonator with PLL enabled : En reliant un quartz souvent inférieur à 4MHz au micro + en activant la boucle à vérouillage de phase de celui-ci (4Mhz vers 96Mhz)
    3. HS High-Speed Crystal/Resonator : En reliant un quartz souvent supérieur à 4MHz au micro
    4. HSPLL High-Speed Crystal/Resonator with PLL enabled : En reliant un quartz souvent supérieur à 4MHz au micro + en activant la boucle à vérouillage de phase de celui-ci (ex : 20Mhz vers 96Mhz)
    5. EC External Clock with FOSC/4 output : Horloge externe en provenance d'un Timer/autre micro/NE555 connecté sur OSC1 et OSC2 devient un sortie qui donne l'horloge / 4
    6. ECIO External Clock with I/O on RA6 : Horloge externe en provenance d'un Timer/autre micro/NE555 connecté sur OSC1 et OSC2 qui est aussi RA4 reste une GPIO
    7. ECPLL External Clock with PLL enabled and FOSC/4 output on RA6 : Horloge externe en provenance d'un Timer/autre micro/NE555 connecté + PLL pour l'accelérer sur OSC1 et OSC2 devient un sortie qui donne l'horloge / 4
    8. ECPIO External Clock with PLL enabled, I/O on RA6 : Horloge externe en provenance d'un Timer/autre micro/NE555 connecté + PLL pour l'accelérer sur OSC1 et OSC2 qui est aussi RA4 reste une GPIO

    9. INTHS Internal Oscillator used as microcontroller clock source, HS Oscillator used as USB clock source : Horloge interne hight speed mais l'USB demande un oscillateur externe
    10. INTXT Internal Oscillator used as microcontroller clock source, XT Oscillator used as USB clock source : Horloge interne classique mais l'USB demande un oscillateur externe
    11. INTIO Internal Oscillator used as microcontroller clock source, EC Oscillator used as USB clock source, digital I/O on RA6 : Horloge interne et OSC2 qui est aussi RA4 reste une GPIO mais l'USB demande un oscillateur externe
    12. INTCKO Internal Oscillator used as microcontroller clock source, EC Oscillator used as USB clock source, FOSC/4 output on RA6 : Horloge interne et OSC2 devient un sortie qui donne l'horloge / 4 mais l'USB demande un oscillateur externe

    Le micro a aussi un horloge auxiliaire pour mettre par exemple une horloge temps réel comme ça des que tu passes en mode veille, tu bascules sur l'auxiliaire et ton composant ne consomme quasiment plus rien.

    Quand on lit la page 25 de cette doc http://ww1.microchip.com/downloads/e...doc/39632c.pdf
    On comprend pourquoi le PIC18F4550 a besoin d'un Quartz car c'est pour l'USB.

    Normalement ton PIC18F45K50, plus récent, sait s'en passer.

    Si il y a autant de possibilité pour les horloges, c'est car tu peux avoir différent besoin. Si tu as des contraintes de place, petit circuit imprimé, alors prendre l'horloge interne peut être un bon choix. Si tu es sur batterie alors prendre une horloge interne lente est adaptée à la faible consommation dont tu as besoin. Si tu as besoin d'être rapide/précis pour faire des mesures alors il faut prendre une horloge externe. Si tu as besoin d'être synchrone avec d'autres contrôleur ou composant alors les solutions EC sont là pour ça.

    Lorsqu'on règle mal son horloge dès le départ il n'y a rien qui fonctionne.
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  14. #74
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 273
    Points : 150
    Points
    150
    Par défaut
    Qu'est ce que les solutions EC ?

    Mais... j'ai bien compris toutes tes explications mais je n'arrive pas à saisir quel rôle exacte joue l'horloge dans le micro et le système embarqué

    Merci

  15. #75
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 187
    Points : 11 568
    Points
    11 568
    Par défaut
    Citation Envoyé par danieldou Voir le message
    Qu'est ce que les solutions EC ?

    Mais... j'ai bien compris toutes tes explications mais je n'arrive pas à saisir quel rôle exacte joue l'horloge dans le micro et le système embarqué

    Merci
    Pour les solutions EC (en 12 ans d'électronique je n'ai jamais eu besoin de m'en servir) :
    Imaginons que tu as 1 micro maître avec des micros esclaves et que le tout cause avec des périphériques ou composants synchrones (de la bonne électronique logique). Pour couronner le tout ton montage est destiné à fonctionner dehors et potentiellement en plein soleil l'été.
    Moi dans un tel cas, je me dirai :
    - Vu que tout le monde cause avec tout le monde, je vais m'épargner les soucis de synchronisation d'horloge du genre "un cours, l'autre qui marche et le troisième est entre les deux" pour causer ensemble c'est pas le top.
    - Je prendrai une seule horloge pour tout le monde et en plus je m'affranchi des problèmes de dérive en température. Avec une horloge si ça dérive, alors ça dérive pour tout le monde donc ce n'est plus un soucis.
    - Face à la contrainte de chaleur, qui peut nuire fortement au projet, une solution serai de prendre une horloge externe genre un VCO (voltage controling oscillateur) que je régulerai avec un sonde de température.

    But du jeu : plus il fait chaud et moins le VCO tourne vite (les composants électroniques consomment proportionnellement à leurs vitesses) et dans ce cas là la sortie du VCO serait reliée aux oscillateurs des micros en mode EC mais aussi aux restes des composants qui ont besoin d'une horloge. Si il fait froid alors le VCO tourne plus vite ! Ceci n'est qu'un exemple bien sur. Je pensais aussi à un micro destiné a être placé sur une carte PCI express d'un PC. Il me semble que le bus PCI express a un horloge et si c'est le cas alors il est judicieux que le micro se serve de cette horloge en mode EC (aux risques de ne pas être synchronisé)

    Pour l'horloge, qu'est ce que tu as du mal à comprendre ? Pourquoi il y a plusieurs fréquences ? Quelle rôle elle joue ?
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  16. #76
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 273
    Points : 150
    Points
    150
    Par défaut
    Citation Envoyé par Vincent PETIT Voir le message
    Pour l'horloge, qu'est ce que tu as du mal à comprendre ? Pourquoi il y a plusieurs fréquences ? Quelle rôle elle joue ?
    Oui voila

  17. #77
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 187
    Points : 11 568
    Points
    11 568
    Par défaut
    Dans le PIC18F4550 (car c'est la doc que j'ai sous les yeux)

    Le micro te laisse beaucoup de choix concernant l'horloge principal mais je vais résumé les deux grandes possibilités :

    1 - Soit tu mets un quartz entre les broches OSC1 et OSC2 et tu dis à ton micro :
    - Je veux que cette horloge (donc le quartz) soit l'horloge principal du micro (cadencement du programme en lui même, des timers, du bus I2C/SPI, du coeur du micro, etc...)
    - Je veux aussi que cette horloge (donc le même quartz) soit l'horloge de la communication USB fullspeed (c'est dire le cadencement des données sur le bus USB)

    Là tu vas me dire... ce sont 2 choses distincts ?
    Oui et non ! Comme tu peux le voir sur le diagramme 2.2 dans le chapitre qui traite de la configuration de l'oscillateur. Le quartz est en relation avec l'USB mais aussi avec le reste du micro, on peut dire qu'a un moment donné il y a une sorte de séparation en deux du quartz. Il y a un aiguillage du quartz vers la PLL pour faire une accélération à 96MHz pour l'USB et de l'autre c'est plutôt une division pour le micro. Chez Microchip ils sont pas fou, ils ceux sont dit "imaginons que l'utilisateur veuille réaliser un projet USB fullspeed, ok ! Mais est ce qu'on peut l'obligé à tourner à fond la caisse même quand la communication USB n'est pas sollicité ? Imagine que tu intérroges ton micro toutes les secondes en USB :
    Lors de la communication USB le micro a besoin de trouner à fond les ballons pour être USB fullspeed ! Mais une fois que c'est fait, à quoi cela servirait que le micro continu de tourner si vite entre deux intérrogations ? Microchip ont jugés plus adapté de mettre en place une sorte d'aiguillage en désynchronisant les vitesses de cadencement du micro avec celui du périphérique USB, dans le micro. Par contre le quartz reste quand même la référence d'horloge sauf qu'il y a d'un côté des accélération de vitesse et de l'autre des divisions.

    C'est un peu comme l'UART (le port série de ton PIC) tu peux très bien faire une communication avec un PC à raison de 9600 Baude/s et avoir un quartz de la mort qui pédale à 48MHz ! Y a aucun soucis, il y aura une division de fréquence à faire à un moment donnée via une config et le tour est joué.

    2 - Soit tu mets un quartz entre les broches OSC1 et OSC2 et tu dis à ton micro :
    - Je ne veux pas que cette horloge (donc le quartz) soit l'horloge principal du micro (cadencement du programme en lui même, des timers, du bus I2C/SPI, du coeur du micro, etc...), je préfère une horloge interner comme ça, lorsque mon micro n'est pas sollicité par l'USB au moins il ne consomme pas trop.
    - Par contre je veux que cette horloge (donc le même quartz) soit l'horloge de la communication USB fullspeed (c'est dire le cadencement des données sur le bus USB)

    La par contre on distingue bien les 2 choses ! Le quartz ne sert qu'aux cadencement des données sur le BUS USB et l'horloge interne sert à tout le reste (cadencement du programme en lui même, des timers, du bus I2C/SPI, du coeur du micro, etc...) Sur le diagramme 2.2 dans le chapitre qui traite de la configuration de l'oscillateur tu verra un truc qui s'appelle MUX et c'est lui qui permet de faire l'aiguillage des horloges.

    Tu as maintenant une question sur ce que j'ai écrit en 1
    Tu te dis "mais qu'est ce qui racconte lui ! Si le programme et le coeur du micro tourne lentement ! Comment est ce que le bus USB peut aller vite ?"
    Sans avoir lu la doc en entier, je suis prêt a parier que ça fonctionne avec des buffers tout comme l'UART.

    Pour te donner une image :
    Prend une mitraillette (genre UZI, pourquoi UZI ? Comme ça ) et son chargeur.
    La mitraillette en elle même c'est le bus USB cadencé hyper vite.
    Le chargeur et toi êtes le micro qui trourne plus lentement.
    Maintenant
    Tu mets les balles dans le chargeur, il faut prendre la balle, l'insérer au fond, puis en prendre une autre et ainsi de suite (le micro est plus lent car son horlge est lente) mais une fois que le chargeur est rempli et enclenché....
    Tu appuis sur la gachette et là... la mitraillette ne mets que quelques secondes à se vider (l'USB est rapide car son horloge est rapide)

    Est ce que j'ai été clair ?
    Sinon ce soir je te l'expliquerai d'une autre manière.

    C'est là qu'on voir à quel point la datasheet du micro est importante.
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  18. #78
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 273
    Points : 150
    Points
    150
    Par défaut
    Je crois que je comprends déjà mieux ^^
    Mais concrètement, ces accélérations ou divisions se font comment ?

    (si je comprends bien, l'oscillateur, qui tourne a une fréquence précise et régulière, sert d'horloge comme son nom l'indique, en gros pour donner une base temps au système, c'est ça ?)

    PS : par contre pour la doc, c'est vrai que leur anglais n'est pas si difficile, mais je galère quand même pas mal à la lire... je comprends globalement mais ça suffit pas à comprendre en détail, je passe à coté de pleins de mots que je comprends pas... en plus y a pas beaucoup sur le sujet en français :/
    Tu pourrais m'indiquer seulement les parties qui me seront utiles pour ce projet (comme ça au moins ça limitera un peu le nombre de pages) ?

    Merci ^^

  19. #79
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 187
    Points : 11 568
    Points
    11 568
    Par défaut
    si je comprends bien, l'oscillateur, qui tourne a une fréquence précise et régulière, sert d'horloge comme son nom l'indique, en gros pour donner une base temps au système, c'est ça ?
    Oui c'est ça.

    L’accélération se fait au travers d'une "PLL" (boucle a vérouillage de phase) dans le micro et la division au travers d'un "Prescaler" (diviseur de fréquence) dans le micro aussi. Dans la doc, tu as un diagramme fonctionnel pour comprendre dans les grandes lignes :

    Nom : Capture du 2015-09-25 21:20:08.png
Affichages : 1335
Taille : 104,8 Ko


    C'est bien à toi de configurer la PLL et le Prescaler pour que ça tourne bien. Rassure toi, les constructeurs te donnent toujours des tableaux récapitulatifs de pré-configuration en fonction des quartz.

    Nom : Capture du 2015-09-25 21:57:52.png
Affichages : 1010
Taille : 35,2 Ko

    Examinons un peu tout ça : tu vas voir c'est pas bien compliqué.
    - Dans le diagramme, j'ai fait un cercle autour de l'accélérateur PLL et si tu regardes bien il y a écrit dans ce cercle "4MHz input only".
    - Sur ce diagramme j'ai dessiné un quartz 48Mhz et je l'ai fait passé, si tu suis le trait rouge, au travers de la ligne (division par 12) car 48MHz / 12 = 4MHz (pour être conforme avec le input only)
    - Ensuite la PLL va faire accélérer le 48MHz jusque 96MHz puis va le diviser en 2 pour regénérer du 48MHz qui servira à l'USB fullspeed. (Pourquoi transformer le 48MHz en 96Mhz, donc faire x2 puis le diviser par 2 ? C'est parce qu'en jouant avec les préscalaires on arrive a avoir beaucoup de fréquences différentes.

    - Maintenant regardons le tableau de Microchip :
    - J'ai entouré la config de ma vieille carte PICDEM FSUSB, celle avec un PIC18F4550. Dessus j'ai un quartz 20MHz, il faut donc le diviser par 5 pour obtenir les 4MHz nécessaire pour que la PLL s'active et passe à 96MHz.
    - Ensuite dans le tableau tu peux voir écrit des choses comme (PLLDIV2 : PLLDIV0) ou (FOSC3 : FOSC0) etc. Ceux sont les noms de bits de configuration qu'il faut régler pour obtenir le divisé par 5 par exemple.
    - Continuons, tu vois la troisième colonne : c'est le choix que tu as pour l'horloge du micro (Hight speed qui correspond au quartz, ou les EC)
    - Puis tu as un préscalaire pour l'horloge du micro elle même (je l'ai appelé diviseur de fréquence sur le diagramme) et sur le tableau j'ai entouré la possibilité de faire tourner le coeur du micro à 20MHz donc identique au Quartz

    Pour faire rejoindre tout ce qu'on s'est dit plus haut, on voit qu'avec le tableau on peut avoir un quartz de 20MHz qui sera transformé en 48MHz pour l'USB et on peut faire tourner le micro par exemple en 5MHz.

    C'est tout à fait normal de ne pas comprendre grand chose à une datasheet de micro, surtout si on est pressé Il y a des termes à connaître et il faut expérimenter pour comprendre. Malheureusement le soucis de l'expérimentation c'est qu'il faut lire un gros morceau de la doc.
    Ne baisse pas les bras car je t'assure que quand on sait lire et naviguer dans une datasheet de micro après y plus rien qui peut faire peur.

    Si tu veux un cours en français : http://www.abcelectronique.com/bigon....php?par=deec0 un peu plus bas dans la page tu as des cours en plusieurs parties, elles sont aux nombres de 5. Ces courts concernent le PIC16F84 (un petit PIC) puis l'auteur t'emmène vers le PIC16F877 (déjà plus balaise) enfin il explique comment migrer vers un PIC18F (ce que tu souhaites faire) et il fait un crochet vers le debugger. Le cours est un peu vieux mais c'est une référence. Il faut que tu lises ça dans le calme et doucement car c'est riche en infos, de plus comme tous les micro se ressemblent et encore plus lorsqu'ils sont du même constructeur, les explications que tu trouvera sur les PIC16 s'appliquent à au PIC18 et de toute manière l'auteur à fait un chapitre sur ce thème.

    Je suis désolé de te rediriger vers un site mais je ne pourrai pas te faire un cours complet sur les PIC. Même si j'ai encore de très bons souvenirs, c'est assez loin tout ça, pour moi.
    Si tu as des questions pas de problème.

    A+
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  20. #80
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 273
    Points : 150
    Points
    150
    Par défaut
    Citation Envoyé par Vincent PETIT Voir le message
    Pour faire rejoindre tout ce qu'on s'est dit plus haut, on voit qu'avec le tableau on peut avoir un quartz de 20MHz qui sera transformé en 48MHz pour l'USB et on peut faire tourner le micro par exemple en 5MHz.
    ça correspond donc au schéma que je t'avais envoyé, ça fonctionnera avec un quartz de 20MHz, je vais donc en commander un.

    Citation Envoyé par Vincent PETIT Voir le message
    C'est tout à fait normal de ne pas comprendre grand chose à une datasheet de micro, surtout si on est pressé
    Comme tu l'a remarqué, en effet je suis assez pressé de finir ce projet...

    Citation Envoyé par Vincent PETIT Voir le message
    Il y a des termes à connaître et il faut expérimenter pour comprendre. Malheureusement le soucis de l'expérimentation c'est qu'il faut lire un gros morceau de la doc.
    Ne baisse pas les bras car je t'assure que quand on sait lire et naviguer dans une datasheet de micro après y plus rien qui peut faire peur.
    A ce point ! dit comme ça, ça voudrait donc dire que c'est le plus dur, ça me rassure, au moins le problème vient pas de moi

    Citation Envoyé par Vincent PETIT Voir le message
    Je suis désolé de te rediriger vers un site mais je ne pourrai pas te faire un cours complet sur les PIC. Même si j'ai encore de très bons souvenirs, c'est assez loin tout ça, pour moi.
    Désolé ? tu rigole ? dit toi que ton aide m'est déjà extrêmement précieuse !
    Merci beaucoup !

    Je vais essayer d'avancer avec ce que tu m'a donné, je vais surement bientôt passer au montage électronique (comme ça je pourrais directement tester le code que j'ai trouvé sur SourceForge en live ^^) et vu que c'est assez long et complexe, je vais d'abord me concentrer sur les connaissances requises pour mener a bien ce projet, puis j'en ferais d'autres pour apprendre le reste

    Je te tiens au courant si j'ai besoin d'aide (même si j'en ai pas besoin d'ailleurs, en tant qu'aide essentielle a mon projet, je suis sûr que tu sera intéresse de savoir comment j'aurais réussi )

    Merci

Discussions similaires

  1. Montage/démontage automatique des clef USB
    Par troumad dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 27/10/2007, 10h48
  2. [FC6] Perdu le montage auto des USB
    Par PM_calou dans le forum RedHat / CentOS / Fedora
    Réponses: 1
    Dernier message: 27/08/2007, 11h27
  3. Montage cle USB qui veut plus marcher
    Par pierabobl dans le forum Matériel
    Réponses: 10
    Dernier message: 07/06/2006, 14h09
  4. Probleme de montage clé usb sous debian
    Par shrucky dans le forum Matériel
    Réponses: 7
    Dernier message: 08/05/2006, 11h31
  5. problème de montage de clé usb
    Par shrucky dans le forum Matériel
    Réponses: 3
    Dernier message: 18/03/2006, 22h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo