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

hola moyano, tengo una consulta que hacerte :D, ademas de felicitarte por el tema.

Modifique el programa del osciloscopio que viene de ejemplo en el CCS(bulk transfer), le quite todo lo que iba de más, y puse solamente que tuviera dos leds, uno para señalar el encencido y otro para mostrar cuando haya sido numerado por la pc. La cuestión es que tuve que instalar el driver especifico para esa aplicación, pero por que no me lo reconoce con el mpusbapi?

Lo unico que se me ocurre es que en el archivo de descriptors tiene un pid diferente al de microchip(me imagino que debe ser por que este programa esta diseñado para una board de desarrollador que vende CCS).

Si quisiera acceder al pic desde el pc con un programa de visual usando la libreria mpusbapi.dll le tengo que cambiar el PID al archivo de descriptor?.

una ultima cuestion el proteus me dice que no esta enumerado, pero hasta sale como un dispositivo con controlador sin problemas en el windows 7.
 
Me parece que es el problema más acertado ...a mi me pasó una vez lo mismo y lo solucione de esa manera..cambiandole los PID y VID...ahora otra cosa que no sucede muy a menudo pero que puede pasar es el tema de que el polling de datos no sea el adecuado...eso también lo tenés definido en los descriptores..yo uso en comunicaciones HID 10ms de polling y con Bulk 25ms

mantenilsa: En una de esas el compilador no está reañizando las temporizaciones correctamente...probá un programa de prender y apagar un puerto del PIC y probá diferentes tiempos con un osciloscopio ...o si tenés el PICKIT2 probá los tiempos con el analizador lógico del mismo.

DAV: Veo tu problema y después te notifico...

george.manson.69: Me mataste la verdad no tengo idea...tendría que ver si el USB no lo utiliza para gestionar la comunicación ...

Adler: Hola como estás....mirá el tema no radica en configurarlos , de eso se encarga el driver USB....lo que vos tenés que hacer es declarar cuantos buffers para la comunicación vas a utilizar ....y luego vas declarando las variables usadas.. te pongo un ejemplo...

Código:
Definimos los buffers utilzados...
DEFINE USB_HID_DEVICE TRUE // Vamos a utilizar el protocolo HID.

#define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT 
#define USB_EP1_TX_SIZE 8 // Definición del tamaño del buffer de salida.

#define USB_EP1_RX_ENABLE USB_ENABLE_INTERRUPT 
#define USB_EP1_RX_SIZE 8 // Definición del tamaño del buffer de entrada.


luego las varibles...

int8 data[8]; // Variable de 8 bytes que guardan el valor del EP1_RX.

void main()
{
   usb_init_cs();    // Iniciamos el puerto USB y salimos.
   while(1)
   {
            usb_task(); // Configuramos el puerto USB.
                  if (usb_enumerated()) // Si el puerto es enumerado y configurado por el host..
                  {
                     if (usb_kbhit(1)) // Si hay un paquete de datos en el buffer lo tomamos y guardamos en la variable data.
                     {
                        usb_get_packet(1, data, 8);
                        if(data[0] == 1) { // Si el paquete contiene el dato "1"
                         output_toggle(PIN_B1); // Cambiamos el valor del PIN_B1.
                        } 
                     }                                
                  }
   }

}


 
Última edición:
otra cuestion...

no puedo llamar a la mpusbapi.dll desde el visual basic 2010... al menos no declarandola como lo hace j1m en vb6.0, lo digo por que uso windows 7; si no tendre que aprender c#...
 
Hola moyano gracias por tu respuesta, pero mi problema continua lo que me sucede es que ahunque ponga mas buffer para usar como puse en el ejemplo para ver usando en VB esto para enviarlos:
Código:
    Public Sub WriteSomeData()
        hidWriteEx(VendorID, ProductID, BufferOut(0))
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        BufferOut(2) = 2
        Call WriteSomeData()
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        BufferOut(1) = 1
        Call WriteSomeData()
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        BufferOut(3) = 3
        Call WriteSomeData()
    End Sub

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        BufferOut(4) = 4
        Call WriteSomeData()
    End Sub
cuando envio datos iguales o diferentes por diferentes buffers, el programa del Uc me reconoce todos los datos de todos los buffers como si fueran enviados por el buffer 1 en el caso de este ejemplo me prende y apaga siempre el B0 ahunque envie datos por buffers apartes, y ahunque sean datos diferentes no me discrimina cual es un 1 o un 3
esa es mi duda que me tiene frenado para poder hacer mas cosas, de antemano gracias


Código:
#include	<18F2550.h>
#fuses NOMCLR,XTPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN
#use	delay(clock=48000000)

#BYTE		PORTB=0x06

#DEFINE	USB_HID_DEVICE	TRUE

#define      USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT 
#define      USB_EP1_TX_SIZE 8

#define      USB_EP1_RX_ENABLE USB_ENABLE_INTERRUPT 
#define      USB_EP1_RX_SIZE 8

#define      USB_EP2_TX_ENABLE USB_ENABLE_INTERRUPT 
#define      USB_EP2_TX_SIZE 8

#define	USB_EP2_RX_ENABLE USB_ENABLE_INTERRUPT
#define	USB_EP2_RX_SIZE 8

#define      USB_EP3_TX_ENABLE USB_ENABLE_INTERRUPT 
#define      USB_EP3_TX_SIZE 8

#define	USB_EP3_RX_ENABLE USB_ENABLE_INTERRUPT
#define	USB_EP3_RX_SIZE 8

#define      USB_EP4_TX_ENABLE USB_ENABLE_INTERRUPT 
#define      USB_EP4_TX_SIZE 8

#define	USB_EP4_RX_ENABLE USB_ENABLE_INTERRUPT
#define	USB_EP4_RX_SIZE 8

#include	<pic18_usb.h>
#include 	<USB_easyHID_descriptores.h>
#include	<usb.c>

int8	data_buffer1[8];
int8	data_buffer2[8];
int8	data_buffer3[8];
int8	data_buffer4[8];



void	main()
{

	set_tris_b(0x00);
	output_b(0x00);
	usb_init_cs();
	while(1)
	{
		usb_task();



////////////////////////////////////////////////////////////////

		while(!usb_enumerated())	{
			output_high(PIN_A0);
			output_low(PIN_A1);
									}
			output_high(PIN_A1);
			output_low(PIN_A0);

				if(usb_kbhit(1))
				{
				usb_get_packet(2, data_buffer2 ,8);

				usb_get_packet(1, data_buffer1 ,8);

				usb_get_packet(3, data_buffer3 ,8);

				usb_get_packet(4, data_buffer4 ,8);


			if(data_buffer1[0]==1)	{
				output_toggle(PIN_B0);
							}
			if(data_buffer2[0]==2)	{
				output_toggle(PIN_B1);
							}
			if(data_buffer3[0]==3)	{
				output_toggle(PIN_B2);
							}
			if(data_buffer4[0]==4)	{
				output_toggle(PIN_B3);
							}

				}//fin kbhit
	}//fin while
}//fin main
 
Moyano paracere que al simular el timer0 como interrupcion por desbordamiento, y conectado a la compu via USB, funciona bien no interrupe la conexion...por ahora lo tengo simulado y si me da los 2 hz de parpadeo y no afecta la comunicacion usb...
solo faltaria simular el CCP1 Y 2 como generadores de frecuencia cuadrada...
 
haa buenisimo entonces...yo le estoy dando unas reparaciones a mi placa entrenadora por que se me quemo un regulador por malas conexiones...y despues me pongo de nuevo con los código de USB.
 
Hola amigo Moyano Jonathan!!.
Me fasinaron tus ejemplos!!!. Ya probe el de mandar una a y x jalan muy bien con un pic 18f4550.
Ya me quedo claro lo del firmware del pic. Donde me encuentro atorado es con el visual basic 6. Entiendo mas o menos el codigo fuente pero no se como implementarlo ya en el ambiente de bisual basic es decir como pongo los botones y se los asigno en el codigo fuente de programa. Ya que no estoy muy familiariazado con el visual ._.!!!

Podrias hecharme una mano con esto del visual basic??? o si alguien sabe tambien seria de gran ayuda....!

Saludos y gracias por compartir estos valiosos ejemplos de aplcacion usb pc. ;D
 
Saludos.

Ando haciendo un proyecto donde un PIC18F2550 debe simular que es un raton standar y conectarse por USB. Ya utilicé los ejemplos del CCS que trae de un mouse usb generico, sin embargo la PC me detecta que el dispositivo usb tuvo un mal funcionamiento.

Puse tu código en el PIC y si funciona. le traté de modificar los descriptores del mouse utilizando estas 3 referencias:
http://www.usbmadesimple.co.uk/ums_ms_desc_conf.htm
http://www.keil.com/forum/docs/thread15398.asp
www.usb.org/developers/devclass_docs/HID1_11.pdf

Ya probé modificar los descriptores del usb_desc_cdec, también use el archivo de CCS usb_desc_mouse y no me funciona. Yu que tienes mucha mas experiencia en el campo, como puedo hacer para que mi PC detecte a mi pic como si fuera un ratón USB genérico.

Gracias y espero me puedas ayudar ya que ando bastante desesperado con esto.
Gracias... atte: Omar
 
hola a todos y gracias por los manuales y las dudas resueltas, tengo una duda loq ue pasa es que necesito transmitir unos datos por usb hacia el computador, y quisiera saber por cual de deberia de hacerlo o es mejor hacerlo, simulando el puerto serial o por la que llaman bulk?.... de antemano gracias
 
Hola, a ver si os ha pasado a alguien algo similar:
Estoy haciendo un proyecto de fin de carrera con un PIC 18f2550, con un cristal 20MHZ con PLL5. El proyecto es bastante grande, tiene dispositivos USB a los que acede con bastante frecuencia, usa el RS232 para controlar movil por comandos AT, y bueno, el problema es q cuando empieza a crecer el codigo, y conecto el USB al ordenador me sale que "no se reconoce el dispositivo USB", si quito algunos delay_ms (que necesito para que funcioene como tiene q ser los requisitos), la cosa empieza otra vez a funcionar. Lo asocio a que el USB_TASK(), o alguna de estas funciones tiene q ejecutarse con cierta frecuencia para que el ordenador sepa que sigue conectado... porque sino no entiendo donde esta el problema. Lo uso como CDC y tengo un bucle asi(resumiendo):

while(true){
usb_task(); // configura el USB
if(usb_cdc_connected()){ // Si está conectado entonces....
if (usb_enumerated()){ // aquí se enumera el dispositivo por el host y despúes sale.
if(usb_cdc_kbhit()){ //en espera de nuevo(s) caracter(es) en el buffer.
//Comprobamos si queremos hacer lectura de datos o escritura
}
}
//Aki el resto de codigo, que por lo menos tarda en ejecutarse 3 segundos(por los delays, y otras instruciones que hay)
}

Alguna idea de como solucionarlo??
Muchas gracias de antemano.

PD.: Muy grande tu trabajo moyano con este post
 
ahora va a tener la teoría completa sobre la estructura interna del controlador USB del micro asi también como una breve pero funcional explicación sobre como hacer un programa de control por USB en ASM.