Control de dispositivos a través del módulo USB del PIC18F45/2550

Waho, logre hacer funcionar el mocosoft vs2008 y no era por la instalación del office, ademas, tambien tengo funcionando el vb6 en W7 ultimate reconociendo incluso OCX's de terceros, ya estaba bastante molesto por el tema.
Gracias por contestar jona

Cordiales Saludos.
HFA
 
Última edición:
hola amigos del foro tengo una duda en caso de descriptor me dice que en ccs debo modificar el vis/pid entonces lo uqe encuentro en algunos probleas es asi: 08,0X0X04 EN VID SERA IGUAL QUE 08XD8,0X04 POR FAVOR EXPLIQUEN CUAL SERIA LO CORRECTO;
el otro es al instalar el drivers al momneto de conectar el pic18xx no instala para nada utilizo sistema operativo windows 7 o como instalo el driver ya lo intente por hdwwiz y nda gracias por su respuestas
 
Colegas necesito una gran ayuda..!!!! Estoy intentando hacer una interfaz USB.. pude lograr la conectividad y el reconocimieneto del hardware con windows 7 pero ahora mi objetivo es establecer una conexion con MATLAB.. he probado muchos programas.. y al compilarlo con matlab me salta este error:

??? Error using ==> loadlibrary at 279
Microsoft Visual C++ 2005 or 2008 is required to use this feature.

Error in ==> usb at 22
loadlibrary mpusbapi _mpusbapi.h alias libreria

.. he guardado las librerias donde corresponde.. y el Microsoft Visual C++ 2005 or 2008 los tengo.. me parece q es un problema de compatibilidad con windows 7.. pero no le encuentro solución.. si alguien sabe cual es se lo re agradeceria.

Saludos
 
Última edición:
bueno es interesante la comunicacion usb - matlab yo hace pocos dias logre la comunicacion usb matlab con pic18f4550 mi objetivo fue procesamiento de imagen por matlab via usb y lo logre pero tuve que pasarme noches y noches ... al respecto tu pregunta::::::::: estas seguro que los archivos _mpusbapi.h y mpusbapi.dll estan en tu directorio de trabajo de matlab?¿? si no esta alli te muestra el herror como te lo aparece tiene k estar en el mismo archivo las librerias mensionados haber si pruebas eso salu2 para alguna consulta sigue escribiendo :apreton:



la compatibilidad nada tiene k ver igual yo tengo so windows 7

descargate de aqui::: http://www.mathworks.com/matlabcent...e-matlab-y-pic-de-microchip-usando-puerto-usb
luego tu haces tus modificaciones de acuerdo a tu nescesidad
ç



en caso tu problemna no lo esta cargando el:::loadlibrary mpusbapi _mpusbapi.h alias libreria

eso es tu problema ahora de esa paginba te lo descargas y pruebalo
 
Última edición:
emersonmayon gracias por contestar, sisi estoy mas que seguro que los archivos _mpusbapi.h y mpusbapi.dll están donde deben estar.. o sea.. los puse en la misma carpeta q tengo el archivo.m (usb.m) de matlab.. y los archivos necesarios para realizar la interfaz usb justamente los baje de sea pagina q me pasaste.. asiq ya no tengo idea de q puede estar pasando.. :S.. cabe aclarar q he probado distintos programas en matlab sacados d la web y todos me tiran ese mismo error..



Corrijo lo anteriormente dicho.. lo he pegado en el directorio de trabajo C:\Program Files\MATLAB\R2010b\bin y por si acaso ya lo he pegado en todos lados... en todas las carpetas donde tengo los archivos.m y sigue sin funcionar.. je :S
 
Última edición:
Buenas, espero que alguno pueda ayudarme, estoy intentando hacer transferencia bulk HID entre un 18f4550 y C#. Me he estado ayudando del programa que Moyano Jonathan que esta en el primer post, de la pagina de http://picmania.garcia-cuervo.net/usb_2_hidtransfers.php y otros sitios que he encontrado.

Estoy intentando utilizar la la mpusbapi.dll que ofrece microchip de manera gratuita y segun creo he entendido bien el funcionamiento de la misma y su integracion con windows. El pic lo estoy programando en CCS.

Mi problema es el siguiente, cuando ejecuto la aplicacion de C#, tenga o no el hardware conectado el visual C# me entrega el error que muestra la imagen.


Ya intenteinstalando las librerias de microchip actualizadas y el error persiste.

Este es el codigo del archivo de la api. Esta practicamente como lo encontre solo he hecho unas pequeñas modificaciones
Código:
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Runtime.InteropServices; // Clase para importar DLL

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




namespace AppUSBv1
{
    unsafe public class PicUSBAPI
    {
        #region Definición de los Strings: EndPoint y VID_PID
        string vid_pid_norm = "vid_04d8&pid_000B";

        string out_pipe = "\\MCHP_EP1";
        string in_pipe = "\\MCHP_EP1";
        #endregion

        #region Funciones importadas de la DLL: mpusbapi.dll
        [DllImport("mpusbapi.dll")]
        private static extern DWORD _MPUSBGetDLLVersion();
        [DllImport("mpusbapi.dll")]
        private static extern DWORD _MPUSBGetDeviceCount(string pVID_PID);
        [DllImport("mpusbapi.dll")]
        private static extern void* _MPUSBOpen(DWORD instance, string pVID_PID, string pEP, DWORD dwDir, DWORD dwReserved);
        [DllImport("mpusbapi.dll")]
        private static extern DWORD _MPUSBRead(void* handle, void* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds);
        [DllImport("mpusbapi.dll")]
        private static extern DWORD _MPUSBWrite(void* handle, void* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds);
        [DllImport("mpusbapi.dll")]
        private static extern DWORD _MPUSBReadInt(void* handle, DWORD* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds);
        [DllImport("mpusbapi.dll")]
        private static extern bool _MPUSBClose(void* handle);
        #endregion

        void* myOutPipe;
        void* myInPipe;

        /*static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new AppUSBv1());
        }*/

        public void OpenPipes()
        {
            DWORD selection = 0;

            myOutPipe = _MPUSBOpen(selection, vid_pid_norm, out_pipe, 0, 0);
            myInPipe = _MPUSBOpen(selection, vid_pid_norm, in_pipe, 1, 0);
        }
        public void ClosePipes()
        {
            _MPUSBClose(myOutPipe);
            _MPUSBClose(myInPipe);
        }
        private void SendPacket(byte* SendData, DWORD SendLength)
        {
            uint SendDelay = 1000;

            DWORD SentDataLength;

            OpenPipes();
            _MPUSBWrite(myOutPipe, (void*)SendData, SendLength, &SentDataLength, SendDelay);
            ClosePipes();
        }
        private void ReceivePacket(byte* ReceiveData, DWORD *ReceiveLength)
		{
			uint ReceiveDelay=1000;

			DWORD ExpectedReceiveLength = *ReceiveLength;

			OpenPipes();
            _MPUSBRead(myInPipe, (void*)ReceiveData, ExpectedReceiveLength, ReceiveLength, ReceiveDelay);
            ClosePipes();
        }

/*        public void SumaPIC(uint sumando1, uint sumando2)
        {
            byte* send_buf = stackalloc byte[3];
            
            send_buf[0] = 0x00;             // Código de Entrada a Modo_Suma
            send_buf[1] = (byte)sumando1;
            send_buf[2] = (byte)sumando2;
            SendPacket(send_buf, 3);
        }
*/
/*        public uint ResultadoPIC()
        {
            uint result = 0;
            byte* receive_buf = stackalloc byte[1];

            DWORD RecvLength = 1;

            ReceivePacket(receive_buf, &RecvLength);
            result = receive_buf[0];

            return result;
        }
*/        
/*        public void LedPIC(uint led)
        {
            byte* send_buf = stackalloc byte[2];

            send_buf[0] = 0x01;             // Código de Entrada a Modo_Led
            send_buf[1] = (byte)led;    
            SendPacket(send_buf, 2);
        }
*/
        public void Enviar(byte led1)
        {
            byte* send_buf = stackalloc byte[2];

            send_buf[0] = led1; //Notifica al pic que ha de modificar puerto B
            //send_buf[1] = salida; //Dato a sacar por puerto B
            SendPacket(send_buf, 2); //Envío 2 bytes de información
        }
    }
}


GRACIAS DE ANTEMANO
 

Adjuntos

  • Error.png
    Error.png
    171.6 KB · Visitas: 50
Última edición:
Gracias Mnicolau, le voy a hechar un ojo.

En lo que tenga avances del proyecto en el que estoy trabajando iré posteando información, estoy haciendo el sistema de control realimentado de un brazo robótico autonomo y el control y programación va a ser por medio del USB y una aplicacion en C#

==========================================================================

Amigos la verdad no se que pueda estas sucediendo, no se si sea porque estoy utilizando la version gratuita de c# o que, pero el codigo que compartio el amigo Mnicolau esta exactamente igual al mio y entrega el mismo error....

Alguna idea??????
:S
 
Última edición:
:cool: Hola a todos.

Bueno siguiendo con el tema de mpusbapi.dll, veremos como utilizar las funciones usb_put_packet() y usb_get_packet(). Las cuales permiten enviar datos por el usb o recibir datos.
Bien una descripción breve de las mismas es la siguiente:
Código:
usb_put_packet(endpoint,*ptr,len,toggle) // Función completa

Vamos a ver lo que está dentro del parentesis:

1 - endpoint: Buffer de entrada o de salida (son unidireccionales) // Ya lo explique post atrás.
2 - *prt : apunta a la dirección del dato a enviar (es una variable declarada por nosotros).
3 - len: es el tamaño del paquete en bytes. (hasta 64 max)
4 - toggle:  En la parte de transmisión de datos USB, los paquetes de datos se encuentran en grupos de paquetes de datos, y dentro de estos, existen unos llamados DATA0, DATA1. hay un proceso llamado sincronización del data toggle. a grandes rasgos esto no es mas que un método de validación de paquetes, y lo que hace es enviar alternadamente a DATA0 y DATA1 en una secuencia seguido de su ACK respectivo. todo con el objetivo de mantener la sincronización transmisor <-> receptor. ver fig 1 y 2

Sumario de la función: Esta función manda un paquete de datos hacia el host, el tamaño de los paquetes de datos hay que definirlos en el programa.

por ejemplo:

#define USB_EP1_TX_SIZE    1             //  Tamaño del buffer de salida.
#define USB_EP1_RX_SIZE    3             //  Tamaño del buffer de entrada.

Buenos dias soy nuevo en el foro le queria hacer una consulta tengo una aplicacion q me manda datos de mi pic a mi pc por usb en forma correcta, mi duda es si quiero enviar este dato en un intervalo de tiempo el buffer cuando envia se limpia solo hoy hay q limpiar el buffer antes de q se llene? Como se limpia el buffer
 
Buenos dias soy nuevo en el foro le queria hacer una consulta tengo una aplicacion q me manda datos de mi pic a mi pc por usb en forma correcta, mi duda es si quiero enviar este dato en un intervalo de tiempo el buffer cuando envia se limpia solo hoy hay q limpiar el buffer antes de q se llene? Como se limpia el buffer

El buffer del PIC, automáticamente se refresca en caso de que estés enviando por ejemplo el valor de un conversor AD, no hace falta limpiar al buffer. Ahora si querés hacer pruebas, en el driver de CCS, está la función
Código:
usb_flush_out(int8 endpoint, USB_DTS_BIT tgl)

Yo nunca la he usado, pero la función existe en la librería usb_pic18.c y la documentación en usb_pic18.h

Saludos !
 
Hola a todos,

Después de leer 103 paginas (ahora si las leí todas :LOL:), para ver si alguien se le había ocurrido lo mismo que a mi, vi que en efecto en este foro todavía no sucede.
Moyano y meta (Que son los nombres que mas he identificado desde el comienzo del tema), les agradezco muchísimo todo lo que han hecho por esta comunidad y gracias a ustedes pude entender y hacer funcionar un proyecto de comunicación PIC USB por HID. Adecue mi proyecto para que utilizara todos los puertos libres y controlar luces, detectores de movimiento, detectores de humo y aires acondicionados de un lugar.
Después de realizar con éxito lo anterior, me di a la tarea de agregar un poco de código a mi aplicación en Visual C# 2010 para que pudiera ver en la misma Form una cámara web.
El hecho es que cuando doy click en "conectar dispositivo" y despues quiero iniciar la cámara web la aplicación me manda un error que dice lo siguiente:
"vshost.32.exe dejó de funcionar"
y le doy en detalles y me aparece lo siguiente


Nombre del evento de problema: APPCRASH
Nombre de la aplicación: Prueba4IMAG.vshost.exe
Versión de la aplicación: 10.0.30319.1
Marca de tiempo de la aplicación: 4ba2084b
Nombre del módulo con errores: ntdll.dll
Versión del módulo con errores: 6.1.7601.17725
Marca de tiempo del módulo con errores: 4ec49b8f
Código de excepción: c0000005
Desplazamiento de excepción: 0003259a
Versión del sistema operativo: 6.1.7601.2.1.0.768.3
Id. de configuración regional: 2058
Información adicional 1: e8ad
Información adicional 2: e8adce1c2b9e7be834b4063ac3c53863
Información adicional 3: e8ad
Información adicional 4: e8adce1c2b9e7be834b4063ac3c53863

Cabe mencionar que estoy trabajando con NET.Framework4
Y volví a realizar la aplicación desde cero ahora con Framwork 3.5, me vuelve a cerrar la aplicación, pero ahora nada mas cambia el .exe que deja de funciar

Vshost32.clr2.exe dejó de funcionar.

Espero que alguien tenga conocimiento de esto, ya que no puedo ocupar las dos aplicaciones al mismo tiempo, ese error solo me lo da cuando las quiero correr las dos al mismo tiempo, es decir, cuando conecto el dispositivo y le doy click a "Iniciar" en la parte de la cámara web.

Gracias a todos por sus comentarios y nuevamente agradezco que compartan sus conocimientos de esta manera. En cuanto termine mi proyecto yo también lo quisiera compartir.
 
TE TRAIGO UN RETO AMIGO MOYANO, AS TRATADO DE HACER COMUNICACION INALAMBRICA DE UN 18F4550 A 16F877A, me pidieron este proyecto para un curso en la universidad, la mentablemente falle en el intento y tuve ke hacerlo con dos de gama media, pruebalo tu que tienes mas experiencia trabajando con los de gama alta. SUERTE Y gracias por todos tus trabajo e aprendido bastante.
 
pruebalo tu que tienes mas experiencia trabajando con los de gama alta. SUERTE Y gracias por todos tus trabajo e aprendido bastante.

Disculpame, si necesitás que yo te arme la comunicación inalámbrica, lo puedo hacer sin problemas; por supuesto tiene su precio.
Ahora si necesitas que alguien te ayude en tu proyecto, también lo podemos hacer sin problemas pero vas a tener que tener en cuenta 2 cosas:

1 - Crear un hilo propio ya que estás haciendo la pregunta en un hilo donde manejamos comunicaciones USB (alámbricas).
2 - Incentivar a que te ayudemos proponiendo vos primero una idea de proyecto, montaje inicial y pruebas para que nosotros podamos partir de una base más sólida y brindar una respuesta más adecuada.

Saludos !
 
Buenas tardes, Moyano Jonathan

e estudiado este hilo sobre la comunicacion usb y el pic18f2550, la verdad es que mis respetos hacia ti
ya que poco a poco fuiste creciendo en informacion.
Pudieras subir algun proyecto reciente tuyo, que sea bidireccional entre visual basic 6 y pic18f2550 en comunicacion USB HID, por ejemplo 4 datos entrantes y 4 salientes o algo parecido, al ver el codigo ya lo podria adecuar a mi necesidad, de ante mano muchas gracias por toda tu ayuda.
 
Hola a todos,

No he visto si tienen esto en el foro pero espero que sea mi aportación.

La conexión en MAC es mas facil realizarla con HID porque si no se hace así la programación se complica, y si que se complica, existe en la pagina http://www.signal11.us/oss/hidapi/hidapi/doxygen/html/index.html una librería que facilita la conexión.

Este es el programa que yo hice de ejemplo, es solo un contador y una entrada analógica y para la salida son digitales por el puerto B, el programa esta echo en xcode. Espero que les sirva de algo.
 

Adjuntos

  • firmware.zip
    41.1 KB · Visitas: 68
  • Conexion_mac.zip
    121.1 KB · Visitas: 77
Buenas amigos, como ya han visto anteriormente, estoy trabajando en un proyecto, el cual es un poco complejo... en lo que tenga avances relevantes postearé por aquí o no se si cree un hilo nuevo. La ayuda de Moyano Jonathan y de META ha sido inmensa gracias a los codigos y la información que han compartido.

Por el momento solucione la comunicación, aunque con respecto a eso voy a seguir trabajando mas adelante.

Ahora tengo otro pequeño detalle, el proyecto en el que estoy trabajando deberá funcionar sin necesidad de estar conectado al puerto usb, en CCS estoy inicializando con la respectiva funcion usb_init_cs(), por la información que he encontrado en diferentes post el micro tiene por medio del sense pin detectar dicha conexión

Haciendo una simple funcion para encender un led led cuando el pic este conectado usando este código

if(usb_enumerated()){
output_high(PIN_C6);
}else{
output_low(PIN_C6);
}

pero si desconecto el puerto USB el micro no apaga el pin, es decir, según entiendo el mismo queda enumerado, he intentado con información de varias fuentes y nada, eso si, apenas vuelvo a conectar, observo como el led se apaga y vuelve a encender, es decir, pierde la enumeracion y la vuelve a obtener.

La pregunta es como puedo hacer que esto funcione, porque me preocupa el hecho de que al desconectar el micro del PC, no haga el cambio a las rutinas que necesito.

Gracias de antemano...
 
Atrás
Arriba