CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

USB sample code PicUSB
Goto page 1, 2  Next
 
Post new topic   Reply to topic    CCS Forum Index -> Code Library
View previous topic :: View next topic  
Author Message
J1M



Joined: 15 Feb 2005
Posts: 21

View user's profile Send private message Visit poster's website

USB sample code PicUSB
PostPosted: Fri Aug 26, 2005 4:54 pm     Reply with quote

Antes de comenzar querr�a agradecer a Mat Clayton el valios�simo aporte de su API para C#, sin la cual estar�a aun d�ndome cabezazos intentando entender porqu� no me le�a la DLL!! Gracias Mat!
Dedico este proyectillo a todos los usuarios del foro TodoPIC, ese pedazo punto de encuentro para todos los PicMan�acos!

PicUSB se ha hecho con la intenci�n de proporcionar un primer empuj�n para todos aquellos que quieren arrancar con los dise�os por USB y que como supongo que a muchos nos ha pasado, no saben por donde engancharlo!

El proyecto en s� es bastante sencillito, pretende mostrar como enviar/recibir datos por USB desde el PIC al PC, he intentado que el programa fuera entendible, por lo que realmente no tiene ninguna utilidad mas que como digo, servir de introducci�n al mundo del USB.

Est� pensado para ser usado sobre la misma plaquita del programador GTP USB (en cualquiera de sus versiones), puesto que el funcionamiento del PicUSB se limita a encender/apagar cada uno de los colores del led bicolor, y a realizar una suma de dos operandos, y no ten�a ganas de montarlo todo en una protoboard!, los que a�n no teng�is el GTP USB, podr�is encontrar el GTP USB Lite aqu�:
http://perso.wanadoo.es/j1m/index.htm



El proyecto consta de tres partes:
- Programaci�n de la aplicaci�n para el PIC
- Programaci�n de la aplicaci�n para PC
- Edici�n del Driver suministrado por Microchip

Para la programaci�n de la aplicaci�n para el PIC se opt� por usar el extendido compilador CCS, he utilizado para ello la versi�n 3.227, el cu�l podr�is encontrar por los medios habituales ;)
El c�digo de la aplicaci�n lo pod�is encontrar en el PicUSB_CCS.zip, as� como el .hex para ser programado en el PIC. Tanto el PicUSB.c, como el PicUSB.h est� mas o menos documentado en un perfecto Spanglish, ya que el proyecto est� basado en el ex_usb_scope.c suministrado por CCS, lo siento por quien no se lleve muy bien con el Ingl�s, pero hay cosas que no se como traducirlas al Espa�ol y me estreso!! Jeje.
Decid� usar el 18F2550 ya que era el que ten�a por aqu� disponible, pero puede usarse cualquiera de la serie 18Fxx5x que incorporan el USB 2.0.

Para la programaci�n de la aplicaci�n para PC se opt� por usar el Visual C# Express 2005, actualmente va por la beta 2 y puede ser descargado gratuitamente de la p�gina de Microsoft, aqui os pongo el link:
http://lab.msdn.microsoft.com/express/vcsharp/default.aspx
He decidido usar este lenguaje ya que no conoc�a ning�n lenguaje y bueno, ya que hab�a que empezar con alguno, pues me decid� a hacerlo con el m�s nuevo, adem�s de que Microsoft lo suministra gratuitamente y eso no pasa todos los dias! Es un lenguaje con much�simas posibilidades y es relativamente f�cil empezar a hacer alguna cosilla con �l.Los que no os descargueis esta version del Visual C#, necesitareis tener instalada la �ltima version del .NET Framework, para poder ejecutar el PicUSB.exe, aqu� lo podeis descargar:
http://www.microsoft.com/downloads/details.aspx?displaylang=es&FamilyID=7abd8c8f-287e-4c7e-9a4a-a4ecff40fc8e
Pod�is encontrar el c�digo fuente en PicUSB_VisualC#.zip, donde tambi�n ver�is funciones_dll.txt en el que se detalla el uso de las funciones contenidas en la mpusbapi.dll proporcionada por Microchip, el c�digo no est� demasiado comentado, ya que he usado la API suministrada por Mat Clayton un poco a ojos cerrados, pero vamos creo que no hay problema para entender el uso de las funciones mas habituales.

El �ltimo paso ha sido la edici�n del Driver suministrado por Microchip para ser usado junto con la DLL, no tiene mucha historia, encontrar�is un leeme.txt dentro de PicUSB_Driver.zip donde se explica como editar el PicUSB.inf, a continuaci�n os explico como instalar el driver para los que no lo teng�is muy claro.

Al conectar el PicUSB por primera vez, nos saldr� el asistente para la instalaci�n de nuevo hardware, marcamos la opci�n de "instalar desde una lista o ubicaci�n espec�fica", le damos a siguiente, en la siguiente pantalla marcamos la opci�n de "Buscar el controlador m�s adecuado en estas ubicaciones", pinchamos sobre "Incluir esta ubicaci�n en la b�squeda", le damos a Examinar, y seleccionamos la carpeta PicUSB_Driver, le damos a Aceptar, y a Siguiente, nos saldr� una pantalla de advertencia, le damos a aceptar, y la instalaci�n del Driver estar� terminada y el led del GTP USB Lite habr� pasado de estar rojo a verde y estar� listo para ser usado.

Dentro del PicUSB_APP.zip podr�is encontrar la aplicaci�n PicUSB.exe as� como la dll necesaria suministrada por Microchip. El funcionamiento es sencillo



En la parte superior podemos encontrar el sumador, introducimos dos n�meros del 00 hasta el 99 en cada uno de los sumandos, pinchamos sobre PIC Suma! Y estos dos operandos ser�n enviados al PIC, donde se procesar� la suma, devolviendo entonces el resultado que se mostrar� en la tercera casilla.
Por otro lado tenemos los botones, Leds Off, Led Verde On y Led Rojo On, que env�an el c�digo correspondiente para cada uno de los casos.
Al hacer click sobre la imagen se abrir� vuestro explorador web por defecto para llevaos a mi p�gina J1MWeB :p

Para programar el PIC os recomiendo usar el WinPIC800 creado por Sisco, pod�is descargarlo de aqu�:
http://perso.wanadoo.es/siscobf/winpic800.htm

Os dejo a continuaci�n el link para descargar el proyecto:
http://perso.wanadoo.es/j1m/index.htm
http://perso.wanadoo.es/j1m/proyectos/picusb/picusb.zip

Para cualquier duda pod�is encontrarme en: [email protected]

Jaime Fern�ndez-Caro Belmonte
Rocket



Joined: 29 Aug 2005
Posts: 27

View user's profile Send private message

PostPosted: Mon Aug 29, 2005 10:37 am     Reply with quote

Hi J1M.
For those who only speak english, could you please translate when you have time?

Thanks.

Kind regards.
_________________
J.I.L.
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Mon Aug 29, 2005 11:34 am     Reply with quote

You can use this online translator:
http://babelfish.altavista.com/
Go down to the bottom of that page, and just copy in the whole URL
of this page into the box "for Translate a Web page". Then select
"Spanish to English", click the Translate button and wait a short time.
The translation is basically readable.
yolanda1



Joined: 06 Sep 2005
Posts: 0

View user's profile Send private message

PostPosted: Fri Sep 09, 2005 2:12 am     Reply with quote

Hi

All in this example work Ok, but is posible change parameters in picusb.h by change icon "??" in control panel ?

Windows assign "??" to PicUsb

This is picusb.h

Thanks for help


/////////////////////////////////////////////////////////////////////////
//// PicUSB.h ////
//// ////
//// Este ejemplo muestra como configurar el dispositivo USB y sus ////
//// descriptores. Los �nicos cambios con respecto a su veri�n ////
//// original (usb_desc_scope.h) han sido realizados en el apartado ////
//// start device descriptors, concretamente el vendor y product id ////
//// y en apartado de start string descriptors, para definir el ////
//// nombre del dispositivo y la compa�ia. ////
//// ////
//// Realizado con el compilador CCS PCWH 3.227 ////
//// ////
//// Por: Jaime Fern�ndez-Caro Belmonte [email protected] ////
//// ////
//// http://perso.wanadoo.es/j1m/index.htm ////
/////////////////////////////////////////////////////////////////////////

#IFNDEF __USB_DESCRIPTORS__
#DEFINE __USB_DESCRIPTORS__

#include <usb.h>

//////////////////////////////////////////////////////////////////
///
/// start config descriptor
/// right now we only support one configuration descriptor.
/// the config, interface, class, and endpoint goes into this array.
///
//////////////////////////////////////////////////////////////////

#DEFINE USB_TOTAL_CONFIG_LEN 32 //config+interface+class+endpoint

//configuration descriptor
char const USB_CONFIG_DESC[] = {
//config_descriptor for config index 1
USB_DESC_CONFIG_LEN, //length of descriptor size
USB_DESC_CONFIG_TYPE, //constant CONFIGURATION (0x02)
USB_TOTAL_CONFIG_LEN,0, //size of all data returned for this config
1, //number of interfaces this device supports
0x01, //identifier for this configuration. (IF we had more than one configurations)
0x00, //index of string descriptor for this configuration
0xC0, //bit 6=1 if self powered, bit 5=1 if supports remote wakeup (we don't), bits 0-4 reserved and bit7=1
0x32, //maximum bus power required (maximum milliamperes/2) (0x32 = 100mA)

//interface descriptor 0 alt 0
USB_DESC_INTERFACE_LEN, //length of descriptor
USB_DESC_INTERFACE_TYPE, //constant INTERFACE (0x04)
0x00, //number defining this interface (IF we had more than one interface)
0x00, //alternate setting
2, //number of endpoints, not counting endpoint 0.
0xFF, //class code, FF = vendor defined
0xFF, //subclass code, FF = vendor
0xFF, //protocol code, FF = vendor
0x00, //index of string descriptor for interface

//endpoint descriptor
USB_DESC_ENDPOINT_LEN, //length of descriptor
USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (0x05)
0x81, //endpoint number and direction (0x81 = EP1 IN)
0x02, //transfer type supported (0 is control, 1 is iso, 2 is bulk, 3 is interrupt)
USB_EP1_TX_SIZE,0x00, //maximum packet size supported
0x01, //polling interval in ms. (for interrupt transfers ONLY)

//endpoint descriptor
USB_DESC_ENDPOINT_LEN, //length of descriptor
USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (0x05)
0x01, //endpoint number and direction (0x01 = EP1 OUT)
0x02, //transfer type supported (0 is control, 1 is iso, 2 is bulk, 3 is interrupt)
USB_EP1_RX_SIZE,0x00, //maximum packet size supported
0x01, //polling interval in ms. (for interrupt transfers ONLY)

};

//****** BEGIN CONFIG DESCRIPTOR LOOKUP TABLES ********
//since we can't make pointers to constants in certain pic16s, this is an offset table to find
// a specific descriptor in the above table.

//NOTE: DO TO A LIMITATION OF THE CCS CODE, ALL HID INTERFACES MUST START AT 0 AND BE SEQUENTIAL
// FOR EXAMPLE, IF YOU HAVE 2 HID INTERFACES THEY MUST BE INTERFACE 0 AND INTERFACE 1
#define USB_NUM_HID_INTERFACES 0

//the maximum number of interfaces seen on any config
//for example, if config 1 has 1 interface and config 2 has 2 interfaces you must define this as 2
#define USB_MAX_NUM_INTERFACES 1

//define how many interfaces there are per config. [0] is the first config, etc.
const char USB_NUM_INTERFACES[USB_NUM_CONFIGURATIONS]={1};

#if (sizeof(USB_CONFIG_DESC) != USB_TOTAL_CONFIG_LEN)
#error USB_TOTAL_CONFIG_LEN not defined correctly
#endif


//////////////////////////////////////////////////////////////////
///
/// start device descriptors
///
//////////////////////////////////////////////////////////////////

//device descriptor
char const USB_DEVICE_DESC[] ={
USB_DESC_DEVICE_LEN, //the length of this report
0x01, //constant DEVICE (0x01)
0x10,0x01, //usb version in bcd
0x00, //class code (if 0, interface defines class. FF is vendor defined)
0x00, //subclass code
0x00, //protocol code
USB_MAX_EP0_PACKET_LENGTH, //max packet size for endpoint 0. (SLOW SPEED SPECIFIES 8)
0xD8,0x04, //vendor id (0x04D8 is Microchip)
0x11,0x00, //product id, me gusta el 11 ;)
0x01,0x00, //device release number
0x01, //index of string description of manufacturer. therefore we point to string_1 array (see below)
0x02, //index of string descriptor of the product
0x00, //index of string descriptor of serial number
USB_NUM_CONFIGURATIONS //number of possible configurations
};


//////////////////////////////////////////////////////////////////
///
/// start string descriptors
/// String 0 is a special language string, and must be defined. People in U.S.A. can leave this alone.
///
/// You must define the length else get_next_string_character() will not see the string
/// Current code only supports 10 strings (0 thru 9)
///
//////////////////////////////////////////////////////////////////

//the offset of the starting location of each string.
//offset[0] is the start of string 0, offset[1] is the start of string 1, etc.
const char USB_STRING_DESC_OFFSET[]={0,4,12};

#define USB_STRING_DESC_COUNT sizeof(USB_STRING_DESC_OFFSET)

char const USB_STRING_DESC[]={
//string 0
4, //length of string index
USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
0x09,0x04, //Microsoft Defined for US-English
//string 1 --> la compa�ia del producto ???
8, //length of string index
USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
'J',0,
'1',0,
'M',0,
//string 2 --> nombre del dispositivo
22, //length of string index
USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
'J',0,
'1',0,
'M',0,
' ',0,
'P',0,
'i',0,
'c',0,
'U',0,
'S',0,
'B',0
};


#ENDIF
ymoona



Joined: 20 Mar 2005
Posts: 32
Location: Heiloo, the Netherlands

View user's profile Send private message Visit poster's website

PostPosted: Mon May 22, 2006 1:33 pm     Reply with quote

is it possible to make is work with a 6, 16 or 20MHz crystal.

Im confused how to set up the crystal
_________________
checkout my site: www.ymoona.com/wiki
Mark



Joined: 07 Sep 2003
Posts: 2838
Location: Atlanta, GA

View user's profile Send private message Send e-mail

PostPosted: Mon May 22, 2006 1:40 pm     Reply with quote

The datasheet for the PIC. It is in there.
ymoona



Joined: 20 Mar 2005
Posts: 32
Location: Heiloo, the Netherlands

View user's profile Send private message Visit poster's website

PostPosted: Mon May 22, 2006 2:10 pm     Reply with quote

Mark wrote:
The the datasheet for the PIC. It is in there.


what I get from the data sheet on page 30 (32 of 430)
I should only change the pll prescaler from PLL3 to PLL4

but that doesn't work, am I forgetting something?
_________________
checkout my site: www.ymoona.com/wiki
ymoona



Joined: 20 Mar 2005
Posts: 32
Location: Heiloo, the Netherlands

View user's profile Send private message Visit poster's website

PostPosted: Wed May 24, 2006 7:01 am     Reply with quote

nobody?
_________________
checkout my site: www.ymoona.com/wiki
Mark



Joined: 07 Sep 2003
Posts: 2838
Location: Atlanta, GA

View user's profile Send private message Send e-mail

PostPosted: Wed May 24, 2006 7:11 am     Reply with quote

Post your setup code and the frequency of your xtal. Also whether you are trying to do low or full speed.
ymoona



Joined: 20 Mar 2005
Posts: 32
Location: Heiloo, the Netherlands

View user's profile Send private message Visit poster's website

PostPosted: Wed May 24, 2006 11:21 am     Reply with quote

this is my code so far.

Code:

#include <18F2550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL4,VREGEN,CPUDIV1
#use delay(clock=48000000)


// hardware pin defines
#define LED1 PIN_B0
#define LED2 PIN_B1
#define LED3 PIN_B2
#define LED4 PIN_B3
#define LED5 PIN_B4
#define LED6 PIN_B5

#define SW1 input(PIN_A4)
#define SW2 input(PIN_A5)
#define SW3 input(PIN_C0)
#define SW4 input(PIN_C6)
#define SW5 input(PIN_C7)

/////////////////////////////////////////////////////////////////////////////
//
// CCS Library dynamic defines.  For dynamic configuration of the CCS Library
// for your application several defines need to be made.  See the comments
// at usb.h for more information
//
/////////////////////////////////////////////////////////////////////////////
#define USB_HID_DEVICE     FALSE             //deshabilitamos el uso de las directivas HID
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for IN bulk/interrupt transfers
#define USB_EP1_RX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE    1                 //size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE    3                 //size to allocate for the rx endpoint 1 buffer

#include <pic18_usb.h>     //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include <PicUSB.h>          //Configuraci�n del USB y los descriptores para este dispositivo
#include <usb.c>           //handles usb setup tokens and get descriptor reports

#define modo      recibe[0]
#define param1    recibe[1]
#define param2    recibe[2]
#define resultado envia[0]

void main(void) {

   int8 recibe[3];                  //declaramos variables
   int8 envia[1];

   output_low(LED1);                   //encendemos led rojo
   output_high(LED2);

   usb_init();                      //inicializamos el USB

   usb_task();                      //habilita periferico usb e interrupciones
   usb_wait_for_enumeration();      //esperamos hasta que el PicUSB sea configurado por el host

   output_low(LED2);
   output_high(LED1);                    //encendemos led verde

   while (TRUE)
   {
      if(usb_enumerated())          //si el PicUSB est� configurado
      {
         if (usb_kbhit(1))          //si el endpoint de salida contiene datos del host
         {
            usb_get_packet(1, recibe, 3); //cojemos el paquete de tama�o 3bytes del EP1 y almacenamos en recibe

            if (modo == 0) // Modo_Suma
            {
               resultado = param1 + param2;  //hacemos la suma

               usb_put_packet(1, envia, 1, USB_DTS_TOGGLE); //enviamos el paquete de tama�o 1byte del EP1 al PC
            }

            if (modo == 1) // Modo_Led
            {
               if (param1 == 0) {output_low(LED1); output_low(LED2);} //apagamos los leds
               if (param1 == 1) {output_high(LED1); output_low(LED2);} //encendemos led verde
               if (param1 == 2) {output_low(LED1); output_high(LED2);} //encendemos led rojo
            }
         }
      }
   }
}


right now I use a 16MHz xtal.
I'm trying to use full speed USB (12Mb/s)

when plug in the USB cable led1 is off and led2 is on. but my laptop doesn't show any new hardware

the hardware I use is
http://www.velleman.be/nl/en/product/view/?id=351346
_________________
checkout my site: www.ymoona.com/wiki
Mark



Joined: 07 Sep 2003
Posts: 2838
Location: Atlanta, GA

View user's profile Send private message Send e-mail

PostPosted: Wed May 24, 2006 12:09 pm     Reply with quote

The schematic for that board show a 6MHz xtal. Did you change this? Did you use the right capacitors? The schematic also shows a pullup on D- which is for low speed. If you want full speed, the pullup should be on D+.
ymoona



Joined: 20 Mar 2005
Posts: 32
Location: Heiloo, the Netherlands

View user's profile Send private message Visit poster's website

PostPosted: Wed May 24, 2006 12:35 pm     Reply with quote

Mark wrote:
The schematic for that board show a 6MHz xtal. Did you change this? Did you use the right capacitors? The schematic also shows a pullup on D- which is for low speed. If you want full speed, the pullup should be on D+.


I did change the xtal because i tought 6MHz was a problem, I didn't change the caps (I will do it now). low speed isnt a problem, shoult I change the software, to make it lowspeed?

the caps are now 22pf so that should be fine now for a 16Mhz xtal.
_________________
checkout my site: www.ymoona.com/wiki
Mark



Joined: 07 Sep 2003
Posts: 2838
Location: Atlanta, GA

View user's profile Send private message Send e-mail

PostPosted: Wed May 24, 2006 2:02 pm     Reply with quote

For low speed the osc configuration is not as flexible. Reread the section in the datasheet. For a 16MHz operation, you'll need full speed. You can either move the pullup to the other pin (D+) or remove it and use the internal pullup.
ymoona



Joined: 20 Mar 2005
Posts: 32
Location: Heiloo, the Netherlands

View user's profile Send private message Visit poster's website

PostPosted: Wed May 24, 2006 3:32 pm     Reply with quote

Mark wrote:
For low speed the osc configuration is not as flexible. Reread the section in the datasheet. For a 16MHz operation, you'll need full speed. You can either move the pullup to the other pin (D+) or remove it and use the internal pullup.


I've adjusted the restor.
looking on the data sheet on page 24
I configure an
HSPLL
I put the PLL prescaler on PPL4 so the output is 4MHz, so USB freq should 96/2= 48MHz
I turn on the CPUDIV1 so the working frequency of the PIC is 96/2 = 48MHz

this is the config so far

#include <18F2550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL4,CPUDIV1,VREGEN
#use delay(clock=48000000)


some times when I connect the device windows tells me "unkows device"
so I think I'm making some progress....

but do you see thing why it shouldn'y work?
_________________
checkout my site: www.ymoona.com/wiki
ymoona



Joined: 20 Mar 2005
Posts: 32
Location: Heiloo, the Netherlands

View user's profile Send private message Visit poster's website

PostPosted: Fri May 26, 2006 6:43 am     Reply with quote

Ive now remode r35, the resistor on D+.
and now the hardware works fine and in recogniced and installed by windows.

but I face another problem, the PC software...
every time I start it up. It craches, no error codes.

Is this a familliar problem?

btv Ive installed .NET framework 2.0

edit:
Ive recompiled the source and now it working just fine!!
_________________
checkout my site: www.ymoona.com/wiki
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> Code Library All times are GMT - 6 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group