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

Añado informacion;
He estado estudiando el tema VID y PID,

dentro del archivo "inf" tengo la siguiente informacion :
Código:
;------------------------------------------------------------------------------
;  Vendor and Product ID Definitions
;------------------------------------------------------------------------------
; When developing your USB device, the VID and PID used in the PC side
; application program and the firmware on the microcontroller must match.
; Modify the below line to use your VID and PID.  Use the format as shown below.
; Note: One INF file can be used for multiple devices with different VID and PIDs.
; For each supported device, append ",USB\VID_xxxx&PID_yyyy" to the end of the line.
;------------------------------------------------------------------------------
[SourceDisksFiles]
[SourceDisksNames]
[DeviceList]
%DESCRIPTION%=DriverInstall, USB\VID_04D8&PID_000B

[DeviceList.NTamd64] 
%DESCRIPTION%=DriverInstall, USB\VID_04D8&PID_000B


;------------------------------------------------------------------------------
;  String Definitions
;------------------------------------------------------------------------------
;Modify these strings to customize your device
;------------------------------------------------------------------------------
[Strings]
MFGFILENAME="mchpcdc"
DRIVERFILENAME ="usbser"
MFGNAME="MoyaPIC_USB"
INSTDISK="Microchip Technology, Inc. Installation Disc"
DESCRIPTION="MoyaPIC_USB28_CDC"
SERVICE="USB RS-232 Emulation Driver"

Hasta ahi todo correcto.
Supuestamente el archivo usb_desc_cdc.h contiene la informacion del VID y el PID,
Código:
   const char USB_DEVICE_DESC[USB_DESC_DEVICE_LEN] ={
      //starts of with device configuration. only one possible
         USB_DESC_DEVICE_LEN, //the length of this report   ==0
         0x01, //the constant DEVICE (DEVICE 0x01)  ==1
         0x10,0x01, //usb version in bcd  ==2,3
         0x02, //class code. 0x02=Communication Device Class ==4
         0x00, //subclass code ==5
         0x00, //protocol code ==6
         USB_MAX_EP0_PACKET_LENGTH, //max packet size for endpoint 0. (SLOW SPEED SPECIFIES 8) ==7
         USB_CONFIG_VID & 0xFF, ((USB_CONFIG_VID >> 8) & 0xFF), //vendor id       ==9, 10
         USB_CONFIG_PID & 0xFF, ((USB_CONFIG_PID >> 8) & 0xFF), //product id, don't use 0xffff       ==11, 12
         USB_CONFIG_VERSION & 0xFF, ((USB_CONFIG_VERSION >> 8) & 0xFF), //device release number  ==13,14
         0x01, //index of string description of manufacturer. therefore we point to string_1 array (see below)  ==14
         0x02, //index of string descriptor of the product  ==15
         0x00, //index of string descriptor of serial number  ==16
         USB_NUM_CONFIGURATIONS  //number of possible configurations  ==17
   };


//////////////////////////////////////////////////////////////////
///
///   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)
///
//////////////////////////////////////////////////////////////////

#if !defined(USB_STRINGS_OVERWRITTEN)
//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.
char USB_STRING_DESC_OFFSET[]={0,4,12};

// Here is where the "CCS" Manufacturer string and "SERIAL DEMO" are stored.
// Strings are saved as unicode.
// These strings are mostly only displayed during the add hardware wizard.
// Once the operating system drivers have been installed it will usually display
// the name from the drivers .INF.
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
         24, //length of string index
         USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
         'C',0,
         'D',0,
         'C',0,
         '_',0,
         'U',0,
         'S',0,
         'B',0,
         '_',0,
         'P',0,
         'I',0,
         'C',0,
};

por mas que lo cambio, lo trasteo, lo compilo y lo cargo al pic 18f4550 del proteus, cuando inicio la simlacion me detecta un dispositivo con el nombre "serial demo", que era el que trae por defecto la libreria de proteus, y no consigo instalar el driver de ninguna manera.

Sabeis por donde pueden ir los tiros??
 
hola, mira el driver que instalas por pimrraves es el que siempre va a buscar el pc, yo lo que hice fue irme al administrador de dispositivos y desinstalar el equipo y reinicie el pc después conecte el pic nuevamente y le di la ruta manual de donde tenia el nuevo controlador. pero todo con pic físico
 
No se como ni porque, pero acabo de encontrar un driver que si me reconoce el usb del proteus.
Código:
[Version]
Signature="$Windows NT$"
Class=Ports
ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318}
Provider=%CCS%
LayoutFile=layout.inf
CatalogFile=cdc_NTXPVista.cat
DriverVer=01/15/2010

[Manufacturer]
%CCS%=CCS,NTamd64

[CCS]
%CCS_CDC%=Reader, USB\VID_0461&PID_0033
%CCS_CDCBOOT%=Reader, USB\VID_0461&PID_0034

[CCS.NTamd64]
%CCS_CDC%=Reader, USB\VID_0461&PID_0033
%CCS_CDCBOOT%=Reader, USB\VID_0461&PID_0034

[Reader_Install.NTx86]
;Windows2000

[DestinationDirs]
DefaultDestDir=12
Reader.NT.Copy=12

;------------------------------------------------------------------------------
;  Windows 2000/XP/Vista-32bit Sections
;------------------------------------------------------------------------------
[Reader.NT]
Include=mdmcpq.inf
CopyFiles=Reader.NT.Copy
AddReg=Reader.NT.AddReg

[Reader.NT.Copy]
usbser.sys

[Reader.NT.AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,usbser.sys
HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"

[Reader.NT.Services]
AddService = usbser, 0x00000002, Service_Inst.NT

[Service_Inst.NT]
DisplayName = %Serial.SvcDesc%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 3 ; SERVICE_DEMAND_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %12%\usbser.sys
LoadOrderGroup = Base
 
holas estoy haciendo un proyecto donde tengo que mandar datos desde una aplicacion de escritorio (estoy usando Visual studio) hacia el PIC 18f4550, en el programa del PIC estoy usando la clase CDC, todo me funciona bien, la PC reconoce al pic mi programa VB se conecta al puerto sin problema, pero al momento de enviar un dato no pasa absolutamente nada ya hice varios programas y vi varios tutoriales y no encontre cual es el problema , si alguien sabe como solucionarlo estaria muy agradecido
 
Gracias netma
bueno aqui te dejo el archivo con los codigos y el circuito que saque de varios foros y tutoriales para hacer la prueba talves hasta se te haga conocido, estaria muy agradecido ya voy una semana en esto y ya me pisa el tiempo, es basicamente un circuito que prende y apaga leds,y desde el visual envia numeros al pic para prender cierto led , pero el pic no recive estos numeros
 

Adjuntos

  • controldeleds.rar
    188.5 KB · Visitas: 159
Última edición:
El codigo a mi me da muchos errores, lo mejor es que lo programes entero.

Yo veo fallos en el vb como por ejemplo nombres de variables mal escritos y todo, es normal que no lo hagas funcionar.


Aprovechando la respuesta, tengo una duda tonta.

Estoy enviando un "1" desde el VB, el pic lo recive perfectamente con un getc y por ejemplo, hago un toggle_b(1), la cosa está en que si vuelvo a mandar un "1", no me hace el toggle.

Puede ser debido a los Timer? (no los he configurado)
 
bueno mil disculpas, ya arregle lo del VB esque elimine dos botones y me olvide borrar el codigo por eso salia error, pero bueno me sigue sin funcionar
 

Adjuntos

  • controldeleds.rar
    187.4 KB · Visitas: 93
Última edición:
el dia de hoy me use ha hacer lo de netma de simular CDC desde proteus y me funciono ero había un problema el ic enviaba caracteres sin problema ero no recibía nada del pc después de darle un rato decidí compilar con la versión 4.108 de ccs y listo me comenzó a recibir las teclas que tecleaba en la terminal del PC.
la versión con la que compilaba era la 104
 
Última edición:
A mi si que me transmite. El problema es que a los 10 segundos aproximadamente deja de hacer nada. Lo he probado en el pic directamente y hace lo mismo. Creo que el problema esta en el firmware. Mañana lo colgare para que lo veáis.
 
Holas
Bueno pues ya solucione mi problema, utilice el driver que publico netma y asi ya me envia los datos, muchas gracias!, ahora ya puedo empezar con mi proyecto.

y bueno ahora se me viene otra duda , para mi proyecto necesito enviar numeros grandes como 4000 del pic al pc y viceversa y yo me imagino enviar esto como string , entonces mi pregunta es si se puede enviar strings con cdc, por q veo en muchos ejemplos q solo envian caracteres
 
Última edición:
Os paso el codigo de mi ccs, funciona perfectamente durante 5 segundos o asi, luego no responde a los envios de datos.

Código:
#include <18f4550.h>
#fuses HSPLL,MCLR,NOWDT,NOLVP,NOPROTECT,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48000000)
#include "usb_cdc.h"
#include "usb_desc_cdc_mod.h"

void usb_conectado(void){
output_high(PIN_A0);
output_low(PIN_A1);}

void usb_desconectado(void){
output_high(PIN_A1);
output_low(PIN_A0);
}

void usb_enumerated(void){
output_high(PIN_A2);}


void main()

{
disable_interrupts(global);   // desactivando interrupciones globales
setup_adc_ports (NO_ANALOGS|VSS_VDD); // desactivando puertos analogicos    
set_tris_a(00000000);
set_tris_b(00000000);
output_low(PIN_B0);
output_low(PIN_B1);
output_low(PIN_B2);
output_low(PIN_B3);
output_low(PIN_B4);
output_low(PIN_B5);
output_low(PIN_B6);
output_low(PIN_B7);
setup_adc(ADC_OFF);
setup_spi(SPI_SS_DISABLED);
setup_wdt(WDT_OFF);
/*setup_timer(RTCC_INTERNAL);
setup_timer1(T1_DISABLED);
setup_timer2(T2_DISABLED,0,1);
setup_timer3(T3_DISABLED|T3_DIV_BY_1);*/
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);


usb_cdc_init();
usb_init();

while(!usb_cdc_connected()){
usb_desconectado();
}

usb_conectado();
if (usb_enumerated()){
   usb_enumerated();}
do{
usb_task();
   
   
   if (usb_cdc_getc()=='1'){output_toggle(PIN_B0);}
   if (usb_cdc_getc()=='2'){output_toggle(PIN_B1);}
   if (usb_cdc_getc()=='3'){output_toggle(PIN_B2);}
   if (usb_cdc_getc()=='4'){output_toggle(PIN_B3);}
   if (usb_cdc_getc()=='5'){output_toggle(PIN_B4);}
   if (usb_cdc_getc()=='6'){output_toggle(PIN_B5);}
   if (usb_cdc_getc()=='7'){output_toggle(PIN_B6);}
   if (usb_cdc_getc()=='8'){output_toggle(PIN_B7);}

}while (1);

}
 
Os adjunto todo, es un diseño de 8 leds pero sigo sin dar con el kit de la cuestion y a los 5 segundos ya no me responde. a que puede deberse??
Gracias
 

Adjuntos

  • Prueba1.rar
    195.2 KB · Visitas: 86
Hola a todos nuevamente. Tengo un programa en el que manejo usb y ademas visualizo datos en un lcd. Tengo el programa corriendo a 48MHz. Mi problema es que a tan alta frecuencia la longitud del cable que conecta al lcd produce que en este no se visualicen bien los datos. Quisiera saber si alguien puede ayudarme a configurar los fuses para que tenga los 48 MHz necesarios para llevar a cabo la comunicación usb y que el cpu corra a una velocidad mucho menor, desde 4MHz hasta 20MHz. Tengo los fuses configurados como aparece en la hoja anterior y utilizo un cristal de 4MHz. Alguien puede ayudarme?. Desde ya muchas gracias

fuses XTPLL,USBDIV,PLL1,PUT,CPUDIV1,VREGEN,NOWDT,NOPROTECT,NOLVP,NODEBUG
#use delay(clock=48000000)
 
Gracias por tu respuesta netma. Te comento mejor mi situación. Mi idea es tener 48MHz pero solo para la comunicación usb. Deseo tener el cpu del micro corriendo a una velocidad mas baja. Según estuve viendo en esta pagina: http://picmania.garcia-cuervo.net/conceptos.php#USB4Mhz, eso es posible, la idea seria desde el oscilador principal seguir el camino del pll para el modulo usb y luego mediante una correcta elección de CPUDIV y los bits FOSC3:FOSC0 (segun el diagrama que aparece en la pagina antes mencionada) conseguir otra frecuencia de trabajo para el pic. Mi problema radica en que no se como configurar los bits FOSC3:FOSC0 desde los fuses de ccs
 
Gracias por tu respuesta netma. Te comento mejor mi situación. Mi idea es tener 48MHz pero solo para la comunicación usb. Deseo tener el cpu del micro corriendo a una velocidad mas baja. Según estuve viendo en esta pagina: http://picmania.garcia-cuervo.net/conceptos.php#USB4Mhz, eso es posible, la idea seria desde el oscilador principal seguir el camino del pll para el modulo usb y luego mediante una correcta elección de CPUDIV y los bits FOSC3:FOSC0 (segun el diagrama que aparece en la pagina antes mencionada) conseguir otra frecuencia de trabajo para el pic. Mi problema radica en que no se como configurar los bits FOSC3:FOSC0 desde los fuses de ccs

Para que necesitas que el micro corra a una velocidad diferentes que la del puerto USB ?
 
Atrás
Arriba