Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

20/11/2010 #1

Avatar de albertoxx

Envio de un Hola en CCS por USB atraves de HID y 18F2550
Aqui les va un resumen de mis primeros pasos con la comunicacion del pic 18F2550 y la PC por USB(HID) si me equivoco en algo les agradeceria que me corrigieran.

Requerimientos :
Compilador CCS
Programa(HOST) en windows que pueda abrir una conexion a un VendorID,ProductID

Descripcion :
Enviar un "hola" cada 500 ms y pueda ser recibido por un programa en windows

Para empezar el compilador CCS ya trae la mayor parte del trabajo echo solo hay que modificar ciertos parametros muy puntualmente para que funcione, elegi HID en vez de CDC por que no quiero ninguna instalacion de drivers en especifico para emular un puerto Serial, por que cuando uno compra un mouse usb solo lo conecta y listo no tiene que instalar ningun driver ademas creo que con HID se obtiene mas velocidad de transmision.

Saquemos una copia del archivo usb_desc_hid.h que esta en el directorio de drivers alli tendremos que modificar varias cosas primero aqui en
const char USB_CLASS_SPECIFIC_DESC[]
las 2 lineas que dicen cambiar el 2 por la cantidad de bytes a enviar o recibir en cada envio
en este caso como hola tiene 4 caracteres ponemos 4 en vez del 2
0x95, 2, // Report count = 16 bits (2 bytes)
en
const char USB_DEVICE_DESC[USB_DESC_DEVICE_LEN] ={
0x61,0x04, //vendor id (0x04D8 is Microchip, or is it 0x0461 ??)
0x20,0x00, //product id ==11,12 //don't use ffff says usb-by-example guy. oops
cambiar o dejar asi las lineas esto nos servira para que desde la compu nos comuniquemos con el dispositivo
aqui ira el nombre con el que windows detectara el dispositivo
char const USB_STRING_DESC[]={

con estos simples cambios ya nos podremos dedicar al programa principal aqui se los pongo con sus respectivas descripciones

Código:
#include <18f2550.h>           //archivo de cabecera
#fuses HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,NOVREGEN,NOPBADEN // fuses  configurados
#use delay(clock=48000000)     // el clock que tendremos a la entrada del CPU compatible con USB 2.0
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, BITS=8) //para debuguear las salidas del printf,puts etc.

#DEFINE USB_HID_DEVICE  TRUE // Si usar HID 

//Habilitar la Transferencia
#define USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT   //Activa el punto final 1 para transferencias por bloque 
#define USB_EP1_TX_SIZE    8                      //8 bytes  para envio
//Habilitar la Recepcion
#define USB_EP1_RX_ENABLE  USB_ENABLE_INTERRUPT   //Activa el punto final 1 para recepcion por bloque 
#define USB_EP1_RX_SIZE    8                      //8 bytes para recepcion

#include <pic18_usb.h>      //Funciones de bajo nivel(hardware) para la serie PIC 18Fxx5x que serviran en usb.c
#include <usb_desc_hid.h>    //Aqui es donde van las descripciones de este dispositivo (como lo reconocera windows)
#include <usb.c>            //libreria para el manejo del usb

//funciones en pic18_usb.h
//Posibles estados del USB
// USB_STATE_DETACHED=0, USB_STATE_ATTACHED=1, USB_STATE_POWERED=2, USB_STATE_DEFAULT=3,
// USB_STATE_ADDRESS=4, USB_STATE_CONFIGURED=5
//usb_init()
//             se desconecta usando usb_init_cs y luego entra en un ciclo infinito monitoriado por
//             usb_task hasta que el estado del usb sea POWERED 
//usb_init_cs()
//             es un alias de usb_detach()
//usb_put_packet()
//             envia un paquete al HOST
//usb_kbhit()
//             devuelve TRUE si hay datos enviados por HOST(PC)
//usb_rx_packet_size()
//             devuelve el tamano del paquete enviado por el HOST(PC)
//usb_get_packet()
//             realiza la recepcion de la informacion enviada por el HOST(PC)
//usb_detach()
//             Se Desconecta y se pone en estado DETACHED
//usb_attach()
//             Se Conecta
//usb_attached() 
//             Para dispositivos que no tienen este pin simpre devuelve TRUE como el 18F2550
//             devuelve TRUE si USB_CON_SENSE_PIN = TRUE el pin que indica si esta conectado o no
//usb_task()
//             Monitorea el estado de la coneccion conectandose y desconectandose automaticamente


//funciones en usb.c necesita de la libreria de hardware
//usb_enumerated()
//             devuelve TRUE si el HOST(PC) ya enumero el dispositivo o sea si windows ya lo detecto
//usb_wait_for_enumeration()
//             espera infinitamente hasta que el dispositivo fue enumerado 
//usb_kbhit()
//             devuelve TRUE si hay datos enviados por HOST(PC)
//usb_puts()
//             como el puts serial solo que este es USB usa la funcion put packet 
//usb_gets()    
//             como el gets serial solo que este es USB usa la funcion get packet 

void main() {
   int8 out_data[20];
   int8 in_data[2];
   int8 send_timer=0;
   int8 contador=0;
   char Mensaje[4]={'H','O','L','A'};

   setup_adc_ports(NO_ANALOGS);  // desactivando puertos analogicos   
   set_tris_b(0x0);              // configurando los puertos como salidas
   output_b (0);                 // saca un nivel bajo de salida en los puertos

   usb_init(); //inicializa y espera a ser encendido
   output_high(PIN_B0);
   usb_wait_for_enumeration(); //ahora espera hasta ser enumerado (reconocido por la PC)    
   output_high(PIN_B1);
   while(TRUE){
      usb_puts(1,Mensaje,4,100);
      delay_ms(500);
   }
}
20/11/2010 #2

Avatar de Moyano Jonathan

Y el programa para el host donde está ?
21/11/2010 #3

Avatar de albertoxx

A si perdon faltaba el host no lo habia puesto por que la recepcion si depende de gustos a mi en lo particular prefiero delphi para programar asi que aqui va el codigo en delphi

Código:
procedure TMainForm.HidCtlArrival(HidDev: TJvHidDevice);
begin
  Memo1.lines.add('Se conecto el siguiente dispositivo HID = '+ DeviceName(HidDev));
end;

procedure TMainForm.HidCtlRemoval(HidDev: TJvHidDevice);
begin
  Memo1.lines.add('Se desconecto el siguiente dispositivo HID = ' + DeviceName(HidDev));
end;

procedure TMainForm.HidCtlDeviceData(HidDev: TJvHidDevice; ReportID: Byte; const Data: Pointer; Size: Word);
var
  I: Integer;
  Str: string;
begin
  Str := DeviceName(HidDev)+' Ha Enviado : '+Format(' ReportId %.2x  ', [ReportID]);
  for I := 0 to Size - 1 do
    Str := Str + PChar(Data)[I];
  Memo1.lines.add(Str);
end;
14/04/2011 #4

Avatar de Deego

Que tal, otra vez yo, ahora por aca. Me pregunto si se necesita algún driver para que reconozca el PIC, porque en proteus si me lo reconoce, tal vez por el driver que toca instalar, pero ya utilizando el PIC real, dice que el dispositivo no ha sido reconocido. En system32 ya puse el dll mcHID pero no se que más tocará realizar, para que el computador reconozca el PIC, probe en todos los puertos, en varios computadores y sigue saliendo el mismo mensaje, que el dispositivo no es reconocido por el HOST. Alguna sugerencia amigos??
19/09/2011 #5

Avatar de albertoxx

La tecnologia HID es universal tal y como lo es conectar un mouse no necesitas los drivers del fabricante por eso se usa el ID del dispositivo para que tu programa sepa que en realidad conectaste tu HID
08/10/2011 #6


Envio de un Hola en CCS por USB atraves de HID y 18F2550
me podrias pasar tu executable para probar el hid , se agradece de todas formas
10/10/2011 #7

Avatar de albertoxx

Aqui te va
Solo lo ejecutas y conectas tu dispositivo si te lo recooce te va decir que conectaste

suerte y saludos
Archivos Adjuntos
Tipo de Archivo: zip HidPrueba.zip (217,8 KB (Kilobytes), 2075 visitas)
12/02/2012 #8


Hola, me pregunto si con tu ejemplo puedo enviarle datos al pic desde la pc, como para prender un led pero que siga siendo HID?
16/02/2012 #9

Avatar de albertoxx

Si claro que se puede solo que es un poco mas complicado del lado de windows que del lado del pic en el pic unicamente se usa la funcion usb_gets que es lo mismo que usb_puts pero a la inversa uno lee y el otro escribe, ahora del lado de windows cuando detectes que el dispositivo se conecto se te enviara como parametro el dispositivo si es el tuyo entonces creas una variable tipo TJvHidDevice y la asignas luego pones un boton o alguna cosa para que cuando lo presiones ejecute el codigo para enviar que seria mas o menos asi : Dispositivo.WriteFile(Buffer,Dispositivo.Caps.Outp utReportByteLength,CuantosEnvio)
OutputReportByteLength te dice cuando es lo maximo que puede llevar lo que le mandes en buffer
de alli lo cachas con el hid y si la data recibida por el hid digamos q es ON pues prendes el led de lo contrario lo apagas y listo, no es tan complicado suerte!
24/09/2012 #10


Problemas
Hola,

Pues yo estoy intentando hacer una aplicación tambien en modo HID basandome en tu codigo. Para debuggear activo unos pines de forma que puedo saber en que parte del codigo esta el PIC. Sin embargo noto que el PIC no esta logrando pasar de la función usb_init();


Que puede ser?


Propie
27/09/2012 #11

Avatar de albertoxx

Donde regularmente se quedan trabados en el usb_wait_for_enumeration() por que es alli donde windows tiene que instalarlo por asi decir y la primera vez que los conectas se demora un poco, revisa si no es alli por que si no fuera alli, pega el codigo para echarle una vista
13/11/2012 #12


hola yo estoy en bolas en comunicacion pic usb con la pc pero quiero aprender y no se si podrian colgar un archivo en el cual explique como manejar. se los agradezdo de antemano GRACIAS
10/06/2013 #13


Me encanta el tema siempre me resulto de extrema curiosidad la coneccion de pic via USB, Hago una consulta inocente, de que frequencia es el cristal externo para este proyecto? Saludos!
10/06/2013 #14

Avatar de albertoxx

El cristal es de 20Mhz
25/06/2013 #15


Consultita
Buenas, excelente aporte, mi consulta es la siguiente:
Segui los pasos al pie de la letra (o eso creo) y me figura Vendor_ID 0x0000 y product_ID 0x0000 tengo la version 4.105 de sofware y además estoy usando proteuss 8 con el driver para usb, es decir, lo utilizo desde un puerto virtual. Alguna sugerencia? gracias!
27/06/2013 #16


Finalmente lo solucione, era un problema de las librerías de CCS, instale otra version por las dudas y funciono bien.
Ahora estoy tratando de hacer un display USB manejado desde delphi 2006, si interesa, cuando termine lo subo.
15/07/2013 #17


Lo logre
Finalmente logre enviar y recibir datos a travez de USB-HID entre un PIC18F2550 y Delphi 2006 para la interfaz de la PC, solo tuve que utilizar unas librerias llamadas HID_Library__.dll donde no recuerdo donde consegui el ejemplo. Si alguien lo necesita lo subo
23/07/2013 #18

Avatar de albertoxx

Que bueno que te funciono, no has tenido problema con el reconocimiento que a veces le cuesta a windows reconocer lo que se ha conectado.
Saludos
26/08/2013 #19


hola acabo de entrar y estoy en un pryecto ya hace mucho tiempo con conectar el pic 18f4550 con mi pc para manejarlo desde java. ya lo intente de modo cdc y bulk..... y falle con hacerlo reconocer con mi pc (windows 7 x 64bits) asi que solo me queda hacerlo en modo hid. asi que esta seria mi ultima oportunidad.
me gustaria que me explicaras mas detalladamente las funciones que pones de comentario mas que todo las que me sirven para que el pic reciva informacion de la pc. y si alguien ya a intentado unirlo con java que me comente como le fue. yo intentare ustilizar la libreria JpicUSB que es el que me parece entendible para manejar al pic desde java
27/08/2013 #20


Buena tarde Sabonjuan,

si puedes subir los archivos te lo agradeceria

saludos
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.