|
|
View previous topic :: View next topic |
Author |
Message |
J1M
Joined: 15 Feb 2005 Posts: 21
|
USB sample code PicUSB |
Posted: Fri Aug 26, 2005 4:54 pm |
|
|
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
|
|
Posted: Mon Aug 29, 2005 10:37 am |
|
|
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
|
|
Posted: Mon Aug 29, 2005 11:34 am |
|
|
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
|
|
Posted: Fri Sep 09, 2005 2:12 am |
|
|
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
|
|
Posted: Mon May 22, 2006 1:33 pm |
|
|
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
|
|
Posted: Mon May 22, 2006 1:40 pm |
|
|
The datasheet for the PIC. It is in there. |
|
|
ymoona
Joined: 20 Mar 2005 Posts: 32 Location: Heiloo, the Netherlands
|
|
Posted: Mon May 22, 2006 2:10 pm |
|
|
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
|
|
|
Mark
Joined: 07 Sep 2003 Posts: 2838 Location: Atlanta, GA
|
|
Posted: Wed May 24, 2006 7:11 am |
|
|
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
|
|
Posted: Wed May 24, 2006 11:21 am |
|
|
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
|
|
Posted: Wed May 24, 2006 12:09 pm |
|
|
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
|
|
Posted: Wed May 24, 2006 12:35 pm |
|
|
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
|
|
Posted: Wed May 24, 2006 2:02 pm |
|
|
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
|
|
Posted: Wed May 24, 2006 3:32 pm |
|
|
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
|
|
Posted: Fri May 26, 2006 6:43 am |
|
|
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 |
|
|
|
|
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
|