Dernière mise à jour le 04/01/2021

Présentation


Ne prenez surtout pas peur lorsque vous allez voir les lignes de programmation un peut plus bas ce n’est surtout pas le but alors resté un peu :-).
Nous allons voir ensemble comment envoyer des données en utilisant le port USB du PIC18F4550 (oui encore une fois ce µC….), et nous allons voir aussi qu’il est tout à fait possible de réaliser un genre de clavier alphanumérique par cette même liaison USB cela vous tente de rester encore un peu?
Niveau clavier j’ai juste fais l’essai avec les lettres de type A/B/C/Z, puis même chose avec le chiffre 5 – après tous si ça marche pour 5 ça fonctionne pour “0,1,2,3,4,6,7,8,9”. Ah oui!! j’ai même essayé les caractères spéciaux comme % ou /
Bien entendu je vous laisse imaginer ce qu’il est possible de réaliser avec le programme qui va suivre. Le but n’est pas de réaliser un clavier d’ordinateur qui peut être raccordé via un port USB mais de vous donner quelle que ligne de code pour que vous puissiez lire un fichier TXT et l’afficher puis écrire à la suite des caractères et d’afficher ces résultats via ce petit logiciel que j’ai développé sans prétention et accessible depuis mon site à ce lien Logiciel: Interface UsbHid – Affichage texte

Schéma



(Clique pour agrandir)

Niveau schéma rien de bien compliqué. Notre quartz de 8Mhz, quelque boutons poussoir qui vont permettent d’envoyer les données sur le logiciel Interface_UsbHid_Lecture_De_Texte avec le PORTB qui donne:

RB0_bit : Lecture du texte
RB1_bit : Ecrire caractère ‘A’
RB2_bit : Ecrire caractère ‘B’
RB3_bit : Ecrire caractère ‘C’
RB4_bit : Ecrire caractère ‘Z’
RB5_bit : Ecrire caractère ‘5’
RB6_bit : Ecrire caractère ‘%’
RB7_bit : Ecrire caractère ‘/’

Je vous laisse tester …

Programmation assez longues …. MikroC


Bon nous y voilà !! retroussons nos manches et avant de lire essayons de prendre du recule sur ce code. Tout d’abord, je vous laisse vous rendre sur cette page Configuration port USB – VID/PID “Pour la familles des PIC 18F Réglages dans Edit Project” afin de bien régler l’horloge de votre PIC18F4550 et l’alimentation du VUSB. Suivez bien les captures d’écran.
Le code est découpé en 5 fonctions différentes qui sont:

// Affichage texte UsbHid – MikroC – Electronique71.com
void interrupt()
{

  USB_Interrupt_Proc(); // La maintenance USB est effectuée à l'intérieur de l'interruption
}

void init()
{
  // Initialisation du PIC18F4550
}



// Fonction pour l'écriture sur le port USB
void Ecriture(unsigned char* sText)
{
  // C'est dans cette boucle que nous allons envoyer les données
}



// Fonction pour l'écriture caractère par caractère sur le port USB
void Ecriture_Char(unsigned char sText)
{
  // Envoyer des caractères tour à tour (pour clavier par exemple...)
}



// Programme principal
void main()
{

  init(); // Initialisation du PIC 18F4550

  while(1)
  {
    // Ecrtiure caractère ".."
    // C'est dans le programme plus précisement la boucle while ou nous allons réaliser la gestion des touches
    else if ((PORTB.B0 == 1) && (Ecriture_Char_0 == FALSE))
    {
      Ecriture_Char_1 = TRUE;
      sText_4_Char = '%';
      Ecriture_Char(sText_1_Char);
    }
    else if ((PORTB.B1 == 0) && (Ecriture_Char_1 == TRUE))
    {
      Ecriture_Char_1 = FALSE;
    }
  }
}

Et ci-dessous le code que vous pouvez désormais copier et coller.
Attention: Lorsque vous allez coller le code dans MikroC, et le compiler vous allez avoir un message d’erreur ! En effet, les guillemets sont mal interprétés et il faudra les corriger en début et fin de chaine de caractère voir capture ci-dessous:


En ce qui concerne la configuration de l’horloge faire ceci:

// Affichage texte UsbHid – MikroC – Electronique71.com
#define TRUE 1
#define FALSE 0

unsigned char readbuff[64] absolute 0x500;// Les tampons doivent être dans la RAM USB
unsigned char writebuff[64] absolute 0x540;

int i;
int iCountChar = 0;

unsigned char Ecriture_HID = FALSE;
unsigned char Stop_Ecriture_HID = FALSE;
unsigned char Ecriture_Char_HID = FALSE;
unsigned char Ecriture_Ajout_Char_HID = FALSE;

unsigned char Ecriture_Char_1 = FALSE;
unsigned char Ecriture_Char_2 = FALSE;
unsigned char Ecriture_Char_3 = FALSE;
unsigned char Ecriture_Char_4 = FALSE;
unsigned char Ecriture_Char_5 = FALSE;
unsigned char Ecriture_Char_6 = FALSE;
unsigned char Ecriture_Char_7 = FALSE;

unsigned char* sText_1 = “0123456789”;
unsigned char* sText_2 = “Bonjour a tous et bienvenue sur mon site !!”;
// En fin de ligne -> \r\n
// -> \r = retour chariot
#// -> \n = saut de ligne
unsigned char* sText_3 = “Texte n°0 -> Depuis trois mois depuis trois mois et une semaine je m’echine ailleurs et le tres long texte n’a pas avance d’un poil pas beaucoup sans doute est-ce mon cote velleitaire qui ne cesse de me jouer des tours et les meandres du tres long texte \r\n\r\n”

“Text n°1 -> Depuis trois mois depuis trois mois et une semaine je m’echine ailleurs et le tres long texte n’a pas avance d’un poil pas beaucoup sans doute est-ce mon cote velleitaire qui ne cesse de me jouer des tours et les meandres du tres long texte \r\n\r\n”

“Texte n°2 -> Depuis trois mois depuis trois mois et une semaine je m’echine ailleurs et le tres long texte n’a pas avance d’un poil pas beaucoup sans doute est-ce mon cote velleitaire qui ne cesse de me jouer des tours et les meandres du tres long texte \r\n”

“FIN ECRITURE”;

unsigned char* sString_Copy = “”;
unsigned char* sText_4_Char;

void interrupt()
{

  USB_Interrupt_Proc(); // La maintenance USB est effectuée à l'intérieur de l'interruption
}

void init()
{
  CMCON = 0x07; // On désctive les comparateurs
  ADON_bit = 0; // On désactive le convertisseur A/N
  ADCON1 = 0xFFFF; // On configure toutes les broches en Digital

  TRISA = 0x01; // Broche RA1 config comme entrée et le reste en sortie
  PORTA = 0x00;
  LATA = 0x00;

  TRISB = 0xFF;  // Toutes les broches du PORTB sont configurées comme entrées
  PORTB = 0x00;
  LATB = 0x00;

  HID_Enable(&readbuff,&writebuff); // Initialisation USB

  delay_ms(100); // On attend un peu la fin de l'initialisation
}



// Fonction pour l'écriture sur le port USB
void Ecriture(unsigned char* sText)
{
  while ( iCountChar != strlen(sText))  // On compte le nbr de caractères
  {
    // On vide le Buffer avant l'écriture
    for(i = 0 ; i < 64  ; ++i)
    {
      writebuff[i] = 0;
    }

    // On ajoute les caractère pour la nouvelle écriture
    for(i = 0 ; i < 64  ; ++i)
    {
      writebuff[i] = sText[iCountChar];
      if (iCountChar == strlen(sText))
      {
        Stop_Ecriture_HID = TRUE;
        HID_Write(&writebuff,64);
        break;
      }

      ++iCountChar;
    }

    if (Stop_Ecriture_HID == TRUE)
    {
      iCountChar = 0;
      break;
    }
    else
    {
      HID_Write(&writebuff,64);
    }
  }
}



// Fonction pour l'écriture caractère par caractère sur le port USB
void Ecriture_Char(unsigned char sText)
{
  // On vide le Buffer avant l'écriture
  for(i = 0 ; i < 64  ; ++i)
  {
    writebuff[i] = 0;
  }

  // On ajoute le caractère pour la nouvelle écriture
  writebuff[0] = sText;
  HID_Write(&writebuff,64);
}



// Programme principal
void main()
{

  init(); // Initialisation du PIC 18F4550

  while(1)
  {
    // Ecriture -> texte
    if ((PORTB.B0 == 1) && (Ecriture_HID == FALSE) && (Stop_Ecriture_HID == FALSE))
    {
      Ecriture_HID = TRUE;
      Ecriture(sText_3); // -> changer sText_3 par: sText_1 ou sText_2 ou sText_3
    }
    else if ((PORTB.B0 == 0) && (Ecriture_HID == TRUE) && (Stop_Ecriture_HID == TRUE))
    {
      Ecriture_HID = FALSE;
      Stop_Ecriture_HID = FALSE;
    }


    // Ecrtiure caractère  -> lettre A
    else if ((PORTB.B1 == 1) && (Ecriture_Char_1 == FALSE))
    {
      Ecriture_Char_1 = TRUE;
      sText_4_Char = 'A';
      Ecriture_Char(sText_4_Char);
    }
    else if ((PORTB.B1 == 0) && (Ecriture_Char_1 == TRUE))
    {
      Ecriture_Char_1 = FALSE;
    }


    // Ecrtiure caractère  -> lettre B
    else if ((PORTB.B2 == 1) && (Ecriture_Char_2 == FALSE))
    {
      Ecriture_Char_2 = TRUE;
      sText_4_Char = 'B';
      Ecriture_Char(sText_4_Char);
    }
    else if ((PORTB.B2 == 0) && (Ecriture_Char_2 == TRUE))
    {
      Ecriture_Char_2 = FALSE;
    }


    // Ecrtiure caractère  -> lettre C
    else if ((PORTB.B3 == 1) && (Ecriture_Char_3 == FALSE))
    {
      Ecriture_Char_3 = TRUE;
      sText_4_Char = 'C';
      Ecriture_Char(sText_4_Char);
    }
    else if ((PORTB.B3 == 0) && (Ecriture_Char_3 == TRUE))
    {
      Ecriture_Char_3 = FALSE;
    }


    // Ecrtiure caractère  -> lettre Z
    else if ((PORTB.B4 == 1) && (Ecriture_Char_4 == FALSE))
    {
      Ecriture_Char_4 = TRUE;
      sText_4_Char = 'Z';
      Ecriture_Char(sText_4_Char);
    }
    else if ((PORTB.B4 == 0) && (Ecriture_Char_4 == TRUE))
    {
      Ecriture_Char_4 = FALSE;
    }


    // Ecrtiure caractère  -> chiffre 5
    else if ((PORTB.B5 == 1) && (Ecriture_Char_5 == FALSE))
    {
      Ecriture_Char_5 = TRUE;
      sText_4_Char = '5';
      Ecriture_Char(sText_4_Char);
    }
    else if ((PORTB.B5 == 0) && (Ecriture_Char_5 == TRUE))
    {
      Ecriture_Char_5 = FALSE;
    }


    // Ecrtiure caractère  -> caractere speciale "%"
    else if ((PORTB.B6 == 1) && (Ecriture_Char_6 == FALSE))
    {
      Ecriture_Char_6 = TRUE;
      sText_4_Char = '%';
      Ecriture_Char(sText_4_Char);
    }
    else if ((PORTB.B6 == 0) && (Ecriture_Char_6 == TRUE))
    {
      Ecriture_Char_6 = FALSE;
    }


    // Ecrtiure caractère  -> caractere speciale "/"
    else if ((PORTB.B7 == 1) && (Ecriture_Char_7 == FALSE))
    {
      Ecriture_Char_7 = TRUE;
      sText_4_Char = '/';
      Ecriture_Char(sText_4_Char);
    }
    else if ((PORTB.B7 == 0) && (Ecriture_Char_7 == TRUE))
    {
      Ecriture_Char_7 = FALSE;
    }
  }
}

Je vous laisse réflechir …

Historiques


04/01/2021
-1er mise à disposition