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

Hola de nuevo!, gracias por la respeusta.

quizas no me exprese del todo bien. Conserve el programa en C# y use el mismo codigo, borrando todo lo que no era para el control de los 4 leds de la salida B0, B1, ...
El dispositvo no me lo reconoce y otra cosa curiosa es que tuve que cambiar el orden de los "include" ya que me tiraba error "USB_EP1_RX_SIZE" (y otras mas) diciendo que estaba fuera del rango.

¿Que podria ser? ¿Tendra que ver con la version del CCS (v 4.023) ?
¿Si uso un cristal de 20MHz cambia mucho si lo pongo o no en el codigo?

Me parece que estoy haciendo algo mal con el Project Wizard; ¿alguien tendria los archivos con el .pjt (proyecto) que le este andando??

Desde ya muchas gracias!
 
Última edición:
Al final se pudo!! :D gracias Moyano, al final era la version del ccs.

Aqui el Easy.cs que use para el proyecto (no de mi autoria, esta en el post) :

Código:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.ComponentModel;
using System.Runtime.InteropServices;

namespace MecaniqueUK
{
    class EasyHID
    {
        // HID specific...
        public const UInt32 VENDOR_ID = 6017;
        public const UInt32 PRODUCT_ID = 2000;
        public const int BUFFER_IN_SIZE = 32;
        public const int BUFFER_OUT_SIZE = 32;

        // HID events...
        private const int WM_APP = 0x8000;
        public const int WM_HID_EVENT = WM_APP + 200;
        public const int NOTIFY_PLUGGED = 0x0001;
        public const int NOTIFY_UNPLUGGED = 0x0002;
        public const int NOTIFY_CHANGED = 0x0003;
        public const int NOTIFY_READ = 0x0004;

        // HID interface...
        [DllImport("mcHID.dll")]
        public static extern bool Connect(IntPtr pHostWin);
        [DllImport("mcHID.dll")]
        public static extern bool Disconnect();
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetItem(UInt32 pIndex);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetItemCount();
        [DllImport("mcHID.dll")]
        public static extern bool Read(UInt32 pHandle, IntPtr pData);
        [DllImport("mcHID.dll")]
        private static extern bool Write(UInt32 pHandle, IntPtr pData);
        [DllImport("mcHID.dll")]
        private static extern bool ReadEx(UInt32 pVendorId, UInt32 pProductId, IntPtr pData);
        [DllImport("mcHID.dll")]
        private static extern bool WriteEx(UInt32 pVendorId, UInt32 pProductId, IntPtr pData);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetHandle(UInt32 pVendorID, UInt32 pProductId);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetVendorID(UInt32 pHandle);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetProductID(UInt32 pHandle);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetVersionID(UInt32 pHandle);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetInputReportLength(UInt32 pHandle);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetOutputReportLength(UInt32 pHandle);
        [DllImport("mcHID.dll")]
        public static extern void SetReadNotify(UInt32 pHandle, bool pValue);
        [DllImport("mcHID.dll")]
        public static extern bool IsReadNotifyEnabled(UInt32 pHandle);
        [DllImport("mcHID.dll")]
        public static extern bool IsAvailable(UInt32 pVendorId, UInt32 pProductId);

        // Managed version of the read/write functions.
        public static bool Read(UInt32 pHandle, out byte[] pData)
        {
            IntPtr unmanagedBuffer = Marshal.AllocHGlobal(BUFFER_IN_SIZE);
            bool result = Read(pHandle, unmanagedBuffer);

            try { pData = new byte[BUFFER_IN_SIZE]; Marshal.Copy(unmanagedBuffer, pData, 0, BUFFER_IN_SIZE); }
            finally { Marshal.FreeHGlobal(unmanagedBuffer); }

            return result;
        }

        public static bool Write(UInt32 pHandle, byte[] pData)
        {
            IntPtr unmanagedBuffer = Marshal.AllocHGlobal(BUFFER_OUT_SIZE);
            bool result;

            try { Marshal.Copy(pData, 0, unmanagedBuffer, BUFFER_OUT_SIZE); result = Write(pHandle, unmanagedBuffer); }
            finally { Marshal.FreeHGlobal(unmanagedBuffer); }

            return result;
        }

        }
    }


*******************
Consulta, como se puede hacer para que con un boton se prenda y apague un LED hasta que se envie otra instruccion? Alguno tiene alguna idea?

Desde ya muchas gracias!
 
Consulta, como se puede hacer para que con un boton se prenda y apague un LED hasta que se envie otra instruccion? Alguno tiene alguna idea?
Podrías dar más presiciones con respecto a esto último. No entiendo si necesitas un led que se prenda a modo de gráfico en la aplicación o que vos puedas encender un led externo desde la aplicación.
 
Hola nuevamente!

A lo que me refiero es prender una cierta secuencia de LEDS y cuando se reciba por USB otra instruccion que cambie la secuencia de encendido.

Si tuviera 2 botones en la aplicacion y uno de ellos hiciera en un bucle una secuencia como prender led1, led2, led3, apagar, y de nuevo.

Quiero que se interrumpa esta secuencia cuando recibe el otro dato. Mi problema radica en que si lo dejo en un bucle al PIC para el encendido, luego como salgo de ese estado para seguir recibiendo otros datos??

Gracias de antemano.

-----------------------------------
Hola gente!

Me surgio otra duda: ¿hay forma de acelerar el tiempo que el pic procesa los datos?

Basado en los ejemplos de este post modifique uno delos botones de la aplicacion de c# con la idea de prender varios LEDS (secuencia) y que sea lo mas rapido posible.

Código:
        private void led4_btn_Click(object sender, EventArgs e)
        {
            byte[] BufferOUT = new byte[EasyHID.BUFFER_OUT_SIZE];
            BufferOUT[0] = 0;      // Report ID
            BufferOUT[1] = 0x0A;   // Primero enviamos un comando de control al dispositivo: 

            byte i;

            for (i = 0; i < 255; i++)
            {
                BufferOUT[2] = i;
                EasyHID.Write(controlador, BufferOUT); // Envía los datos.
            }
}

El pic solo esta programado para prender los leds segun su entrada.. es decir que si mando 255 prende todos, 0 ninguno etc.

¿Ideas?


Gracias nuevamente!
 
Última edición:
Hola, gente del foro, al igual que todos he estado siguiendo ésta tematica, sin embargo, estoy probando en una aplicación hecha por un servidor mi problema es que curiosamente al enviar un bloque de varios Bytes del host al PIC, en el byte numero 18, los datos se truncan, en el siguiente bloque lo mismo, hasta que en un tiempo la aplicación se detiene por un error(curiosamente en el Byte #18) me dice: "El dispositivo no funciona".
pluginta.png
 
Muy buenos días, he estado siguiendo el tema y gracias a todos sus aportes y la dedicación de Moyano tengo una mejor idea de como usar el modulo usb de los pic 18, quiero preguntarles si alguno de usted ha realizado una conexión usb a un dispositivo móvil, ya que debo hacer una tarjeta de muestreo que pueda conectarse a un dispositivo móvil con SO ANDROID desde la versión 2.3 a la 4 y este debe tener la interfaz de visualización, pero estoy confundido en que tipo de comunicación debería realizarse si HID o BULK? ademas de como programar la interfaz en ANDROID, saludos y muchas gracias por cualquier aporte.
 
Maestro Moyamano...

y en general a todos los compañeros del foro, queria preguntarle si alguno ya instalo el driver cdc en win 8 y si alquien ya lo realizo me podria decir uqeu hiso gracias....
 
Amigo acj8991.
Primero que todo, no me le ponga apodos al amigo Moyano :D, que es muy buena gente.
Ahora si en serio, ya probe este driver en windows 8 de mi portatil y no funciono.:unsure:
 
amigo moyano, saludes desde colombia, te cuento, estoy trabajando en un proyecto de grado en el cual creo que tu podrias ayudarme con tu conocimiento para poder comenzar a desarrollarlo, el proyecto lo he dividido en etapas, y no he podido comenzar por que no conosco mucho de la primera etapa por no decir que nada pero por lo visto en estos foros tu si, puedo contar con tu ayuda?? existe algun medio de comunicacion mas continuo??
 
Hola como estás.

Si es tu proyecto de grado podrías empezar por deducir que es lo que necesitas hacer con el mismo. Luego dividir en etapas el desarrollo.
Si alguna de las etapas tiene conectividad USB, en este hilo podrás poner tus dudas al respecto y ver como las podemos solucionar entre todos.

Saludos !
 
Cordiales saludos a todos………
Acudo a Uds. Con la firme convicción de contar con su ayuda en un problema en el que me encuentro el cual paso a describir a continuación:
Estoy desarrollando un proyecto con comunicación USB, para ello estoy empleando el PIC18F2550 que es el encargado de recibir y enviar datos desde y hacia la PC por medio del bus USB clase CDC, cuento con una tarjeta de proceso en la cual dispongo de un XMEGA de ATMEL el mismo que recibe y envía datos desde y hacia el PIC18F2550 por medio de comunicación serial RS-232, en la transmisión de datos en el sentido PC->PIC18F2550->XMEGA no tengo inconvenientes, el problema surge cuando quiero enviar los datos resultados del proceso en el sentido XMEGA->PIC18F2550->PC, ya que en el PIC he intentado recibir los datos por medio de la interrupción INT_RDA(Interrupción del puerto USART); pero dicha interrupción no se produce ya que al compilar el programa del PIC los warnings indican que las interrupciones se encuentran deshabilitadas, también he intentado recibir los datos de la comunicación serial sin utilizar la interrupción es decir directamente en la función MAIN() con la instrucción FGETS(DATOS) pero ocurre que se pierde la comunicación USB y el programa se queda como estancado en alguna de las librerías incluidas, porque no se ejecuta ni esta instrucción FGETS(DATOS).
He probado por separado la comunicación USB PIC18F2550<->PC y la comunicación XMEGA<->PIC18F2550 y funciona de maravilla.
Compilador: PCWHD Lenguaje: CCS
Librerías incluidas:
#INCLUDE <PIC18_USB.H>
#INCLUDE <USB.C>
Warnings al compilar el programa del PIC:
Interrupts disabled during call to prevent re-entrancy: (usb_token_reset)
Interrupts disabled during call to prevent re-entrancy: (usb_flush_out)
Interrupts disabled during call to prevent re-entrancy: (usb_flush_in)

Puede ser que el USB CDC al crear un Puerto serie virtual, ello puede estar interfiriendo en la comunicación serial. Por fa si me pueden echar una mano con este asunto……..de antemano muchas gracias.
 
Buenas tardes a todos, soy nuevo y estoy probando la comunicación USB del PIC18F4550.
Utilicé el código de que les mostraré a continuación, pero cuando conecto el PIC al PC se genera un error en la Instalación.

El mensaje del error es el siguiente:
"Se encontró software del controlador de Windows del dispositivo, pero se produjo un error al intentar instalarlo.
El sistema no encontró controladores del archivo especificado.
Si sabe quién fabricó el dispositivo, busque información acerca del software del controlador en la sección de soporte técnico del sitio web del fabricante."

El sistema operativo es Windows 7
Este mensaje me da cuando manualmente doy una ruta que es la del CCS que está en la carpeta Picc\Drivers

Porque cuando doy alguna otra ruta me dice que el controlador no se encontró.

De antemano muchas gracias por su pronta respuesta.

Código:
#include <18F4550.h> // Definición de Registros Internos.
#fuses HSPLL, NOMCLR, NOWDT, NOPROTECT, NOLVP, NODEBUG, USBDIV, PLL5, CPUDIV1, VREGEN, NOPBADEN
#use delay (clock = 20000000) // Frecuencia Máxima de Trabajo
#include <usb_cdc.h> // Descripción de Funciones del USB
#include <usb_desc_cdc.h> // Descriptores del Dispositivo USB.

void main () {
set_tris_b (0x00);
output_b (0x00);
usb_cdc_init (); // Configuramos al puerto virtual.
usb_init (); // Inicializamos el stack USB.
output_high (PIN_B0); // LED ROJO ENCENDIDO
output_low (PIN_B1); // LED VERDE Apagado

while (! usb_cdc_connected ()) {} // Espera un DETECTAR Una transmission de la PC (. Set_Line_Coding)
do {usb_task (); 
if (usb_enumerated ()) {// Espera una cola el Dispositivo porción enumerado mar el host.
output_low (PIN_B0); // LED ROJO Apagado
output_high (PIN_B1); // LED VERDE ENCENDIDO
if (usb_cdc_kbhit ()) {// En espera de Nuevos Caracteres en el búfer de recepción ¿.
if (usb_cdc_getc () == 'x') {// llego x?
printf (usb_cdc_putc ". llego x \n \r");}
if (usb_cdc_getc () == 'a') {// llego a?
printf (usb_cdc_putc, "llego a \n \r.");
}
}
}
}
while (TRUE);
}
 
Última edición por un moderador:
primero que todo felicitaciones por el foro esta excelente y me ha servido mucho Quisiera saber como hago para apagar las salidas del pic por medio de vb.net , ya que genero una secuencia y cuando esta termina me queda encendida alguna salida, como hago entonces para que por medio de codigo las pueda apagar la salida que quedo encendida o sea que el apague la salida o salidas que quedo encendida.
 
primero que todo felicitaciones por el foro esta excelente y me ha servido mucho Quisiera saber como hago para apagar las salidas del pic por medio de vb.net , ya que genero una secuencia y cuando esta termina me queda encendida alguna salida, como hago entonces para que por medio de codigo las pueda apagar la salida que quedo encendida o sea que el apague la salida o salidas que quedo encendida.

Ya tenes un código que se pueda ver? Que tipo de comunicación usas? Si es HID quizás tenga una respuesta :p.


Sino puedes apagar todas las salidas al recibir un comando desde VB net. Ej: si los puertos utilizados son el B, entonces podrias apagarlos a todos con la siguiente funcion:

output_b(0);​

(la funcion es para CCS compiler).
 
Buenas a todos!
Tengo un aparato que funciona con un PIC16F877 que se comunica con un PC mediante un puerto serie. Quería "modernizar" este aparato y hacer la comunicación mediante USB en lugar de con puerto serie. ¿Alguien puede orientarme sobre cómo empezar?
 
Claro que si fifiolo :), la ayuda ya la tienes en este foro, solo debes leer con calma y paciencia desde el principio...

Saludos :apreton: amigo

Buenas a todos!
Tengo un aparato que funciona con un PIC16F877 que se comunica con un PC mediante un puerto serie. Quería "modernizar" este aparato y hacer la comunicación mediante USB en lugar de con puerto serie. ¿Alguien puede orientarme sobre cómo empezar?
 
Hola buen dia a todos, como andan?, hace poco empece con esto de pic-usb, ya que aprendi algo de java y me mire un par de tutoriales, pero resulta que no puedo simular la conexión del usb, para mi el problema esta en el VID/PID, cuando ejecuto la simulación(Proteus 8) la pc reconoce el nuevo dispositivo, pero al querer instalar el driver no lo encuentra, al fijarme los detalles del controlador aparece que no encontró el controlador, al ir a la ventana de detalles me fijo el Id de hardware y me pone

USB\Vid_0000&Pid_0000&Rev_0000
USB\VID_0000&PID_0000,

cuando en la compilación del programa para el pic el vid/pid esta puesto:

USB_MAX_EP0_PACKET_LENGTH, //max packet size for endpoint 0. (SLOW SPEED SPECIFIES 8)
0:LOL:8,0x04, //vendor id (0x04D8 is Microchip)
0x0B,0x00, //product id

Así que me parece que se me esta pasando algo por alto.... resulta que al modificar el driver de:

[DeviceList]
%DESCRIPTION%=DriverInstall, USB\VID_04D8&PID_000B

a

[DeviceList]
%DESCRIPTION%=DriverInstall, USB\VID_0000&PID_0000

y ahi reconoce el driver, lo instala, en java uso la libreria jpicUSB con la dll correspondiente, la carga todo bien, pero al ejecutar iface.GetDeviceCount("vid/pid") que es para que devuelva la cantidad de dispositivos que coinciden con el vid/pid, me devuelve 0, asi que instalar el driver con vid_0000&pid_0000 no es la forma correcta.

no se que mas decirles, espero que alguien me pueda ayudar con este problema, de ultima lo que no funciona es simularlo en proteus... muchas gracias, Saludos :)
 
Hola a todos!!!
Quisiera saber si alguien a realizado la comunicación USB con algún dispositivo utilizando mikroC y Visual C# ó Visual Basic, para que intercambiemos información.
Muchas gracias.:)
 
Atrás
Arriba