Autor Tema: Proyecto PicUSB  (Leído 392282 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
Re: Proyecto PicUSB
« Respuesta #285 en: 20 de Enero de 2008, 15:58:57 »
Exacto jeremy, es para detectar el cambio en el byte del pulsador. Entra en el IF si hay dato 'recibido' y dentro del IF se mira si se ha pulsado el switch.

La verdad no se si con el driver de Microchip se puede hacer eso, la verdad está algo limitado. Yo he usado la transmisión Bulk, hay otro modo que es la de interrupción, se que con el Driver del WinUSB se puede usar, aunque no lo he hecho nunca y tampoco sabría decir si con este modo se resolvería tu problema, que si bien es cierto, como te he dicho se puede 'solucionar', como me comentas y efectivamente el Sistema operativo se queda 'demasiado pendiente' de ese timer.

Un saludo!

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Proyecto PicUSB
« Respuesta #286 en: 20 de Enero de 2008, 18:28:52 »
Hola J1M. Me referia a q cuando tu lees el buffer sin enviar nada previamente, para estar en una misma trama de transferencia, siempre leera 0. Por eso en "public float ConvADPIC()", en "if (receive_buf[0] == 0)", siempre se cumplira por eso mismo. Entonces enviar un 0 al Host es lo mismo q si no mandaramos nada, me dejo entender?  :lol:

Porcierto en "private void adconv_Click(object sender, EventArgs e)" llamas a ConvADPIC dos veces siendo la 1ra inecesaria (creo) y dentro de ella justo en la linea de "send_buf[0] = 0x02;" en el comentario pones "text mode" donde deberia ser "AD mode".  :lol:

Sobre como detectar/tratar la interrupcion por buffer ocupado que nos brinda el Host,  creo q el modo interrupcion del USB no es la solucion porq esta es mas para dispositivos de interacion humana, HID (si, e estado leyendo mucho  :lol:). Lo q si, es tratar esa interrupcion en modo bulk por VC# de alguna manera y aunq tampoco se como sea posible e buscado y buscado haber conq me encontraba y hay unos codigos que hacen funcionar el USB desde VC# y pues de algo pueden ayudar, los dejo aqui posiacaso:

http://www.componentsnotebook.com/notebooks/csharp/deviceio.aspx
http://libusb-win32.sourceforge.net/#about
http://libusb.sourceforge.net/
http://primates.ximian.com/~lupus/corlib-cov/class-Microsoft.Win32.Win32RegistryApi.html
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=580712&SiteID=1
http://www.codeproject.com/KB/system/DriveDetector.aspx
http://www.developerfusion.co.uk/show/4392/1/

No estoy seguro si tratan el tema de la interrupcion que hay por dato alojado en buffer en modo bulk, yaq no estoy del todo familiarizado con el VC# en ese nivel. Pero si el tema de USB por VC# y pues, podria ayudar  :lol:


Gracias por todo J1M.
Un saludo 8)
« Última modificación: 21 de Enero de 2008, 04:07:17 por jeremylf »

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Proyecto PicUSB
« Respuesta #287 en: 26 de Enero de 2008, 22:59:13 »
Bueno, y yo sigo buscando como tratar tal interrupcion  :lol:

Y me tope con un forma que, no es precisamente eso, pero, deacuerdo a lo q quiero, se va acercando. Lo q hago es leer y leer siempre el buffer de una forma mas abreviada, por asi decirlo (luego pondre el codigo), como en el PicUSBnut. Pero ahora, ANTES verificando q se ha cojido un dato: Yaq la funcion _MPUSBRead devuelve un 1 si se a obtenido algun dato (y muchos numeros mas q creo q son errores y etceteras  :mrgreen:). Y asi hasta q se cumpla y recien procesar. Pero hay un error, y esq me coje un valor q no es  :?

Aqui el codigo en VC# (Esta todo bien explicado  :mrgreen:):
Código: [Seleccionar]
        public void Esperar_dato()    //Esto se produce cuando aprieto un boton en el Form1.
        {
            //Estas variables son para poder ejecutar _MPUSBRead
            DWORD int_ = 0;
            byte* recivi = stackalloc byte[1];
            DWORD reclen = 1; DWORD *lengt = &reclen;
           
            //Variables propias de mi xD!
            byte cont = 1, d1=0, d2=0, d3=0, d4=0;
           
            while (cont <= 4)    //Bien, esto porq quiero solamente cojer 4 datos.
            {
                int_ = 0;       //Esta varialbe indica "si uvo interrupcion" por simularlo de algun manera, espero se ntienda.
               
                OpenPipes();
                while (int_ == 0)        //Y esto se ejecutara infinitamente hasta q haya algun dato en el bufer y q se coja correctamente, entonces int_ cambiara a 1.
                {
                    int_ = _MPUSBRead(myInPipe, (void*)recivi, 1, lengt, 1);     //Pues eso, la revicion infita =)
                }
                ClosePipes();
               
                //Esto ultimo es para revisar los 4 datos q me llegan y luego mostrarlos por un mensaje.
                switch (cont)
                {
                    case 1: d1 = recivi[0]; break;
                    case 2: d2 = recivi[0]; break;
                    case 3: d3 = recivi[0]; break;
                    case 4: d4 = recivi[0]; break;
                }
                cont++;      //Aumento contador para q se cumpla lo de leer solamente 4 veces.
            }
           
            //Y pues finalmente, lo muestro todo.
            MessageBox.Show(d1.ToString() + " " + d2.ToString() + " " + d3.ToString() + " " + d4.ToString());
        }

El problema esq cuando me lee, lee valores q no son a los q yo envie desde el pic. Se supone q todos deben de ser iguales y si, en eso esta bien, todos son iguales. Pero no el numero correcto.

Esto es lo q esta en CCS:
Código: [Seleccionar]
#include <18F2550.h>
#fuses xtPLL, NOWDT, NOPROTECT, NOLVP, NODEBUG, USBDIV, PLL1, CPUDIV1, VREGEN
#use delay(clock=48000000)
#use rs232(baud = 9600, xmit = PIN_C6, rcv = PIN_C7)

/////////////////////////////////
#define USB_HID_DEVICE     FALSE             //deshabilitamos el uso de las directivas HID
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for IN bulk/interrupt transfers
#define USB_EP1_RX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE    1                 //size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE    3                 //size to allocate for the rx endpoint 1 buffer

#include <pic18_usb.h>     //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include "USB_extreme_descriptores.h"         //Configuración del USB y los descriptores para este dispositivo
#include <usb.c>           //handles usb setup tokens and get descriptor reports

/////////////////////////////////

#define dato_recivido_1    recibe[0]
#define dato_recivido_2    recibe[1]
#define dato_recivido_3    recibe[2]

#define dato_a_enviar_1 envia[0]

/////////////////////////////////
void main(void)
{
   int8 recibe[3];                  //declaramos variables
   int8 envia[1];
   int16 i;
   short enviado = 0;
 
   printf("\fJEREMY!");

   usb_init();                      //inicializamos el USB
   usb_task();                      //habilita periferico usb e interrupciones
   usb_wait_for_enumeration();      //esperamos hasta que el PicUSB sea configurado por el host
   
   printf("\r\n%u", input(PIN_A0));
   while (TRUE)
   {
      if(usb_enumerated())          //si el PicUSB está configurado
      {
         //Cuando se pone a 0 el A0, por un boton.
         if (input(pin_a0) == 0)
         {
            dato_a_enviar_1 = 128;    //EL DATO Q VOY A ENVIAR ES 128.
           
            printf("%u", usb_put_packet(1, recibe, 1, USB_DTS_TOGGLE));   //Y envio y envio asta q se suelte el boton. Lo pongo printf porq luego me muestra si se
                                                             // cumplio con el envio o no, cuando no pulso el boton para chekear el bufer e VC# me pone 0, cuando captura
                                                             //los 4    q   quiero me pone algunos 1 y otros 0.
         }
      }
   }
}

El problema, como se ve, esq no lee 128 (q es lo q envio desde el pic en la variable dato_a_enviar_1), lee 23, cuatro veces seguida claro.

A q se debe? Solo estoy esperando un dato en el buffer y pues cuando lo cojo me deberia leer bien, nose porq lee mal  :?
Espero se me entienda.

Gracias.
Salud.

Desconectado gu1llermo

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 217
Re: Proyecto PicUSB
« Respuesta #288 en: 27 de Enero de 2008, 02:14:42 »
Primero que todo quiero Felicitar a J1M, por abrir éste hilo y también agradecerle por compartir sus conocimientos, en especial acerca del picusb, que a tantas personas como yo les a servido, por eso muchas gracias  :-/ , también quería agradecer a todos los que han participado en el mismo, que por lo que veo hay muchos maestros  8) y también a los que preguntan porque son como la chispa que encienden la luz de las ideas y soluciones generadas por estos.

jeremylf, fíjate en la línea: printf("%u", usb_put_packet(1, recibe, 1, USB_DTS_TOGGLE));

creo que lo que quieres hacer es: printf("%u", usb_put_packet(1, envia, 1, USB_DTS_TOGGLE));

Prueba a ver.

En un Post anterior creo que Trino se llama el participante tenía problemas porque el windows no le deja actualizar el controlador y por lo tanto no podía instalar el que él quería, a mi me pasó lo mismo y lo solucioné de la siguiente forma:
Inicio --> Click derecho sobre Mi PC --> Propiedades --> Hardware --> Administrador de Dispositivos --> selecciono el de mi interés y le doy click derecho --> Actualizar controlador... --> No por el momento --> Siguiente --> Instalar desde una lista o ubicación específica (avanzado) --> Siguiente --> No buscar. Seleccionaré el controlador que se va a instalar --> Siguiente --> Utilizar disco... --> Examinar... --> Aquí finalmente selecciono el .inf que yo quiero y listo!

Si me extendí es porque quise dejarlo lo más claro posible, es lo menos que puedo hacer después de tanta ayuda que e recibido de todos uds. nuevamente gracias a todos.

Saludos.

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Proyecto PicUSB
« Respuesta #289 en: 28 de Enero de 2008, 15:17:30 »
jeremylf, fíjate en la línea: printf("%u", usb_put_packet(1, recibe, 1, USB_DTS_TOGGLE));

creo que lo que quieres hacer es: printf("%u", usb_put_packet(1, envia, 1, USB_DTS_TOGGLE));
Pero q descuidado (por no decir otra cosa) soy!  :mrgreen: Creo q fue por culpa d un copy/paste  :D

Gracias gu1llermo, ahora si tdo funciona bien :lol:


salu2 8)

Desconectado zana

  • PIC10
  • *
  • Mensajes: 4
Re: Proyecto PicUSB
« Respuesta #290 en: 28 de Enero de 2008, 16:49:29 »
Hola,

 estoy intentado comenzar un proyecto con un Pic conectado por USB, llevo tiempo leyendo todo lo que hay hacerca de esto en internet y me surge un fallo que no he conseguido arreglarlo. Para empezar quise probar algun codigo ya hecho y uriliza el de hobbypic con el driver winUSB. Lo instale y todo funcionó a la perfeccion. Mi problema surge cuando intenté cambiar de driver ya que ese proyecto estaba hacho en C# y me interesaba hacerlo en C++ o visual basic. entoces cogui algun ejemplo en esos lenguajes y todo utilizan el driver de microchip, y como habia instalado primero el winUSB no ha manera de que funcione ninguno. He intentado desintalar el driver de todas las maneras posibles pero ya no funciona ninguno ecepto el que esta con el driver WINUBS.

Alguien sabe como puedo solucionar el problema? He intentado cambiar el ID tambien y nada.

Un ssaludo

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Proyecto PicUSB
« Respuesta #291 en: 29 de Enero de 2008, 00:05:02 »
Hola zana.

Veras, el driver de microchip (concretamente la mpusbapi) solo funciona en win xp y 98, EN VISTA NO. Creo q Jim lo comenta en el PicWinsUSB pero creo q no lo viste bien. Bueno, creo ese es el motivo porq no te funciona  :-)

Otra cosa, siquieres hacer trabajar los ejemplos de PicUSB en otro lenguaje, q no sea el VC#, q tb estan en Hobbipic (ESTOS), decirte q solo funcionaran en xp y 98 como te comento el xq arriba.

Suerte.
Salu2 8)

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Proyecto PicUSB
« Respuesta #292 en: 29 de Enero de 2008, 02:27:03 »
Hola denuevo.

Tengo una duda: Se pueden enviar/recibir datos de la PC al PIC de 16 bits ?? Porq creo q eso es lo maximo q puede soportar el PIC  (leyendo el pic18_usb.h, en su version history). Bien, pues hice pruebas y solo me recibio (el PIC) el 1er dato.

Para q me ntiendan mejor, aqui esta lo q hice en VC#:
Código: [Seleccionar]
        public void Ejecutar()
        {
            UInt16* send_buf = stackalloc UInt16[3];
           
            send_buf[0] = 1111;           
            send_buf[1] = 23;
            send_buf[2] = 56;

            SendPacket(send_buf, 3);
        }

Y, claro, cambie el tipo de variable del 1er argumento de SendPacket a:
Código: [Seleccionar]
private void SendPacket(UInt16* SendData, DWORD SendLength)

Bueno, es obvio q en el pic hay q tb cambiar algunas cosas, y pues, hice esto (CCS):
Decir antes q, como mi mayor prioridad es el recivimiento de datos desde el Pic, pues solo cambie eso de la variable recibe[].
Código: [Seleccionar]
.
.
.
void main(void)
{
   int16 recibe[3];        //AQUI
   int8 envia[1];
 
   printf("\fJEREMY!");

   usb_init();               
   usb_task();                     
   usb_wait_for_enumeration();     

   while (TRUE)
   {
      if(usb_enumerated())         
      {
         if (usb_kbhit(1) == 1)         
         {
            printf("\r\n%Lu ", usb_get_packet(1, recibe, 3));     //Aqui cojo y muestro por rs232 la cantidad q cojio (ocea 3).
            printf(" %Lu %Lu %Lu", recibe[0], recibe[1], recibe[2]);      //Y aqui muestro cada uno d los valores de recibe[].
         }
      }
   }
}

Y lo q me sale en hiperterminal, teniendo encuenta los valores q yo e mandado desde la PC, programadas en VC# (send_buf[]), me sale esto:

(El 3 es el 1er printf q hago, la cantidad de datos cojidos del bufer del pic)
Y, asi como se ve, solo el 1ro llega bien. Creo q tiene q ver con q enviar un dato de 16bits es lo maximo por mensaje, ocupando todo un paquete; y q a 8bits se pueden enviar muchos paquetes en un solo mensaje, o algo asi, q no ntiendo muy bien, porq hay diferencia entre mesajes y paquetes creo haber leido. Bien, pues tb vi el usb_gets pero leer la Nota q dejan, pues, como q uno no se siente muy seguro de usarla...
Citar
NOTE: NOT THOUROUGHLY TESTED.  I AM NOT EVEN SURE IF THIS IS A GOOD IDEA
Q cosas no?  :D. Aunq tampoco sabria como usarla.

Espero puedan darme una mano y q haya sido bien explicativo  :lol:

Hasta luego.
Salu2.

EDITO
Ehm... creo q no se puede:
Código: [Seleccionar]
int16 usb_get_packet(int8 endpoint, int8 * ptr, int16 max)
16 bits son el numero de datos cojidos del bufer y no puede ser la cantidad de cada uno de ellos, porque el puntero (variable) que contendra tal valor esta especificado en el 2do argumento de esa funcion y pues, ahi indica q solo es de 8bits. Pero es raro, porq:

1- ¿¿ Porq no me botaba error el compilador cuando ponia una variable de 16bits si esa funcion solo permite de 8 (int16 recibe[3]) en el puntero donde alojar los valores ??
2- ¿¿ Porq si podia leerme un valor (el 1111 y cualquier otro), el del 1er valor del buffer a enviar de la PC (send_buffer[]) ??

Todo se torna muy raro  :z).
« Última modificación: 29 de Enero de 2008, 04:01:18 por jeremylf »

Desconectado zana

  • PIC10
  • *
  • Mensajes: 4
Re: Proyecto PicUSB
« Respuesta #293 en: 29 de Enero de 2008, 07:58:46 »
Hola zana.

Veras, el driver de microchip (concretamente la mpusbapi) solo funciona en win xp y 98, EN VISTA NO. Creo q Jim lo comenta en el PicWinsUSB pero creo q no lo viste bien. Bueno, creo ese es el motivo porq no te funciona  :-)

Otra cosa, siquieres hacer trabajar los ejemplos de PicUSB en otro lenguaje, q no sea el VC#, q tb estan en Hobbipic (ESTOS), decirte q solo funcionaran en xp y 98 como te comento el xq arriba.

Suerte.
Salu2 8)

Hola jeremylf

Gracias por contestar, el caso es que no utilizo Vista sino windows Xp, el problema fue que instale esos driver y ahora ya no hay manera que me coja los otros. Una cosa que se me ha ocurrido es cambiar el VID y Id para que cuando lo conecte al ordenador no me relaciones el micro con ese driver. Es esto posible??

Un saludo

Desconectado jfh900

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Proyecto PicUSB
« Respuesta #294 en: 29 de Enero de 2008, 10:53:33 »
Aquí tienes un hilo donde se explica (varios métodos) para desistalar los drivers:

Método manual para Desenumerar el dispositivo que usa mchpusb.sys del WinXP

Un saludo
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
Re: Proyecto PicUSB
« Respuesta #295 en: 30 de Enero de 2008, 20:58:10 »
hola zana, sigue los pasos que comenta Pedro en el link que te ha puesto Jesús, es decir, desisntala el dispositivo, borra la clave de registro asociada al dispositivo y por último elimina de la carpeta drivers el .inf del driver instalado. Con eso debería ser suficiente para que el SO te solicite de nuevo un driver.

saludos!

Desconectado zana

  • PIC10
  • *
  • Mensajes: 4
Re: Proyecto PicUSB
« Respuesta #296 en: 01 de Febrero de 2008, 15:50:49 »
Hola

Gracias jfh900 y J1M por contestar. Lo he intentado  ya todo, realice los pasos que me comentan borrando los registros el driver etc pero nada. Cuando introduzco el pic me lo reconoce como un dispositivo desconocido con VID_0000&PID_0000 cosa que me parece muy raro. Y al intentar instalar el driver me dice que no hay driver para ese dispositivo.

He intentado tambien cambiando el Vid y PID a ver si de esa manera reconoce otro dispositivo, pero nada. Ya estoy pensado que solo me falta formatear el ordenador.

Alguien tiene alguna idea de como solucionarlo.

Gracias

Zana

P.D. J1M tu aplicacion con winUSB es infalible ya que aunque le quite el driver si le cargo el programa esa version siempre la detecta bien y funciona. El problema es que quiero hace la apliacacion en C++ y sin un ejemplo de codigo voi un poco perdido.

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
Re: Proyecto PicUSB
« Respuesta #297 en: 01 de Febrero de 2008, 15:59:18 »
Me da que debe haber algún error en el programa que utilizas en el PIC... pruébalo tal y como aparece en la página.

Con respecto al WinUSB yo me basé en el artículo de las MSDN y este venía en VC++. Un usuario de los foros de Microchip publicó hace un tiempo un ejemplo también en VC++:
http://www.raccoonrezcats.com/soundcard.html

saludos!

Desconectado jfh900

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Proyecto PicUSB
« Respuesta #298 en: 01 de Febrero de 2008, 17:33:16 »
Tienes mal configurado en el PIC el VID y el PID estos valores son erroneos: VID_0000&PID_0000

Un saludo
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado zana

  • PIC10
  • *
  • Mensajes: 4
Re: Proyecto PicUSB
« Respuesta #299 en: 01 de Febrero de 2008, 17:58:18 »
Tienes mal configurado en el PIC el VID y el PID estos valores son erroneos: VID_0000&PID_0000

Un saludo

La cuestion es que no he tocado el codigo, me he bajado los diferentes proyectos y los he probado directamente sin tocar el código. Y solo ha funcionado el que esta basado en WinUSB.

Un saludo


 

anything