Autor Tema: Migrando a 18F66J50 ejemplo USB CDC de CCS  (Leído 6112 veces)

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

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Migrando a 18F66J50 ejemplo USB CDC de CCS
« en: 29 de Octubre de 2010, 12:48:09 »
Tengo Montado un interfaz MIDI-USB (clase AUDIO) con un 18F66J50 que funciona perfectamente.
La cuestión es que me viene bien usarla en labores de depuración convirtiéndola en un dispositivo CDC, para representar datos en Hyperterminal o similares.

He cogido el ejemplo ex_usb_serial2 de CCS y le he hecho los cambios que he considerado pertinentes para que, al menos, el dispositivo enumere...pero no lo hace.
Nunca he trabajado con la clase CDC, y no se si estaré obviando algún detalle.

Pongo el código del Main.
No he hecho modificación alguna en ninguno de los otros ficheros.
Adjunto también todo el proyecto para CCS (estoy usando la versión 4.065)

Código: C++
  1. //set to 1 to use a PIC's internal USB Peripheral
  2. //set to 0 to use a National USBN960x peripheral
  3.  
  4. /*
  5. #define __USB_PIC_PERIF__ 1
  6.  
  7. #if !defined(__PCH__)
  8.  #error USB CDC Library requires PIC18
  9. #endif
  10.  
  11. #if __USB_PIC_PERIF__
  12.   #include <18F4550.h>
  13.  
  14.   //configure a 20MHz crystal to operate at 48MHz
  15.   #fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
  16.   //#fuses   USBDIV, PLL1, CPUDIV1, PROTECT, NOCPD, noBROWNOUT,HSPLL,NOWDT,nolvp, VREGEN
  17.   #use delay(clock=48000000)
  18. #else //use the National USBN960x peripheral
  19.   #include <18F452.h>
  20.   #fuses HS,NOWDT,NOPROTECT,NOLVP
  21.   #use delay(clock=20000000)
  22. #endif   //endif check to see which peripheral to use
  23. */
  24.  
  25. #include <18F66J50.h>
  26. #fuses H4_SW,PLL5,NOWDT,NOPROTECT,NODEBUG,NOIESO,NOFCMEN,NOSTVREN
  27. #use delay(clock=48000000)
  28. #use rs232 (STREAM = puerto1, BAUD=31250, PARITY=N, RCV=PIN_C7, xmit=PIN_C6, BITS=8)
  29. //#use rs232 (STREAM = puerto2, BAUD=31250, PARITY=N, RCV=PIN_G2, xmit=PIN_G1, BITS=8)
  30.  
  31. // Includes all USB code and interrupts, as well as the CDC API
  32. #include <usb_cdc.h>
  33.  
  34.  
  35. void main() {
  36.    BYTE i, j, address, value;
  37.  
  38.    usb_cdc_init();
  39.    usb_init();
  40.    
  41.    
  42.    //while(!usb_cdc_connected()) {}
  43.  
  44.    do {
  45.       usb_task();
  46.       if (usb_enumerated()) {
  47.      
  48.          //printf(usb_cdc_putc, "\r\n\nEEPROM:\r\n");              // Display contents of the first 64
  49.        
  50.          //printf(usb_cdc_putc, "\n\r");
  51.          //printf(usb_cdc_putc, "\r\nLocation to change: ");
  52.          //printf(usb_cdc_putc, "\r\nNew value: ");
  53.          //value = gethex_usb();
  54.  
  55.       }
  56.    } while (TRUE);
  57. }

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Migrando a 18F66J50 ejemplo USB CDC de CCS
« Respuesta #1 en: 29 de Octubre de 2010, 13:21:10 »
Yo tengo esto antes de entrar al bucle
while (!usb_enumerated());


y en el bucle la contínua llamada a usb_task();


No sé si ejecutar el task antes del usb_enumerated() puede ser la causa del problema.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Migrando a 18F66J50 ejemplo USB CDC de CCS
« Respuesta #2 en: 29 de Octubre de 2010, 13:28:10 »
Imagino que lo tienes funcionando en un 4550 o alguno de dicha gama.

He probado lo que mencionas y sigue igual :(

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Migrando a 18F66J50 ejemplo USB CDC de CCS
« Respuesta #3 en: 29 de Octubre de 2010, 13:30:27 »
Modu, la función while(!usb_cdc_connected()) {} siempre me ha hecho falta. Prueba descomentando.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Migrando a 18F66J50 ejemplo USB CDC de CCS
« Respuesta #4 en: 29 de Octubre de 2010, 13:31:36 »
Sí, en 18F2550 y también me funciona en un 24FJ.

Quizás inicializando los periféricos consigas algo. A veces en CCS no me arrancan los programas hasta que ejecuto los distintos setup_adc, setup_comparator, setup_timer...

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Migrando a 18F66J50 ejemplo USB CDC de CCS
« Respuesta #5 en: 29 de Octubre de 2010, 13:39:21 »
Voy haciendo lo que comentais a ver...

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Migrando a 18F66J50 ejemplo USB CDC de CCS
« Respuesta #6 en: 29 de Octubre de 2010, 14:34:22 »
Sigue igual.
Windows no llega ni a pedir el driver...simplemente no reconoce el dispositivo :? :5]

Código: C++
  1. #include <18F66J50.h>
  2. #fuses H4_SW,PLL5,NOWDT,NOPROTECT,NODEBUG,NOIESO,NOFCMEN,NOSTVREN
  3. #use delay(clock=48000000)
  4. #use rs232 (STREAM = puerto1, BAUD=31250, PARITY=N, RCV=PIN_C7, xmit=PIN_C6, BITS=8)
  5. #use rs232 (STREAM = puerto2, BAUD=31250, PARITY=N, RCV=PIN_G2, xmit=PIN_G1, BITS=8)
  6.  
  7. // Includes all USB code and interrupts, as well as the CDC API
  8. #include <usb_cdc.h>
  9.  
  10. void inicia()
  11. {
  12.   setup_adc(ADC_OFF);
  13.   setup_timer_1(T1_DISABLED);
  14.   setup_timer_2(T2_DISABLED,0,1);
  15.   setup_timer_3(T3_DISABLED);
  16.   setup_timer_4(T4_DISABLED,0,1);
  17.   setup_ccp1(CCP_OFF);
  18.   setup_ccp2(CCP_OFF);
  19.   setup_ccp3(CCP_OFF);
  20.   setup_ccp4(CCP_OFF);
  21.   setup_ccp5(CCP_OFF);
  22. }
  23.  
  24. void main() {
  25.  
  26.    inicia();
  27.  
  28.    usb_cdc_init();
  29.    usb_init();
  30.      
  31.    while (!usb_enumerated());
  32.    while(!usb_cdc_connected()) {}
  33.  
  34.    do {
  35.       usb_task();
  36.       if (usb_enumerated()) {
  37.      
  38.          //printf(usb_cdc_putc, "\r\n\nEEPROM:\r\n");              // Display contents of the first 64
  39.        
  40.          //printf(usb_cdc_putc, "\n\r");
  41.          //printf(usb_cdc_putc, "\r\nLocation to change: ");
  42.          //printf(usb_cdc_putc, "\r\nNew value: ");
  43.          //value = gethex_usb();
  44.  
  45.       }
  46.    } while (TRUE);
  47. }

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Migrando a 18F66J50 ejemplo USB CDC de CCS
« Respuesta #7 en: 29 de Octubre de 2010, 16:36:56 »
Ese pic funciona hasta 3.6V, deberás implementar varios reguladores externos. Muéstranos el diagrama Modu.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Migrando a 18F66J50 ejemplo USB CDC de CCS
« Respuesta #8 en: 29 de Octubre de 2010, 17:19:14 »
Bueno, doy por hecho que el hard está bien porque funciona como midi-usb

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Migrando a 18F66J50 ejemplo USB CDC de CCS
« Respuesta #9 en: 29 de Octubre de 2010, 17:42:46 »
Hola Modulay, intenté compilar el código con CCS V4.106 y me da este error: Error 111 "ex_usb_serial2.c" Line 4 [7,13]: Unknown keyword in #FUSES "H4_SW" entonces abri el archivo encabezado 18F66J50.h y efectivamente ese fuse no existe.  Esto te ha compilado asi?

Utilizando el PIC_Wizard del CCS me da estos fuses y este encabezado y asi si compila:

Código: [Seleccionar]
#include <18F66J50.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS_PLL
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES NOSTVREN                 //Stack full/underflow will not cause reset
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOFCMEN                  //Fail-safe clock monitor disabled
#FUSES NOIESO                   //Internal External Switch Over mode disabled
#FUSES NOCPUDIV
#FUSES PLL5                     //Divide By 5(20MHz oscillator input)

#use delay(clock=48000000)

#use rs232 (STREAM = puerto1, BAUD=31250, PARITY=N, RCV=PIN_C7, xmit=PIN_C6, BITS=8)
//#use rs232 (STREAM = puerto2, BAUD=31250, PARITY=N, RCV=PIN_G2, xmit=PIN_G1, BITS=8)

// Includes all USB code and interrupts, as well as the CDC API
#include <usb_cdc.h>


void main()
{
   BYTE i, j, address, value;
  
   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_2|ADC_TAD_MUL_0);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_timer_4(T4_DISABLED,0,1);
   setup_ccp1(CCP_OFF);
   setup_comparator(NC_NC_NC_NC);
  
   usb_cdc_init();
   usb_init();
  
  
   //while(!usb_cdc_connected()) {}

   do {
      usb_task();
      if (usb_enumerated()) {
      
         //printf(usb_cdc_putc, "\r\n\nEEPROM:\r\n");              // Display contents of the first 64
        
         //printf(usb_cdc_putc, "\n\r");
         //printf(usb_cdc_putc, "\r\nLocation to change: ");
         //printf(usb_cdc_putc, "\r\nNew value: ");
         //value = gethex_usb();

      }
   } while (TRUE);
}


Saludos!
« Última modificación: 29 de Octubre de 2010, 17:46:06 por bmb »

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Migrando a 18F66J50 ejemplo USB CDC de CCS
« Respuesta #10 en: 29 de Octubre de 2010, 21:39:38 »
Ese pic funciona hasta 3.6V, deberás implementar varios reguladores externos. Muéstranos el diagrama Modu.

Efectivamente, funciona con ese voltaje.
Lleva su regulador alimentado desde el usb.
Mañana os pongo los esquemas, aunque como dice Manolo, si funciona implementando un dispositivo de otra clase, no parece que sea un problema HW.

Hola Modulay, intenté compilar el código con CCS V4.106 y me da este error: Error 111 "ex_usb_serial2.c" Line 4 [7,13]: Unknown keyword in #FUSES "H4_SW" entonces abri el archivo encabezado 18F66J50.h y efectivamente ese fuse no existe.  Esto te ha compilado asi?

Utilizando el PIC_Wizard del CCS me da estos fuses y este encabezado y asi si compila:

Código: [Seleccionar]
#include <18F66J50.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS_PLL
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES NOSTVREN                 //Stack full/underflow will not cause reset
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOFCMEN                  //Fail-safe clock monitor disabled
#FUSES NOIESO                   //Internal External Switch Over mode disabled
#FUSES NOCPUDIV
#FUSES PLL5                     //Divide By 5(20MHz oscillator input)

#use delay(clock=48000000)

#use rs232 (STREAM = puerto1, BAUD=31250, PARITY=N, RCV=PIN_C7, xmit=PIN_C6, BITS=8)
//#use rs232 (STREAM = puerto2, BAUD=31250, PARITY=N, RCV=PIN_G2, xmit=PIN_G1, BITS=8)

// Includes all USB code and interrupts, as well as the CDC API
#include <usb_cdc.h>


void main()
{
   BYTE i, j, address, value;
  
   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_2|ADC_TAD_MUL_0);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_timer_4(T4_DISABLED,0,1);
   setup_ccp1(CCP_OFF);
   setup_comparator(NC_NC_NC_NC);
  
   usb_cdc_init();
   usb_init();
  
  
   //while(!usb_cdc_connected()) {}

   do {
      usb_task();
      if (usb_enumerated()) {
      
         //printf(usb_cdc_putc, "\r\n\nEEPROM:\r\n");              // Display contents of the first 64
        
         //printf(usb_cdc_putc, "\n\r");
         //printf(usb_cdc_putc, "\r\nLocation to change: ");
         //printf(usb_cdc_putc, "\r\nNew value: ");
         //value = gethex_usb();

      }
   } while (TRUE);
}


Saludos!

Es una cuestión de versiones de CCS.
En la 4.065 el fuse en cuestión es H4_SW.
En versiones posteriores el mismo fuse cambia de nombre (HS_PLL)

Creo que acabo de descubrir que los sniffers software que he usado hasta ahora no valen para nada mientras el dispositivo no está enumerado y con su driver cargado en memoria. Probaremos con SourceUSB que parece que si ofrece esa posibilidad.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Migrando a 18F66J50 ejemplo USB CDC de CCS
« Respuesta #11 en: 29 de Octubre de 2010, 22:07:26 »
Hola Modulay.

Cuando hace un tiempo me tocó exprimirle 4Mbps al USB con un arm lpc1343, en modo isócrono, terminé utilizando la versión shareware de este software, que me ayudo muchísimo a encontrar los inconvenientes, enumeracion, transacciones,paquetes,etc...

http://www.hhdsoftware.com/usb-monitor

Te recomiendo que le eches una mirada... Fijate que hay una opcion que permite que el programa monitoree el próximo dispositivo que conectes a un USB(sirve mas que nada para cuando el dispositivo no logra enumerarse, por lo que no aparece en el listado nunca, pero el programa deberia mostrarte al menos los paquetes in y out que viajan y en alguno falla, por lo que windows aborta la enumeración del dispositivo)

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Migrando a 18F66J50 ejemplo USB CDC de CCS
« Respuesta #12 en: 29 de Octubre de 2010, 22:16:36 »
Tiene muy buena pinta.
Lo probaré también.
Gracias, Bruno

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
Re: Migrando a 18F66J50 ejemplo USB CDC de CCS
« Respuesta #13 en: 30 de Octubre de 2010, 08:56:17 »
Compañero, a los PICs con USB de la serie J hay que activarles el PLL por software.

Hay que definir esto:
#bit PLLEN = 0xf9b.6

Y poner eso al principio del main:
PLLEN = 1;

Ejemplo:
http://www.microingenia.com/electronics/upload/docs/18F67J50Trainer/E1_18F67J50Trainer_CCS_V1.0.zip

Saludos!

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Migrando a 18F66J50 ejemplo USB CDC de CCS
« Respuesta #14 en: 30 de Octubre de 2010, 10:35:20 »
Ya rulaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

Gracias J1M.