Control de dispositivos a través del módulo USB del PIC18F45/2550

Vaya, vas como un campeón, a por todas. Yo estoy trabado con mi proyecto en la parte de que no se leer con el datagridview los log de la base de datos. Desde que me funcione esta parte, ya puedo empezar acabar lo demás que si se manejar.

En tu proyecto estás haciendo el USB, junto con el FAT y red. Lo veo muy duro, aún así, ánimo...
 
Lo de red está durisimo....... lo de FAT está en proceso muy "recien nacido de busqueda de información" lo de USB va muy bien. Ahora tambien tengo proyectos como la controladora de 3 motores PAP i2c mediante USB y un amplificador de 400W reales que va encaminado en la hoja de diseño del PCB.

Unos de mis proyectos tambien es el del control de 8 cargas y lectura de 4 señales a través de internet.
 
Moyano Jonathan

Gracias por el codigo, sigo intentando hacerlo funcionar pero evidentemente mi problema es otro, cuando lo descubra lo sabran por las dudas sirva a alguien. ¡¡Muy bueno el manual !
 
Bueno me alegro de que les haya gustado ! Matquin tu problema me tiene bastante intrigado.
Si no es mucho pedir podrías describirme exactamente cuales son tus problemas a la hora de comunicarte
 
Moyano Jonathan :
El problema es precisamente ese, no se cual es el problema.

Para que tengas una idea, compile el codigo que me ofreciste con pcwhd (ver 4.088) y compilo perfectamente. Luego simule y hice el debug con el ISIS de Proteus (7.5 SP3, ademas, ya que no confio demaciado en el proteus lo implemento en el pic). Haciendo el debug me doy cuenta que no sale del bucle de codigo suiguiente en <usb.c>

void usb_wait_for_enumeration(void) {
while (USB_stack_status.curr_config == 0) {restart_wdt();}
}

Osea, nunca se produce la comunicacion para la enumeracion(cuando lo implemento en el pic y lo conecto me aparece algo como - el dispositivo no ha sido reconocido o tuvo un mal funcionamiento- en windows XP sp2) .
Ademas el ejemple que propone proteus en el isis me anda sin ningun problema.
Creo haber provado todo con todas sus variantes, con y sin definicion de pin de senseo, alimentando el pic con la tension del bus usb y con fuente externa , con distinta configuraciones de oscilador y distintos osciladores,... siempre guiado por hoja de datos del pic ademas de tus consejos en otros post y los de mucha gente mas en otros foros

En relidad no se que mas contarte, creo que es el compilador pero no estoy seguro y no consigo una version = o > a 3.227 para probar mi teoria.

un saludo, cuando lo solucione lo comento
 
Moyano Jonathan :

Que lo pruebes me ayudaria bastante desde ya gracias y aqui esta el codigo

Código:
#include <18F2550.h>

#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)                   //Cuando utilizo el Wizard  #use delay(clock=20000000)no se por que

#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    1                 //size to allocate for the rx endpoint 1 buffer

#define USB_CON_SENSE_PIN PIN_A1             // Probe definiendolo o no, con la consecuente 
                                             //modificacion del circuito de implementacion

#include <pic18_usb.h>                       //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver

// Tambien utilice otros enumeradores
#include "usb_desc_scope.h"                  //Configuración del USB por Enumerador Palitroquez

#include <usb.c>                             //handles usb setup tokens and get descriptor reports



#define LEDV    PIN_B6
#define LEDR    PIN_B7
#define LED_ON  output_high
#define LED_OFF output_low

//Lo Unico que pretendo es que windows me reconozca el dispositivo
void main()
{
   set_tris_b(0x00);                //Todo salidas
   set_tris_a(0xff);                //Todo entradas    
   
   LED_OFF(LEDV);                   //encendemos led rojo
   LED_ON(LEDR);

   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

   LED_OFF(LEDR);
   LED_ON(LEDV);                    //encendemos led verde
}

Código:
Alguno de los descriptores que probe
///////////////////////////////////////////////////////////////////////////
////                         usb_desc_scope.h                          ////
////                                                                   ////
//// An example set of device / configuration descriptors for use with ////
//// the USB Bulk demo (see ex_usb_scope.c)                            ////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////
////                                                                   ////
//// Version History:                                                  ////
////                                                                   ////
//// July 13th, 2005:                                                  ////
////   Endpoint descriptor works if USB_EP1_TX_SIZE is 16bits          ////
////   Endpoint descriptor works if USB_EP1_RX_SIZE is 16bits          ////
////                                                                   ////
//// June 20th, 2005:                                                  ////
////   18fxx5x Initial release.                                        ////
////                                                                   ////
//// March 21st, 2005:                                                 ////
////   EP 0x01 and EP 0x81 now use USB_EP1_TX_SIZE and USB_EP1_RX_SIZE ////
////      to define max packet size, to make it easier for dynamically ////
////      changed code.                                                ////
////                                                                   ////
//// June 24th, 2002: Cleanup                                          ////
////                                                                   ////
//// May 6th, 2003: Fixed non-HID descriptors pointing to faulty       ////
////                strings                                            ////
////                                                                   ////
//// August 2nd, 2002: Initial Public Release                          ////
////                                                                   ////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,2005 Custom Computer Services           ////
//// This source code may only be used by licensed users of the CCS    ////
//// C compiler.  This source code may only be distributed to other    ////
//// licensed users of the CCS C compiler.  No other use,              ////
//// reproduction or distribution is permitted without written         ////
//// permission.  Derivative programs created using this software      ////
//// in object code form are not restricted in any way.                ////
///////////////////////////////////////////////////////////////////////////

#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 & 0xFF,USB_EP1_TX_SIZE >> 8,         //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 & 0xFF,USB_EP1_RX_SIZE >> 8,         //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)
         08,0x04,           //vendor id (0x04D8 is Microchip)
         0x11,0x00,           //product id
         0x00,0x01,           //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
         8, //length of string index
         USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
         'C',0,
         'C',0,
         'S',0,
   //string 2
         28, //length of string index
         USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
         'P',0,
         'i',0,
         'c',0,
         'U',0,
         'S',0,
         'B',0,
         '1',0,
         '8',0,
         'F',0,
         '2',0,
         '5',0,
         '5',0,
         '0',0,

};


#ENDIF
 
Lo implementé , reconoce al PIC , me instala el driver pero me larga error código 10............Voy a ver más a fondo que pasa pero si a otros le ha funcionado a nosotros también nos va a funcionar.
 
Moyano Jonathan :
:LOL: Por fin lo logre! Muchisimas gracias por tu ayuda

Al final hera un maldi.. capacitor que estaba molestando (Increible no! )solo lo reemplace. El error de codigo 10 en mi codigo creo que aparece por que al salir del bucle --> usb_wait_for_enumeration(); no hace nada. Solo copie el ultimo fragmento de tu codigo y listo ningun problema.

Gracias de nuevo.
 
Yo también probé el código y tuve el mismo problema al salir de usb_wait_for_enumeration();.......puse un bucle while(true){} después de esa función y funcionó sin ningún problema.

A todo esto menos mal que pudiste solucionar tu problema.
 
Hola, ya me he leido las 25 paginas, y mas o menos me he enterado de todo, pero siempre me quedan dudas. Yo estoy haciendo un programa de lectura de u teclado matricial de 7x10 mediante visual basic, tengo conocimiento de C, pero no de visual C.
Me ha quedado claro que para la comunicacion PC <-> USB se puede usar clases CDC (Comunication device class) y bulk transfer (mpusbapi.dll), la primera es la emulacion del puerto serie, pero también e visto mediant HID que no necesita drivers. Para mi proyecto solo necesito 2 cosas: que el PC active o apague un LED y el USB mande 2 datos seguidos al PC, ademas el pic soo usa entradas y salidas digitales, por lo que no es muy complicado. Me gustaria hacerlo por HID, ya que no hay drivers, pero he visto que la frecuencia de cristal del PIC es de 4 MHz, se podria usar un cristal de 20 MHz, lo digo porque la lectura del teclado tiene que ser muy rapida porque la duración del pulso al presionar la tecla es muy corta. LA pregunta en si es ¿por que se usa ese crsital?
 
hola a todos les escribo porque tengo un pequeño problema con el Vusb de un pic 18f4550, lo que pasa es que no logro obtener el voltaje indicado de entre 3.0 a 3.6 v solo obtengo hasta 2v y eso solo poniendo mi dedo en dicho pin, he puesto capacitores de 220 nf ceramico 47uf a 25 v y 470pf ceramico y no logro obtener el voltaje ojala y me puedan ayudar de antemano gracias
 
electro 02006:

asegurate de haber habilitado la regulacion de usb interna
Con el compilador de CCS seria
#fuses VREGEN // habita el regulador de voltaje USB
saludos
 
electro 02006:

Estas alimentando al pic con el puerto? de ser así intenta con una fuente externa de 5V aunque tendria que funcionar sin esta, pero no esta demas probar no?
 
Atrás
Arriba