Tutoriel de programmation de l’interface HID

Créez votre premier projet avec MikroC et communiquez rapidement avec votre interface

Commencez par créer un nouveau projet pour PIC18F4550, en fixant la fréquence de l’horloge du PIC (pas la fréquence de résonance du quartz, mais la fréquence en sortie de PLL fournie par le tableau ci-après).

projet1

projet2

Ensuite, il faut configurer le comportement du PIC en remplissant ses fusibles. Les fusibles sont différents registres du PIC qui fixent le type d’oscillateur, la vitesse de l’horloge interne, l’état du watchdog…
Pour ce faire, MikroC fournit une interface graphique qui simplifie la configuration du PIC (Project -> Edit Project). Pour que l’interface HID fonctionne correctement, il faut respecter quelques règles:

  • Activer le régulateur de tension USB
  • Assurer une fréquence d’horloge de 4MHz en sortie de la PLL
  • Utiliser la sortie de la PLL comme horloge USB
  • Activer le Master Clear (MCLR) => permet d’effectuer un RESET de la carte avec le bouton poussoir

Voici un extrait de ma configuration pour une horloge externe à 20MHz (quartz):

configHorloge

configPIC

Pour la configuration du circuit d’horloge, il est important de respecter le tableau suivant (extrait du Datasheet du PIC18f4550, Section 2-3-2):

tableauHorloge1

tableauHorloge2

Ensuite, il faut configurer les ports d’entrées/sorties du PIC: les lignes D- et D+ (RC4 et RC5) doivent être placées en entrées pour utiliser l’USB.

Enfin, MikroC fournit un ensemble de librairies facilitant la mise en place du protocole HID. Voici les étapes clés de la programmation de l’interface:

    1. Générer le Descripteur de l’interface:
      1. Lancer l’utilitaire HID Terminal de MikroC (Tools -> HID Terminal)
      2. Onglet Descriptor
      3. Compléter les informations propres à votre interface
      4. Enregistrer le descripteur pour MikroC dans le dossier de votre projet

HIDTerm

  1. Importer le descripteur dans votre projet: #import « USBdsc.c »
  2. Initialiser le module HID: HID-Enable(&ReadBuf, &WriteBuf);
  3. Pour lire des informations: while (HID_Read() == 0); ou par interruption
  4. Pour écrire des informations: HID_Write();

Pour plus de détail, voir l’aide de MikroC, rubrique USB:

exempleHID

Pour envoyer votre programme sur l’interface; il vous faut utiliser un programmateur de PIC. J’utilise un PicKit3. Pour utiliser un programmateur Microchip, il faut installer MPlab (ou MPlabX qui est multiplateforme). Ensuite il faut importer le fichier .hex qui a été généré par MikroC et programmer le PIC avec. La procédure diffère entre MPlab et MPlabX. Avec MPlab, il suffit de faire File -> import, puis de programmer; avec MPlabX, il faut créer un nouveau projet et y importer le fichier .hex en enfin programmer le PIC.

Pour tester la communication HID, vous pouvez utiliser le HID Terminal fournit par MikroC ou bien écrire votre propre programme.
Personnellement, j’utilise LabVIEW, un environnement de programmation graphique développé par National Instrument, qui offre une grande compatibilité avec la plupart des protocoles de communications.

Voici un exemple simple de communication HID permettant de piloter la luminosité des deux LED de l’interface:

#include "USBdsc.c"
#define TAILLE_BUF 64
 
/*------------- Pilotage des LEDs en luminosité -------------*/
/*                                                           */
/* Programme écrit pour MikroC 2009,                         */
/* incompatible avec la version 2011                         */
/*                                                           */
/* Auteur: LAURENT Amaury                                    */
/* Date: 30/11/2011                                          */
/*                                                           */
/*-----------------------------------------------------------*/
 
unsigned short userRD_buffer[TAILLE_BUF];
unsigned short userWR_buffer[TAILLE_BUF];
char * pt;
char ReadBuf[TAILLE_BUF] WriteBuf[TAILLE_BUF];
int i;
 
signed int consigne1=0, consigne2=0;
unsigned char cpt=0;
 
void Vider_Buffer(char * Buffer)
{
     for (i=0;i<TAILLE_BUF;i++) Buffer[i]=0;
}
 
void interrupt()
{
    if (PIR2.USBIF == 1)
    {
    asm CALL _Hid_InterruptProc
    asm nop
    
    if(HID_Read()!=0)
        {
            pt=strstr(ReadBuf,"LED1: ");
            if (pt!=0)
            {
                consigne1=*(pt+6);
            }
 
            pt=strstr(ReadBuf,"LED2: ");
            if (pt!=0)
            {
                consigne2=*(pt+6);
            }            
 
            Vider_Buffer(ReadBuf);
            Vider_Buffer(WriteBuf);
        }
   }
}
 
void InitPIC (void)
{
    ADCON1=0x0F;
    CMCON=7;
    
    //------------- LED1 ------------
    TRISD.f0=0;
    PORTD.f0=0;
 
    //------------- LED2 ------------
    TRISD.f1=0;
    PORTD.f1=0;
 
    //------------- USB -------------
    TRISC.f4=1;  //D-
    TRISC.f5=1;  //D+
    HID_Enable(&ReadBuf,&WriteBuf);
}
 
void main()
{
 
    InitPIC();
 
    while (1)
    {
        //-------------------------------
        //------------- PWM -------------
        //-------------------------------
        
        //----------- LED 1 -------------
        portd.f0=(consigne1>cpt);
 
        //----------- LED 2 -------------
        portd.f1=(consigne2>cpt);
 
        cpt++;
    }
}

 

Laisser un commentaire