desktop

Envio de un Hola en CCS por USB atraves de HID y 18F2550

Que version usaste inves de la 4.105 ???? Tengo el mismo problema uso la 4.107...



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!


que version usaste inves de la 4.105?? Tengo el mismo problema con los id... Lo llegaste a implementar fisicamente'????? Yo lo tengo en fisico y uso la 4.107 y aun no puedo establecer la comunicacion en winxp ni en win7
 
Última edición:
Empece con esa versión, finalmente lo hice funcionar en cualquier otra versión, tanto la 4.023 (creo que la 4.06X no recuerdo exactamente) y en versiones posteriores estoy probando.
 
Buenas, ahi subo los archivos, perdon por la demora, pero he estado complicado con el trabajo y mi bendita tesis:
ese es el codigo del microcontrolador, basicamente recive datos para mostrarlos en un display serial

despues subo con tiempo los codigos en delphi, no los tengo a mano ahora, pero para subir algo. De todos modos en delphi buscando se encuentran unas librerias interesantes en USB, pero la verdad son medias complicadas de hacerlas funcionar, veo si en estos dias subo los archivos que restan.
 
Hola a todos, viendo todos los aportes que han dado logre hacer que el usb HID me funcionara en proteus, pero cuando lo pruebo físicamente no funciona, el único inconveniente que se me presenta en proteus es que me toca darle correr dos veces para que empiece a funcionar, el HOST lo hice en C# 2008 y el código del pic esta hecho en ccs. El programa consiste en enviar un numero de celular de 10 dígitos. para iniciar se debe correr la simulación en proteus una ves aparezca en la lcd "presionar iniciar" en la interfaz de C# se presiona conectar y luego iniciar, una ves hecho esto en la lcd se nos pide el numero de celular una ves ingresado este a través del teclado se presiona le tecla "A" para enviarlo al campo de texto de la interfaz. en el archivo adjunto la librería modificada para el manejo del teclado4X4 y la libreria usb_desc_hid2 que de igual forma modifique. cualquier colaboración acerca de porque no funciona físicamente les agradeceré.

Ps: el cristal externo que uso es de 20MHZ y el problema es que el computador ni siquiera reconoce el dispositivo ya que cuando este es reconocido enciendo 2 leds
 

Adjuntos

  • USB JD.rar
    699 KB · Visitas: 192
Hola todos de nuevo bueno el problema que tenia ya lo solucione, use el ejemplo ex_usb_hid.c que viene con el ccs y de ahi me guie y ya el computador lo reconoce y envio datos desde el micro al computador. Pero ahora tengo una duda quiero saber si se puede usar en el mismo micro USB HID y la lcd al tiempo, ya que estoy usando el pic 18f4550 y apenas inicializo la lcd ( lcd_init();) el computador no reconoce el micro
 
quiero saber si se puede usar en el mismo micro USB HID y la lcd al tiempo, ya que estoy usando el pic 18f4550 y apenas inicializo la lcd ( lcd_init();) el computador no reconoce el micro
Intenta cambiando el órden, primero inicia el LCD luego el USB.
Otra también es que está trabajando por poleo, es decir que si el PIC no se comunica con la PC cada cierto tiempo, ésta pierde conexión. Una solución a ésto es activar interrupción por USB, averigua sobre eso para configurar en el CCS.

Saludos.
 
ByAxel gracias por responder. He cambiado el lcd_init(); el usb_init_cs(); de posicion e incluso el #include <lcd.c> pero nada en el proteus funciona perfecto pero físicamente no y como dije si quito el lcd_ini(); si funciona físicamente, aquí coloco el código a ver si me pueden ayudar, con respecto a lo del usb por interrupciones si me pueden colaborar con información ya que no he trabajado antes con esto.

Código:
//set to 1 to use a PIC's internal USB Peripheral
//set to 0 to use a National USBN960x peripheral
#define __USB_PIC_PERIF__ 1
#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48MHZ)

#DEFINE LED1  PIN_A0
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)



//Tells the CCS PIC USB firmware to include HID handling code.
#DEFINE USB_HID_DEVICE  TRUE

//the following defines needed for the CCS USB PIC driver to enable the TX endpoint 1
// and allocate buffer space on the peripheral
#define USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT   //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP1_TX_SIZE    11 //allocate 8 bytes in the hardware for transmission
#define USB_CONFIG_HID_TX_SIZE 11

#define USB_CONFIG_HID_RX_SIZE 11
//the following defines needed for the CCS USB PIC driver to enable the RX endpoint 1
// and allocate buffer space on the peripheral
#define USB_EP1_RX_ENABLE  USB_ENABLE_INTERRUPT   //turn on EP1 for OUT bulk/interrupt transfers
#define USB_EP1_RX_SIZE    11 //allocate 8 bytes in the hardware for reception


///only the 18F4550 development kit has this pin
#if __USB_PIC_PERIF__ && defined(__PCH__)
 #define USB_CON_SENSE_PIN PIN_C2
#endif




#if __USB_PIC_PERIF__
#if defined(__PCM__)
#include <pic_usb.h>   //Microchip PIC16C765 hardware layer for usb.c
#else
#include <pic18_usb.h>   //Microchip 18Fxx5x hardware layer for usb.c
#endif
#else
#include <usbn960x.c>   //National 960x hardware layer for usb.c
#endif
#include <usb_desc_hid.h>   //USB Configuration and Device descriptors for this UBS device
#include <usb.c>        //handles usb setup tokens and get descriptor reports


#define LED_ON output_low
#define LED_OFF output_high


#include <lcd.c> //libreria manejo lcd 4 bits

void usb_debug_task(void) {
   static int8 last_connected;
   static int8 last_enumerated;
   int8 new_connected;
   int8 new_enumerated;

   new_connected=usb_attached();
   new_enumerated=usb_enumerated();

   if (new_enumerated)
      LED_ON(LED1);
   else
      LED_OFF(LED1);

   if (new_connected && !last_connected)
      printf("\r\n\nUSB connected, waiting for enumaration...");
   if (!new_connected && last_connected)
      printf("\r\n\nUSB disconnected, waiting for connection...");
   if (new_enumerated && !last_enumerated)
      printf("\r\n\nUSB enumerated by PC/HOST");
   if (!new_enumerated && last_enumerated)
      printf("\r\n\nUSB unenumerated by PC/HOST, waiting for enumeration...");

   last_connected=new_connected;
   last_enumerated=new_enumerated;
}

void main() {
char Mensaje[4]={'H','O', 'L', 'A'};

   

   printf("\r\n\nCCS Vendor Specific HID Example");

  #ifdef __PCH__
   printf("\r\nPCH: v");
   printf(__PCH__);
  #else
   printf("\r\n\PCM: v");
   printf(__PCM__);
  #endif

   usb_init_cs();
   lcd_init();                   // inicializo la LCD
   lcd_gotoxy(1,1);
   printf(lcd_putc, "PIC 18f4550"); //Imprimo mensaje en la LCD

   while (TRUE) {
      usb_task();
      usb_debug_task();
 
        
      if (usb_enumerated()) {
        usb_put_packet(1, Mensaje, 4, USB_DTS_TOGGLE); //envio la palabra HOLA por el puerto usb
        delay_ms(500);
       }
      
   }
}
 
Última edición:
Intenta con iniciar 1ro el LCD:

Código:
lcd_init();       // 1ro inicializo la LCD, dura unos 15ms a más según la libreria que uses
usb_init_cs();  // 2do

Usar Delays grandes (delay_ms(500)) es una mala práctica cuando se trabaja con USB Polling, como ya mencioné el PC y el PIC deben de comunicarse cada cierto tiempo, constantemente y este tiempo es reducido.

Adjunto un archivo que es para un teclado USB HID, no es de mi autoria pero te puede guiar.
Saludos.
 

Adjuntos

  • RRUSB_HID.rar
    134.7 KB · Visitas: 122
Gracias ByAxel por tu ayuda ya solucione el inconveniente lo que pasaba era que como estaba usando una tarjeta de desarrollo de prueba donde ya viene cableado la LCD, el teclado la conexión USB y todas esas cosas que evitan el uso de la protoboar esta tarjeta el pin RW de la LCD esta cableado a tierra y revisando en la librería de LCD.c me encontre con esta linea de código " while(bit_test(lcd_read_byte(),7)) " lo que hace es leer la LCD en otras palabras es como detectarla y al estar el RW a tierra el pic no la podía leer y se quedaba en ese ciclo, entonces solo la comente y listo! esto pasaría igualmente si se hacen pruebas sin tener la LCD conectada.

En todo caso muchas gracias, cuando termine el trabajo completo se los estaré compartiendo con detalles.
 
muy buenos días a todos, soy nuevo en este tema y me gustaría me pudiesen ayudar, he logrado hacer comunicación usb atraes del puerto con cdc pero ahora lo estoy intentando por HID y es aquí donde estoy teniendo problemas, he estado probando con el ejemplo que subió el compañero que no es de su autoria el archivo "RRUSB_HID", el cual lo que hace es en cuanto se conecta el pic empieza a enviar todo el abecedario de la "a" a la "z" y luego los números del 0 al 9, pero el problema que tengo es que para poder que funcione físicamente debo tocar con mi dedo el pin B0
de resto el micro no envía los ¡¡datos!!! se que es algo raro y dentro del programa el configura el puerto B así
port_b_pullups(true);
set_tris_b(0b00000001);
output_high(PIN_SOURCE);

y no se con que fin lo hace, viendo otros programas también encontré en los mismo que también configuraban el pin B0 como high, al momento de enviar un dato, ademas intente aterrizar este pin con resistencia 220 ohm, pero nada, luego conecte la resistencia a 5v y nada, pero al tocar el pin funciona inmediatamente el envió de datos, en este momento estoy probando el programa que subieron inicialmente en este foro del envió del "HOLA" y no me quiere funcionar, agradecería su ayuda, gracias
 
muy buenas a todos, deseo por favor me puedan dar solución a los inconvenientes y dudas que se me vienen presentando, he hecho también el programa que envía un HOLA y tampoco funciona, aun después de haber seguido los pasos que allí se indican, les agradecería una pronta respuesta.
mi correo es políticas@delforo.com
les deseo a todos un feliz día.


 
Última edición por un moderador:
Bueno, antes que anda probé el programa del PIC que subí, anda bien en Proteuss 8, pero a la hora de probarlo en la realidad, es decir, "FISICAMENTE" no funciona correctamente.
Lo que hubo que hacer es modificar los fuses, estos están en la mayoría de los ejemplos que hay dando vueltas.
Además el programa que tenía de ejemplo no hay manera de que funcione en delphi xe4, por este motivo no lo he subido.
Igual, ahora abandoné el USB por un tiempo hasta que termine con otros inconvenientes que tengo encima.
Estoy terminando mi tesis de grado y estoy haciendo un programa que comanda un horno de inducción, por lo qué hasta que no termine con eso no podré verme con esto.
Aun así, cualquier consulta háganla por acá.
 
Última edición por un moderador:
Hola buenas! una pregunta, cuando compilo cualquier programa o ejemplo me dice que no encuentra el archivo usb.c la verdad lo busque por toda la pc y no lo encuentro. alguien me puede ayudar? Gracias! Saludos!
 
Hola buen dia a todos, soy nuevo en esto de conexion usb-pic, resulta que quiero simular con proteus la conexion, me reconoce la conexion usb, instala el dispositivo como HID, pero pone el "vid_0000&pid_0000" como esta configurado en el pic "vid_04D8&pid_00E0", supongo que no soy el unico que le paso esto :(, espero que alguien me pueda dar una mano :), muchas gracias,Saludos.
 
Hola que tal, tengo un problema con un programa de USB HID.
Conecto el pic a la pc y lo reconoce y el pic puede recibir los datos de la pc.
El problema es cuando uso el comando usb_put_packet, envía siempre el mismo dato, no es que solo lo envía una ves y listo.
Acá dejo el código, espero alguien me pueda ayudar.
Saludos.
Código:
#include <18f2550.h>           //archivo de cabecera
#fuses HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN // fuses  configurados
#use delay(clock=20000000)     // 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
#define USB_CONFIG_HID_TX_SIZE 8
//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
#define USB_CONFIG_HID_RX_SIZE 8

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

   #define LCD_ENABLE_PIN  PIN_B5                                    ////
     #define LCD_RS_PIN      PIN_B6                                    ////
     #define LCD_RW_PIN      PIN_B7                                    ////
     #define LCD_DATA4       PIN_B0                                   ////
     #define LCD_DATA5       PIN_B1                                   ////
     #define LCD_DATA6       PIN_B2                                   ////
     #define LCD_DATA7       PIN_B3 

#include <lcd.c>


  

void main() {
   int8    datai[USB_EP1_RX_SIZE];                                    // Declaramos la variable recibe de 32 bytes.
   int8    datao[USB_EP1_TX_SIZE]={'E','n','u','m',' ',' ','O','K'};                               // Declaramos la variable envía  de 32 bytes.

   char Mensaje[8]={'R','E','C','I','B','I','D','O'};

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

 
    lcd_init();
    lcd_putc("\fConectando\n");


    usb_init(); //inicializa y espera a ser encendido  
      

   usb_wait_for_enumeration(); //ahora espera hasta ser enumerado (reconocido por la PC)    
               



    lcd_putc("\fEsperando orden\n");
    
usb_task();
//usb_puts(1,datao,8,0);


    usb_put_packet(1,datao,USB_EP1_TX_SIZE ,USB_DTS_TOGGLE);
delay_ms(50);

   while(TRUE){
    
            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, datai, USB_CONFIG_HID_RX_SIZE);      // En el buffer lo tomamos del EP1 y lo guardamos en la variable datai....
        
               
            if (datai[0]==1){
    
                 lcd_putc ("\f Recibido 1 \n"); }      
        if (datai[0]==2){
                 lcd_putc ("\f Recibido 2 \n"); } 
        if (datai[0]==3){
                 lcd_putc ("\f Recibido 3 \n"); }  
        if (datai[0]==4){
                 lcd_putc ("\f Recibido 4 \n"); }  
        if (datai[0]==5){
                 lcd_putc ("\f Recibido 5 \n"); }     

            }
              
   }
}
 
Última edición por un moderador:
Atrás
Arriba