A A A

Electronicfr.com

Home arrow Microcontroleurs et USB arrow Part 1 : Construire un périphérique USB avec un PIC 18F4550 24.07.2008

Menu principal

Home
Robotique
Microcontroleurs et Ethernet
Microcontroleurs et USB
Systèmes embarqués
Proposer un circuit

Search

Google
Web
electronicfr


Part 1 : Construire un périphérique USB avec un PIC 18F4550

Ecrit par Administrator, le 27-10-2007 13:30
Pages vues 58260    

Vous trouverez sur cette page les informations nécessaires (schémas électroniques, circuit imprimé, description du firmware) pour construire un périphérique USB (2.0 full-speed) avec les microcontrôleurs PIC 18F4550 ou 18F2550.

Ces microcontroleurs sont les successeurs des 16C745 et 16C765. Ils sont extrêmement simple à mettre en oeuvre et Microchip fournit des examples de firmwares très bien documentés. Pour nos expérimentations, nous utiliserons le firmware CDC permettant d'émuler un port série mais il est également facile de construire des périphériques HID.

La carte à 18F4550

Voici un schéma pour le 18F4550. Il y a très peu de composants additionnels. C'est un périphérique USB auto-alimenté par le bus USB.

 

Rq: Je travaille avec le programmeur tiny-ICSD d'Olimex, si vous utilisez un autre programmateur , il faut retirer les diodes D1 et D2 et remplacer le connecteur de programmation.

usb_schema

(cliquez sur l'image pour une version haute résolution)

Ce schéma est compatible avec le bootloader USB fournit par microchip.

C5 vaut 470nF (c'est à dire plus que les 220nF recommandés dans le datasheet) et doit être low ESR (faible résistance série), un céramique multicouche convient parfaitement. Il ne faut pas oublier les capacités de découplage de 100nF placées au plus prés des broches d'alimentation.

Voici une implémentation possible:

pcb

En cliquant sur l'image vous donwloaderez un PCB en 300dpi pour vos gravure.

Connectez bien votre cable USB: Noir=GND, Rouge=+5V, Vert=Data+, Blanc=Data-

4/1/2007 : IMPORTANT ERRATA. Il y a un petit bug sur le PCB. R5 doit etre connecté au +5V, pas à la masse (le schema est bon mais le PCB non) (Merci à Direk qui à vu le problème)

Le logiciel

Il faut commencer par récupérer le MCHPFSUSB_Setup  sur le site de Microchip. C'est un exécutable, il faut donc Windows pour récupérer les sources :(. Le firmware est écrit en C (compatible avec le compilateur Microchip C18). Le code est gratuit, mais pas libre.

   

Vous trouverez dans l'archive:

  • le bootloader USB avec sont code source en C
  • un utilitaire windows pour utiliser le bootloader
  • le code du firmware CDC (émulation série) en C18. Il peut être utilisé directement avec le bootloader sinon il faut faire quelques modifications
  • Un autre firmware pour les périphériques HID
  • un driver windows pour CDC (sous linux c'est supporté nativement par le module CDC-ACM sur tout les noyaux modernes)

 Comme je ne peux pas distribuer le code modifié, voici quelques indications pour vos prototypes.

Les sources du firmware CDC sont dans fw/cdc/MCHPUSB.mcw

Commentez les lignes suivantes dans usbcfg.h :

#define USE_SELF_POWER_SENSE_IO
#define USE_USB_BUS_SENSE_IO

 

Sur le schéma présenté, les LED systèmes sont sur le port B. Il est donc utile de modifier io_cfg.h

 

#define mLED_1              LATBbits.LATB0
#define mLED_2              LATBbits.LATB1
#define mLED_3              LATBbits.LATB2
#define mLED_4              LATBbits.LATB3

Placez vos applications perso dans user.c. Comme exemple vous pouvez regardez le fonctionnement de la fonction Exercise_Example() dans user.c.

Les fonctions utiles sont getsUSBUSART() (reception de données) et putrsUSBUSART() (envoie de données)

Pensez bien à vérifier l'état de mUSBUSARTIsTxTrfReady() avant d'envoyer des données.

D'autres exemples sont dans le répertoire exercice. Par exemple la fonction suivante (à appeler dans user.c) permet d'allumer ou d'éteindre la LED 4 en pressant la touche 1 dans le terminal.

void Exercise_03(void){
if(getsUSBUSART(input_buffer,1))
{
if(input_buffer[0] == '1')
mLED_4_Toggle();
}

Sous windows vous devez installer le driver fournit et vous pouvez utiliser hyperterminal comme émulateur de terminal (configurer les communications à 19200bd avec un quartz 20MHz si vous ne modifiez pas le code). Sous linux il faut s'assurer que le module cdc-acm se charge bien, un périphérique /dev/ttyACM0 doit apparaitre.


Si vous ne voulez pas utilisez le bootloader, il faut retirer la section vector remapping dans main.c et remplacer le linker script fournit par un linker script standard pour le 18F4550. (voir le fichier important.readme.txt fournit avec les sources)

 

[Note]Adaptations pour le 18F2550
Le code pour le 4550 est utilisable presque sans modification avec le 2550, vous devez selectionner 18F2550 dans le menu configure de MPLAB, changer le Linker Script et vérifier les bits de configuration (ils peuvent bouger en changeant de microcontroleurs dans MPLAB). Voir cette image pour vous aider. Il faut aussi retirer les références au port D dans io_cfg.h

Aide et discussions

Venez discuter sur le forum electronicfr.

Avertissement

L'ENSEMBRE LES INFORMATIONS DES CE SITE EST FOURNI « EN L'ÉTAT » ET SANS GARANTIE SPÉCIFIQUE OU IMPLICITE, Y COMPRIS, ET C'EST UNE LISTE NON EXHAUSTIVE, LES GARANTIES IMPLICITES DE QUALITÉ COMMERCIALE OU D'ADÉQUATION À UN OBJECTIF PARTICULIER.

A venir

Vous trouverez bientôt sur ce site des exemples de montages avec le 18F4550 dont bientôt un convertisseur USB<->serie.
Quote this article in website Print Related articles Save this to del.icio.us

Commentaires utilisateurs (3) Fil RSS des commentaires
Commentaires en langue: English (9), French (3)
Posté le Alain, le 17-02-2008 11:49, IP 82.241.45.83
1. PIC18F4550
Bonjour monsieur, 
 
Votre article sur le PIC18F4550 est formidable , car il résume clairement tout ce qui est nécesssaire à la réalisation d'une interface équipéé d'un pic 18F4550 , mais malgré cela mon montage ne fonctionne pas. 
 
Pouvez vous m'aider ou me donner des conseils sur cette réalisation. 
 
J'ai réalisé une carte pour programmer des PIC's (PC com1 RS232 vers ICSP) et une carte d'interface avec un 18F4550 ( connecteur ICSP pour la programmation , quartz 20MHZ ). 
 
Le programmeur de PIC et cette carte d'interface fonctionnent correctement avec des fichiers HEX pour la classe HID que j'ai trouvé sur internet ( exemples : je peux allumer les leds et relire 
des entrées logiques , tout fonctionne normalement. 
 
Mais je voudrais par moi-même développer des applications en me basant sur votre article. 
 
Voilà ce que j'ai réalisé pour tester mon montage: 
 
j'ai enlevé les barres commentaires dans le fichier usbcfg.h : 
#define USE_SELF_POWER_SENSE_IO 
#define USE_USB_BUS_SENSE_IO 
 
Dans le fichier _cfg.h j'ai bien modifié les defines suivants : 
#define mLED_1 LATBbits.LATB0 
#define mLED_2 LATBbits.LATB1 
#define mLED_3 LATBbits.LATB2 
#define mLED_4 LATBbits.LATB3 
 
Dans le fichier user.c j'ai placé l'exemple 3 
void Exercise_03(void){ 
if(getsUSBUSART(input_buffer,1 )) 

if(input_buffer[0] == '1') 
mLED_4_Toggle(); 

 
Comme je n'utilise pas de bootloader mais le technique ICSP 
 
J'ai remplacé rm18f4550.lkr par le 18f4550.lkr. 
J'ai supprimé dans le main.c le Vector Remapping.  
 
Je n'ai pas d'erreur de compilation et je retrouve bien le fichier MCHPUSB.hex 
dans le répertoire MCHPFSUSB/fw/Cdc/_output. 
 
J'ai téléchargé ce fichier MCHPUSB.hex via le connecteur ICSP avec WinPic800 
avec la configuration COM1 pour le JDM Programmer. 
 
Quand je branche le connecteur USB au PC pour la première fois , il me demande 
le driver correspondant , j'ai fourni le driver MCHPUSB.inf qui se trouve dans le répertoire 
MCHPFSUSB/Pc/MCHPFSUSB Driver/Release , Windows est satisfait de ce driver!. 
 
Ensuite j'ai essayé les logiciels Hyperterminal et REC232.EXE , j'ai testé la transmission 
RS232 et j'ai bien le caractère '1' = 31H transmis sur la ligne , mais aucunes led's ne répondent 
à cette commande. 
 
Pouvez m'aider! En vous remerçiant d'avance.
 
» Signaler ce commentaire à l'administrateur
» Répondre à ce commentaire
» Voir les 1 réponse(s)

Posté le Alain, le 18-02-2008 17:14, IP 129.104.38.5
2. 18F4550
Je vous remerçie d'abord pour toute l'aide que vous m'avez donnée et qui m'a permis d'avancer au développement de ma carte USB. 
 
Tous les exercices fonctionnent parfaitement sauf l'exercice 3 , je constate que la transmission 
de la carte vers le PC est correcte , mais du PC vers la carte , la transmission ne fonctionne pas . 
 
Donc si j'envoi le caractère '1' = 31H à partir du logiciel Hyperterminal (19600 bauds, 8,none, 1 bit stop) je n'arrive pas à commander le led sur la carte, celle-çi reste éteinte. 
 
Ce n'est pas un problème hardware de la carte , car si je charge le 18F4550 avec un soft que j'ai trouvé sur internet , je commande bien cette Led à partir du soft de commande en Delphi.
 
» Signaler ce commentaire à l'administrateur
» Répondre à ce commentaire
» Voir les 1 réponse(s)

Posté le Pico12, le 28-02-2008 16:52, IP 82.243.36.49
3. Pico12
Merci grâce à tes explications, et des explications trouvées sur d'autre site, j'ai réussi à faire un oscilloscope, avec un PIC 18F4550. 
Pour ceux qui serait interessés, tout mon proje est en ligne, à l'adresse suivante :  
http://pico12.free.fr/ oscilloscope/
 
» Signaler ce commentaire à l'administrateur
» Répondre à ce commentaire
» Voir les 7 réponse(s)

Ajouter votre commentaire



mXcomment 1.0.5 © 2007-2008 - visualclinic.fr
License Creative Commons - Some rights reserved
 
Suivant >
 
TOP