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

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

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
Re: Proyecto PicUSB
« Respuesta #300 en: 05 de Febrero de 2008, 18:56:44 »
Novedades!!!

Microchip ha sacado la versión 1.3 de su stack, en otras palabras, hay nueva versión del driver mpusbapi.dll, aquí las novedades:

What's New/Updated in Release v1.3
·         Microchip General Purpose USB Windows® Driver, mchpusb.sys v1.0.0.6, is updated to support Windows Vista™ and 64-bit Windows® Operating Systems. This version is WHQL certified.
·         CDC RS-232 emulation INF file, mchpcdc.inf, updated for supporting Windows Vista™ 32-bit and 64-bit.
·         Some bug fixes in USB library firmware (usb9.c).

http://ww1.microchip.com/downloads/en/DeviceDoc/Release%20Notes%20for%20MCHPFSUSB%20v1.3.htm
http://ww1.microchip.com/downloads/en/DeviceDoc/MCHPFSUSB_Setup_v1.3.exe

Ya se puede volver a jugar con el driver de microchip... ahora en Vista y versiones de 64bits de windows, voy a ojearlo a ver que tal va! ;)

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Proyecto PicUSB
« Respuesta #301 en: 08 de Febrero de 2008, 23:34:04 »
Buenas gente!!! Primero q nada, mil gracias a todos los responsables de este proyecto y sus colaboradores, han hecho un excelente trabajo y nos han abierto muchas puertas a todos!!! la verdad q se pasaron! :) los felicito!!!!

Bueno, les comento lo q pasa. Uso Linux, y luego de superar una q otra complicacion, logre hacer funcionar el programa q subieron.
La cosa es q ahora quiero hacer mis propias aplicaciones, asiq para empezar quise usar el mismo codigo del pic, pero usando mi propio codigo en la PC. Asi que me puse a leer y leer el codigo a ver si entendia como trabajaba, pero sinceramente me perdio mucho el tema de las librerias de gtk y todo eso. Y queria pedir, si no es mucha molestia, q me expliquen un poco cuales son las partes escenciales del codigo, asi voy filtrando un poco la cosa.
La idea seria hacer un programa simple q se ejecute desde el shell, q haga titilar un par de veces los leds y me devuelva el resultado de una suma arbitraria. Una vez q entienda lo minimo q se requiere para enviar y recibir paquetes ya puedo seguir solo.

Nuevamente, muy agradecido a todos ustedes!!!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Proyecto PicUSB
« Respuesta #302 en: 09 de Febrero de 2008, 05:30:26 »
Hola zspikes.

A que te refieres con tu propio codigo para PC? A la programacion para el programa de usuario?, porq este esta echo en VC#, c++, delphi, etc.

Y tampoco se a q te refieres con las librerias gtk.

Quisiera ayudarte pero no entiendo q es lo q quieres enrealidad.

Citar
Novedades!!!
Microchip ha sacado la versión 1.3 de su stack, en otras palabras, hay nueva versión del driver mpusbapi.dll, aquí las novedades...
Q bien! Solo, lo q no me gusta esq no hayan cambiado en nada a la DLL. Precisamente lo q ando como loco buscando... Catch a la interrupcion en bulk  :lol:

De todos modos, es bueno saber q se podra usar la DLL en Vista.


Salu2  :mrgreen:
« Última modificación: 09 de Febrero de 2008, 05:36:20 por jeremylf »

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Proyecto PicUSB
« Respuesta #303 en: 09 de Febrero de 2008, 05:31:26 »
Bueno, y yo segui buscando la forma de tratar la interrupcion...  :lol:

Hasta ahora, solo e estado metido en la mpusbapi.dll (si, me baje el builder c++ 6 y todo). Y, por dar informacion, ahi usan las funciones del API de windows como ReadFile, WriteFile, CreateFile, etc. Tambien me encontre con formas para poder "esperar" a la interrupcion con funciones como WaitForSingleObject, WaitCommEvent,... que siendo este ultimo el q mas me llamo la atencion porq es muy utilizado para el puerto serie. Pero (si, siempre lo hay u.u'), no funciono.

Y esq, para los q conoscan sobre estas funciones API del Windows (yaq esto es un mundo nuevo para mi tb), usando el WaitCommEvent, siempre me debuelve FALSE (ese y toda su familia, ocea: SetCommMask (poniendo este antes, claro), ClearCommError, etc). Parece ser q al poner el handle, q me da CreateEvent(...) en MPUSBOpen(...), no lo reconociera o algo, porq GetLasError me devuelve  ERROR_INVALID_FUNCTION enves de ERROR_INVALID_HANDLE, y nose que pensar  :shock: Quiza falte especificar algo en el CreateEvent(...) como un flag pero nose que pueda ser.

Con WaitForSingleObject pasa lo mismo; pense en poner en su 1er parametro el handle de MPUSBOpen pero no es algo q se pueda señalar (como lo hace con el evento de la estructura OverLapped).

Estuve echando una mirada tambien a MPUSBReadInt y pues hay algo en la funcion q usa: DeviceIoControl que pueda ser de ayuda. Pero (u.u') probando con al handle normal (yaq, en la decripcion del paramtro pEP del MPUSBOpen dice que hay q cambiar este valor por otro, indicando que quieres la pipe del tipo de transferencia: Interrupcion) no funciono. Y, ahi si, me devuelve GetLastError: ERROR_INVALID_HANDLE... Lo q me hace pensar esto, esq si la transferencia por Interrupcion tiene un handle especifico (porq el de Bulk fallo), donde indica una espera (ocea interrupcion) de byte almacenado en el buffer del Host (IOCTL_MCHPUSB_WAIT_INTERRUPT), pues entonces el Bulk tb lo tendra. Pero nose cual, ademas q su 2do parametro lo hace mas complicado aun, porq hace llamado a un tal CTL_CODE q crea una nueva funcion para el DeviceIoControl, o algo en un nivel mas bajo aun permitido legalmente en el windows. Esto si ya es demasiado.

Con todo esto y arta compilacion en el builder c++ 6... Encontre una forma, muy poco elegante (yaq todo lo q intentaba con esas funciones de comunicacion(WaitCommEVENT, ... de la libreria Kernel32.dll, me fallaba) de esperar, por asi decirlo (porq realmente espera) a la interrupcion esta. Y es combinado con el VC#. Ocea, a de crear un Thread (un subprocedimiento) que se encarge de una espera, fuera del programa principal, del buffer del Host. Asi, cuando aya llegado un dato, aparte de guardarlo (porq es muy poco elegante ya dije  :lol:) realizara algun otro evento enviando este byte a procesarlo o lo q sea.

Bueno, todo esto ultimo en codigos es asi:

VC#:
Primero, agregar a algunas funciones y varaibles el static. Exactamente a: vid_pid_norm, out_pipe, in_pipe, myOutPipe, myInPipe, OpenPipes() y ClosePipes(). Esto devido a que el Thread, encargado de la tarea de esperar la interrupcion sin colgar nuestro programa principal, solo es creado con static y, por ende, solo puede llamar a funciones static (Open/ClosePipes()). Los demas string's y void's es porque estos son llamados desde un metodo, ahora, static, ocea OpenPipes y ClosePipes.

Luego, crear el Thread, fuera del main porque se necesitara luego para cerrarla desde otro evento (aunq hay errores con esto porq la DLL nunca se cierra). Pero, sera iniciada desde el Main, eso si.

Y, por ultimo, hacer lo que el Thread hara ni bien se inicia el programa. Este, llama a _MPUSBEsperarInterrupcionYLeer(...) (si, yo lo cree  :lol:), que, es muy similar a _MPUSBRead pero que en la funcion WaitFosSingleObject(...) se queda indefinidamente esperando hasta que el evento Overlaped sea señalado (ocea que haya un dato en el buffer). Asiq dejo tambien la DLL modificada con esa sola funcion que le puse para lograr tal cometido  :mrgreen:

Ahora, si. Todo esto en codigo es asi:
Código: [Seleccionar]
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Runtime.InteropServices; // Clase para importar DLL
using System.Threading; //Clase para subprocesos.

using PVOID = System.IntPtr;
using DWORD = System.UInt32;

namespace PicUSB
{
    unsafe public class PicUSBAPI
    {
        #region Definición de los Strings: EndPoint y VID_PID
        static string vid_pid_norm = "vid_04d8&pid_0011"; //AHORA ES STATIC.

        static string out_pipe = "\\MCHP_EP1"; //AHORA ES STATIC.
        static string in_pipe = "\\MCHP_EP1"; //AHORA ES STATIC.
        #endregion

        #region Funciones importadas de la DLL: mpusbapi.dll
.
.
.
        [DllImport("mpusbapi.dll")]
        private static extern void* _MPUSBOpen(DWORD instance, string pVID_PID, string pEP, DWORD dwDir, DWORD dwReserved);
       
        //LA NUEVA n.n'
[DllImport("mpusbapi.dll")]
        private static extern DWORD _MPUSBEsperarInterrupcionYLeer(void* handle, void* pData, DWORD dwLen, DWORD* pLength);
       
        [DllImport("mpusbapi.dll")]
        private static extern DWORD _MPUSBRead(void* handle, void* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds);
.
        .
        .
        #endregion
       
        static void* myOutPipe; //AHORA ES STATIC.
        static void* myInPipe; //AHORA ES STATIC.
       
        //Creo un nuevo subproceso.
        static ThreadStart clase = new ThreadStart(Work);
        static Thread subprocedimiento = new Thread(clase);

        static void Main()
        {
            //Inicializo el subprocedimiento.
            subprocedimiento.Start();

            Application.EnableVisualStyles();
            Application.Run(new PicUSB());
           
        }

        public static void OpenPipes() //AHORA ES STATIC.
        {
            DWORD selection = 0;

            myOutPipe = _MPUSBOpen(selection, vid_pid_norm, out_pipe, 0, 0);
            myInPipe = _MPUSBOpen(selection, vid_pid_norm, in_pipe, 1, 0);
        }

        public static void ClosePipes() //AHORA ES STATIC.
        {
            _MPUSBClose(myOutPipe);
            _MPUSBClose(myInPipe);
        }

//Lo q quieras hacer cuando halla llegado el mensaje
        public static void RutinaISR(byte DatoLeido)
        {
            MessageBox.Show("Aja! Encontre un dato x) \r\n" + DatoLeido.ToString());
        }

//Codigo del Subproceso:
        public static void Work()
        {
            while (true)
            {
                DWORD OcurrioInterrupcion = 0, LongitudDelDato;
                byte* BuferDeDatos = stackalloc byte[1];

                OpenPipes();
               
                OcurrioInterrupcion = _MPUSBEsperarInterrupcionYLeer(myInPipe, (void*)BuferDeDatos, 1, &LongitudDelDato);

                //Verifico si realmente es correcto si regreso con datos. Porq no regresara hasta que los tenga.
                if ((OcurrioInterrupcion == 1) && (LongitudDelDato != 0))
                {
                    RutinaISR(BuferDeDatos[0]); //Ejecuto lo q quiero hacer cuando es pase.
                }

                ClosePipes();
            }
        }
       
        public void CerarHilo()
        {
            subprocedimiento.Abort();
     
        }
    }
}
Cuando llamo a _MPUSBEsperarInterrupcionYLeer(...) el subproceso se queda dormido, yaq ReadFile devuelve ERROR_IO_PENDING y la estructura overlapped es la encargada ahora de esperar que se lea algo en el buffer de entrada del host. Esto hace que no se gasten recursos del sistema.

Y la funcion CerrarHilo, es pues, para terminar con el Thread que se esta ejecutando en segundo plano. Esto simplemente llamadola desde el evento cuando se cierra la aplicacion (PicUSB_FormClosing):
(Esto va en el PicUSB.cs)
Código: [Seleccionar]
private void PicUSB_FormClosing(object sender, FormClosingEventArgs e)
{
    usbapi.CerarHilo();
}

CCS C:
Aqui, nada. Solo envia un byte mientras el programa este abierto y lo detectara. Puede ser con un boton o lo q sea =)

Y nada mas. Decir que hay errores, y feos:
-Cuando cierro el programa, el subproceso (o mas bien dicho la DLL) sige ejecutandose en espera de algun dato, aunq le diga q cierre el hilo sige igual.
-No llega a encontrar una seria asincrona de datos enviados desde el PIC. Esto me molesta porque se supone que si se especifica en el ultimo argumento de ReadFile alguna estructura Overlapeed, es porque quieres una lectura asincrona y, como comentario, encima de esa funcion, el creador del codigo, pones: // attempt an asynchronous read operation.
-El nombre de ...YLeer(...) es por una limitacion, yaque no encontre la forma de ver antes cuantos bytes hay por lee. Pense hacerlo con ClearCommError(...) pero, como dije, esta familia de comunicacion me devuelve errores.
-Hay veces que se "autodesconecta" el dispositivo cuando intento capturar unos 10 datos enviados simultaneamente desde el pic a la PC.
-No se puede escribir, yaq el Thread esta manteniendo el handle de Read abierto y esperando :lol:
.
.
.

Si, lose. Es horrible. Pero como primer paso va bien, el programa detecta siquiera un dato y lo devuelve inmediatamente.

Por otro lado, me dijieron que para hacer tal "catch" a la interrupcion no es necesario de modifcar nada en el driver, yaq esta solo es para definir la comunicacion y esas cosas, ustedes saben... la pipe de control y eso. Y de que, es la DLL en si la q se dedica a ello.

Lo q podria ser de muy buena ayuda es, como ya dije, la funcion de la API: DeviceIoControl. Pero, hay algunos parametros que nose q especificar, yaq solo funciona para la pipe de interupcion y no reconoce el handle del bulk. Aunq encontre algunos ejemplos en la DDK que usa J1M para la instalacion de la clase y eso, donde hacen uso de esta funcion y trata, en esta misma, al usb y verificacion de alguna interrupcion (la testmcro.cpp, la funcion GetInterruptEvent (helper)). No la e visto mucho pero puede ser de gran ayuda. En si, creo q todo se torna a esta funcion pero nose que tanto se podria hacer.

Algo mas q me dijieron era usar unas funciones (o la verdad q nose q son) llamadas: BEGIN_MESSAGE_MAP y END_MESSAGE_MAP. Que sirven para rastrear algun evento en particular. Algo asi mas o menos estoy entendiendo, la verdad que es muy nuevo esto del API y sus funciones y todo, en si todo  :D

Bueno, espero q alguien mas se suba al carro porque ando solo en esto y ya me esta dando miedo  :mrgreen:


Un saludo para todos.

PD: En el archivo adjunto esta la DLL modificada y los 2 archivos (el .cpp y el .h) que tuve q agregarle la nueva funcion, esa si, la fea  :D... por si se quiere recompilar o lo q sea.

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
Re: Proyecto PicUSB
« Respuesta #304 en: 09 de Febrero de 2008, 11:04:01 »
Enhorabuena por ese pedazo análisis que le estas haciendo a la mpusbapi!!! Seguro que finalmente lograrás lo que buscas!! Eso de pelearse con los 'hilos' y demás historias de C# me da 'yuyu'! jejeje

saludos y gracias por postear tus progresos! :)

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Proyecto PicUSB
« Respuesta #305 en: 09 de Febrero de 2008, 12:22:54 »
Hola zspikes.

A que te refieres con tu propio codigo para PC? A la programacion para el programa de usuario?, porq este esta echo en VC#, c++, delphi, etc.

Y tampoco se a q te refieres con las librerias gtk.

Quisiera ayudarte pero no entiendo q es lo q quieres enrealidad.

Buenas jeremylf! Gracias por responder :)
Eso es exactamente a lo q me refiero, a un programa de usuario. Pero no olvides q uso Linux. La cosa es que la parte del código de la GUI me perdió bastante y no sé bien qué partes del código son las esenciales, osea, las que envían y reciben los datos.
Me gustaría hacer un programita de pocas líneas, que se ejecute simplemente desde la consola, se conecte, intercambie un par de datos vía USB y listo.
Espero haber sido claro, perdón si no lo fui antes. Saludos!!!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Proyecto PicUSB
« Respuesta #306 en: 09 de Febrero de 2008, 15:52:08 »
Si, tienes razon. Eso de los hilos no tenia ni idea; y C# y C++.. como q la cosa cambia, pero con su ayuda, poniendo Thread, me ayudo de mucho  :D
Gracias por el animo!  :)

zspikes, no trabajo en Linux y no sabria ayudarte en esto. Creo, que aqui postearon como hacer PicUSB en Linux. Quiza el te pueda ayudar, esta unas paginas mas arriba creo =) Intenta contactactar con el, podria ayudarte en el tema de Linux.


Salu2

Desconectado ma4826

  • PIC16
  • ***
  • Mensajes: 130
Re: Proyecto PicUSB
« Respuesta #307 en: 09 de Febrero de 2008, 18:33:45 »
Hola Zspikes,

Los archivos fundamentales para el usb son el Picusb.c y el Picusb.h.

Saludos,

Miguel Angel.


万人の友は誰の友でもない。

Desconectado SimonMG

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 172
Re: Proyecto PicUSB
« Respuesta #308 en: 09 de Febrero de 2008, 20:26:59 »
Saludos Zspikes, para linux es mejor y mucho mas versatil usar Python para interactuar con el USB, hay miles de ejemplos en internet, ademas de poder crear una interfase gtk basada en python con wxpython. Suerte
"La politica es para ahora, una ecuacion es para siempre"
Albert Einstein

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Proyecto PicUSB
« Respuesta #309 en: 09 de Febrero de 2008, 22:07:51 »
zspikes, no trabajo en Linux y no sabria ayudarte en esto. Creo, que aqui postearon como hacer PicUSB en Linux. Quiza el te pueda ayudar, esta unas paginas mas arriba creo =) Intenta contactactar con el, podria ayudarte en el tema de Linux.
Salu2
Hola Zspikes,
Los archivos fundamentales para el usb son el Picusb.c y el Picusb.h.
Saludos,
Miguel Angel.

Muchas gracias a ambos!!! Logré hacer lo q quería. Al final era agregar un "-lusb" al compilar, como bien dijo Miguel en su privado :)
Ahora voy a ver si hago una versión simplificada del programa, así otros usuarios q tengan las dudas q tuve yo se benefician de el ;)

Y ya q estamos, pregunto... el programa q va grabado en el pic, será muy dificil de hacer en ensamblador? Es q para mi proyecto me piden una parte en C y otra en ensamblador, y de principio tenia pensado programar un pic en ensamblador y sus "drivers" en C. Creo q la unica parte dificil seria la de recibir y enviar datos por USB... una vez teniendo el dato, el resto del programa es facil.

Nuevamente, muchas gracias muchachos! espero algun dia compensar todo esto y poder ayudarlos en algo :)

EDIT:
Saludos Zspikes, para linux es mejor y mucho mas versatil usar Python para interactuar con el USB, hay miles de ejemplos en internet, ademas de poder crear una interfase gtk basada en python con wxpython. Suerte
Lo sé, siempre q puedo trato de usar python, no cabe duda de q nos saca un gran peso de encima para poder dedicarnos de pleno al problema principal... pero como comentaba mas arriba, el proyecto debe contar con una parte en C y otra en ensamblador. De todos modos no descarto tu consejo para futuros proyectos ;)
saludos!!!
« Última modificación: 09 de Febrero de 2008, 22:10:31 por zspikes »

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Proyecto PicUSB
« Respuesta #310 en: 10 de Febrero de 2008, 04:12:26 »
Y ya q estamos, pregunto... el programa q va grabado en el pic, será muy dificil de hacer en ensamblador? Es q para mi proyecto me piden una parte en C y otra en ensamblador, y de principio tenia pensado programar un pic en ensamblador y sus "drivers" en C. Creo q la unica parte dificil seria la de recibir y enviar datos por USB... una vez teniendo el dato, el resto del programa es facil.
Mira que es lo que hace las funciones de envio/recibo y demas, en su respectivo archivo .c o .h, entiendelo, y luego mira tb lo q el CCS te traduce eso a assembler (en el archivo .list q te crea). Y, con eso, ya tienes todas las partes q quieres en C y/o assembler. Hasta podrias "reducir" el codigo, si sabes lo que haces claro  :D

Suerte.
Salu2.

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Proyecto PicUSB
« Respuesta #311 en: 10 de Febrero de 2008, 23:03:14 »
Gracias por el consejo jeremy ;) por ahora no cuento con el CCS porq no uso windows :( pero estoy viendo de instalarlo por lo menos en una VM, hasta q linux tenga mejor soporte con este asunto de los pic.

Mientras tanto les comento q estoy trabajando en una version de PicUSB para ejecutar en un shell unix, pero me ocurre algo muy extraño: La primera vez q se ejecuta el programa funciona bien, pero al ejecutarlo nuevamente da error. Supongo q el problema esta en q el dispositivo no se cierra como corresponde. Pero es curioso, porq tengo una version de prueba del mismo programa q funciona a la perfeccion :S alguien tiene idea de q pasa?

Adjunto ambas versiones con un LEEME que explica como compilar y los problemas
saludos!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado diogoc

  • PIC10
  • *
  • Mensajes: 3
Re: Proyecto PicUSB
« Respuesta #312 en: 13 de Febrero de 2008, 17:13:12 »
Hi!
 i like to know it it is possible receive more than one byte with usb_receive. vi in labview? i receive more than one byte but the format is an integer and i dont know how separate the bytes of an integer. ist possible to recive the data in a array?
thanks and sorry for my english

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Proyecto PicUSB
« Respuesta #313 en: 13 de Febrero de 2008, 18:03:20 »
Estimado Diogoc.
Bienvenido al foro.
Porque no posteas en tu idioma original, el portugues??
Aqui hay muchos foreros que lo hacen, y de esa forma hacemos menos esfuerzos para entendernos, ya que tu lengua es del mismo origen Latino que el español, lo que hace que haya mucho mas gente disponible para poder ayudarte. :mrgreen: :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Proyecto PicUSB
« Respuesta #314 en: 13 de Febrero de 2008, 18:23:03 »
Hi!
 i like to know it it is possible receive more than one byte with usb_receive. vi in labview? i receive more than one byte but the format is an integer and i dont know how separate the bytes of an integer. ist possible to recive the data in a array?
thanks and sorry for my english

En portugués es mejor. Em portugues é melhor.  :mrgreen:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania