TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: alperez en 03 de Noviembre de 2012, 08:59:42

Título: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: alperez en 03 de Noviembre de 2012, 08:59:42
Pues simplemente quería darles las gracias por aportar algo de información para poder configurar el USB CDC en el pic24fj256gb106 con XC16.
Me ha costado una barbaridad debido a mi ignorancia, han sido dos dias rompiendome la cabeza y buscando en este y otros foros en los que sé que muchos participais, pero lo he conseguido.

Por ahora sólo he conseguido que enumere, pero creo que ya es algo.
Sé que con CCS hubiera sido mucho más fácil, pero sin pena no hay gloria ¿no?

De nuevo gracias
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: musttork en 05 de Junio de 2013, 16:44:03
Ola socio, no se como ha ido tu proyecto. Estoy yo con el mismo micro y me esta costando sudor y sangre conectarle por USB al PC. no habras echo algo asi? de conectarle via USB?
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: alperez en 05 de Junio de 2013, 17:02:52
Pues sí compañero. Con problemas pero funcionó

Qué necesitas
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: musttork en 05 de Junio de 2013, 17:51:30
Pues para empezar no se si tengo un problema de hadware o de software...no se si todas las conexiones y componentes los tengo bien situados y de los valores correctos, cosa que he revisado varias veces y no veo fallos, y en el software no se si me falta algun archivo, sobra alguno o tengo mal la configuracion del PIC.

Podrias facilitarme tu esquema basico aunque sea? para poder ver la conexion de los pines basicos.
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: alperez en 05 de Junio de 2013, 19:03:18
Hace tiempo que lo hice y trateré de darte algo de información, Dejé el USB para comunicarlo por TCP/IP, por las molestias de los drivers
He visto que tienes un  post sobre el tema y lo primero que te recomendaría es que pongas en alto los pines que puedas y midas la tension a ver si todavía funciona el microcontrolador.

Te paso un esquema muy básico del primer prototipo que hice, esto es lo mínimo que se puede hacer para que funcione.
Puedes ignorar el max487 y el 78l05.
Te aconsejo que compruebes si hay algun cortocircuito, estos encapsulados son dificiles de soldar con un pitch tan bajo, yo tuve que modificar la huella porque me quedaban demasiado pegados los pads


Recuerda que tienes que configurar el driver para XP (es para el SO que yo probé, no sé si para otros funciona) y el PID y VID deben coincidir.
En la ayuda del Stack está todo lo necesario, para marearte, pero es una ayuda.
Si te dice que no reconoce el dispositivo, puedes ver con algun programa como Everest cuales dispositivos hay y comprobar si enumera, cual es el PID y el VID
Es muy importante el condensador del core, según el datasheet puede ser de tántalo o cerámico, yo lo puse de tántalo.


Estos son mis fuses, yo usé un xtal de 4Mhz.
Código: [Seleccionar]
// CONFIG3
#pragma config WPFP = WPFP511           // Write Protection Flash Page Segment Boundary (Highest Page (same as page 170))
#pragma config WPDIS = WPDIS            // Segment Write Protection Disable bit (Segmented code protection disabled)
#pragma config WPCFG = WPCFGDIS         // Configuration Word Code Page Protection Select bit (Last page(at the top of program memory) and Flash configuration words are not protected)
#pragma config WPEND = WPENDMEM         // Segment Write Protection End Page Select bit (Write Protect from WPFP to the last page of memory)

// CONFIG2
#pragma config POSCMOD = XT             // Primary Oscillator Select (XS oscillator mode selected)
#pragma config DISUVREG = ON            // Internal USB 3.3V Regulator Disable bit (Regulator is enabled)
#pragma config IOL1WAY = ON             // IOLOCK One-Way Set Enable bit (Write RP Registers Once)
#pragma config OSCIOFNC = OFF           // Primary Oscillator Output Function (OSCO functions as CLKO (FOSC/2))
#pragma config FCKSM = CSDCMD           // Clock Switching and Monitor (Both Clock Switching and Fail-safe Clock Monitor are disabled)
#pragma config FNOSC = PRIPLL           // Oscillator Select (Primary oscillator (XT, HS, EC) with PLL module (XTPLL,HSPLL, ECPLL))
#pragma config PLL_96MHZ = ON           // 96MHz PLL Disable (Enabled)
#pragma config PLLDIV = NODIV           // USB 96 MHz PLL Prescaler Select bits (Oscillator input used directly (4MHz input))
#pragma config IESO = OFF               // Internal External Switch Over Mode (IESO mode (Two-speed start-up)disabled)

// CONFIG1
#pragma config WDTPS = PS32768          // Watchdog Timer Postscaler (1:32,768)
#pragma config FWPSA = PR128            // WDT Prescaler (Prescaler ratio of 1:128)
#pragma config WINDIS = OFF             // Watchdog Timer Window (Standard Watchdog Timer enabled,(Windowed-mode is disabled))
#pragma config FWDTEN = OFF             // Watchdog Timer Enable (Watchdog Timer is disabled)
#pragma config ICS = PGx1               // Comm Channel Select (Emulator functions are shared with PGEC1/PGED1)
#pragma config GWRP = OFF               // General Code Segment Write Protect (Writes to program memory are allowed)
#pragma config GCP = OFF                // General Code Segment Code Protect (Code protection is disabled)
#pragma config JTAGEN = ON              // JTAG Port Enable (JTAG port is enabled)

Estos bits de los registros los tengo en el main, antes del while claro

Código: [Seleccionar]
   CLKDIVbits.CPDIV = 0b0;    // Configuro la CPU a la maxima velocidad 32Mhz
    
    CLKDIVbits.DOZEN = 0b0;     // Podemos configurar el clock ratio de la cpu, no de los perifericos. Lo dejamos a 32Mhz
    CLKDIVbits.ROI = 0b0;      // Las interrupciones no tienen efecto sobre el bit DOZE
    CLKDIVbits.DOZE = 0b0;    // seleccion de ratio del clock de la CPU


si vas a usar la clase CDC, tambien antes del el while:

Código: [Seleccionar]
   CDCSetBaudRate(9600);
    CDCSetCharacterFormat(NUM_STOP_BITS_1);
    CDCSetDataSize(8);
    CDCSetParity(PARITY_NONE);
    
    USBCBInitEP();

    USBDeviceInit(); //usb_device.c.  Initializes USB module SFRs and firmware
     //variables to known states.

Esto tiene que ir en el while principal. Si tienes un programa demasiado grande tienes que llamarla de vez en cuando. Ese tiempo está en la ayuda del stack, ahora no lo recuerdo.

Código: [Seleccionar]
USBDeviceTasks();
Yo tuve un problema y es que se me desconectaba y volvia a conectar, no sé si por esto o por el pin sense.

Espero que te sirva de ayuda y si necesitas algo en lo que te pueda ayudar... ya sabes
Un saludo


esquema (http://img843.imageshack.us/img843/4269/esquemad.png)
PCB (http://img27.imageshack.us/img27/9996/pcbuc.png)
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: musttork en 05 de Junio de 2013, 19:18:40
Ostras muchisimas gracias por toda la información, ahora es tarde y mañana trabajo temprano pero en cuanto llegue a casa me pongo con ello para revisarlo todo de nuevo.

Te dejo por aqui mi esquema y pcb por si ves algo raro, el codigo no puedo dejartelo por que ocupa mucho, tendria que mandartelo a un correo.

Un saludo amigo y graicas por todo d verdad!
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: alperez en 06 de Junio de 2013, 14:39:16
Veo que tienes VBus a Vin...
Página 210 del datasheet:

Citar
In Host mode, as well as Host mode in On-the-Go
operation, the USB 2.0 specification requires that the
Host application supply power on VBUS. Since the
microcontroller is running below VBUS and is not able to
source sufficient current, a separate power supply must
be provided.

Si vas a usarlo como Host/OTG no te podré ayudar porque no tengo ni idea, si tu intención es usarlo como por ejemplo CDC no estoy seguro de si tienes que desconectarlo, si es así y la pusiste por error prueba a cortar la pista con un cutter.

Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: musttork en 06 de Junio de 2013, 15:24:01
nO no como host no, es un device. Te explico el proyecto para que entiendas lo que estoy planeando.

He echo la placa que te he comentado para conectarla al ordenador, y a través de los timmer del pic poder contar segundos, lo que necesito es aprovechar una entrada de un reloj super preciso (un oscilador externo atómico que tenemos en la universidad) para calibrar los cronómetros, contar tiempo de forma muy precisa para saber si un cronometro esta con deriva o los calcula de forma precisa. contaré pequeños tiempos asta tiempos muy extensos de incluso 24 horas.

para meter el tiempo que quiero medir, se hará a través de un programa sencillo en visual basic a través del usb.

Conecte el Vbus a 5v por que al leer el data sheet del PIC vi que VUSB HABIA que conectarlo a 3.3v y Vbus a 5v.:

VBUS 34 44 54 P — USB Voltage, Host mode (5V).
VUSB 35 45 55 P — USB Voltage (3.3V)


Pero si me explicas bien lo de VBUS...igual me he equivocado por que si que parece que pone host mode. quiere decir que 3.3v seria para device, y 5v para host????

saludos amigo
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: alperez en 06 de Junio de 2013, 15:56:37
Te comento que yo no he usado el OTG ni el Host mode, pero entiendo que es una tensíon "suplementaria" para alimentar el usb. Yo en mi esquema lo pongo a 3v3 y funciona, pero recuerdo que se me desconectaba y volvia a conectar, no se si entonces está del todo bien.

Si vas a hacer una aplicacion en VB utilizaras la clase serialport y la clase CDC en el pic. Si windows te dice que no reconoce el dispositivo puede ser por que no tengas bien configurado ni el driver ni el PID ni el VID.
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: musttork en 06 de Junio de 2013, 16:27:10
Revisando de nuevo tu esquema para ver en que me he podido equivocar en el hardware y revisando los valores d elos condensadores, he visto que tu tambien utilizas un convertidor DC/DC, en el que le metes los 5v del usb y saca otros 5v.
Con que fin utiizas este convertidor y no directamente los del USB? no es la primera vez que lo veo y me entra la curiosidad y duda.

Saludos
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: planeta9999 en 06 de Junio de 2013, 17:09:46

No es necesario meter ningún estabilizador o conversor DC/DC desde el pin de 5v del conector USB, basta con poner un diodo schottky.
Además, metiendo un estabilizador, necesitarías a su entrada, 7 voltios para un 7805, y 6.2 voltios para un LM1117, o no funcionarán correctamente.

Yo en mis circuitos, cuando necesito alimentar el PIC desde los 5v del puerto USB, meto un diodo schottky desde el pin de 5v del conector USB a la entrada de un regulador LM1117 de 3.3v.  Si el circuito puede estar alimentado tanto desde el puerto USB, como desde una fuente externa, conecto ambas tensiones a través de sendos diodos schottky, a la entrada del regulador. En mi caso siempre necesito los 3.3v, porque solo trabajo con PIC32.


Quedaría algo así, con alimentación desde USB o fuente externa:

(http://tuomasnylund.fi/drupal6/sites/default/files/u3/fgen-sch-psu.png)


Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: musttork en 06 de Junio de 2013, 17:59:16
Lo que he estado mirando el datasheet del LM1117 es que saca una corriente de 800mA, no es demasiada corriente para alimentar el PIC? o es la corriente maxima que puede dar? yo he utilizado un regulador LM7803, que saca 200mA, cual crees que es mejor?

Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: alperez en 06 de Junio de 2013, 18:05:03
Revisando de nuevo tu esquema para ver en que me he podido equivocar en el hardware y revisando los valores d elos condensadores, he visto que tu tambien utilizas un convertidor DC/DC, en el que le metes los 5v del usb y saca otros 5v.
Con que fin utiizas este convertidor y no directamente los del USB? no es la primera vez que lo veo y me entra la curiosidad y duda.

Saludos

No entran 5v, la alimentación de salida del 78l05 es SOLO para el max487 (aunque ponga max481), lo que pasa es que esos pines (GND y Vin) están ocultos porque el que dibujó la libreria lo hizo así. El 1117 es para el PIC y no utilizo la tensión USB para nada, mas que nada porque alimenta un bus RS485 que debe alimentarse a mayor tension que los 5v USB para que no caiga la tensión por la distancia.
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: alperez en 06 de Junio de 2013, 18:10:51
Lo que he estado mirando el datasheet del LM1117 es que saca una corriente de 800mA, no es demasiada corriente para alimentar el PIC? o es la corriente maxima que puede dar? yo he utilizado un regulador LM7803, que saca 200mA, cual crees que es mejor?



800mA es la intensidad máxima, cuidado con esto por que no es lo mismo que la máxima que puede soportar bajo ciertas condiciones.
Mira en la pag 311 del datasheet del pic porque como le des mucha "caña" lo vas a tener justito
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: musttork en 06 de Junio de 2013, 18:13:55
Entonces me aconsejas el LM1117?

Me paso una cosa que no os he contado, tenia la huella del regulador dada la vuelta ya que no habia el mismo modelo de regulador que el mio, entonces durante unas cuantas veces hasta que me di cuenta estuve alimentando al pic en vez de con 3.3V con 4.2, 4.3 Voltios.

Creeis que fue suficiente para joderle? deberia de sustituirle por uno nuevo?

Un saludo chicos, no sabeis la ayuda que me estais prestando...os estare siempre agradecidos, si consigo terminar el proeycto os envio unos bombones jejejeje =)  :mrgreen:
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: planeta9999 en 06 de Junio de 2013, 20:42:48
Entonces me aconsejas el LM1117?

Si es solo para alimentar el PIC, sin cargas en los puertos, es excesivo.
Además el consumo, depende de la temperatura, la frecuencia de reloj y el voltaje de alimentación, todo eso lo tienes en el datasheet "DC CHARACTERISTICS: OPERATING CURRENT".


Citar
Me paso una cosa que no os he contado, tenia la huella del regulador dada la vuelta ya que no habia el mismo modelo de regulador que el mio, entonces durante unas cuantas veces hasta que me di cuenta estuve alimentando al pic en vez de con 3.3V con 4.2, 4.3 Voltios.
Creeis que fue suficiente para joderle? deberia de sustituirle por uno nuevo?

Como puedes ver en el datasheet, el voltaje de alimentación debe de estar entre 2v y 3.6v, yo diría que te lo has cargado.



Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: alperez en 07 de Junio de 2013, 03:22:43
Entonces me aconsejas el LM1117?

Me paso una cosa que no os he contado, tenia la huella del regulador dada la vuelta ya que no habia el mismo modelo de regulador que el mio, entonces durante unas cuantas veces hasta que me di cuenta estuve alimentando al pic en vez de con 3.3V con 4.2, 4.3 Voltios.

Creeis que fue suficiente para joderle? deberia de sustituirle por uno nuevo?

Un saludo chicos, no sabeis la ayuda que me estais prestando...os estare siempre agradecidos, si consigo terminar el proeycto os envio unos bombones jejejeje =)  :mrgreen:

A ver si entiendo, si la das la vuelta al DC/DC "al espejo" Y UNICAMENTE AL DC/DC, vas a poner a 4.2 la entrada del DC/DC pero no del PIC.
Entonces deberías de mirar la posibilidad de que "algo de corriente viajara" desde los 3v3 hasta los 4v2 del DC/DC, suponiendo que la pata del centro sea GND.
Si es así debes mirar en el datasheet a ver si dice algo sobre la impedancia salida-entrada o corriente directa inversa.

No se si me he explicado, por darle la vuelta al DC/DC no le das 4.2v al PIC, si no a la salida del DC/DC.

De todas formas pon en alto todos los puertos y mide con un polimetro a ver si todavia funciona, si puedes leer/grabar y no está caliente el PIC (se calientan cuando tienen un corto) es posible que todavía funcione.
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: musttork en 08 de Junio de 2013, 08:24:17
NO no! le di la vuelta al regulador de tension, no al convertidor! es decir al ponerle a la salida los 5v del convertidor y a la entrada pues todo lque venia a salida...soea un pifostio...cuand medi a la salida media 4.3V, de ahi q dije algo falla...por que si tiene que ser 3.3 y m da 4.2...y me di cuenta de lo de la huella, que estaba invertida.

De todos modos, el LM3940, es de 1A, creeis que es excesivo? unicamente tiene que alimentar lo que veis en el esquema, el PIC, y los optoaclopadores como veis, unicamente esas salidas de los optos van a salir pulsos.
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: planeta9999 en 08 de Junio de 2013, 10:10:29
De todos modos, el LM3940, es de 1A, creeis que es excesivo? unicamente tiene que alimentar lo que veis en el esquema, el PIC, y los optoaclopadores como veis, unicamente esas salidas de los optos van a salir pulsos.


Si, es excesivo.
El PIC a la máxima velocidad, alimentado a 3.3v, tendrá un consumo de unos 24mA máximo, según el datasheet, más el consumo de los puertos.
Añade 10-15mA por cada led de los optos, más el consumo de la carga que pongas a la salida de los optos.
Con un regulador que aguante 100-150mA, sobra.
Y quita ese conversor DC/DC que no vale para nada, si quieres aislar la alimentación del puerto USB, pon un diodo schottky a la entrada del regulador.




Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: musttork en 08 de Junio de 2013, 15:14:34
Chicos he puesto todos los pines a 1, para ver si sigue vivo...

a la salida del pic tengo una tension de 3Voltios más o menos, es eso normal? no tendria que dar 5v?

En cuanto al convertidor, si creo que le voy a quitar, ya que es bastante estable la tension del usb y con un diodo shotcky es suficiente.
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: alperez en 08 de Junio de 2013, 15:38:10
Chicos he puesto todos los pines a 1, para ver si sigue vivo...

a la salida del pic tengo una tension de 3Voltios más o menos, es eso normal? no tendria que dar 5v?

En cuanto al convertidor, si creo que le voy a quitar, ya que es bastante estable la tension del usb y con un diodo shotcky es suficiente.

Estás alimentando el PIC a 3'3v, que es lo correcto, por lo tanto cuando un pin de un puerto está a nivel alto, éste se pone a la alimentación del PIC, o sea, a esos 3'3v, menos algún que otro milivoltio que se pueda perder, pero es correcto.

Mira a ver si el PIC se calienta, pero yo diría que está bien.

Otra cosa, aún sigue sin cuadrarme que al darle la vuelta al regulador te diera esa tensión de 4 y pico voltios, y aún siendo así es posible que la corriente sea minúscula y por eso tu PIC haya sobrevivido.
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: musttork en 08 de Junio de 2013, 19:14:05
A mi tampoco me cuadró...es decir a la entrada tenia lo que tenia que tener a la alida..es decir, los pines VDD del pic, y las resistencias de los opto etc...pero ahi no deberia de haber tensiones de ningun tipo, a menos que al enchufar los 5voltios en el pin de salida se inducieran de alguna manera 4.2 voltios a la entrada...nose es raro...

aun asi, el regador funciona correctamente entregando 3.3voltios...

ahora el verdadero problema...sino es de hadware y el pic parece que sigue vivo...de que narices puede ser el problema de no reconocermele...S:S:S el PID y el VID, son el mismo que en el arhicvo .inf....

al tener un ristal de 8 mHZ he puesto en el pll DIV2 para tener los 4Mhz necesarios para el USB.

os pongo la configuracion que he puesto por is veis algo raro:

Código: [Seleccionar]
//Mi Proyecto**********************************************************************************************************
#elif defined(__PIC24FJ256GB106__)
_CONFIG1( JTAGEN_OFF & GCP_OFF & GWRP_OFF & FWDTEN_OFF & ICS_PGx1)
    _CONFIG2( PLL_96MHZ_ON & IESO_OFF & FCKSM_CSDCMD & OSCIOFNC_ON & POSCMOD_HS & FNOSC_PRIPLL & PLLDIV_DIV2 & IOL1WAY_ON)
//********************************************************************************************************** 

 
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: alperez en 09 de Junio de 2013, 06:24:20
Prueba este hex ¡¡ PERO CON UN XTAL DE 4MHz!!!!

Yo ahora no puedo compilartelo con 8 MHz pero si tienes uno de 4MHz y puedes probarlo estarás seguro que enumerar enumera.
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: musttork en 09 de Junio de 2013, 08:29:46
Que es el hex ese que has subido? esuqe no tengo ningun reloj de 4MHZ, no se puede utilizar el interno?
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: planeta9999 en 09 de Junio de 2013, 10:20:37



En las Microchip Solutions, tienes mucho código fuente para USB, tanto HID como MCHPUSB.
Yo he probado algunos ejemplos con PIC32, para emular teclado, ratón, joystick, comunicacion USB con driver, y me han funcionado muy bien.



Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: musttork en 09 de Junio de 2013, 11:11:00



En las Microchip Solutions, tienes mucho código fuente para USB, tanto HID como MCHPUSB.
Yo he probado algunos ejemplos con PIC32, para emular teclado, ratón, joystick, comunicacion USB con driver, y me han funcionado muy bien.






He tirado con el ejemplo de Microchip Solution CDC, cambiando e introduciendo mi PIC, el problema es que no me detecta el dispositivo, no se si por tener algun problema en el hardware o en el software...que me falte algo en la configuracioón, o algun archivo o algo.

Subiria todo mi archivo pero es demasiado grande. Tendria que pasaroslo por correo electronico.
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: alperez en 09 de Junio de 2013, 11:26:29
Que es el hex ese que has subido? esuqe no tengo ningun reloj de 4MHZ, no se puede utilizar el interno?

es una prueba USB <-> RS485, cuando tenga tiempo te compilo ese codigo con xtal de 8Mhz
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: planeta9999 en 09 de Junio de 2013, 11:59:55
He tirado con el ejemplo de Microchip Solution CDC, cambiando e introduciendo mi PIC, el problema es que no me detecta el dispositivo, no se si por tener algun problema en el hardware o en el software...que me falte algo en la configuracioón, o algun archivo o algo.

Subiria todo mi archivo pero es demasiado grande. Tendria que pasaroslo por correo electronico.


Prueba con un HID, por ejemplo un emulador de teclado.
¿ Has mirado en el Administrador de Dispositivos de windows, a ver si sale algún error ?.

Yo solo he probado los HID, porque me interesaba emular un teclado estandar para varios proyectos, y por curiosidad también probé el MCHPUSB para ver como tira el driver de Microchip, ambos me funcionaron perfectamente con PIC32. También tengo el bootloader, que me reconoce a la perfección nada más conectar el PIC.



Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: musttork en 12 de Junio de 2013, 16:23:15
Os pongo al dia. Cambie el PIC por si estuviera dañado el otro. He revisado vuestros circuitos, el mio, 2 de internet, uno de otro chico de mi universidad y el circuito del PI24F Starter Kit de Microchip y he comprobado que el hardware está correcto, da las tensiones que tiene que dar y las conexiones como deben estar, asique supongo que es de software. He estado rehaciendo todos los archivos de nuevo, siendo muy semejarntes al proyecto del chico que os digo para comunicarle con el USB, ya que él lo logro pero con un PIC32X, he cambiado cosas, y a la hora de compilar parecia que estaban arreglados todos los fallos, pero me da al final este:

main.o(.text+0x5a): In function `USBCBSuspend':
C:\Documents and Settings\BlackCrystal™\Escritorio\MI PROYECTO MPLAB\main.c:234: undefined reference to `USBSleepOnSuspend'

Alguno sabe de que puede ser?

Saludos y gracias, si necesitais que suba el Main decirlo....bueno le subo de todos modos :D

Código: [Seleccionar]
//**Victor Manuel San Segundo Jimenez**//
//**main - PIC24FJ256GB106**//

/** INCLUDES ***********************************************************************/

#include <p24Fxxxx.h>
#include "./USB/usb.h"
#include "./USB/usb_function_cdc.h"
#include "HardwareProfile.h"

/** CONFIGURACION CALIBRADOR DE CALIBRES*************************************************************/

#if defined(__PIC24FJ256GB106__)
   _CONFIG1( JTAGEN_OFF & GCP_OFF & GWRP_OFF & FWDTEN_OFF & ICS_PGx1)
   _CONFIG2( PLL_96MHZ_ON & IESO_OFF & FCKSM_CSDCMD & OSCIOFNC_ON & POSCMOD_HS & FNOSC_PRIPLL & PLLDIV_DIV2 & IOL1WAY_ON)

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

#else
     #error No hardware board defined, see "HardwareProfile.h" and __FILE__
#endif


/** V A R I A B L E S ********************************************************/
#pragma udata
char USB_In_Buffer[64]; //Buffer de 64 caracteres para enviar por el USB
char USB_Out_Buffer[64];//Buffer de 64 caracteres para recibir desde el USB

BOOL stringPrinted;
volatile BOOL buttonPressed;
volatile BYTE buttonCount;

BYTE CAN1MessageFifoArea[2 * 8 * 16];

/** P R I V A T E  P R O T O T Y P E S ***************************************/

static void InitializeSystem(void);
void ProcessIO(void);
void USBDeviceTasks(void);
void YourHighPriorityISRCode();
void YourLowPriorityISRCode();
void USBCBSendResume(void);
void BlinkUSBStatus(void);
void UserInit(void);

/** DECLARATIONS ***************************************************/

#pragma code

/******************************************************************************
 * Function:        void main(void)
 *****************************************************************************/

int main(void)
{
   //Configura el sistema para un máximo rendimiento y habilita las interrupciones del multivector
   
   InitializeSystem();      /* Inicializamos el USB */
               /* Inicializamos el CAN */

    while(1){
        #if defined(USB_INTERRUPT)
            if(USB_BUS_SENSE && (USBGetDeviceState() == DETACHED_STATE))
            {
                USBDeviceAttach();
            }
        #endif

        #if defined(USB_POLLING)
      // Check bus status and service USB interrupts.
        USBDeviceTasks(); // Interrupt or polling method.  If using polling, must call
                      // this function periodically.  This function will take care
                      // of processing and responding to SETUP transactions
                      // (such as during the enumeration process when you first
                      // plug in).  USB hosts require that USB devices should accept
                      // and process SETUP packets in a timely fashion.  Therefore,
                      // when using polling, this function should be called
                      // regularly (such as once every 1.8ms or faster** [see
                      // inline code comments in usb_device.c for explanation when
                      // "or faster" applies])  In most cases, the USBDeviceTasks()
                      // function does not take very long to execute (ex: <100
                      // instruction cycles) before it returns.
        #endif       

        ProcessIO();       
    }//end while
}//end main

/********************************************************************
 * Function:        static void InitializeSystem(void)
 *******************************************************************/

static void InitializeSystem(void)
{
     #if defined(__C30__)
       
            AD1PCFGL = 0xFFFF;
       
   
    #endif
   
    #if defined(PIC24FJ64GB004_PIM) || defined(PIC24FJ256GB106)
   //On the PIC24FJ64GB004 Family of USB microcontrollers, the PLL will not power up and be enabled
   //by default, even if a PLL enabled oscillator configuration is selected (such as HS+PLL).
   //This allows the device to power up at a lower initial operating frequency, which can be
   //advantageous when powered from a source which is not gauranteed to be adequate for 32MHz
   //operation.  On these devices, user firmware needs to manually set the CLKDIV<PLLEN> bit to
   //power up the PLL.
    {
        unsigned int pll_startup_counter = 600;
        CLKDIVbits.PLLEN = 1;
        while(pll_startup_counter--);
    }

    //Device switches over automatically to PLL output after PLL is locked and ready.
    #endif

//"USE_USB_BUS_SENSE_IO" has been defined in the HardwareProfile.h file.   
    #if defined(USE_USB_BUS_SENSE_IO)
    tris_usb_bus_sense = INPUT_PIN; // See HardwareProfile.h
    #endif
   
//   "USE_SELF_POWER_SENSE_IO" in HardwareProfile.h.
    #if defined(USE_SELF_POWER_SENSE_IO)
    tris_self_power = INPUT_PIN;   // See HardwareProfile.h
    #endif
   
    UserInit();
    USBDeviceInit();   //usb_device.c.  Initializes USB module SFRs and firmware variables to known states.

}//end InitializeSystem

/******************************************************************************
 * Function:        void UserInit(void)
 *****************************************************************************/
void UserInit(void)
{
    //Initialize all of the debouncing variables
    buttonCount = 0;
    buttonPressed = FALSE;
    stringPrinted = TRUE;

    //Inicializar todos los pines de los LEDs
    mInitAllLEDs();

}//end UserInit

/******************************************************************************
 * Function:        void ProcessIO(void)
Aqui hacemos que parpadee el LED 1 (Rojo) cuando conectamos la tarjeta al PC
 ******************************************************************************/
void ProcessIO(void)
{   
    mLED_2_On();
    //Blink the LEDs according to the USB device status
    BlinkUSBStatus();


}   //end ProcessIO

/********************************************************************
 * Function:        void BlinkUSBStatus(void)
 *******************************************************************/
void BlinkUSBStatus(void)
{
    /*static WORD led_count=0;
   
    if(led_count == 0)led_count = 40000U;
         led_count--;

    #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();}

    if(USBSuspendControl == 1)
    {
        if(led_count==0)
        {
            mLED_1_Toggle();
            if(mGetLED_1())
            {
                mLED_2_On();
            }
            else
            {
                mLED_2_Off();
            }
        }//end if
    }
    else
    {
        if(USBDeviceState == DETACHED_STATE)
        {
            mLED_Both_Off();
        }
        else if(USBDeviceState == ATTACHED_STATE)
        {
            mLED_Both_On();
        }
        else if(USBDeviceState == POWERED_STATE)
        {
            mLED_Only_1_On();
        }
        else if(USBDeviceState == DEFAULT_STATE)
        {
            mLED_Only_2_On();
        }
        else if(USBDeviceState == ADDRESS_STATE)
        {
             if(led_count == 0)
            {
                mLED_1_Toggle();
                mLED_2_Off();
            }//end if
        }
        else if(USBDeviceState == CONFIGURED_STATE)
        {
            if(led_count==0)
            {
                mLED_1_Toggle();      // Parpadeo LED Rojo (1)
            }//end if
        }//end if(...)
    }//end if(UCONbits.SUSPND...)
    */
}//end BlinkUSBStatus

/******************************************************************************
 * Function:        void USBCBSuspend(void)
 *****************************************************************************/
void USBCBSuspend(void)
{
   #if defined(__C30__)
        USBSleepOnSuspend();
    #endif
}

/******************************************************************************
 * Function:        void USBCBWakeFromSuspend(void)
 *****************************************************************************/
void USBCBWakeFromSuspend(void)
{

}

/********************************************************************
 * Function:        void USBCB_SOF_Handler(void)
 *******************************************************************/
void USBCB_SOF_Handler(void)
{
    // No need to clear UIRbits.SOFIF to 0 here.
    // Callback caller is already doing that.

    //This is reverse logic since the pushbutton is active low
/*    if(buttonPressed == sw1)//AQUI CAMBIO EL PULSADOR QUE QUIERO VER
    {
        if(buttonCount != 0)
        {
            buttonCount--;
        }
        else
        {
            //This is reverse logic since the pushbutton is active low
            buttonPressed = !sw1;//AQUI CAMBIO EL PULSADOR QUE QUIERO VER

            //Wait 100ms before the next press can be generated
            buttonCount = 100;
        }
    }
    else
    {
        if(buttonCount != 0)
        {
            buttonCount--;
        }
    }*/
}

/*******************************************************************
 * Function:        void USBCBErrorHandler(void)
 *******************************************************************/
void USBCBErrorHandler(void)
{
   
}

/*******************************************************************
 * Function:        void USBCBCheckOtherReq(void)
 *******************************************************************/
void USBCBCheckOtherReq(void)
{
    USBCheckCDCRequest();
}//end


/*******************************************************************
 * Function:        void USBCBStdSetDscHandler(void)
 *******************************************************************/
void USBCBStdSetDscHandler(void)
{
    // Must claim session ownership if supporting this request
}//end


/*******************************************************************
 * Function:        void USBCBInitEP(void)
 *******************************************************************/
void USBCBInitEP(void)
{
    CDCInitEP();
}

/********************************************************************
 * Function:        void USBCBSendResume(void)
 *******************************************************************/
void USBCBSendResume(void)
{
    static WORD delay_count;
   
    //First verify that the host has armed us to perform remote wakeup.
    //It does this by sending a SET_FEATURE request to enable remote wakeup,
    //usually just before the host goes to standby mode (note: it will only
    //send this SET_FEATURE request if the configuration descriptor declares
    //the device as remote wakeup capable, AND, if the feature is enabled
    //on the host (ex: on Windows based hosts, in the device manager
    //properties page for the USB device, power management tab, the
    //"Allow this device to bring the computer out of standby." checkbox
    //should be checked).
    if(USBGetRemoteWakeupStatus() == TRUE)
    {
        //Verify that the USB bus is in fact suspended, before we send
        //remote wakeup signalling.
        if(USBIsBusSuspended() == TRUE)
        {
            USBMaskInterrupts();
           
            //Clock switch to settings consistent with normal USB operation.
            USBCBWakeFromSuspend();
            USBSuspendControl = 0;
            USBBusIsSuspended = FALSE;  //So we don't execute this code again,
                                        //until a new suspend condition is detected.

            //Section 7.1.7.7 of the USB 2.0 specifications indicates a USB
            //device must continuously see 5ms+ of idle on the bus, before it sends
            //remote wakeup signalling.  One way to be certain that this parameter
            //gets met, is to add a 2ms+ blocking delay here (2ms plus at
            //least 3ms from bus idle to USBIsBusSuspended() == TRUE, yeilds
            //5ms+ total delay since start of idle).
            delay_count = 3600U;       
            do
            {
                delay_count--;
            }while(delay_count);
           
            //Now drive the resume K-state signalling onto the USB bus.
            USBResumeControl = 1;       // Start RESUME signaling
            delay_count = 1800U;        // Set RESUME line for 1-13 ms
            do
            {
                delay_count--;
            }while(delay_count);
            USBResumeControl = 0;       //Finished driving resume signalling

            USBUnmaskInterrupts();
        }
    }
}


/*******************************************************************
 * Function:        void USBCBEP0DataReceived(void)
*******************************************************************/
#if defined(ENABLE_EP0_DATA_RECEIVED_CALLBACK)
void USBCBEP0DataReceived(void)
{
}
#endif

/*******************************************************************
 * Function:        BOOL USER_USB_CALLBACK_EVENT_HANDLER(
 *                        USB_EVENT event, void *pdata, WORD size)
 *******************************************************************/
BOOL USER_USB_CALLBACK_EVENT_HANDLER(USB_EVENT event, void *pdata, WORD size)
{
    switch(event)
    {
        case EVENT_TRANSFER:
            //Add application specific callback task or callback function here if desired.
            break;
        case EVENT_SOF:
            USBCB_SOF_Handler();
            break;
        case EVENT_SUSPEND:
            USBCBSuspend();
            break;
        case EVENT_RESUME:
            USBCBWakeFromSuspend();
            break;
        case EVENT_CONFIGURED:
            USBCBInitEP();
            break;
        case EVENT_SET_DESCRIPTOR:
            USBCBStdSetDscHandler();
            break;
        case EVENT_EP0_REQUEST:
            USBCBCheckOtherReq();
            break;
        case EVENT_BUS_ERROR:
            USBCBErrorHandler();
            break;
        case EVENT_TRANSFER_TERMINATED:
            //Add application specific callback task or callback function here if desired.
            //The EVENT_TRANSFER_TERMINATED event occurs when the host performs a CLEAR
            //FEATURE (endpoint halt) request on an application endpoint which was
            //previously armed (UOWN was = 1).  Here would be a good place to:
            //1.  Determine which endpoint the transaction that just got terminated was
            //      on, by checking the handle value in the *pdata.
            //2.  Re-arm the endpoint if desired (typically would be the case for OUT
            //      endpoints).
            break;
        default:
            break;
    }     
    return TRUE;
}


/** EOF main.c *************************************************/
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: alperez en 13 de Junio de 2013, 08:46:42
Esa función está definida en "usb_hal_pic24.c" forma parte del stack USB
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: planeta9999 en 13 de Junio de 2013, 08:58:35
He estado rehaciendo todos los archivos de nuevo, siendo muy semejarntes al proyecto del chico que os digo para comunicarle con el USB, ya que él lo logro pero con un PIC32X, he cambiado cosas, y a la hora de compilar parecia que estaban arreglados todos los fallos, pero me da al final este:

main.o(.text+0x5a): In function `USBCBSuspend':
C:\Documents and Settings\BlackCrystal™\Escritorio\MI PROYECTO MPLAB\main.c:234: undefined reference to `USBSleepOnSuspend'

Alguno sabe de que puede ser?


Pulsa Shift+Ctrl+F y busca USBSleepOnSuspend en todo el proyecto, si solo te sale en el main, te falta el .H o .C que define esa función.



Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: musttork en 13 de Junio de 2013, 16:57:47
gENTE os cuento...si que estaba definida, pero como es booleano pues necesitaba BOOL antes de la funcion. He pasado de nuevo el archivo por pickit2 al pic...y nada...sigue igual...tenia la esperanza de que ahora consiguiera que me lo detectara..pero sigue dandome el p...mesaje.

Si alguien quiere que le mande todo el archivo para echarlo un ojo en sus ratos libres, que me pase un correo para mandarselo.

Saludos y gracias chicos!
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: alperez en 14 de Junio de 2013, 04:00:52
gENTE os cuento...si que estaba definida, pero como es booleano pues necesitaba BOOL antes de la funcion. He pasado de nuevo el archivo por pickit2 al pic...y nada...sigue igual...tenia la esperanza de que ahora consiguiera que me lo detectara..pero sigue dandome el p...mesaje.

Si alguien quiere que le mande todo el archivo para echarlo un ojo en sus ratos libres, que me pase un correo para mandarselo.

Saludos y gracias chicos!

¿Conoces dropbox?
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: musttork en 15 de Junio de 2013, 06:47:30
Si, lo tengo instalado en el ordenador, pero no se como se utiliza la carpeta public, si me indicas, sigo tus pasos.
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: alperez en 15 de Junio de 2013, 17:06:19
En tu carpeta dropbox >>selecciona el archivo>> boton derecho>> dropbox>> compartir enlace
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: musttork en 15 de Junio de 2013, 18:04:56
https://www.dropbox.com/sh/xhmhpkrrep99cju/d26D2DYD1Q
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: alperez en 16 de Junio de 2013, 07:01:10
Lo he compilado con MPLABX y XC16 puesto que no tengo mplab C30 y compila con unos warning que ni caso de momento.

Si utilizas pickit 2 para quemar el PIC (es el que uso yo) te tienes que haber dado cuenta de un mensaje que te dice algo así como que no están configurados los fuses y se tomarán los valores por defecto, es ahí tu problema. Te indiqué en un post anterior los fuses que yo uso, los he copiado en tu proyecto, lo he compilado y enumera sin mayores problemas, así que revisa la configuración de los fuses, ponle los que yo uso y cambia el del divisor del FOSC para usar ese de 8 Mhz que tienes.
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: musttork en 17 de Junio de 2013, 05:15:59
También utilizo el Pickit2, pero no he visto ningún mensaje que me diga nada de los fuses...puede ser por utilizar un compilador diferente?

después, al poner lo de #pragma CONFIG, me da un error cuando intento compilar, como si esa forma de escribir al configuración no fuera admitida...

y la ultima cosa y perdona mi ignorancia, que es eso de que enumera sin problema¿? es la primera vez que utilizo este tipo de micros y ando un poco perdido la verdad.

Un saludo y gracias de nuevo
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: alperez en 17 de Junio de 2013, 05:33:39
Es posible que no admita esa sintaxis el compilador,

Enumera significa que el dispositivo es reconocido por el sistema operativo, esté configurado o no, quiero decir, que aunque el sistema operativo no tenga el driver, sí que lo reconoce por que ha habido ya una comunicación en la que se ha identificado con un PID y un VID, esto no quere decir ni mucho menos que el dispositivo funcione, ya que debes indicarle al SO que dispositivo es, si es CDC, BULK u otra clase de dispositivo. Tambien se puede modificar la corriente máxima que se le sumunistrará a través del puerto USB y la velocidad y/o version (USB1.0 USB2.0...)
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: musttork en 17 de Junio de 2013, 10:08:19
y si que lo has echo y funciona?

como puedo hacer yo eso de enumerar?

saludos
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: musttork en 17 de Junio de 2013, 15:31:12
Me estoy descargado en MPLABX y el XC16 para probar con lo mismo que tu. Volviendo al inicio de este post, vi que me comentaste que debia de configurar el driver para XP, que es lo que hay que hacer? tenia entendido que solo habia q modificar el PID y el VID del archivo descriptors y del driver, para que fuera el mismo. hay que hacer alguna otra cosa más?
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: alperez en 17 de Junio de 2013, 16:01:16
Me estoy descargado en MPLABX y el XC16 para probar con lo mismo que tu. Volviendo al inicio de este post, vi que me comentaste que debia de configurar el driver para XP, que es lo que hay que hacer? tenia entendido que solo habia q modificar el PID y el VID del archivo descriptors y del driver, para que fuera el mismo. hay que hacer alguna otra cosa más?

Creo recordar que tienes que hacer coincidir el VID y el PID. Con eso ya sólo el SO debe de identificar el dispositivo
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: musttork en 17 de Junio de 2013, 16:04:12
Me estoy descargado en MPLABX y el XC16 para probar con lo mismo que tu. Volviendo al inicio de este post, vi que me comentaste que debia de configurar el driver para XP, que es lo que hay que hacer? tenia entendido que solo habia q modificar el PID y el VID del archivo descriptors y del driver, para que fuera el mismo. hay que hacer alguna otra cosa más?

Creo recordar que tienes que hacer coincidir el VID y el PID. Con eso ya sólo el SO debe de identificar el dispositivo

Gracias maquina! me pongo a compilar
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: musttork en 17 de Junio de 2013, 16:15:17
Por cierto, en este mplabx, donde se pone la ruta del path para que coja mis archivos? en el otro mplab se donde pero en este me pierdo
Título: Re: Con dolor de cabeza, pero satisfecho (USBCDC PIC24)
Publicado por: alperez en 17 de Junio de 2013, 16:49:07
Por cierto, en este mplabx, donde se pone la ruta del path para que coja mis archivos? en el otro mplab se donde pero en este me pierdo

En las propiedades del proyecto. Pero importa el que ya tienes en c30