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

hola que tal, tengo una duda con los pics que soportan puerto USB, si yo tengo un dispositivo que manda datos por usb y se conecta a la compu o sea manda los datos que lee a la compu por un cable USB verdad, entonces mi duda es si puedo mandar esos datos que manda por USB a un pic 18f4550 que soporta transmision por USB para procesar los datos en el microcontrolador y luego mandarlos a la pc, no se si me explique es decir usar el microcontrolador entre el dispositivo USB y la PC como quien dice meterlo en medio para hacer otra funcion, esto es posible?
 
Se puede hacer pero no de la manera que vos planteas. Para hacerlo hay otras maneras mas o menos sencillas según el nivel de conocimiento:

- Usar un chip USB - HOST dedicado, donde escribiendo el handler y la plantilla de descriptores USB en algún lenguaje de programación, podés interactuar con mouse, teclado, impresoras, cámaras, dispositivos android, etc. Una opción de complejidad alta para hacerlo desde 0, en Arduino hay algunos ejemplos y librerías listos. Manejo por puerto SPI.

- Usar un chip de vínculo ...(FTDI VINCULUM) que es un controlador USB más sencillo, donde podés conectar por ejemplo un pendrive y crear, modificar, borrar, archivos o carpetas, etc. Se maneja desde el puerto SPI y no es muy complejo de implementar.

- Usar algún PIC que disponga de puerto USB host, como por ejemplo los PIC24 o los PIC32. Microchip ya tiene listas las librerías y los ejemplos para que vos puedas implementar lo que necesitas según sea el caso.

Espero te puedas guiar, un saludo !
 
gracias por la respuesta, creo que me decidire por un micro con USB-Host conoces alguno de la familia de microchip que me puedas recomendar?, alguno famoso del cual pueda encontrar informacion en la red x favor
 
Última edición:
Hola Foristas, estoy implementando lo aportado en ésta discusión en un programa de prueba en C# ya logré hacer un bridge cuando le haga los ajustes finales lo posteo.

Saludos
 
Buenos dias, ya he leido mas o menos hasta la hoja 78 del tema, la pregunta mia va encaminada a solucionar un problema que aunque muchos lo preguntaron no se dio respuesta concreta, (hasta donde mire), necesito leer varias variables análogas digitales, primero en 8 bits de resolucion para que no me toque hacer conversiones de bits, me envía unos datos de unos pulsadores como entradas digitales y solo uno de los datos AD, eso dentro de un buffer envia[], voy a enviar el otro dato dentro del buffer pero al colocar el put(1,envia,3,usb_dts_toggle) ya no recibe nada en visual, estoy utilizando la plantilla del ejemplo 6 de Jhonatan, ya he mirado que el migro del easyHID, pero este fue el unico que me funciono siguiendo todo el tema. si me dan una luz en el proyecto de envio de mas de 2 datos por usb gracias estoy con un reloj de 4Mhz.
 
Lo que pasa es que el PIC empaqueta los datos cuando envía por USB. Si querés leer por ejemplo 2 entradas analógicas + entradas digitales:

Código:
 private void Lee_datos(UInt32 In_handle)
        {
            byte[] BufferINP = new byte[EasyHID.BUFFER_IN_SIZE]; // Declaramos el buffer de entrada.
            if ((EasyHID.Read(In_handle, out BufferINP)) == true) // Si hay datos, los procesamos...
            {
                // Según se haya presionado un pulsador, indicará el evento de forma gráfica.
                if (BufferINP[1] == 0x01) { IN_DIGITAL_1.BackColor = Color.GreenYellow; 
                    MENSAJES_USB.Items.Add("Botón 1 presionado."); }
                else { IN_DIGITAL_1.BackColor = Color.Green; }
                if (BufferINP[2] == 0x01) { IN_DIGITAL_2.BackColor = Color.GreenYellow; 
                    MENSAJES_USB.Items.Add("Botón 2 presionado."); }
                else { IN_DIGITAL_2.BackColor = Color.Green; }
                if (BufferINP[3] == 0x01) { IN_DIGITAL_3.BackColor = Color.GreenYellow; 
                    MENSAJES_USB.Items.Add("Botón 3 presionado."); }
                else { IN_DIGITAL_3.BackColor = Color.Green; }
                if (BufferINP[4] == 0x01) { IN_DIGITAL_4.BackColor = Color.GreenYellow; 
                    MENSAJES_USB.Items.Add("Botón 4 presionado."); }
                else { IN_DIGITAL_4.BackColor = Color.Green; }
                
                // Une la parte alta y baja de la conversión y guarda el dato en la variable
                // ADCxValue.
                ADCValue1 = (uint)(BufferINP[5] << 8) + BufferINP[6];
                ADCValue2 = (uint)(BufferINP[7] << 8) + BufferINP[8];
                // Muestra los valores en las barras de progreso.
                ADC1_VALUE.Value = (int)ADCValue1;
                ADC2_VALUE.Value = (int)ADCValue2;
            }
                                                                   
 }

El buffer del endpoint de salida, tiene declarados 32 bytes, si analizas la porción de código:

Código:
ADCValue1 = (uint)(BufferINP[5] << 8) + BufferINP[6];
ADCValue2 = (uint)(BufferINP[7] << 8) + BufferINP[8];

Te das cuenta que los datos del conversor analógico de 10 bits se encuentran en los bytes 5,6,7 y 8 respectivamente.

Del lado del PIC:

Código:
// Leemos 2 canales analógicos del PIC.

                    set_adc_channel(0);                                 // Seleccionamos el canal 0 y comenzamos a leer.
                    delay_us(10);                                       // Esperamos un tiempo para estabalizar el dato leido.
                    valor_adc_alta = (read_adc()>>8);                   // Enviamos la parte alta de la conversión de 10 bits.
                    valor_adc_baja = (int)(read_adc());                 // Enviamos la parte baja de la conversión de 10 bits.
                    envia[4]=valor_adc_alta;
                    envia[5]=valor_adc_baja;


                    set_adc_channel(2);                                 // Seleccionamos el canal 2 y comenzamos a leer.
                    delay_us(10);                                       // Esperamos un tiempo para estabalizar el dato leido.
                    valor_adc_alta = (read_adc()>>8);                   // Enviamos la parte alta de la conversión de 10 bits.
                    valor_adc_baja = (int)(read_adc());                 // Enviamos la parte baja de la conversión de 10 bits.
                    envia[6]=valor_adc_alta;
                    envia[7]=valor_adc_baja;

Si necesitas enviar o recibir más datos...solamente usá más bytes del buffer del lado del PIC y del programa host...usando la misma estructura que usé para el ejemplo.

Saludos !
 
creo que con estos datos podre solucionar mi dificultad nuevamnete te felicito, y personalmente aunque he investigado mucho al respecto tus documentos, ellos han sido una guia completa para mi, esto es una labor educativa el proyecto que estamos haciendo, no es comercial y nada por el estilo, esta bien que utilicemos los protocolos a los que hace referencia este proyecto???

Gracias Miles
 
estimado moyano.
te cuento que estoy en eso de la comunicacion de dispositivos por usb y c#,y me baje todos los Zip que pusiste en el foro y otros que encontre en scribd.
la pena es en los codigos del CCS,no me compilan y me salen como 100 errores,los he compilado de diferentes formas y me descargue lo ultimo en ccs v4.114 y ccs v4.130 y nada, lo estoy ejecutando en windows 7 32bits.espero que puedas ayudarme o mandarme un zip,te lo agradeceria.
 
buenas tardes, el proyecto me funciono en HID sin problemas, pero ya se me presenta un problema adicional, es que la gran variedad de software educativo que trabaja coin adquisicion de datos trabaja por el puerto COM, estoy mirando como puedo hacer para que estos lean el dato pensando en un comvirtual como el que se genra cuando se trabaja por cdc, pero la velocidad del programa que muestras ahi y en el micro hacen que la comunicacion no se adecuada para los adc, como se podria mejorar estos tiempos, estoy mirando si el timmer que colocas en los programas de VB, es necesario o exista la opcion que cuando ocurra en evento de dato en el buffer se ejecute algo? pero no tengo claro si se puede hacer, ahora, en el PUIC cuando el PC enumera el USb veo que esta dentro de un ciclo, se podria hacer antes de entrar al ciclo que la numeracion se haga y desùes entre al ciclo?, por que cuando le doy clic a uno de los botones del programa para prender un led en VB, el responde despues de un tiempo.

Gracias
 
Hola gente, soy nuevo en el foro y estoy acá porque ya no se a quien mas recurrir!

Necesito establecer una comunicacion PIC-USB, mi problema es que este es mi primer proyecto con usb y no estoy muy metido en el tema.
No quiero molestarlos con todo el resto del programa porque es largo y solo tengo problemas en la transmisión. El tema es el siguiente, con un PIC18F4550 y un xtal de 20Mhz, necesito transmitir 250KB en un segundo, que son repetidas mediciones de una plancha de 48x48 sensores, que ya están guardadas en la memoria del micro. Para probar la TX con la PC me base en el proyecto de http://picmania.garcia-cuervo.net/usb_3_cdctransfers.php, el cual me anduvo sin problemas... excepto que solo lograba transmitir al rededor de 50kb en un segundo... demasiado lento para lo que necesito.
El programa lo hice en CCS y utilice el hyperterminal para recibir los datos en la pc. Como podrán ver en el cogido a continuación, mi idea fue mostrar los datos en forma de tabla, 48 columnas, 48 filas y transmitir 50 veces la plancha, que es mas o menos lo que necesito. Una vez que envio las 50 planchas hace titilar un led que se encuentra en el PIN C0.
El circuito es TAN SIMPLE COMO ESO, transmite por USB y en el pin C0 hay un led, nada mas.

Este fue el codigo que utilice, basado en el proyecto de picmania:
Código:
#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)

#include ".\include\usb_cdc.h"


void main() {
   BYTE columna,fila,plancha;
   output_high(PIN_C0);
   delay_ms(300);
   usb_cdc_init();
   usb_init();
   while(!usb_cdc_connected()) {}
   output_low(PIN_C0);
  
 
   while (TRUE) {    
    for(plancha=1;plancha<=50;++plancha){
      for(columna=1; columna<=48;++columna){
         printf(usb_cdc_putc, "\r\n");
         for(fila=1; fila<=48; ++fila) {
            printf(usb_cdc_putc, "%2x" fila);
            printf(usb_cdc_putc, " ");
            
         }
      }printf(usb_cdc_putc, "\r\n\n Plancha: ");
       printf(usb_cdc_putc, "%2x" plancha );
       printf(usb_cdc_putc, "\r\n");
    }    

    while (TRUE) 
      {output_toggle(PIN_C0);
      delay_ms(500);}

   }
}

Estaria muy agradecido si me pudieran ayudar con este problema! Al menos dándome una mano con algún link o código en donde pueda entender como abrir varios endpoints y como utilizarlos.

Saludos!

Facundo
 
Hola a todos :), soy nueva en el foro y sobre el proyecto de prender leds via usb , pues tengo un error que me deja dormir varios días. Me aparece este error , en el controlador desde la administración de dispositivos " Este dispositivo no puede iniciar. (Código 10)
No hay recursos de sistema suficientes para completar la llamada a la API." . Sin embargo el circuito funciona perfectamente desde la pc de un amigo y yo tengo este problema :(, osea no es por capacitores , ni el crystal .
No tuve oportunidad de revisar su maquina , pero el proyecto es exactamente el mismo.

Estoy usando win8, eso tiene algo que ver??? .
muchisimas gracias por responder :)
 
(y)Hola a todos estoy empesando programacion con visual c++2010 Express para poder realizar comunicacion usb entre la pc y un microcontrolador (ejemplo 18f4550).
Si alguien me puede ayudar con algun ejemplo se lo agradesco.
 
Hola amigos del foro. Hace mucho tiempo que me viene interesando este tema, a diferencia de ustedes yo lo estoy realizando en PIC SIMULATOR IDE, lo abandone hace unos meses por qué no lo logre hacer funcionar y como hasta ese entonces no era de importancia, no seguí con el asunto. Pero ahora me topo con la necesidad de adaptar un extenso programa que realice en PSI el cual necesita una interfaz USB y no puedo, Pero luego de hacer muchos experimentos logre descubrir que la rutina se bloquea en la línea UsbStart.

El código usado es en el que esta de ejemplo en la página de OshonSoft
Código:
Define CLOCK_FREQUENCY = 20
Define CONFIG1L = 0x24
Define CONFIG1H = 0x0c
Define CONFIG2L = 0x3e
Define CONFIG2H = 0x00
Define CONFIG3L = 0x00
Define CONFIG3H = 0x83
Define CONFIG4L = 0x80
Define CONFIG4H = 0x00
Define CONFIG5L = 0x0f
Define CONFIG5H = 0xc0
Define CONFIG6L = 0x0f
Define CONFIG6H = 0xe0
Define CONFIG7L = 0x0f
Define CONFIG7H = 0x40

UsbSetVendorId 0x1234
UsbSetProductId 0x1234
UsbSetVersionNumber 0x1122
UsbSetManufacturerString "OshonSoft.com"
UsbSetProductString "Generic USB HID Device"
UsbSetSerialNumberString "1111111111"
UsbOnIoInGosub input_report_before_sending
UsbOnIoOutGosub output_report_received
UsbOnFtInGosub feature_report_before_sending
UsbOnFtOutGosub feature_report_received

AllDigital
ADCON1 = 0x0e
TRISB = 0
PORTB = 0xff
UsbStart
PORTB = 0

Dim an0 As Byte

loop:
	Adcin 0, an0
	If an0 < 50 Then
		PORTB = 0
		UsbStop
		While an0 < 100
			Adcin 0, an0
		Wend
		PORTB = 0xff
		UsbStart
		PORTB = 0
	Endif
	UsbService
Goto loop
End                                               

feature_report_received:
Toggle PORTB.7
Return                                            

feature_report_before_sending:
UsbFtBuffer(0) = UsbFtBuffer(0) - 1
UsbFtBuffer(1) = UsbFtBuffer(1) - 1
UsbFtBuffer(2) = UsbFtBuffer(2) - 1
UsbFtBuffer(3) = UsbFtBuffer(3) - 1
UsbFtBuffer(4) = UsbFtBuffer(4) - 1
UsbFtBuffer(5) = UsbFtBuffer(5) - 1
UsbFtBuffer(6) = UsbFtBuffer(6) - 1
UsbFtBuffer(7) = UsbFtBuffer(7) - 1
Return                                            

output_report_received:
Toggle PORTB.6
Return                                            

input_report_before_sending:
UsbIoBuffer(0) = UsbIoBuffer(0) + 1
UsbIoBuffer(1) = UsbIoBuffer(1) + 1
UsbIoBuffer(2) = UsbIoBuffer(2) + 1
UsbIoBuffer(3) = UsbIoBuffer(3) + 1
UsbIoBuffer(4) = UsbIoBuffer(4) + 1
UsbIoBuffer(5) = UsbIoBuffer(5) + 1
UsbIoBuffer(6) = UsbIoBuffer(6) + 1
UsbIoBuffer(7) = UsbIoBuffer(7) + 1
Return

Y aquí pueden ver donde se queda trabado.
f95e8da0c8e6a0b4bb5e0cc581511e21o.jpg



He escrito 2 mensajes en el report bug del psi pero jamás recibí respuesta alguna de parte de Vladimir ni tampoco de oshonsoft o quien sea que responda los mensajes (Aclaro que tengo la versión comprada personal del PSI)

Alguien tiene idea que sucede?, se deberá a mala configuración de bytes? Alguien ha tratado esto antes en el PSI?, he encontrado realmente poco respecto del Pic18 Simulator Ide y usb en el internet. Y realmente la página de Oshonsoft la explicación y ejemplos para este tema es muy pobre. Cordiales saludos y gracias de antemano espero poder solucionar esto y que nos sirva a todos.
 
Buenas, he seguido este foro, y me ha sido de gran utilidad, Muchisimas gracias por ayudarnos a todos los que estamos aun amateur en este mundo de la electrónica. Tengo una necesidad, en mi universidad, nos pidieron que simuláramos con un micro controlador un proceso, y que por medio de una conexion usb pudiéramos pasar el proceso de forma automática ( la programación del pic ) A manual ( Por medio de un software controlador en la pc, controlar todo el proceso). Lo estoy simulando con unos leds, los cuales hacen el papel de bombas y sistemas de refrescamiento.

Estoy aun en eso, pero si están disponibles, me gustaría que me dieran ideas de como hacerlo mejor, actualmente estoy preguntando por el valor enviado del pc al pic, y dependiendo del valor recibido prende o apaga un led. Pero tengo problemas para pasarlo de automático a manual. La idea es que el pic aun conectado a la pc, ejecute su proceso tranquilamente, y al darle en el software a ( MANUAL ) este se detenga por completo y espere la orden del pc, una ves que en el pc se le de a ( Automático ) El pic continué su proceso tranquilamente, o lo inicie de 0, es indiferente.

De que forma podría hacerlo? tienen algun ejemplo por el cual guiarme? Utilizo VB6 tal como los ejemplos de este tema, el pic 18f2550 y el compilador CCS. Muchas gracias de ante mano.

Anexo dejo mi código fuente, tanto aplicación en CCs para el Pic como, el proyecto en VB6. también las librerías y el driver. Recibo cualquier critica, mejora, ayuda, todo. Muchas gracias.

Nota: Me baso totalmente en los proyectos del inicio de este tema.
 

Adjuntos

  • PROYECTO.rar
    121.7 KB · Visitas: 124
Última edición:
hola estoy tratando de hacer funcionar el proyecto de la pagina nº1 visual C# hid USB,les comento trabajo con un pic18F4550.Les voy a dejar los dos programas,yo cambie el vid y el pid del fuente visualC# por no coincidir con el del fuente c del pic.

PHP:
/********************************************************************
Programa: Control de dispositivos por USB.
Descripción: HID - DEMO, programa para mostrar el uso del puerto USB 
             en proyectos de control.
Programador: Moyano Jonathan.
Hardware necesario: USB - PIC trainer v0.1 + PicKit2 clon.
Año: 2011.

*********************************************************************/

//=========================================================================

#include <18F4550.h> // Definición de registros internos del PIC18F2550.
//#DEVICE ADC=8 // CAD a 8 bits, justificación a a la derecha.
#DEVICE ADC=10 // CAD a 10 bits, justificación a a la derecha.
//#DEVICE ADC=16 // CAD a 10 bits, justificación a a la izquierda.

#fuses MCLR,HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN

// NOMCLR: No vamos ha usar el PIN MCLR, el reset se hará por software.
// HSPLL: Utilizaremos un cristal de alta velocidad en conjunto con el PLL.
// NOWDT: No vamos a usar el perro guardian.
// NOPROTECT: Memoria no protejida contra lecturas.
// NOLVP: No utilizamos el modo de programación con bajo voltaje.
// NODEBUG: No utilizamos código para debugear.
// USBDIV: signfica que el clock del usb se tomará del PLL/2 = 96Mhz/2 = 48Mhz.
// PLL1: significa que el PLL prescaler dividirá la frecuencia del cristal. para HS = 20Mhz, PLL = 5.
//       con esto se obtiene: 20Mhz/5 = 4Mhz.
// CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejamos como está.
// VREGEN: habilita el regulador de 3.3 volts que usa el módulo USB.
// NOPBADEN: Todo el Puerto B como I/O digitales.

// Usamos una frecuencia de trabajo de 48Mhz.
#use delay(clock=48000000)

//===========================================================================

//========================================================================================================

// Incluimos librerías utilizadas por la aplicación.
#include <pic18_usb.h>                   // Drivers's USB del PIC18F2550.
#include <APLICACION_HID.h>              // Definición de funciones y hardware utilizado en el programa.
#include <Descriptor_easyHID.h>          // Descriptores HID del proyecto.
#include <USB.c>                         // Funciones del USB.
#define USB_EP1_RX_SIZE 32
#define USB_EP1_TX_SIZE 32
#build(reset=0x1000,interrupt=0x1008) //Remapeo
#org 0x0000,0x0FFF {}


// Usamos fast_io, en los puertos B y C.
#use fast_io(b) 
#use fast_io(c)

void USB_debug(){

    LED_ON(LED_RED); // Enciende el led error y apaga el led USB_OK.
    LED_OFF(LED_GREEN);
    usb_wait_for_enumeration(); // Espera a ser enumerado por el host.
    LED_ON(LED_GREEN); // Enciende el led USB_OK y apaga el led USB_ERROR.
    LED_OFF(LED_RED);  
}

void config_adcon2(void) {
   #asm
   movlw 0b10111110 
   iorwf 0xFC0,1    
   #endasm
}

    int8    recibe[USB_EP1_RX_SIZE];                                    // Declaramos la variable recibe de 32 bytes.
    int8    envia[USB_EP1_TX_SIZE];                                     // Declaramos la variable envía  de 32 bytes.
    int8    valorPWM1_H=0;                                              // Valor del semiperiodo alto del PWM1.  
    int8    valorPWM2_H=0;                                              // Valor del semiperiodo alto del PWM2. 
    int8    valorPWM1_L=0;                                              // Valor del semiperiodo bajo del PWM1.
    int8    valorPWM2_L=0;                                              // Valor del semiperiodo bajo del PWM2.
    int8    valorPWM1=0;                                                // Variable que contiene el valor del PWM1.
    int8    valorPWM2=0;                                                // Variable que contiene el valor del PWM2.
    int8    valor_adc_alta=0;                                           // Contiene el MSB del valor del ADC.
    int8    valor_adc_baja=0;                                           // Contiene el LSB del valor del ADC.
  
   
//===========================================================================================================



    // Variables globales.
    void main(void)                                                         // Función Principal.
{    

    // Configuraciones varias.

    set_tris_b(0xF0);                                                   // Nibble bajo salidas, el alto entradas.
    output_b(0x00);                                                     // Inicializamos las salidas a 0.
    set_tris_c(0b00111000);                                             // RC0,RC1,RC2,RC6,RC7,como salidas. Las demás Rc3
                                                                        // RC4,RC5, como entradas.

    setup_adc_ports(AN0_TO_AN2);                                        // Configura canales usados por el ADC.
    setup_adc(ADC_CLOCK_DIV_64);                                        // Asigna la velocidad: relog\64.
    config_ADCON2();                                                    // Configuramos el ADCON2.


    LED_OFF(PWM1);                                                      // Apagamos ambos canales PWM.
    LED_OFF(PWM2);
    usb_init();                                                         // Inicializamos el stack USB.

    usb_task();                                                         // Habilita el periferico usb y las interrupciones.
    USB_debug();                                                        // Nos muestra el estado de conección del USB.                                                       


    while (TRUE)                                                        // Bucle infinito.
    {
        if(usb_enumerated())                                            // Si el dispositivo está configurado...
        {
                    // PWM por software correspondiente al canal 1.
                    valorPWM1_H=valorPWM1;
                    valorPWM1_L=255-valorPWM1_H;
                    for(valorPWM1_H;valorPWM1_H>0;valorPWM1_H--){
                    LED_ON(PWM1);}
                    for(valorPWM1_L;valorPWM1_L>0;valorPWM1_L--){
                    LED_OFF(PWM1);
                    }
                    // PWM por software correspondiente al canal 2.
                    valorPWM2_H=valorPWM2;
                    valorPWM2_L=255-valorPWM2_H;
                    for(valorPWM2_H;valorPWM2_H>0;valorPWM2_H--){
                    LED_ON(PWM2);}
                    for(valorPWM2_L;valorPWM2_L>0;valorPWM2_L--){
                    LED_OFF(PWM2);
                    }

   // Leemos el estado de los pulsadores.                 
   if(input_state(SW1)==0x01){delay_ms(20); envia[0]=0x01;}else{envia[0]=0x00;}
   if(input_state(SW2)==0x01){delay_ms(20); envia[1]=0x01;}else{envia[1]=0x00;}
   if(input_state(SW3)==0x01){delay_ms(20); envia[2]=0x01;}else{envia[2]=0x00;}
   if(input_state(SW4)==0x01){delay_ms(20); envia[3]=0x01;}else{envia[3]=0x00;}

   // Leemos 2 canales analógicos del PIC.

                    set_adc_channel(0);                                 // Seleccionamos el canal 0 y comenzamos a leer.
                    delay_us(10);                                       // Esperamos un tiempo para estabalizar el dato leido.
                    valor_adc_alta = (read_adc()>>8);                   // Enviamos la parte alta de la conversión de 10 bits.
                    valor_adc_baja = (int)(read_adc());                 // Enviamos la parte baja de la conversión de 10 bits.
                    envia[4]=valor_adc_alta;
                    envia[5]=valor_adc_baja;


                    set_adc_channel(2);                                 // Seleccionamos el canal 2 y comenzamos a leer.
                    delay_us(10);                                       // Esperamos un tiempo para estabalizar el dato leido.
                    valor_adc_alta = (read_adc()>>8);                   // Enviamos la parte alta de la conversión de 10 bits.
                    valor_adc_baja = (int)(read_adc());                 // Enviamos la parte baja de la conversión de 10 bits.
                    envia[6]=valor_adc_alta;
                    envia[7]=valor_adc_baja;

 usb_put_packet(1, envia, USB_CONFIG_HID_TX_SIZE, USB_DTS_TOGGLE);      // Enviamos el paquete de datos por USB.

            if (usb_kbhit(1))                                           // Si hay un paquete de datos del host.. en el buffer lo tomamos y guardamos en la variable data.
            {
                usb_get_packet(1, recibe, USB_CONFIG_HID_RX_SIZE);      // En el buffer lo tomamos del EP1 y lo guardamos en la variable recibe....
                                                                       
                if(recibe[0]==ACTIVA_SALIDAS){                          // Si recibe comando de control de salidas...
                     
                        switch(recibe[1]){                              // Según el dato que recibe, activa o desactiva los led's.
                        case LED_1:
                        output_toggle(PIN_B0);                          // Cambia de estado el LED1.
                        break;
                        case LED_2:
                        output_toggle(PIN_B1);                          // Cambia de estado el LED2.
                        break;
                        case LED_3:
                        output_toggle(PIN_B2);                          // Cambia de estado el LED3.
                        break;
                        case LED_4: 
                        output_toggle(PIN_B3);                          // Cambia de estado el LED4.
                        break;
                         }
                    }
                if(recibe[0]==PWM_CONTROL1)                             // Si recibimos el comando de control PWM1..
                {valorPWM1=recibe[2];}                                  // Tomamos el dato y lo procesamos.
       
                if(recibe[0]==PWM_CONTROL2)                             // Si recibimos el comando de control PWM2..
                {valorPWM2=recibe[3];}                                  // Tomamos el dato y lo procesamos.
                
            }
        }
    }
}              

aca va el C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.ComponentModel;
using System.Runtime.InteropServices;

namespace MecaniqueUK
{
    class EasyHID
    {
        // HID specific...
        public const UInt32 VENDOR_ID = 1781;
        public const UInt32 PRODUCT_ID = 07D0;
        public const int BUFFER_IN_SIZE = 32;
        public const int BUFFER_OUT_SIZE = 32;

        // HID events...
        private const int WM_APP = 0x8000;
        public const int WM_HID_EVENT = WM_APP + 200;
        public const int NOTIFY_PLUGGED = 0x0001;
        public const int NOTIFY_UNPLUGGED = 0x0002;
        public const int NOTIFY_CHANGED = 0x0003;
        public const int NOTIFY_READ = 0x0004;

        // HID interface...
        [DllImport("mcHID.dll")]
        public static extern bool Connect(IntPtr pHostWin);
        [DllImport("mcHID.dll")]
        public static extern bool Disconnect();
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetItem(UInt32 pIndex);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetItemCount();
        [DllImport("mcHID.dll")]
        public static extern bool Read(UInt32 pHandle, IntPtr pData);
        [DllImport("mcHID.dll")]
        private static extern bool Write(UInt32 pHandle, IntPtr pData);
        [DllImport("mcHID.dll")]
        private static extern bool ReadEx(UInt32 pVendorId, UInt32 pProductId, IntPtr pData);
        [DllImport("mcHID.dll")]
        private static extern bool WriteEx(UInt32 pVendorId, UInt32 pProductId, IntPtr pData);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetHandle(UInt32 pVendorID, UInt32 pProductId);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetVendorID(UInt32 pHandle);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetProductID(UInt32 pHandle);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetVersionID(UInt32 pHandle);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetInputReportLength(UInt32 pHandle);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetOutputReportLength(UInt32 pHandle);
        [DllImport("mcHID.dll")]
        public static extern void SetReadNotify(UInt32 pHandle, bool pValue);
        [DllImport("mcHID.dll")]
        public static extern bool IsReadNotifyEnabled(UInt32 pHandle);
        [DllImport("mcHID.dll")]
        public static extern bool IsAvailable(UInt32 pVendorId, UInt32 pProductId);

        // Managed version of the read/write functions.
        public static bool Read(UInt32 pHandle, out byte[] pData)
        {
            IntPtr unmanagedBuffer = Marshal.AllocHGlobal(BUFFER_IN_SIZE);
            bool result = Read(pHandle, unmanagedBuffer);

            try { pData = new byte[BUFFER_IN_SIZE]; Marshal.Copy(unmanagedBuffer, pData, 0, BUFFER_IN_SIZE); }
            finally { Marshal.FreeHGlobal(unmanagedBuffer); }

            return result;
        }

        public static bool Write(UInt32 pHandle, byte[] pData)
        {
            IntPtr unmanagedBuffer = Marshal.AllocHGlobal(BUFFER_OUT_SIZE);
            bool result;

            try { Marshal.Copy(pData, 0, unmanagedBuffer, BUFFER_OUT_SIZE); result = Write(pHandle, unmanagedBuffer); }
            finally { Marshal.FreeHGlobal(unmanagedBuffer); }

            return result;
        }

        }
    }
Cambio de vid,pid
namespace MecaniqueUK
{
    class EasyHID
    {
        // HID specific...
        public const UInt32 VENDOR_ID = 1781;
        public const UInt32 PRODUCT_ID = 07D0;
        public const int BUFFER_IN_SIZE = 32;
        public const int BUFFER_OUT_SIZE = 32;



#ifndef __USB_DESCRIPTORS__
#define __USB_DESCRIPTORS__

#ifndef USB_CONFIG_PID
   #define USB_CONFIG_PID  0x07D0  // PID easyHID, configurado por el usuario.
#endif

#ifndef USB_CONFIG_VID
   #define  USB_CONFIG_VID 0x1781  // VID easyHID, configurado por el usuario.
#endif

El funcionamiento es el siguiente teniendo habierto el control desde la pc conecto el usb de mi placa oprimo DISPOSITIVO CONECTADO y lo hacepta como conectado.Si lo desconecto y oprimo DIS-CON nuevamente confirma la desconeccion hasta ahora todo bien el problema es que no me indica ni entradas ni salidas ,nada,lo unico que se obserba en la placa es el cambio de led de la enumeracion.
Comento yo tengo un booloader cargado en el pic que esta en C18 y en otr momento queria cargar un programa para dimerizar led y buscando en un foro encontre el que yo puse como remapeo y funciono.
Tendra esto que ver en el problema.
Desde ya un gran abazo.
 
Última edición por un moderador:
Les voy a dejar los dos programas,yo cambie el vid y el pid del fuente visualC# por no coincidir con el del fuente c del pic

Muy raro esto que contas, yo cuando lo cargué al proyecto funcionaba todo OK y el VID/PID era correcto.
De todas maneras lo voy a revisar.

El funcionamiento es el siguiente teniendo habierto el control desde la pc conecto el usb de mi placa oprimo DISPOSITIVO CONECTADO y lo hacepta como conectado.Si lo desconecto y oprimo DIS-CON nuevamente confirma la desconeccion hasta ahora todo bien el problema es que no me indica ni entradas ni salidas ,nada,lo unico que se obserba en la placa es el cambio de led de la enumeracion.

Puede ser que el software para la PC tenga algunos errores, estaría bueno que subas un video corto del comportamiento del software para ver que es lo que sucede.

Saludos !
 
Atrás
Arriba