Autor Tema: USB CDC para PIC18F4550 en CCS  (Leído 28493 veces)

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

Desconectado proyecto2009utu

  • PIC12
  • **
  • Mensajes: 62
USB CDC para PIC18F4550 en CCS
« en: 10 de Enero de 2011, 17:59:05 »
Buenas comunidad, desde hace dias ya estoy intentando levantar una comunicacion USB CDC sin exito....
He encontrado algunos ejemplos en la web pero tampoco pude hacer andar ninguno, lo que me desconcierta mas  :?

Yo recien empiezo a trabajar con CCS, y mis experiencas anteriores fueron con MikroC con el cual logre estableer una comunicacion HID mediante el USB

Por ahora lo unico que quiero hacer es establecer la comunicacion CDC y ver que funciona.

Tengo algunas dudas con el driver, no se si lo debo crear o es el mismo siempre???

Y mi gran duda es el error que me da en mis programas al compilar, me dice que no esta definido #device PIC18F4550, en el 18f4550.h
No entiendo porque este error, y como lo corrigo?

Luego seguire colocando otras dudas en este hilo, pero la verdad esto me tiene muy trancado  :5]

Desde ya mil gracias

Desconectado rodrigo_control2009

  • PIC12
  • **
  • Mensajes: 54
    • Blog  de la  Orden del  temple
Re: USB CDC para PIC18F4550 en CCS
« Respuesta #1 en: 16 de Enero de 2011, 16:13:21 »
Amigo  busca un tema llamado el  usb desencadenado http://picmania.garcia-cuervo.net/usb_0_desencadenado.php , allí encontraras todo  sobre  el  usb   cdc, bulk, hid   está  todo  muy  fácil de entender.  Yo  los he probado  y hecho aplicaciones sencillas  con el usb_cdc   con el 18f4550 en win 7  64 bit  y en general  todo  funciona muy bien, solo asegurate q  el  archvo  inf  incluya  los  SO de 64 bit  o 32 bit segun en  cual estes  trabajando
“El hombre ideal, sería persa de origen, árabe de religión, iraquí por cultura, hebreo por experiencia, cristiano por conducta, hindú por perspicacia, sufí por su estilo de vida, angélico por su moral y divino por sus ideas y conocimiento, destinado a la eternidad”

Desconectado rodrigo_control2009

  • PIC12
  • **
  • Mensajes: 54
    • Blog  de la  Orden del  temple
Re: USB CDC para PIC18F4550 en CCS
« Respuesta #2 en: 16 de Enero de 2011, 16:37:46 »
Como  mencione mas arriba  en general   no he  tenisdo problemas con el usb_cdc 
Habia hecho algunas pruebas  y  todo funcionaba  bien, luego quice enviar  datos desde el pc a un pic el cual a su vez lo enviaba a otro pic   y  finalmente el 1er pic lo enviaba al PC. Bueno la cosa  no funciono y  el  primer pic no entraba en la rutina de interrupcion. Luego de algunas pruebas nada mejoro, asi q decidi hacer lo mas basico  hacer el eco desde el 1er pic, y para sopresa  el eco enviado al pc  es  cualquier cosa menos el caracter  enviado por el pc.
Al enviar el caracter desde el pc el pic lo recibe ya q se enciende un led como bandera, pero retorna al pc cualquier cosa.
Estoy usando  e CCS 4.104  en win 7 64 bit. El pc reconoce bien el pic y le asigna un puerto com.


este es el Cod.

#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)
#include <usb_cdc_HomeScada.h>
//#define USB_CON_SENSE_PIN PIN_B2
char recepcion;

void main(){
delay_ms(300);
usb_cdc_init();               //esta  en  usb_cdc   y  configura  los  baudios, bit paridad etc
usb_init();                   // esta en pic18_usb llama  a usb_init_cs() q a su vez  llama a usb_task()
while(!usb_cdc_connected()) {}
usb_task();                  //está en pic18_usb
 if (usb_enumerated()) printf(usb_cdc_putc, " TEST ECO USB:\r\n");
                              //Atencion de  eco  USB_CDC
do{
 usb_task();                 //está en pic18_usb
 if (usb_enumerated())     {
  if(usb_cdc_kbhit())             {
  if ((recepcion=usb_cdc_getc()) != 0x00)  {
   usb_cdc_putc(recepcion);recepcion=0x00;
   output_high(pin_c0);         //enciende led para  monitorea si entra en rutina de rx  y  tx
   delay_ms(10);
   output_low(pin_c0);
                                           }
                                 }

                            }
 } while(true);
         }
“El hombre ideal, sería persa de origen, árabe de religión, iraquí por cultura, hebreo por experiencia, cristiano por conducta, hindú por perspicacia, sufí por su estilo de vida, angélico por su moral y divino por sus ideas y conocimiento, destinado a la eternidad”

Desconectado rodrigo_control2009

  • PIC12
  • **
  • Mensajes: 54
    • Blog  de la  Orden del  temple
Re: USB CDC para PIC18F4550 en CCS
« Respuesta #3 en: 17 de Enero de 2011, 13:25:49 »
Seguí haciendo  pruebas y  la falla  se mantenía por el  lado de la recepción usb_cdc del pic.   Todo lo que el PIC recibía y  retransmitia al pc o al módulo  serie  salia  mal.
Así que decidí, compilar en  otra versión anterior el mismo código, y  esto resolvió el problema 
Con la  versión  4.104 de CCS me genera un .hex  que  tiene falla en la  recepción  usb_cdc
Con la  versión  4.023  de CCS   no  produce problemas .

Este es el cod de prueba usado en las dos versiones


#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N)
#include <usb_cdc_HomeScada.h>

//#define USB_CON_SENSE_PIN PIN_B2

char s;

void main(){
char c=0x00;
delay_ms(300);
usb_cdc_init();                         //esta  en  usb_cdc   y  configura  los  baudios, bit paridad etc
usb_init();                             // esta en pic18_usb llama  a usb_init_cs() q a su vez  llama a usb_task()
while(!usb_cdc_connected()) {}

enable_interrupts(global);
enable_interrupts(int_rda);


do{
 usb_task();                             //está en pic18_usb
 if (usb_enumerated())     {

 c=usb_cdc_getc();                     
 usb_cdc_putc(c);
 putc(c);
 c=0x00;                               // lo retransmite por rs232 y hace eco usb
                           }
 } while(true);
         }

#int_rda
void serie_isr(){
if (kbhit()){
   output_high(pin_c0);         //enciende led para  monitorea q entro en rutina de rx
   s=getc();
   putc(s);
   delay_ms(1);
   output_low(pin_c0);
   usb_task();                 //está en pic18_usb
 if (usb_enumerated()){ if (s != 0x00) usb_cdc_putc(s); s=0x00;}
}}
“El hombre ideal, sería persa de origen, árabe de religión, iraquí por cultura, hebreo por experiencia, cristiano por conducta, hindú por perspicacia, sufí por su estilo de vida, angélico por su moral y divino por sus ideas y conocimiento, destinado a la eternidad”

Desconectado proyecto2009utu

  • PIC12
  • **
  • Mensajes: 62
Re: USB CDC para PIC18F4550 en CCS
« Respuesta #4 en: 20 de Enero de 2011, 18:04:28 »
Interesante que con una version mas nueva te de problemas...
Yo estoy usando la version 4.104 actualemente (en sistemas operativos de 32 bit), voy a ver si me paso a la 4.023, como tu dices...

Cual es la aplicacion que estas utilizando para comprobar tus programas???

Actualmente estoy con problemas para instalar el driver, ya que inicializo el USB pero no logro instalar el driver para que el sistema operativo reconozca al dispositivo
Tu como lo haces?

Desde ya muchas gracias


Desconectado rodrigo_control2009

  • PIC12
  • **
  • Mensajes: 54
    • Blog  de la  Orden del  temple
Re: USB CDC para PIC18F4550 en CCS
« Respuesta #5 en: 20 de Enero de 2011, 21:31:41 »
Hola, ya  descubrí  mi  problema.  Los archivos usb_desc_cdc.h q usaba los habia  creado con una  versión menos reciente de PICC. Así que  modifique el archivo usb_desc_cdc. de la versión 4.104 y  todo  funciona  bien, también lo probe  con la versión 4.114 y  compila  bien. Probe mi tarjeta en  win 7 64 bit  y   se asigna puerto com. Hice las  pruebas de eco  y  responde  muy  bien.

Prueba este  código  solo  hace  el eco  emulando un puerto com  con USB_CDC

eco_usb_cdc.c

 
#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN  //  uso un cristal de 20MHz
#use delay(clock=48000000)
#include <usb_cdc.h>


#define USB_CON_SENSE_PIN PIN_B2  //  puede  ser  aunq deshabilitado  tb  me  funcionó para este  ejemplo en otros  casos  si  es necesario

char s;
char c=0x00;
void main(){

delay_ms(300);
usb_cdc_init();                         //esta  en  usb_cdc   y  configura  los  baudios, bit paridad etc
usb_init();                             // esta en pic18_usb llama  a usb_init_cs() q a su vez  llama a usb_task()
while(!usb_cdc_connected()) {}



do{
 usb_task();
//c=0x00;                         
 if (usb_enumerated())     {
 c=usb_cdc_getc();                     
 usb_cdc_putc(c);
 }
 }                     
 while(true);
         }


Te  adjunto el  archivo usb_desc_cdc.h
Nota: no  uso el VID y PID  de microchip, solo  por antojo jejeje, así q  puedes  usar el q quieras para fines didácticos, no así  para  fines  comerciales.
Verifica que en tu archivo usb_cdc.h  este  esta línea,

#include <usb_desc_cdc.h>   //USB Configuration and Device descriptors for this UBS device

 para que pueda llamar al archivo usb_desc_cdc.h q t adjunto y este  a su vez llame al .inf q tb adjunto  el cual a su vez  llama al driver standard de windows. (no olvides  hacer un respaldo de tus drivers originales si coincide el  nombre o cambia el nombre al q t envio, sin olvidar  cambiar el nombre en la línea antes citada.
modifica  el arch .txt  a  .inf
“El hombre ideal, sería persa de origen, árabe de religión, iraquí por cultura, hebreo por experiencia, cristiano por conducta, hindú por perspicacia, sufí por su estilo de vida, angélico por su moral y divino por sus ideas y conocimiento, destinado a la eternidad”

Desconectado proyecto2009utu

  • PIC12
  • **
  • Mensajes: 62
Re: USB CDC para PIC18F4550 en CCS
« Respuesta #6 en: 21 de Enero de 2011, 13:03:53 »
Anda bien... ni siquiera me pide para instalar el driver y me genera un com virtual...

No se que aplicacion utilizar para probarlo

Ya que con el hyperterminal me recibe los datos pero no me devuelve nada  :(

Gracias

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5378
    • Electrónica Didacta
Re: USB CDC para PIC18F4550 en CCS
« Respuesta #7 en: 21 de Enero de 2011, 13:23:10 »
proyecto2009ut

al usar CDC, no necesitas driver, porque el windows ya lo trae, pero si necesitas informarle al windows como será la configuración del dispositivo que trabajará como puerto serial virtual y es allí donde debes buscar un archivo con extensión .inf

el que yo he usado es el que proporciona microchip en su MCHPFSUSB Framework  http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2680&dDocName=en537044

buscas en la carpeta drivers y cdc y allí deben estar unos 4 o 5 archivos que son los que necesitan,

pero eso si, debes usar el mismo VID y PID para que puedan integrarse correctamente al sistema.




bueno debo corregir mi post anterior, en realidad si necesita un driver, los archivos que te mencioné son estos:




al buscar el inf, el inf copia los .sys a la carpeta del sistema

« Última modificación: 21 de Enero de 2011, 13:36:05 por PalitroqueZ, Razón: corrección en la información suministrada »
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado rodrigo_control2009

  • PIC12
  • **
  • Mensajes: 54
    • Blog  de la  Orden del  temple
Re: USB CDC para PIC18F4550 en CCS
« Respuesta #8 en: 21 de Enero de 2011, 22:14:17 »
Cuando preguntas   q aplicación uso, t refieres  al  software ??
Con cualquier  visor de puerto  serie  deberías  ver  lo  q envias por el  puerto  com y  lo q recibes  por  el.
Yo hago las pruebas con el Docklihgt 1.6 y  el  monitor de puerto serie  q está en tools del compilador  ccs.
Y el hardaware  es una tarjeta en la que tengo un 18f4550 conectado  al usb, y  su  puerto  serie  a un modulo xbee, admas de una memoria i2c, y otras  cosas.
Creo q  si usas win de 32 bit, puedes simular la  comunicaión usb_cdc  en proteus, asi  no necitaras de una tarjeta  fisica o si ya  dispones de una o  en un proto, mucho mejor.
Y  como  bien dice  Palitroquez  el usb_cdc  no necesita driver pq  windows  ya  lo  tiene, pues  lo  único q uno hace  es  indicarle  cual driver usar, con el archivo .inf
Proyecto2009ut, sube  los códigos q usas, así mas  puden  verlos  y  te  podrán dar buenas  sugerencias.
“El hombre ideal, sería persa de origen, árabe de religión, iraquí por cultura, hebreo por experiencia, cristiano por conducta, hindú por perspicacia, sufí por su estilo de vida, angélico por su moral y divino por sus ideas y conocimiento, destinado a la eternidad”

Desconectado proyecto2009utu

  • PIC12
  • **
  • Mensajes: 62
Re: USB CDC para PIC18F4550 en CCS
« Respuesta #9 en: 22 de Enero de 2011, 15:43:04 »
Buenas, gracias por su interes...
Si te preguntaba por la aplicacion, yo estaba usando el putty y el hyperterminal, y los dos me hacen lo mismo, me envian lo que escribo pero no recibo nada.... es raro  :?, pero igual yo estoy trancado en un paso anterior ya que la pc no me reconoce el dispositivo  :5]

Lo que estoy intentando realizar es un osciloscopio digital, que se comunique por usb. Ahora bien estoy teniendo ciertos polemas con el PIC...

El codigo que tengo hasta al momento es solo una pequeña parte de lo que quiero hacer...

Código: [Seleccionar]
#include <18f4550.h>
#fuses   HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL12,CPUDIV1,VREGEN,NOPBADEN       
#use delay(clock=48000000)     
#include <pic18_usb.h> //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include "usb_desc_cdc.h"      // Descriptores del dispositivo USB.     
#include "usb_cdc.h"           // Descripción de funciones del USB.
short estado_usb;      // boolean global, se debe declarar antes de llamar a usb_cdc.h
#define USB_CON_SENSE_PIN PIN_E3
#define  PORTB = busdata   // Defino el puerto B como la entrada de datos
                                       
// Declaracion de funciones

static void adqrap(void); // Defino adquisicion rapida                                                                   
static void adqlen(void); // Defino adquisicion lenta                                               
static void lectur(void); // Funcion Lectura                               
static void escrit(void); // Funcion Esctritura
         
// Declaracion de variables   

int8  var1;
char  var;

void main() {
       
set_tris_b (0xff);     
set_tris_a (00010000);                 

   usb_cdc_init();
   usb_init();                                           
   while(!usb_cdc_connected()) {}                       
   // espera a detectar una transmisión de la PC (Set_Line_Coding)
   do{
      usb_task();
      if (usb_enumerated()){
      usb_cdc_putc(var);
         if(usb_cdc_kbhit()){ //en espera de nuevo(s) caracter(es) en el buffer
            if(usb_cdc_getc()=='x'){ //¿lo que llegó fué el caracter x?
               printf(usb_cdc_putc, "Probando comunicacion\n\r");                   
               //si, entonces envía una cadena hacia el PC
             }                                   
            if(usb_cdc_getc()=='a'){ //¿lo que llegó fué el caracter a?
               printf(usb_cdc_putc, "Proximamente datos osciloscopio\n\r");
               //si, entonces envía una cadena hacia el PC               
             }                                                 
         }                               
        }
       }while (TRUE); // bucle eterno
}             


Ahora bien, lo que quiero hacer y no se como  es cargar los datos del PuertoB en alguna de las variables y enviarlo por el USB, como puedo cargar una variable con el valor del puerto?

Gracias

PD: No se si me entienden el codigo, la parte de los caracteres y printf es solo para probar la comunicacion  :oops:

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1652
Re: USB CDC para PIC18F4550 en CCS
« Respuesta #10 en: 22 de Enero de 2011, 19:32:57 »
para leer el puerto define la variable y lees con
Código: [Seleccionar]
variable=input_b();
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado rodrigo_control2009

  • PIC12
  • **
  • Mensajes: 54
    • Blog  de la  Orden del  temple
Re: USB CDC para PIC18F4550 en CCS
« Respuesta #11 en: 22 de Enero de 2011, 20:34:17 »
La aplicación funciona, uno de  los  problemas es q al inicio del  buble  mandas  el valor de var y ésta  está  vacio asi q solo mandas  0x00 o caratcter nulo, además como  está  al  inicio del bucle infinito,  saturas  el terminal, ya q no hay nada q controle su envio.
Por otro lado no puedes ver el valor del  PORTB:
1.- No lo lees
2.- No lo  guardas en ninguna variable (si asi lo deseas).
3.- En ningun momento envias el valor del PORTB al PC
4.- Declaras  varias  funciones, pero no las  usas

Como  te  mencionan con input_b()  puedes leer  el  PORTB

#include <18f4550.h>
//#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN  //  YO USO CRISTAL DE 20MHz 20/5=4MHz, TU USAS UNO DE 48 MHz YA 1 USAS PLL12 48/12=4MHz
#fuses   HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL12,CPUDIV1,VREGEN,NOPBADEN       
#use delay(clock=48000000)     

//#include <pic18_usb.h>           //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
//#include "usb_desc_cdc.h"        // Descriptores del dispositivo USB.   

//  usb_cdc.h  ya  incluye los  arch antes citados, reviza usb_cdc.h
 
#include "usb_cdc.h"           // Descripción de funciones del USB.

//short estado_usb;      // boolean global, se debe declarar antes de llamar a usb_cdc.h

//#define USB_CON_SENSE_PIN PIN_B2
#define USB_CON_SENSE_PIN PIN_E3
//#define  PORTB = busdata  // Defino el puerto B como la entrada de datos

//#byte PORTB =0x81  //  defino  portb  reg  0x81  del 18f4550
                                       
// Declaracion de funciones

static void adqrap(void); // Defino adquisicion rapida                                                                   
static void adqlen(void); // Defino adquisicion lenta                                               
static void lectur(void); // Funcion Lectura                               
static void escrit(void); // Funcion Esctritura
         
// Declaracion de variables   

int8  var1;
char  var;

void main() {
       
//set_tris_b (0xff);     
//set_tris_a (00010000);                 
   delay_ms(300);
   usb_cdc_init();
   usb_init();                                           
   while(!usb_cdc_connected()) {}                       
   // espera a detectar una transmisión de la PC (Set_Line_Coding)
   do{
      usb_task();
      if (usb_enumerated()){
      var1=input_b();
      var=input_b();
          //usb_cdc_putc(var1);
         //usb_cdc_putc(var);
         if(usb_cdc_kbhit()){ //en espera de nuevo(s) caracter(es) en el buffer
            if(usb_cdc_getc()=='x'){ //¿lo que llegó fué el caracter x?
               printf(usb_cdc_putc, "Probando comunicacion\n\r");                   
               //si, entonces envía una cadena hacia el PC
             }                                   
            if(usb_cdc_getc()=='a'){ //¿lo que llegó fué el caracter a?
               printf(usb_cdc_putc, "Proximamente datos osciloscopio\n\r");
               //si, entonces envía una cadena hacia el PC               
             }
             if(usb_cdc_getc()=='b'){ //¿lo que llegó fué el caracter b?  // aca  t  muestra  el valor de PORTB
               printf(usb_cdc_putc, "PORTB= %c\n\r",var);
               printf(usb_cdc_putc, "PORTB= %u\n\r",var1);}
         }                               
        }
       }while (TRUE); // bucle eterno
}

Hice las pruebas con dos  soft  y  con ambos  funciona igual ve las imagenes


“El hombre ideal, sería persa de origen, árabe de religión, iraquí por cultura, hebreo por experiencia, cristiano por conducta, hindú por perspicacia, sufí por su estilo de vida, angélico por su moral y divino por sus ideas y conocimiento, destinado a la eternidad”

Desconectado proyecto2009utu

  • PIC12
  • **
  • Mensajes: 62
Re: USB CDC para PIC18F4550 en CCS
« Respuesta #12 en: 24 de Enero de 2011, 15:32:16 »
Muchas gracias por sus respuestas y por su gran ayuda!
A mi tambien me a funcionado perfectamente....  :-/
pero tengo un problema extraño... les cuento un poco:

Yo trabajo con dos maquinas una con win7 y otra con winxp (los dos de 32bits) pero con win7 me anda y no en xp, que sigue sin reconocerme el driver...

Es extraño esto no???

En win7 le puse que me buscara el driver en una carpeta raiz y que incluyera todas las sub carpetas (y ahi encontro alguno, pero no se exactamente cual es) en xp no me deja hacer esto  :?

Igualmente si no estoy equivocado los archivos que preciso de driver son siempre los mismos verdad???
el mchpcdc.cat y el mchpcdc.inf que son propiedad de microchip

en las imagenes muestro un poco lo que me aprece

Por favor digame si estoy muy equivocado, porque esto es lo que me esta desconcertando un poco  :shock:

Muchisimas gracias!
Espero este hilo le pueda servir a mucha mas gente

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1652
Re: USB CDC para PIC18F4550 en CCS
« Respuesta #13 en: 24 de Enero de 2011, 18:20:41 »
yo copié esos dos archivos en la carpeta "projects" de ccs y asi me los encuentra
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado proyecto2009utu

  • PIC12
  • **
  • Mensajes: 62
Re: USB CDC para PIC18F4550 en CCS
« Respuesta #14 en: 25 de Enero de 2011, 07:22:41 »
Pero luego le pones la ubicacion especifica que te lo busque en la carpeta "projects" no jhozate?

Igual creo que se supone que se puede poner en cualquier carpeta, siempre y cuando uno le especifique donde esta el driver para el controlador, no?


 

anything