7
Partie 1: Comment construire un port USB avec un PIC 18F4550 ou 18F2550 vue d'ensemble PIC 18F4550 et 18F2550 sont des microcontrôleurs puissantes, comprenant une interface compatible USB pleine vitesse V2.0. Avec ces MCU il est très facile pour l'amateur de concevoir des périphériques USB avec très peu de composants. Dans cette page, je vais décrire comment utiliser le firmware CDC de Microchip. Il permet d'émuler un port série avec un PC sous Windows ou Linux. Il est également très facile de construire des périphériques HID. La carte 18F4550 d'expérimentation Voici une photo de la carte d'expérimentation: Le schéma suivant est très simple, peu de composants sont nécessaires. Il s'agit d'un périphérique USB autoalimenté.

Partie’1:’Comment’construire’un’port’USB’’avec’un’PIC ... · noterquej'utiliselaOlimex’petitTICSD’programmeur,’si’vous’souhaitez’utiliser’un’autre’

Embed Size (px)

Citation preview

Partie  1:  Comment  construire  un  port  USB    avec  un  PIC  18F4550  ou  18F2550  

vue  d'ensemble    

PIC  18F4550  et  18F2550  sont  des  microcontrôleurs  puissantes,  comprenant  une  interface  compatible  USB  pleine  vitesse  V2.0.    

Avec  ces  MCU  il  est  très  facile  pour  l'amateur  de  concevoir  des  périphériques  USB  avec  très  peu  de  composants.    

Dans  cette  page,  je  vais  décrire  comment  utiliser  le  firmware  CDC  de  Microchip.  Il  permet  d'émuler  un  port  série  avec  un  PC  sous  Windows  ou  Linux.  Il  est  également  très  facile  de  construire  des  périphériques  HID.    

La  carte  18F4550  d'expérimentation    

Voici  une  photo  de  la  carte  d'expérimentation:    

 

 

Le  schéma  suivant  est  très  simple,  peu  de  composants  sont  nécessaires.  Il  s'agit  d'un  périphérique  USB  auto-­‐alimenté.  

 

noter  que  j'utilise  la  Olimex  petit-­‐ICSD  programmeur,  si  vous  souhaitez  utiliser  un  autre  programmeur  PIC  ICSP,    

vous  devez  supprimer  D1  et  D2  et  changer  le  connecteur    

Cet  appareil  est  compatible  avec  le  chargeur  de  démarrage  puce  USB    

 noter  C5  est  de  470nF  (la  fiche  recommande  220nF  mais  plus  c'est  mieux)  et  devrait  être  faible  ESR  (pour  par  exemple  un  multi-­‐couche  de  céramique).  N'oubliez  pas  les  découplages  100nF.    

Voici  une  mise  en  œuvre  possible    

 

 

Vous  pouvez  regarder  la  couleur  du  fil  de  votre  câble  USB:  Noir  =  masse,  rouge  =  +  5V,  Vert  =  Data  +,  blanc  =  Data-­‐    

le  logiciel    

Vous  pouvez  télécharger  MCHPFSUSB_Setup  sur  le  site  de  Microchip.  C'est  une  fenêtre  .exe  :(.  Le  firmware  va  utiliser  est  écrit  en  C  (pour  le  compilateur  C18  de  Microchip).  Ce  code  est  (royaltyes)  libre,  mais  ce  n'est  pas  un  logiciel  gratuit,  il  n'est  donc  pas  possible  de  redistribuer  le  code  source  modifié  dans  cette  archive,  vous  trouverez:    

• Le  son  code  source  en  C18  bootloader  USB      • Des  fenêtres  un  utilitaire  pour  le  chargeur  de  démarrage    • Le  code  source  du  firmware  CDC  (émulation  de  série)  en  C18.  Il  peut  être  utilisé    

avec  le  chargeur  de  démarrage  USB  sans  modification    

• Un  autre  le  micrologiciel  du  périphérique  HID    • Un  pilote  Windows  A  pour  CDC  (sous  linux  CDC-­‐ACM  est  supporté  nativement)    

Quelques  conseils  pour  vos  prototypes:    

Le  code  source  est  dans  le  fw  /  répertoire  cdc  /  MCHPUSB.mcw    

Vous  devez  commenter  les  lignes  suivantes  dans  usbcfg.h  pour  un  dispositif  usb  auto-­‐alimenté:    

#define  USE_SELF_POWER_SENSE_IO    

#define  USE_USB_BUS_SENSE_IO    

Sur  mon  schéma,  LED  sont  connectés  sur  le  port  B.  Donc,  vous  devriez  modifier  io_cfg.h    

#define  mLED_1  LATBbits.LATB0    

#define  mLED_2  LATBbits.LATB1    

#define  mLED_3  LATBbits.LATB2    

#define  mLED_4  LATBbits.LATB3    

Vous  pouvez  mettre  votre  propre  code  sur  user.c.  Par  exemple,  regardez  Exercise_Example  ()  dans  user.c.    

Les  Fonctions  utiles  sont  getsUSBUSART  ()  (obtenir  des  données)  et  putrsUSBUSART  ()  (mis  données  d'autres  le  port  série)    

Ne  pas  oublier  de  vérifier  mUSBUSARTIsTxTrfReady  ()  avant  d'envoyer  des  données.    

ce  sont  quelques  exemples  dans  le  répertoire  de  l'exercice.  Par  exemple,  le  programme  suivant  (à  mettre  dans  user.c)  passer  au  nombre  de  LED  4  lorsque  vous  appuyez  sur  la  touche  "1"  dans  le  terminal    

Ce  sont  quelques  exemples  dans  le  répertoire  d'exercice.  Par  exemple,  le  programme  suivant  (à  mettre  dans  user.c)  passer  au  nombre  de  LED  4  lorsque  vous  appuyez  sur  la  touche  "1"  dans  le  terminal    

void  Exercise_03  (void)  {  

si  (getsUSBUSART  (input_buffer,  1))    

{  

si  (input_buffer  [0]  ==  "1")    

mLED_4_Toggle  ();    

}    

Sous  Windows,  vous  devez  installer  le  pilote  fourni  et  vous  pouvez  utiliser  l'utilitaire  hyperterminal  (19200bd  avec  un  cristal  de  20MHz).  Sous  Linux,  consultez  le  module  cdc-­‐acm,  un  nouveau  périphérique  /  dev  /  ttyACM0  devrait  apparaître.    

Si  vous  ne  souhaitez  pas  utiliser  le  chargeur  de  démarrage,  vous  devez  supprimer  le  vecteur  remappage  section  dans  main.c  et  modifier  le  script  de  linker  (voir  important.readme.txt  dans  le  répertoire  des  sources)    

 

 

 

-­‐  Partie  2  -­‐  Application:  Comment  construire  un  thermomètre  USB  

Nous  allons  ajouter  un  capteur  de  température  pour  le  circuit  décrit  dans  la  première  partie.  Vous  pouvez  utiliser  le  circuit  LM35  (Fiche  technique),  ou  bien  d'autres  circuits  comme  MCP9701,  TC1047  ...    

Le  spectacle  schéma  suivant  comment  brancher  le  capteur  sur  notre  carte  USB  d'expérimentation:    

 

 

le  firmware    

Nous  allons  ajouter  du  code  pour  la  conversion  analogique  au  numérique    et  de  calcul  de  la  température  dans  le  fichier  user.x    

//  Ajoutons  includes  pour  ADC  et  manipulations  de  chaines  

#  include    

#  include    

#  include    

//  [...]    

//  Nous  allons  écrire  les  données  de  sortie  dans  cette  chaîne    

char  input_buffer  [64];    

//  [...]    

Void  Exercise_Example  vide  (void)    

{  

int  température;    

//  [...]    

else  if  (==  start_up_state  3)    

{  

if  (mUSBUSARTIsTxTrfReady  ())    

{  

//  A0    en  entrée    

TRISAbits.TRISA0  =  1;    

memset  (output_buffer,  '\  0',  64);    

output_buffer  [(6  *  5)]  =  '\  r';    

output_buffer  [(6  *  5)  +1]  =  '\  n';    

OpenADC  (ADC_FOSC_8  &  ADC_RIGHT_JUST  &  ADC_0_TAD,    

ADC_CH0  &  ADC_INT_OFF  &  ADC_VREFPLUS_VDD  &    

ADC_VREFMINUS_VSS,    

0b1011);    

SetChanADC  (ADC_CH0);    

Delay10TCYx  (50);    

ConvertADC  ();  //  Démarrer  la  conversion    

while  (BusyADC  ());  //  Attendre  pour  la  conversion  de  l'ADC    

temp  =  ReadADC  ();  //  Lire  la  suite  et  mettre  en  température    

CloseADC  ();  //  Désactiver  convertisseur  A  /  D    

temp  =  temp  /  7;  //  Convertir  en  degrés  centigrade  

itoa  (temp,  output_buffer);  //  Convertir  en  une  chaîne    

mUSBUSARTTxRam  ((octet  *)  output_buffer,  (6  *  5)  2);    

start_up_state  =  0;    

}    

}    

//}  fin  Exercise_Example    

La  valeur  en  degrés  Celsius  sera  envoyé  sur    le  bus  USB  lorsque  le  bouton  sur  RB4  sera  enfoncé.    

Sous  Windows,  vous  pouvez  utiliser  l'utilitaire  hyperterminal  (19200bd  avec  un  cristal  de  20MHz)  pour  voir  la  valeur.  Sous  Linux,  vous  pouvez  utiliser  cat  /  dev  /  ttyACM0.    

Comment  utiliser  un  18F2550    

Vous  pouvez  utiliser  le  code  source  pour  4550  avec  très  peu  de  modifications.  Il  suffit  de  sélectionner  le  dispositif  approprié  dans  le  menu  de  configuration  MPLAB.  Modifier  le  script  de  liaison,  et  régler  les  bits  de  configuration.  Supprimer  toute  référence  au  port  D  dans  io_cfg.h.    

Quelques  liens  sur  USB    

Donner  un  sens  à  la  norme  USB  (Beyomg  logic)    

Comprendre  USB  (usbdeveloper)    

USB  2.0  (usb.org)    

Les  spécifications  USB  1.1  (fichier  pdf)