Autor Tema: Problema con bootloader HID y comunicación usb cdc  (Leído 5554 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado InfraDigi

  • PIC10
  • *
  • Mensajes: 3
Problema con bootloader HID y comunicación usb cdc
« en: 26 de Enero de 2011, 04:12:28 »
Saludos a todos.
Soy nuevo en el foro como participante pues, siempre lo he visto  sin estar registrado.
Espero puedan ayudarme y de la misma forma, trataré de aportar con mis conocimientos.

Tengo un PIC18f2550 con bootloader HID sacado del beepic de microingenia.
Quiero que este pic soporte comunicación Rs232 a través del usb tipo cdc.
El código que implemento es el siguiente:

/***********************************************************************************************/
#include <18F2550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,NOBROWNOUT,USBDIV,PLL2,CPUDIV1,VREGEN,PUT,MCLR
#use delay(clock=48000000)

#include "C:\Program Files\PICC\Projects\usb_BOOTLOADER.h"
#include "C:\Program Files\PICC\Projects\usb_cdc.h"

void main()
{
   usb_cdc_init();
   usb_init_cs();
   while (TRUE)
  {                   
     usb_task();   
  }
   //TODO: User Code
}

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


En el archivo usb_desc_cdc.h tengo como VID = 0x0461 y PID = 0x0033, tal como están en los .inf. Uso uno de microchip y el que tiene ccs en su versión 4.110


El programa compila sin problemas y lo cargo al microcontrolador.

En la imagen adjunta se ven los resultados:
1. en el administrador de dispositivos se ve el PIC como un dispositivo tipo usb desconocido.
2. Me sale un mensaje diciendo que hay problema con el dispositivo.
3. Al intentar instalar el driver, me dice que ya está instalado el mejor driver y no me soluciona el problema.

Mi hipótesis es que el Bootloader HID afecta de alguna forma el uso del cdc, pero no se exactamente como.

Creo que los fuses están bien, tengo un cristal de 8MHz.

Agradezco cualquier ayuda.

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
Re: Problema con bootloader HID y comunicación usb cdc
« Respuesta #1 en: 27 de Enero de 2011, 08:12:33 »
Hola,

Si estás usando el Bootloader HID, cambia esta linea:
#include "C:\Program Files\PICC\Projects\usb_cdc.h"

Por esto:
#define CODE_START   0x1000
#build(reset=CODE_START, interrupt=CODE_START+0x08)
#org 0, CODE_START-1 {}

Pruebalo y comenta ;)

Desconectado InfraDigi

  • PIC10
  • *
  • Mensajes: 3
Re: Problema con bootloader HID y comunicación usb cdc
« Respuesta #2 en: 27 de Enero de 2011, 10:35:39 »
Muchas gracias J1M. Hice lo que me dijiste y todo se solucionó.

Aclaro que el cambio que hice fue cambiar la línea:
#include "C:\Program Files\PICC\Projects\usb_BOOTLOADER.h"

y no cambié la línea
#include "C:\Program Files\PICC\Projects\usb_cdc.h"
pues me quedo sin usb  :)

Ya tengo por fin mi dispositivo usb cdc.

Se que con las lineas que me dio J1M reservo el espacio del bootloader para que la aplicación
no interfiera con su espacio de memoria, además que ubica el vector de reset y de interrupciones
pero finalmente no se que parte del archivo usb_BOOTLOADER.h tenía el problema.


Lo muestro a continuación y si saben el problema y por qué, agradecería mucho.


//*****************************************************************
#define LOADER_SIZE        (0x17FF)

//the loader and application need a common flag that determines if we are in
//the bootloader or application, that way the ISR knows where to go.  this
//is the location in ram that is reserved for this flag.
#define LOC_IN_LOADER_FLAG  0x25

//// --- end configuration --- ////////////////////////////////////////////

#reserve LOC_IN_LOADER_FLAG

int8 g_InBootloader;
#locate g_InBootloader=LOC_IN_LOADER_FLAG

#define LOADER_START       (0)
#define LOADER_END         (LOADER_SIZE)
#define APPLICATION_START  (LOADER_SIZE+1)
#if defined(__USB_87J50__)
 #define APPLICATION_END    (getenv("PROGRAM_MEMORY")-9) //configuration bits
#else
 #define APPLICATION_END    (getenv("PROGRAM_MEMORY")-1)
#endif
#define APPLICATION_ISR    (APPLICATION_START+8)

#ifdef _bootloader
 /*
  Provide an empty application, so if you load this .HEX file into the pic
  without an application this will prevent the pic from executing unknown code.
 */
 #org APPLICATION_START,APPLICATION_START+0xF
 void BlankApplication(void)
 {
   while(TRUE);
 }

 //we need to prevent the loader from using application space
 #if (APPLICATION_END > 0x10000)
   #org APPLICATION_START+0x10, 0xFFFF {}
   #if (APPLICATION_END > 0x20000)
      #org 0x10000, 0x1FFFF {}
      #org 0x20000, APPLICATION_END {}
   #else
      #org 0x10000, APPLICATION_END {}
   #endif
 #else
   #org APPLICATION_START+0x10, APPLICATION_END {}
 #endif

   #define  USB_CONFIG_PID       0x0033

   #define USB_STRINGS_OVERWRITTEN
   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
            0x03, //USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
            0x09,0x04,   //Microsoft Defined for US-English
      //string 1  - manufacturer
            8, //length of string index
            0x03, //USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
            'C',0,
            'C',0,
            'S',0,
      //string 2 - product
            30, //length of string index
            0x03, //USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
            'C',0,
            'D',0,
            'C',0,
            ' ',0,
            'B',0,
            'o',0,
            'o',0,
            't',0,
            'l',0,
            'o',0,
            'a',0,
            'd',0,
            'e',0,
            'r',0
   };
#endif   //_bootloader

#ifndef _bootloader
 //in the application, this moves the reset and isr vector out of the bootload
 //space.  it then reserves the loader space from being used by the application.
 #build(reset=APPLICATION_START, interrupt=APPLICATION_ISR)
 #org 0, LOADER_END {}
#endif

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


Muchas gracias.

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
Re: Problema con bootloader HID y comunicación usb cdc
« Respuesta #3 en: 27 de Enero de 2011, 10:42:43 »
Razón tienes... xD Me equivoqué al copiar la linea, veo que captaste el mensaje jejeje.

Me alegro que funcione!

Un saludo ;)

PD: Con respecto a tu pregunta, el problema está en que el tamaño del bootloader de CCS (USB CDC) es de 0x2000bytes, el de MCP/MiE (USB HID) es de 0x1000bytes.

Desconectado InfraDigi

  • PIC10
  • *
  • Mensajes: 3
Re: Problema con bootloader HID y comunicación usb cdc
« Respuesta #4 en: 27 de Enero de 2011, 12:22:49 »
Gracias por responder.

Luego hago pruebas para verificar lo que me dices del tamaño del bootloader.

De nuevo muchas gracias por la ayuda.

Un saludo para ti.

Desconectado marito

  • PIC16
  • ***
  • Mensajes: 217
Re: Problema con bootloader HID y comunicación usb cdc
« Respuesta #5 en: 05 de Enero de 2012, 22:35:35 »
Hola!


Estoy trabajando con un PIC18F4550 en el que uso bootloader HID y comunicación USB CDC para enviar datos a una PC con windows 7 64 bits.

El bootloader funciona de manera correcta, me detecta el PIC y descargo el siguiente programa:

Código: [Seleccionar]
#include <18F4550.h>

#fuses HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48000000)

#include <usb_cdc.h>
#include "usb_desc_cdc.h"
#include <usb.c>           //handles usb setup tokens and get descriptor reports

#define LOADER_SIZE                 (0x0FFF)
#define LOADER_START                (0)
#define LOADER_END                  (LOADER_SIZE)
#define APPLICATION_START           (LOADER_SIZE+1)
#define APPLICATION_END             (getenv("PROGRAM_MEMORY")-1)
#define APPLICATION_ISR             (APPLICATION_START+8)

#build(reset=APPLICATION_START, interrupt=APPLICATION_ISR)

#org 0,LOADER_END AUTO=0 void bootloader(void) {}


void main(){
   usb_cdc_init();
   usb_init_cs();    
  
while(true){
     usb_task();
     if(usb_cdc_connected()){
      
if (usb_enumerated()){
                printf(usb_cdc_putc, "Hola");
                delay_ms(500);    
           }
     }
}
}



Luego de descargar el programa, reseteo el mismo, y dentro de los dispositivos del sistema me aparece como COM5.
Con el programa intento enviar los caracteres "HOLA" y recibirlos en la PC, pero hasta el momento no lo he conseguido. He probado con el SIOW de ccs y con un terminal pero no recibo nada.


Hay algún error en el código que estoy usando?


Para hacer una prueba y determinar si es correcta la configuración, intente encender un led conectado en el PIN_D2, usando el siguiente código:

Código: [Seleccionar]
include <18F4550.h>

#fuses HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48000000)

#include <usb_cdc.h>
#include "usb_desc_cdc.h"
#include <usb.c>           //handles usb setup tokens and get descriptor reports

#define LOADER_SIZE                 (0x0FFF)
#define LOADER_START                (0)
#define LOADER_END                  (LOADER_SIZE)
#define APPLICATION_START           (LOADER_SIZE+1)
#define APPLICATION_END             (getenv("PROGRAM_MEMORY")-1)
#define APPLICATION_ISR             (APPLICATION_START+8)

#build(reset=APPLICATION_START, interrupt=APPLICATION_ISR)

#org 0,LOADER_END AUTO=0 void bootloader(void) {}


void main(){
   //usb_cdc_init();
   //usb_init_cs();    
  
while(true){
     output_high(PIN_D2);
delay_ms(5000);

output_low(PIN_D2);
delay_ms(5000);
}
}

El LED no se encendía, recién comenzo a parpadear cuando elimine las siguientes líneas:


Código: [Seleccionar]
include <usb_cdc.h>
#include "usb_desc_cdc.h"
#include <usb.c>           //handles usb setup tokens and get descriptor reports


Espero que toda la información pueda servir para resolver mi problema.

Gracias!

Desconectado marito

  • PIC16
  • ***
  • Mensajes: 217
Re: Problema con bootloader HID y comunicación usb cdc
« Respuesta #6 en: 21 de Enero de 2012, 21:48:06 »
Hola!

He estado haciendo pruebas con el bootloader HID y la comunicación USB CDC entre un 18F4550 y un PC con windows7 64bits.

Hasta el momento, han funcionado ambas cosas pero por separado. Lo que necesito, que no he logrado hasta ahora, es tener un PIC con bootloader HID que me permita cargar un programa que comunique datos con el PC a través de CDC.

Es posible que funcionen ambas funciones en forma conjunta?

Saludos!

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problema con bootloader HID y comunicación usb cdc
« Respuesta #7 en: 22 de Enero de 2012, 00:07:51 »
Primero que nada, en este caso que mencionas, no trabajan de forma conjunta. Según se seleccione por SW se ejecutará uno u otro. No hay nada que imposibilite usarlos como necesitas.  ;-)



Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado marito

  • PIC16
  • ***
  • Mensajes: 217
Re: Problema con bootloader HID y comunicación usb cdc
« Respuesta #8 en: 30 de Enero de 2012, 19:54:36 »
Suky! Leyendo en varios foros encontré que varias personas tuvieron problemas con el bootloader HID.

Así que tomé la decisión y probé con el bootloader CDC de CCS.

Funcionó! Asi que tengo bootloader CDC y también un programa comunicando con comunicación CDC.

El bootloader HID me permite descargar programas, pero al momento de intentar comunicar vía usb cdc, no lo hace.

Algún día encontraré la respuesta, pero por el momento ya tengo mi PIC con comunicación USB y bootloader!

Saludos!

Desconectado marito

  • PIC16
  • ***
  • Mensajes: 217
Re: Problema con bootloader HID y comunicación usb cdc
« Respuesta #9 en: 30 de Enero de 2012, 19:56:30 »
Ah!  Tengo en mente abrir un hilo para explicar el paso a paso de lo que tuve que hacer, pero primero tengo que ordenar la info y las ideas!

Saludos!

Desconectado isabelino

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 139
Re: Problema con bootloader HID y comunicación usb cdc
« Respuesta #10 en: 07 de Abril de 2012, 11:59:33 »
Marito:
          Recién veo tu post, el error que tienes es la configuración del pin USB_SENSE dentro de io_cfg.h. Lo que hago, es desde el pin1 del conector USB pongo a tierra una resistencia de 100k, y otra del mismo valor que va desde esa misma unión al pin RB2 del PIC. Tienes que modificar:
-----------------------------------------------------------------------------------------------------------------
#define tris_usb_bus_sense   TRISBbits.TRISB2    // Modica aquí para el pin que vayas a usar.
#if defined(USE_USB_BUS_SENSE_IO)
   #define usb_bus_sense   PORTAbits.RA2     
#else
   #define usb_bus_sense   1
#endif
------------------------------------------------------------------------------------------------------------------
Utilizo el bootloader de Neoteo, pero entonces tuve que modificar el códgo de arriba y también el siguiente, también en io_cfg.h

#define tris_self_power     TRISCbits.TRISC2    // Modifique para entrar en modo bootloader con
#if defined(USE_SELF_POWER_SENSE_IO)        // el pin RC2.
   #define self_power      PORTCbits.RC2
#else
   #define self_power      1
#endif

/** L E D ***********************************************************/
#define mInitAllLEDs()      LATC &= 0xFC; TRISC &= 0xFC; // Modifique para que coincidieran los
                                                                                       // Leds
#define mLED_1              LATCbits.LATC0 //verde               //Aqui también
#define mLED_2              LATCbits.LATC1 //rojo                  // y aquí.

#define mLED_1_On()         mLED_1 = 1;
#define mLED_2_On()         mLED_2 = 1;

#define mLED_1_Off()        mLED_1 = 0;
#define mLED_2_Off()        mLED_2 = 0;

#define mLED_1_Toggle()     mLED_1 = !mLED_1;
#define mLED_2_Toggle()     mLED_2 = !mLED_2;

#define mLED_Both_Off()     {mLED_1_Off();mLED_2_Off();}
#define mLED_Both_On()      {mLED_1_On();mLED_2_On();}
#define mLED_Only_1_On()    {mLED_1_On();mLED_2_Off();}
#define mLED_Only_2_On()    {mLED_1_Off();mLED_2_On();}

#endif //IO_CFG_H
---------------------------------------------------------------------------------------------------------

Pruebalo funciona de maravillas.

Un abrazo desde Uruguay:
                                      Isabelino.   :D :D :D