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

Hola a todos, los ejemplos de la página están todos probados con la versión de CCS v4.093. Como CCS modifica las librerías de vez en cuando ...no es posible deducir si los ejemplos van a funcionar en todas las versiones del compilador.
Actualmente trabajo con la versión 4.114, que hasta el momento me ha resultado bastante estable. El manual que está en la primera página del hilo, está desarrollado con esta versión y está 100% probado.

Con respecto al C18, en el futuro habrá un manual pero actualmente el colega Suky ha propuesto varios manuales con respecto al uso de perifericos avanzados:
http://www.micros-designs.com.ar/aplicaciones-avanzadas-en-c18/

Con respecto al tema en general del USB, se va a seguir desarrollando a lo largo del año pero antes tengo que seguir haciendo pruebas y seguir trabajando con lo que ya tenemos para entenderlo totalmente.

Un saludo !
 
hola manes...

soy nuevo aqui pero he leido y probado cada ejemplo que han posteado; pero para mi total descontento ninguno me funciono por lo que les queria pedir su concepto sobre mi problema.

y pus como ven en la imagen utilizo el usb view yno me aparece ninguna decripcion del descriptor del dispositivo.
estoy utilizando el ccs 4,114 en windows 7 de 64 bits.
 

Adjuntos

  • ada.png
    ada.png
    138.3 KB · Visitas: 41
ola compañeros, me podrian ayudar?
la cuestion es la siguiente, tengo que hacer una interfaz tal que al oprimir un led se muestre una señal gráfica en un pc, son 12 pulsadores, ya tengo el codigo en C que cambia el valor de unas variables (12 s1, s2...) segun el pulsador que oprima y también tengo el tentrenador de moyano funcionando, trate de hacer el progama desde cero con el pdf del tutorial pero no me resulto, creo que es por que yo tengo visual estudio 2010 (fue el único legal que conseguí en la U:D ) y pues bueno, no se programar en visual basic, estoy tratando de aprender a encender leds por el puerto paralelo y seguir avanzando y quisiera me indicaran que puede hacer para lograr mi cometido (aparte de seguir estudiando VB :rolleyes:)

gracias.
salu2
 
Moya una pregunta, no se si lo han aclarado ya. En el ejemplo que está al principio de este post en PDF. La aplicación en C# con tu placa entenadora: hay un objeto en el programa de C# que se llama MENSAJES_USB y no veo en que parte lo declarás ni se a que clase pertenece.

A ver si me podes aclarar eso. No hace falta decir que te has pasado con toda esa información que compartís. (y)

Saludos.

Listo ya está lo encontré. Es el nombre del ListBox.

Saludos.
 
Última edición:
ola compañeros, me podrian ayudar?
la cuestion es la siguiente, tengo que hacer una interfaz tal que al oprimir un led se muestre una señal gráfica en un pc, son 12 pulsadores, ya tengo el codigo en C que cambia el valor de unas variables (12 s1, s2...) segun el pulsador que oprima y también tengo el tentrenador de moyano funcionando, trate de hacer el progama desde cero con el pdf del tutorial pero no me resulto, creo que es por que yo tengo visual estudio 2010 (fue el único legal que conseguí en la U ) y pues bueno, no se programar en visual basic, estoy tratando de aprender a encender leds por el puerto paralelo y seguir avanzando y quisiera me indicaran que puede hacer para lograr mi cometido (aparte de seguir estudiando VB )

gracias.
salu2

Cuál es tu duda específica ??
 
Moya vos instalaste algun driver en la PC cuando probaste tu tarjeta entrenadora HID ?

Te cuento: yo me armé una mucho mas resumida, solo 2 leds y 2 pulsadores.

La pc me la reconoce y la enumera. En el administrador de dispositivos me aparece como dispositivo HID. Pero no logro que la interfaz de C# haga contacto con la tarjeta.

Por ahora en el programa del PIC no puse ninguna función de enviar o recibir datos. Solo puse:

usb_init();
usb_task();
while( TRUE )
{
if( usb_enumerated() )
{
output_bit(LED_ENUM,1); //enciende led de enumeraion USB si está enumerado
delay_ms(50);

}
}
... ademas de configurar los puertos y los #FUSES.

Entonces yo compruebo la enumeración cuando se enciende el led. De hecho lo hace bien.

En la interfaz de C#, dentro de la función "Dispositivo_Conectado(UInt32[/SIZE] handle)" le pongo que haga alguna cosa que me muestre a mi que está conectado. Pero no pasa nada. O sea que nunca entra en esta función. Puse un boton CONECTAR con la misma rutina tuya, pero tampoco se comunica.Por eso te pregunto de los drivers. Tengo la versión 4.114 del CCS.
Saludos.

Estoy viendo que puede llegar a ser un problema con el agregado de la dll. Yo la copié en el directorio del proyecto de C# luego la agregé con ----> Proyecto----->Agregar elemento existente.

Estará bien de esa forma ???

Cuando intento agregar la libreria dll como referencia me tira un error :

"No se puede agregar una referencia (ubicacion de la dll). Asegurese de que tiene acceso al archivo y de que es un ensamblado o compoente COM válido"

:confused: :confused: :confused:

Bueno me vengo solucionando las cosas yo solo. Pero no importa, estoy contento porque anda ahora !

Aclaro lo que me pasó por si le sirve a alguien: la dll hay que copiarla también en el directorio Debug y en el directorio Release del proyecto de C#.

Saludos.
 
Última edición:
Foso, con respecto a tu problema es una cuestión de .dll

- HID tiene librerías nativas en todos los sistemas operativos, por lo tanto no necesitas instalar drivers.

- La librería mcHID.dll la tenés que instalar en la carpeta System32 de windows. Una vez que la librería está en esa carpeta cualquier aplicación que escribas va a poder trabajar con ella.

Un saludo y felicidades por poder solucionar tus problemas !!
 
Hola moyano, quiero convertir el programa de ccs para el 18f4550.

Código:
Mas concretamente tener mas entradas y salidas, ya hice los cambios pero para compilar, ccs no encuentra los archivos pic18_usb y usb.h, le he puesto algunos de internet y me ha provocado error, le he puesto los de la carpeta de CCS y me ha dado erro, me podrias indicar como hacerle para compilar bien? tengo la versión 4.12 y la verdad que no me esta sirviendo.
Saludos.

bueno no encontre el formato de tachar, ya pude compilarlo, ahora a levantar el icsp de mi brenner, muchas gracias por el thread moyano!
 
Última edición:
Gracias por el tuto moyano...:aplauso::aplauso:
Logre realizarlo con exito funciona de 10, el unico problema es que no me deja ponele un icono a la "forma" pero no importa asi esta bien...:unsure::unsure:

Me di cuenta que se pueden cambia los #'s de ID como para hacer que un "progama" funcione y/o sea compatible con un solo "cxto"...(y)

Tengo una pregunta...

Como hago para que el programa desde windows, osea el que uno hace en VS 2008, envie los datos al microcontrolador al oprimir el boton N y no al soltarlo...
Es decir...
que los envie al dar clic y no al soltarlo...
ya que note que cuando das clic en cualquiera de los botones de salida, si sostienes el clic el boton se queda apretado pero no envia nada y cuando sueltas el clic el boton sume y ay si enbia los datos...

Es para hacer que se mantenga en "1" X pines de X puertos del pic mientas se mantiene el clic presionado y cuando se suelte el clic se mantengan en "0"...

EJM:
Clic sostenido= 0b00110011 (pueto b) y 0b11001100 en (puerto d)...
Clic suelto= ambos puertos en 0 (0b00000000)...

Bueno segure cacharriandole esto y si algo despues te pregunto algo, si no es molestia...:oops::oops:

Gracias...
 
Bueno ya pille una forma...

-En las propiedades del boton XX vamos al cuadrito que tiene un rayito (eventos) y vamos a ver que aparecen un monton de cosas en "blanco" y aparece una que dice:

Click= boton_XX_click


Mas abajo hay otro que se llama "MouseDown", a ese le ponemos:

MouseDown= boton_XX_click

Osea el mismo nombre del de arriba...

despues de eso nos aparece el pedaso de codigo para el "MouseDown" y hacemos sai...

Código:
       //--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--        
        private void limpiar_()
        {
            // Limpia los puetos del PIC
            byte[] BufferOUT = new byte[EasyHID.BUFFER_OUT_SIZE];
            BufferOUT[0] = 0;      // Report ID
            BufferOUT[1] = 0x00;   // Primero enviamos un comando de control al dispositivo: 
            EasyHID.Write(controlador, BufferOUT); // Envía los datos.
        }
        //--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--

        //--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--
        private void [B]boton_XX_click[/B](object sender, EventArgs e)//Suelto clic
        {
            limpiar_();
        }
        private void [B]boton_XX_click[/B](object sender, MouseEventArgs e)//Presiono clic-->MouseDown
        {
            byte[] BufferOUT = new byte[EasyHID.BUFFER_OUT_SIZE];
            BufferOUT[0] = 0;      // Report ID
            BufferOUT[1] = 0x01;   // Primero enviamos un comando de control al dispositivo: 
            EasyHID.Write(controlador, BufferOUT); // Envía los datos.
        }
        //--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--
Y hacemos lo mismo para los demas botones...

y en PIC C o CCS C, como lo quieran llamar, copiamos:

Código:
#include "Prueba USB 1.0.h"

//-------------------------------------------------------------------------------> Incluimos librerías utilizadas por la aplicación.
#include "pic18_usb.h"                //----------------------------------------------> Drivers's USB del PIC18F2550.
#include "APLICACION_HID.h"      //----------------------------------------------> Definición de funciones y hardware utilizado en el programa.
#include "Descriptor_easyHID.h"  //----------------------------------------------> Descriptores HID del proyecto.
#include "USB.c"                 //----------------------------------------------> Funciones del USB.
//-------------------------------------------------------------------------------> 

#bit        rc6=        0xf82.6            //----------------------------------------------> Led Error al enumerar.
#bit        rc7=        0xf82.7            //----------------------------------------------> Led USB_OK al enumerar.

int    recibe[USB_EP1_RX_SIZE];        //-------------------------------------------> Declaramos la variable recibe de 32 bytes. 
int    envia[USB_EP1_TX_SIZE];      //-------------------------------------------> Declaramos la variable envía  de 32 bytes.  

void USB_debug()
    {
    rc6= 1;                             //----------------------------------------------> Enciende el led error y apaga el led USB_OK.
    rc7= 0;
    usb_wait_for_enumeration();  //----------------------------------------------> Espera a ser enumerado por el host.
    rc6= 0;                             //----------------------------------------------> Enciende el led USB_OK y apaga el led USB_ERROR.
    rc7= 1;  
    }

void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_2|ADC_TAD_MUL_0);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab

   // TODO: USER CODE!!

set_tris_a (0x00);
set_tris_b (0x00);
set_tris_c (0x00);
set_tris_d (0x00);
set_tris_e (0x00);

porta= 0x00;
portb= 0x00;
portc= 0x00;
portd= 0x00;
porte= 0x00;

usb_init();                  //--------------------------------------------------> Inicializamos el stack USB.
usb_task();                  //--------------------------------------------------> Habilita el periferico usb y las interrupciones.
USB_debug();                 //--------------------------------------------------> Nos muestra el estado de conección del USB. 

while (1)
    {
     if(usb_enumerated())      //-------------------------------------------------> Si el dispositivo está configurado...
        {
         usb_put_packet(1, envia, USB_CONFIG_HID_TX_SIZE, USB_DTS_TOGGLE);//-------> Enviamos el paquete de datos por USB.

            if (usb_kbhit(1))                        //----------------------------------> Si hay un paquete de datos del host.. en el buffer lo tomamos y guardamos en la variable data.
               {
              usb_get_packet(1, recibe, USB_CONFIG_HID_RX_SIZE);//----------------> En el buffer lo tomamos del EP1 y lo guardamos en la variable recibe....

                if (recibe[0]==0x00)         //----------------> Este es el de limpiar puerto
                  {portb= 0b0000;}
                if (recibe[0]==0x01)         //----------------> Este es el de poner el pueto en tal combinacion...
                  {portb= 0b0101;}
              }
        }
    }
}
Y ya...
Esta la unica forma que he logrado hacer lo que les dije en el comentario anterior...

Y ya tengo otra duda...
:unsure: :unsure: :unsure: :unsure: :unsure: :unsure: :unsure:
Como hago para asignarle una tecla a un boton....
Es decir...
Que se habra el programa y que tales y que ese boton lo puedsa controlar con teclado...
EJM:
Que el "boton 1" se active/pulse y desactive/despulse cuando, respectivamente, presione y suelte la tecla "a"o la "b" o la que sea...
:unsure: :unsure: :unsure: :unsure: :unsure: :unsure: :unsure:
Espero les sirva de algo y espero que esto no sea Repost:cry:
Que descansen ya me voy a dormir que aca ya son las 5:31 a.m.
 
Como hago para asignarle una tecla a un boton....
Es decir...
Que se habra el programa y que tales y que ese boton lo puedsa controlar con teclado...
EJM:
Que el "boton 1" se active/pulse y desactive/despulse cuando, respectivamente, presione y suelte la tecla "a"o la "b" o la que sea...

No se específicamente a que te referís....por favor explícamelo más gráficamente.

Con respecto a tus logros, felicitaciones !!
 
Hace un tiempo he intentado hacer eso y me daba problemas. Es escaneo de letras del teclado y que lo reconozca el Form1 principa. Más adelante conseguiré el código en C#.
 
alguien tiene un ejemplo en c18 de bulk transfer?

lo pido porque necesito implementarlo en un pic32 pero prefiero empezar probando con un pic18, gracias
 
Última edición:
A ver si le entiendo a arias887 si lo que quieres es que cuando alguien presione la tecla "A" del teclado haga lo mismo que haria presionando un boton X, si es asi entonces lo mas facil es poner un edit box y alli escribir en el evento que dispare el otro ej.

private void Edit_01_KeyDown(object sender, ... //los parametros no me acuerdo
{
Boton_XX_click(sender...); //ejecuta el codigo como q si hubieras presionado un boton
}
==============================
Ahora con una mi duda, para Moyano: en uno de tus primeros post subiste un pdf sobre la teoria del funcionamiento del modulo de conversion analogo digital del pic alli escribiste que usando la velocidad
de 48Mhz y un 64 Tosc da 1.33 us quiere decir que:

//de aqui
dato = read_adc();
//hasta aqui han pasado 1.33 us?

Y con que otra configuracion se logra el tiempo minimo de 700ns
 
Ahora con una mi duda, para Moyano: en uno de tus primeros post subiste un pdf sobre la teoria del funcionamiento del modulo de conversion analogo digital del pic alli escribiste que usando la velocidad
de 48Mhz y un 64 Tosc da 1.33 us quiere decir que:

Eso es teorico usando ASM. Los tiempos en C suben bastante..ahora si necesitas velocidad en la conversión podrias usar un conversor externo. Todo depende de la aplicación que quieras realizar.
Otra opción seria usar una función embebida (hecha en ASM) que trabaje bajo un código fuente hecho en C, para poder obtener los valores del conversor de manera más eficiente...pero todo depende de la aplicación ..quizas no te haga falta tanta velocidad.

Un saludo !
 
Si tenes razon disminuye mucho por tanto codigo extra que mete el compilador para muestreos rapidos si creo que es necesario solo puro asm, y 100% mejor un ADC externo, solo era duda eso de los tiempos que se tarda la conversion que esta un poco dificil de entender el datasheet del pic
 
A ver si le entiendo a arias887 si lo que quieres es que cuando alguien presione la tecla "A" del teclado haga lo mismo que haria presionando un boton X, si es asi entonces lo mas facil es poner un edit box y alli escribir en el evento que dispare el otro ej.

private void Edit_01_KeyDown(object sender, ... //los parametros no me acuerdo
{
Boton_XX_click(sender...); //ejecuta el codigo como q si hubieras presionado un boton
}

albertoxx no te entendi muy buen por lo que faltan "parametos", pero al fin al cabo ya estoy avanzando en esto...

Hay que usar el KeyPreview, el KeyPress y el KeyUp en la "Forma" principal...

en cuanto aclare unas dudas le subo la info...

:D:D:D:D:D
 
Moya: tenés idea si esa librería dll de la empresa MecaniqueUK es libre y gratuita ?? tengo curiosidad de donde la sacaste. EN realidad me gustaría aprender a armar algo así, pero ya el lenguaje se hace muy específico de windows y se pone dificil.

Otra cosa, si es una librería específica para dispositivos HID, debería poder utilizarce con cualquier otro micro ( no de Microchip ) también. No?
 
Atrás
Arriba