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

¿Qué archivo hay que grabarle al pic? APLICACION_HID.hex de la carpeta "Aplicación USB CCS" o Detección del HOST_CDC.hex del ejercicio_n2??

Otra cosa, le puse de firmware el del ejercicio 2 y si prende con el de conexion en caliente pero con el de USB HID no detecta que el dispositivo esta conectado, alguna idea de por que no manda nada :'(

Una cosa mas, el VID de mi pic es 04d8 y el PID es 000B
lo pase a decimal y me salio VID 1240 y PID 11
cambie de easyHID.cs:
public const UInt32 VENDOR_ID = 6017;
public const UInt32 PRODUCT_ID = 200;
por:
public const UInt32 VENDOR_ID = 1240;
public const UInt32 PRODUCT_ID = 11;
para ver si asi funcionaba, pero aun asi no detecta el dispositivo, mira te dejo mi codigo:
Código:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Diagnostics;             //Mensajes referentes a advertencias, errores, etc.
using System.Windows.Forms;
using System.Runtime.InteropServices; //Clase para poder comunicarnos con el dll.
using MecaniqueUK;

namespace Visual_C_sharp__HID_Demo
{
    public partial class USB_HID : Form
    {//Variables globales declaradas por el usuario
        UInt32 controlador;
        UInt32 ADCValue1;
        UInt32 ADCValue2;
        public USB_HID()
        {
            InitializeComponent();
        }
        protected override void WndProc(ref Message message)
        {
            //Interceptamos los mensajes de windows.
            if (message.Msg == EasyHID.WM_HID_EVENT) //Si ha ocurrido algún evento...
            { //Intercepta el mensaje y opera segun el valor recibido...	
                switch (message.WParam.ToInt32())
                {
                    case EasyHID.NOTIFY_PLUGGED:
                        //Se ha conectado un dispositivo.
                        Dispositivo_Conectado((UInt32)message.LParam.ToInt32());
                        break;
                    case EasyHID.NOTIFY_UNPLUGGED:
                        //Se ha desconectado un dispositivo.
                        Dispositivo_Desconectado((UInt32)message.LParam.ToInt32());
                        break;
                    case EasyHID.NOTIFY_READ:
                        //Hay datos en el buffer de entrada.
                        Lee_Dispositivo((UInt32)message.LParam.ToInt32());
                        break;
                }
            }
            base.WndProc(ref message);
        }
        private void Dispositivo_Conectado(UInt32 handle)
        {
            if (EasyHID.GetVendorID(handle) == EasyHID.VENDOR_ID && EasyHID.GetProductID(handle) == EasyHID.PRODUCT_ID)
            {
                //Si el handler ha encontrado un dispositivo conectado que coincida con el VID/PID
                //Declarado en el programa...
                EasyHID.SetReadNotify(handle, true); //Activa el sistema de notificacion para saber
                //cuando se reciben datos desde el dispositivo.

                controlador = handle;                //Asignamos a controlador el handle de salida.
            }
        }
        private void Dispositivo_Desconectado(UInt32 handle)
        {
            if (EasyHID.GetVendorID(handle) == EasyHID.VENDOR_ID && EasyHID.GetProductID(handle) == EasyHID.PRODUCT_ID)
            {
                deshabilita_controles();
                MENSAJES_USB.Items.Add("Dispositivo USB Desconectado.");
                CONECTAR_DISPOSITIVO.BackColor = Color.Red;
                CONECTAR_DISPOSITIVO.ForeColor = Color.White;
                CONECTAR_DISPOSITIVO.Text = "CONECTAR DISPOSITIVO";
                EasyHID.Disconnect();
            }
        }
        private void Lee_Dispositivo(UInt32 In_handle)
        {
            byte[] BufferINP = new byte[EasyHID.BUFFER_IN_SIZE]; //Declaramos el buffer de entrada.
            if ((EasyHID.Read(In_handle, out BufferINP)) == true) //Si hay datos los procesamos.
            {  //Segun se haya presionado un pulsador, indicara el evento de forma grafica y textual.
                if (BufferINP[1] == 0x01)
                {
                    IN_DIGITAL_1.BackColor = Color.GreenYellow;
                    MENSAJES_USB.Items.Add("Boton 1 Presionado.");
                }
                else { IN_DIGITAL_1.BackColor = Color.SeaGreen; }

                if (BufferINP[2] == 0x01)
                {
                    IN_DIGITAL_2.BackColor = Color.GreenYellow;
                    MENSAJES_USB.Items.Add("Boton 2 Presionado.");
                }
                else { IN_DIGITAL_2.BackColor = Color.SeaGreen; }

                if (BufferINP[3] == 0x01)
                {
                    IN_DIGITAL_3.BackColor = Color.GreenYellow;
                    MENSAJES_USB.Items.Add("Boton 3 Presionado.");
                }
                else { IN_DIGITAL_3.BackColor = Color.SeaGreen; }

                if (BufferINP[4] == 0x01)
                {
                    IN_DIGITAL_4.BackColor = Color.GreenYellow;
                    MENSAJES_USB.Items.Add("Boton 4 Presionado.");
                }
                else { IN_DIGITAL_4.BackColor = Color.SeaGreen; }
            }
            ADCValue1 = (uint)(BufferINP[5] << 8 + BufferINP[6]);
            ADCValue2 = (uint)(BufferINP[7] << 8 + BufferINP[8]);
            ADC1_VALUE.Value = (int)ADCValue1;
            ADC2_VALUE.Value = (int)ADCValue2;
        }
        private void CONECTAR_DISPOSITIVO_Click(object sender, EventArgs e)
        {
            habilita_controles();
            try
            {
                EasyHID.Connect(Handle); //conectamos la aplicacion al controlador
                if (EasyHID.IsAvailable(EasyHID.VENDOR_ID, EasyHID.PRODUCT_ID) == true)
                { //Si el dispositivo está conectado
                    MENSAJES_USB.Items.Add("Dispositivo conectado.");
                    CONECTAR_DISPOSITIVO.Text = "DISPOSITIVO CONECTADO";
                    CONECTAR_DISPOSITIVO.BackColor = Color.GreenYellow;
                    CONECTAR_DISPOSITIVO.ForeColor = Color.Black;
                }
                else
                {
                    MENSAJES_USB.Items.Add("Dispositivo no encontrado, controlador conectado.");
                    CONECTAR_DISPOSITIVO.Text = "CONTROLADOR CONECTADO";
                    CONECTAR_DISPOSITIVO.BackColor = Color.Blue;
                    CONECTAR_DISPOSITIVO.ForeColor = Color.White;
                }
            }//En caso de no poder enlazar al controlador
            catch { MENSAJES_USB.Items.Add("Imposible conectar al controlador."); }

        }
        private void OUT_DIGITAL_1_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.
            //0x0A Conando de Salidas.
            BufferOUT[2] = 0x10; //Luego enviamos los datos de control de los LEDs.
            EasyHID.Write(controlador, BufferOUT); //Envia los datos.
            MENSAJES_USB.Items.Add("Cambia estado: Salida 1.");
        }
        private void OUT_DIGITAL_2_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.
            //0x0A Conando de Salidas.
            BufferOUT[2] = 0x20; //Luego enviamos los datos de control de los LEDs.
            EasyHID.Write(controlador, BufferOUT); //Envia los datos.
            MENSAJES_USB.Items.Add("Cambia estado: Salida 2.");
        }
        private void OUT_DIGITAL_3_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.
            //0x0A Comando de Salidas.
            BufferOUT[2] = 0x30; //Luego enviamos los datos de control de los LEDs.
            EasyHID.Write(controlador, BufferOUT); //Envia los datos.
            MENSAJES_USB.Items.Add("Cambia estado: Salida 3.");
        }
        private void OUT_DIGITAL_4_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.
            //0x0A Comando de Salidas.
            BufferOUT[2] = 0x40; //Luego enviamos los datos de control de los LEDs.
            EasyHID.Write(controlador, BufferOUT); //Envia los datos.
            MENSAJES_USB.Items.Add("Cambia estado: Salida 4.");
        }
        private void PWM_CONTROL_1_ValueChanged(object sender, EventArgs e)
        {
            byte[] BufferOUT = new byte[EasyHID.BUFFER_OUT_SIZE];
            BufferOUT[0] = 0;    //Report ID
            BufferOUT[1] = 0x0B; //Primero enviamos un comando de control al dispositivo.
            //0x0B Comando de Salidas.
            BufferOUT[3] = Convert.ToByte(PWM_CONTROL_1.Value);
            EasyHID.Write(controlador, BufferOUT);
        }
        private void PWM_CONTROL_2_ValueChanged(object sender, EventArgs e)
        {
            byte[] BufferOUT = new byte[EasyHID.BUFFER_OUT_SIZE];
            BufferOUT[0] = 0;    //Report ID
            BufferOUT[1] = 0x0C; //Primero enviamos un comando de control al dispositivo.
            //0x0C Comando de Salidas.
            BufferOUT[4] = Convert.ToByte(PWM_CONTROL_2.Value);
            EasyHID.Write(controlador, BufferOUT);
        }
        private void USB_HID_Load(object sender, EventArgs e)
        {
            timer1.Enabled = true;
            deshabilita_controles();
        }
        private void USB_HID_FormClosed(object sender, FormClosedEventArgs e)
        {
            EasyHID.Disconnect();
        }
        private void habilita_controles()
        {
            OUT_DIGITAL_1.Enabled = true;
            OUT_DIGITAL_2.Enabled = true;
            OUT_DIGITAL_3.Enabled = true;
            OUT_DIGITAL_4.Enabled = true;
            PWM_CONTROL_1.Enabled = true;
            PWM_CONTROL_2.Enabled = true;
            IN_DIGITAL_1.Enabled = true;
            IN_DIGITAL_2.Enabled = true;
            IN_DIGITAL_3.Enabled = true;
            IN_DIGITAL_4.Enabled = true;
            ADC1_VALUE.Enabled = true;
            ADC2_VALUE.Enabled = true;
            MENSAJES_USB.Enabled = true;
        }
        private void deshabilita_controles()
        {
            OUT_DIGITAL_1.Enabled = false;
            OUT_DIGITAL_2.Enabled = false;
            OUT_DIGITAL_3.Enabled = false;
            OUT_DIGITAL_4.Enabled = false;
            PWM_CONTROL_1.Enabled = false;
            PWM_CONTROL_2.Enabled = false;
            IN_DIGITAL_1.BackColor = Color.Gray;
            IN_DIGITAL_1.Enabled = false;
            IN_DIGITAL_2.BackColor = Color.Gray;
            IN_DIGITAL_2.Enabled = false;
            IN_DIGITAL_3.BackColor = Color.Gray;
            IN_DIGITAL_3.Enabled = false;
            IN_DIGITAL_4.BackColor = Color.Gray;
            IN_DIGITAL_4.Enabled = false;
            ADC1_VALUE.Value = 0;
            ADC1_VALUE.Enabled = false;
            ADC2_VALUE.Value = 0;
            ADC2_VALUE.Enabled = false;
            MENSAJES_USB.Enabled = false;
        }
        private void salirToolStripMenuItem_Click(object sender, EventArgs e)
        {
            EasyHID.Disconnect();
            this.Close();
        }
        private void acercaDeHIDToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("USB HID en Visual C#\n\n Version Beta\n\n" +
                            "Basado en el tuto de Moyano Jonathan\n" +
                            "Creador del programa Erick Santiago Gómez (Wampiro)\n" +
                            "Equipo con Atl Odin Vanegas Santoyo (Arbol)\n" +
                            "Diseño PCB Angel Martinez Zabala (Fraile, Abelardo)\n" +
                            "Carrera Técnico en mecatrónica     Grupo 201\n" +
                            "CBT No.1 \"Dr. Donato Alarcón Segovia\"", "Acerca del Programa:",
                            MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
        private void webDelProyectoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("No hay web por ahora ¬¬ no se vaya a enojar el profe :P", "Web del Proyecto:",
                MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
        private void manualDeUsuarioToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                Process.Start("Control de dispositivos USB.pdf");
            }
            catch (Win32Exception)
            {
                MessageBox.Show("No se encuentra el archivo \"Control de dispositivos USB.pdf\". \n" +
                                "asegurate que el nombre es correcto y/o se \n" +
                                "encuentra en la misma ubicación que la aplicación.\n", "Aviso:",
                                MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }
        private void timer1_Tick(object sender, EventArgs e)
        {
            statusStrip1.Items[0].Text = DateTime.Now.ToLongTimeString();
        }
        private void toolTip1_Popup(object sender, PopupEventArgs e)
        {
            MENSAJE_TOOL.SetToolTip(this.CONTENEDOR_ANALOGICAS,
            "Barras de progreso que muestran el valor medido en el CAD.");
            MENSAJE_TOOL.SetToolTip(this.CONTENEDOR_PWM,
            "Control en el cual variamos el ciclo de trabajo de los PWM.");
            MENSAJE_TOOL.SetToolTip(this.CONTENEDOR_SALIDAS,
            "Control en el cual cambiamos el estado logico de los LEDs de salida.");
            MENSAJE_TOOL.SetToolTip(this.CONTENEDOR_IN_DIGITALES,
            "Control que muestra el estado de los diferentes pulsadores.");
            MENSAJE_TOOL.SetToolTip(this.CONECTAR_DISPOSITIVO,
            "Boton que nos permite enlazar el dispositivo al controlador.");
            MENSAJE_TOOL.SetToolTip(this.MENSAJES_USB,
            "En está ventana van apareciendo los diferentes sucesos ocurridos en la aplicación.");
        }
    }
}

Por Ultimo como puedo mandar las señales al COM1???

Eso es todo
Porfavor ayuda
 
Última edición:
¿Qué archivo hay que grabarle al pic? APLICACION_HID.hex de la carpeta "Aplicación USB CCS" o Detección del HOST_CDC.hex del ejercicio_n2??
No entiendo tu consulta, va a depender que tipo de conexión quieras hacer: CDC o HID.

Otra cosa, le puse de firmware el del ejercicio 2 y si prende con el de conexion en caliente pero con el de USB HID no detecta que el dispositivo esta conectado, alguna idea de por que no manda nada :'(

Esto es debido a que has modificado algo en el código , no estás usando la misma versión que usé yo para compilar el código (v4.023) o tenés un problema de drivers en la PC.. hay muchas variantes al problema que me planteas.

Una cosa mas, el VID de mi pic es 04d8 y el PID es 000B
lo pase a decimal y me salio VID 1240 y PID 11
No son decimales , son enteros de 32 bits. Si lo cambias el funcionamiento es erróneo.

el problema de detección:Puede estar dado por varias razones que te detallo a continuación (las más usuales). Puede haber más razones que no te especifico ...pero lo vas a tener que investigar:

- Mala gestión de la comunicación USB. Debido principalmente a la modificación errónea del código o utilización de un compilador viejo.
En mi manual utilizo el compilador V4.114 por lo que te vas a tener que conseguir esa versión.

- Errores hardware relacionados con el PIC.....mala alimentación, capacitor Vusb erróneo, etc....lo tenés que investigar.

- Errores en la PC debido a los drivers....controlador USB dañado...etc.


Por Ultimo como puedo mandar las señales al COM1???


No entiendo la razón de la consulta, se más específico !
 
va a depender que tipo de conexión quieras hacer: CDC o HID.
Quiero hacer HID (en realidad solo debo hacer que prenda un led del entrenador usando el programa que acabo de hacer con base en el tutorial), porque tengo entendido que CDC es como emular el puerto serie, ¿¿entonces tengo que usar el archivo "APLICACION_HID.hex" de la carpeta "Aplicación USB CCS" para hacerlo HID??

Esto es debido a que has modificado algo en el código , no estás usando la misma versión que usé yo para compilar el código (v4.023) o tenés un problema de drivers en la PC.. hay muchas variantes al problema que me planteas.
Estoy usando la misma version que tu (v4.114) y no he modificado el codigo, use los .hex del ejercicio_n2 y del hex que viene en el tutorial.

No son decimales , son enteros de 32 bits. Si lo cambias el funcionamiento es erróneo.
Entonces lo tengo que dejar como VID 6017 y PID 2000??

El problema de detección:Puede estar dado por varias razones que te detallo a continuación (las más usuales). Puede haber más razones que no te especifico ...pero lo vas a tener que investigar:
Esto lo descarto xq ya vi que el entrenador si sirve.

Creo que ya se de donde podria venir el error, gracias por responder Moyano.
 
¿¿entonces tengo que usar el archivo "APLICACION_HID.hex" de la carpeta "Aplicación USB CCS" para hacerlo HID??
Estás entendiendo mal el concepto. El tema es de la siguiente manera:

1º - Decidís si usar HID o CDC.
2º - Creas la aplicación en CCS, en base a las funciones de control y los descriptores de cada tipo de comunicación.
3º - Creas la aplicación de control para la PC. En HID, usas una librería con las funciones de control ...por ejemplo HID.dll. En cambio para CDC, usas el control de puerto serie que te viene junto con el editor de programación.
4º - Cargas tu .hex al micro con la aplicación de CCS. Luego conectas el micro al puerto USB / instalás los driver's.
5º - Haces las pruebas correspondientes.
 
hola Moyano Jonathan, soy nuevo en el foro y en el tema d los pics con usb; queria saber si me podes dar una mano con el tema d mandar datos a traves del usb para en el pic poder guardarlos en la eeprom. por favor lo necesito en vb6. desde ya muchas gracias.
 
necesito implementar un voltimetro con pic en ccs comunicacion usb y mostrar el voltaje en un interfaz creado en c# en el pc y crear un panel de control que detecte que puerto ha sido activado en el pic
 
necesito implementar un voltimetro con pic en ccs comunicacion usb y mostrar el voltaje en un interfaz creado en c# en el pc y crear un panel de control que detecte que puerto ha sido activado en el pic
Existe un proyecto exactamente como el que mencionas, pero hecho en VB 6.0 y con programación para el PIC en ASM...buscalo en la web.

Mojano Jonathan, leo todos los hilos del foro en lo posible, pero tengo escaso tiempo, trabajo en una fabrica textil, y estoy terminando ing electronica, es muy dificil,. dentro de unas semanas rindo control discreto en el tiempo con el clasico ogata. y estoy repasando,. ya aprobe control continuo en el tiempo con el clasico ingenieria de control moderna con el ogata. todas estas ultimas las materias, la estoy rindiendo libres y es muy dificil por mi trabajo.
yo programe para la fabrica ,no para mi los 16f877, ya obsoletos con la llegada de los de la linea 18. yo programo en assembler.

pero muy interesante este hilo como todos los del foro.

gracias por compartir sus experiencias. espero aprender a cerca de los de la linea 18

saludos cordiales
gabriel

Hola como estás. El tema de la programación en ASM...no te la recomiendo ya principalmente por que los compiladores y vienen bastante optimizados y se consiguen muy facilmente en la Web. Si vas a empezar con la serie PIC18F..te recomiendo el PIC18F2550 o el PIC18F4550 que tiene más cantidad de pines.

Muchas gracias por la ayuda que nos brindan, de no ser por ustedes seria muy dificil iniciarnos en el bello mundo de la programacion


Saludos LdSwFyL

Muchas gracias por el comentario.(y)
 
Los ejemplos que iré desarrollando van aplicados a las clases CDC (Comunication device class) y el control mediante la api de windows proporcionada por microchip mpusbapi.dll (bulk transfer).

Pregunta: cual es la diferencia entre el protocolo HDI y bulk. Es indistinto usar uno y otro? En que caso se utiliza cada uno?
El el proyecto del Joistik usas HDI y me gustaría conocer las diferencias y porque tomaste esa decisión.
Muchas gracias!
 
Pregunta: cual es la diferencia entre el protocolo HDI y bulk. Es indistinto usar uno y otro? En que caso se utiliza cada uno?
En cuanto a comunicaciones la velocidad. HID hasta 64Kbps (teórico) y 1.2 Mbps en Bulk (Teórico). En casi todos los casos podés usar HID....casi nunca vas a usar un enlace que requiera más de 64Kbps...en velocidad. Bulk (No está totalmente implementado en CCS...si en C18) Sirve para transmisiones que usen muy alta tasa de datos...

El el proyecto del Joistik usas HDI y me gustaría conocer las diferencias y porque tomaste esa decisión.
Muchas gracias!
Usé HID debido a que es el standar y que además no transferís grandes cantidades de datos.

Un saludo !
 
Que tal, pues soy yo de nuevo. Aun sigo con problemas ya que no puedo tener comunicacion con el PIC desde la PC. Uso el 18f2550, compilo en CCs 4.114, el código es de visual C# 2008 y corro la aplicacion en Windows XP de 32 bit... y nada :( anteriormente me detectaba que no estaba bien conectado, pero era un problema de conexión, lo resolví y ahora no hace nada, no detecta que esté conectado el PIC.
No se si pueda ser el problema la conexión, ya que use un conector hembra de USB al que le soldé las señales del PIC y de ahí conecté con la PC con un cable, sin embargo no pasó nada. Ahora intento con un cable USB que corté, para conectar las señales del PIC directamente a cada alambre interno del cable pero aun no logro comunicarme.
Además, estuve trabajando con algunos ejemplos que vi por aquí para hacer parpadear un led y me encontré con algo curioso, ya que la frecuencia a la que se suponía debía de encender y apagar era curiosamente 48 veces más que la que indicaba en la programación y la única solución que encontre fue variar el parametro "use delay(clock = 48000000)" por "use delay(clock = 1000000)". Esto lo digo porque tal vez no haya comunicación por la frecuencia que no se logra en el PIC, la verdad me pareció muy raro.
Espero que me puedan ayudar, porque se me acaban las ideas jeje. Les agradezco cualquier comentario. Saludos!
 
Hola! Buen día a todos.
Usando la funcionalidad USB me topo con un problema que no sé si a todos les ha tocado. Se trata de la cantidad de corriente que usa el PIC al funcionar en modo USB. Según mediciones que he hecho la máxima corriente que he observado es de 32mA aproximadamente, lo que necesito es ver si hay alguna manera de hacer que la funcionalidad USB sólo se active cuando esté conectado el USB, ya que en mi aplicación ocupo que sea de muy bajo consumo de energía, además de que el pic permanece dormido y despierta cada medio minuto. Estoy pensando en directivas #IF - #ENDIF para reacomodar los fuses, ya que cuando quito los que ocupa el USB el consumo de corriente baja hasta los 6mA. Si alguien tuviera alguna idea se lo agradeceré ;-)

Saludos!
 
No se si pueda ser el problema la conexión, ya que use un conector hembra de USB al que le soldé las señales del PIC y de ahí conecté con la PC con un cable, sin embargo no pasó nada. Ahora intento con un cable USB que corté, para conectar las señales del PIC directamente a cada alambre interno del cable pero aun no logro comunicarme.
Por favor analizá el hardware que estás usando, puede ser que el problema radique ahí. Te recomiendo que armes el entrenador que está adjunto al manual, para que te puedas guiar en tu diseño.

Además, estuve trabajando con algunos ejemplos que vi por aquí para hacer parpadear un led y me encontré con algo curioso, ya que la frecuencia a la que se suponía debía de encender y apagar era curiosamente 48 veces más que la que indicaba en la programación y la única solución que encontre fue variar el parametro "use delay(clock = 48000000)" por "use delay(clock = 1000000)"

Tiene que ser si o si "use delay(clock = 48000000)" caso contrario no funcionará. Antes de modificar el código que muestro en mi aplicación, te recomiendo mires su estructura para no perderte al momento de modificarlo. En versiones futuras de mi manual seré más claro en su descripción pero no es dificil guiarte.
Ahora si es el primer proyecto que afrontas con este protocolo de comunicación, te recomiendo que leas más al respecto.

Hola! Buen día a todos.
Usando la funcionalidad USB me topo con un problema que no sé si a todos les ha tocado. Se trata de la cantidad de corriente que usa el PIC al funcionar en modo USB
La corriente se programa en los descriptores de dispositivo, en todos mis ejemplos uso un descriptor para 100mA max. Teóricamente el bus puede entregar hasta 500mA ...pero no es recomendable usar más de 1/2 de la capacidad máxima de corriente...por un tema de hardware propio del PC/Notebook que estés usando.

lo que necesito es ver si hay alguna manera de hacer que la funcionalidad USB sólo se active cuando esté conectado el USB,
Eso lo hace de forma transparente al programador, no hace falta tocar nada.

Estoy pensando en directivas #IF - #ENDIF para reacomodar los fuses
Los fuses no son configurables en tiempo de aplicación , documentate sobre el tema.
 
Muchas gracias Moyano por tu pronta respuesta.
Creo que no me expliqué muy bien sobre el problema que estoy teniendo. Estoy utilizando el pic en modo USB - CDC para cargarle datos mediante la computadora, no tengo ningun problema en que el PIC me consuma mucha corriente (como tu comentaste, hasta 100mA) mientras lo conecto al puerto USB, más bien lo que me gustaría es que esos 32mA no se consuman cuando lo tengo en "modo de operación", en el cual está conectado a una fuente sin transformador de muy baja potencia (alrededor de 50mA máximos). En la documentación del CCS vienen las funciones para inicializar el USB pero no encontré ninguna respecto a "apagar" el USB. De cualquier manera creo que incrementaré el tamaño de la fuente para que eso no sea un problema, aunque el espacio que ocupa aumenta bastante.

Saludos!
 
Moyano tu trabajo de "PIC 18F2550 y USB desarrollo y aplicaciones" fue de gran ayuda para mi tesis de grado, te voy a poner de referencia respetando los debidos derechos de autor. Ese lo publicaste en el 2010 cierto?? necesito esa fecha para la cita bibliográfica. Muchas Gracias!
 
Hola, Hace varias semanas que empecé con el USB. Lo entiendo todo bastante bien, pero no puedo avanzar debido a que el PC no me reconoce el PIC. Si me pudieras hechar una mano y resolver alguna duda estaría agradecidisimo! pues estoy atrancado y ya no sé qué hacer.

El PC no me reconoce el dispositivo. Al menos, detecta que algo está conectado.
¿Los drivers para el PC del PIC, son solo para establecer un puerto COM virtual? Es decir, si uso el PIC en modo CDC, los necesitaria. Pero si uso el PIC en modo HID, ¿tambien los necesitaria?

¿Qué drivers deberia usar si tengo Windows 7? ¿Dónde se modifica el VID i PID en el microcontrolador? ¿Puede ser problema de esto?

Mil gracias de antemano! Me ha sorprendido mucho éste post. Introducís a la gente al USB de modo muy práctico. Yo primero queria ver el USB y hacer el programa en Visual C. Pero parece que me lo dais a modo de tutorial. ESTO VALE ORO! :LOL: Gracias a vosotros!
 
Lo entiendo todo bastante bien, pero no puedo avanzar debido a que el PC no me reconoce el PIC.
Es un problema muy comentado en el foro y se puede deber a muchos casos , principalmente relacionados con el hardware que estés usando para probar tus programas.
Revisá los capacitores del cristal, el capacitor Vusb, la configuración de los fuses, los pines D+ y D- , etc.
SI detectas que no es problema del hardware del dispositivo, puedes tener conflictos con los controladores USB de tu PC....y ahí lo único que soluciona el problema por lo general es reinstalar el sistema operativo.

¿Los drivers para el PC del PIC, son solo para establecer un puerto COM virtual? Es decir, si uso el PIC en modo CDC, los necesitaria. Pero si uso el PIC en modo HID, ¿tambien los necesitaria?

Los drivers siempre son necesarios tanto en CDC, HID y Bulk.

¿Qué drivers deberia usar si tengo Windows 7? ¿Dónde se modifica el VID i PID en el microcontrolador? ¿Puede ser problema de esto?

Si el problema puede llegar a venir por ese lado. Yo he probado todos los programas para que funcionen con un VID/PID determinado. Esto es por que el driver para la PC venía configurado de esa manera y no toqué nada.
Conclusión: NO modifiques el VID/PID.

Mil gracias de antemano! Me ha sorprendido mucho éste post. Introducís a la gente al USB de modo muy práctico. Yo primero queria ver el USB y hacer el programa en Visual C. Pero parece que me lo dais a modo de tutorial. ESTO VALE ORO! :LOL: Gracias a vosotros!

Muchas gracias por tus palabras. El hecho está en aprender con elementos prácticos y no volvernos locos con la teoría...aunque en algunos casos es muy necesaria.
Más adelante seguiré con los manuales sobre USB, pero ahora estoy viendo más la teoría para seguir con el libro que estoy escribiendo sobre este puerto.

Un saludo !
 
Revisá los capacitores del cristal, el capacitor Vusb, la configuración de los fuses, los pines D+ y D- , etc.
SI detectas que no es problema del hardware del dispositivo, puedes tener conflictos con los controladores USB de tu PC....y ahí lo único que soluciona el problema por lo general es reinstalar el sistema operativo.
Estoy algo confundido con el capacitador de Vusb. En algunos sitios leo 470nF, en otros lugares 47uF. Pero si leo el datasheet del PIC18F2550 me encuentro que debe de ser de 220nF. Los he probado todos con el mismo resultado. Los capacitadores del cristal son de 22pF para un cristal de 16Mhz. Tambien lo tuve en cuenta con los fuses. en especial al PLL.

Lo he probado en: Win7-32bit, Win7-64bit, WinXP-32bit.
Exactamente, ¿qué archivo debo instalar (driver) en el PC para el pic? Desesperado, descargué "Microchip Application Libraries" que traía controladores para USB entre otras cosas... Y dudo entre instalar el "mchpusb.inf" de las librerias de Microchip o el "mchpcdc.inf" de tu carpeta "Driver_XP". ¿Debo ir cambiando los drivers según sea CDC, Bulk o HID?

Conclusión: NO modifiques el VID/PID.
OK! Solo queria saber si los VID/PID eran correctos (que no fueran diferentes y por eso diese error).

Muchas gracias por tus palabras. El hecho está en aprender con elementos prácticos y no volvernos locos con la teoría...aunque en algunos casos es muy necesaria.
Más adelante seguiré con los manuales sobre USB, pero ahora estoy viendo más la teoría para seguir con el libro que estoy escribiendo sobre este puerto.
La esperaré como agua bendita! :D
Saludos!
 
Estoy algo confundido con el capacitador de Vusb. En algunos sitios leo 470nF, en otros lugares 47uF. Pero si leo el datasheet del PIC18F2550 me encuentro que debe de ser de 220nF. Los he probado todos con el mismo resultado. Los capacitadores del cristal son de 22pF para un cristal de 16Mhz. Tambien lo tuve en cuenta con los fuses. en especial al PLL.
Tiene que ser de 470nF. Es el que siempre uso.

Lo he probado en: Win7-32bit, Win7-64bit, WinXP-32bit.
Exactamente, ¿qué archivo debo instalar (driver) en el PC para el pic? Desesperado, descargué "Microchip Application Libraries" que traía controladores para USB entre otras cosas... Y dudo entre instalar el "mchpusb.inf" de las librerias de Microchip o el "mchpcdc.inf" de tu carpeta "Driver_XP". ¿Debo ir cambiando los drivers según sea CDC, Bulk o HID?

Para el caso de CDC en mis prácticas incluyo el driver (probado solo en Windows XP y algunas prácticas preliminares en Windows 7). Para el caso de HID no necesitas ningún driver especial solo el que trae windows...por eso la instalación de dispositivos HID se realiza de manera automatica.

La verdad vas a tener que investigar más tu problema para así te podemos dar respuestas más detalladas.
 
Última edición:
Atrás
Arriba