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

Tengo varias inquietudes, en realidad ahora estoy algo confundido acerca de la dll mcHID.dll, y es que, pues veo que esta es generada por el esayHID pero, esa que genera el easyHID no es para visual basic 6?? o también sirve para visual basic.net??, ahora, esta no sirve para utilizarla con C# cierto??, entonces si no sirve con C#, como hicieron para modificarla?? En que lenguaje está esta dll?? Estaría muy agradecido por sus respuestas, la verdad, estudiar esta librería es parte importante para el trabajo que estoy desarrollando, y googleando solo se encuentra que esta es generada por el esayHID, no mas.
 
Hola moyano disculpa la molestia, para saber si es posible que puedas hacer una aplicación con usb para vb 2008, estoy tratando de enviar datos al pic desde vb 2008 y no logra conectar o un pequeño ejemplo para poder guiarme ya que estoy haciendo mi tesi dirigida a un laboratorio de instrumentación y control.
 
Hola moyano disculpa la molestia, para saber si es posible que puedas hacer una aplicación con usb para vb 2008, estoy tratando de enviar datos al pic desde vb 2008 y no logra conectar o un pequeño ejemplo para poder guiarme ya que estoy haciendo mi tesi dirigida a un laboratorio de instrumentación y control.

La segunda parte de mi manual habla de como comunicarse con USB usando el PIC18F2550 en VB.net ...pero todavía no la termino. Calculo que para diciembre estará lista...pero no puedo adelantarte nada por que no está terminado...y el programa todavía tiene algunos bugs importantes.

Un saludo !
 
Hola a todos, hace rato que no paso por este hilo. Queria saber si alguien me podría ayudar con un inconveniente al usar el protocolo HID y el pic 18f4550. Busqué a través de todo el hilo, y lo único que encontré fue alguien con la misma inquietud...

Gracias por la colaboración.

Cuando me refiero a llenar el buffer es que, según entiendo, easyHID crea en VB una clase de array que define el número de Bytes que se pueden enviar en un paquete (máx 64). Yo utilicé el buffer de 8 bytes que pone easyHID. Si se fija en el programa, lo que se hace es ubicar un dato en cada uno de los bloques o posiciones del array BufferOut con 1<= i <= 8, y eviarlo al PIC. En el pic hay otro array DatoRx que los debe recibir.

Según comprendí, el dato que se envía desde VB se puede leer en el PIC de la siguiente forma:


VB <------------> PIC
BufferOut[0] No se utiliza
BufferOut[1] DatoRx[0]
BufferOut[2] DatoRx[1]
. .
BufferOut[8] DatoRx[7]

Y de la misma forma al leer en VB lo que se envía del PIC. Sin embargo, como mencioné antes, no coinciden las lecturas que hago en el PIC con los datos que envío del PC (solo coinciden los datos de BufferOut(1) y DatoRx(0)). Espero haber aclarado alguna duda que permita su colaboración.

Agradecimientos


Al igual que en la cita anterior, cuando yo envio un paquete de 8 bytes hacia el pic, el micro solo lee los primeros 2, y los demas son nulos, ya intenté usar la funcion usb_gets() pero sigo teniendo los mismos resultados.

De antemano muchas gracias
 
Al igual que en la cita anterior, cuando yo envio un paquete de 8 bytes hacia el pic, el micro solo lee los primeros 2, y los demas son nulos, ya intenté usar la funcion usb_gets() pero sigo teniendo los mismos resultados.

De antemano muchas gracias

Tenés que usar la versión 4.114 del compilador CCS...los descriptores de versiones viejas no funcionan con las últimas versiones del compilador...además hay muchas funciones que se han mejorado i/o modificado...por lo que tenés que revisar el código.

Un saludo !
 
Muchas gracias Jonathan, ya cambie por la versión 4.114, sin embargo, ahora el problema que presenta es que los bytes a partir del 3ro son números al azar, cuando envio 8 bytes en 0 hacia el pic, el parece recibir otra cosa. Adjunto una porción del código:

Código:
/*********************************************************************************************************/
/*                                        Definición de funciónes                                        */
/*********************************************************************************************************/


void Settings (void){
   set_tris_a(0x2F);
   set_tris_b(0xFF);
   set_tris_c(0x00);
   set_tris_d(0x00);
   set_tris_e(0x9);
   usb_init();
}

void get_data_axis_motion (void){
   usb_get_packet(1,data_in,8);
   x_axis = data_in[1];
   y_axis = data_in[3];
   z_axis = data_in[5];
   FLAGS = data_in[0];
   X_MSB = data_in[2];
   Y_MSB = data_in[4];
   Z_MSB = data_in[6];
   JOG = data_in[7];
   x=0;
   y=0;
   z=0;
   output_bit(SPINDLE_ENABLE,FLAGS.spindle);
   output_bit(PIN_D6,FLAGS.enable_x);
   output_bit(PIN_D7,FLAGS.enable_y);
   output_bit(PIN_E2,FLAGS.enable_z);
   output_bit(X_AXIS_DIR,bit_test(X_MSB,7));
   output_bit(Y_AXIS_DIR,bit_test(X_MSB,7));
   output_bit(Z_AXIS_DIR,bit_test(X_MSB,7));
   
   while(!((x_axis == 0) & (y_axis == 0) & (z_axis == 0))){
      if(x_axis != 0){
         output_toggle(X_AXIS_PULSE);
         x += 1;
         x_axis -= 1;
      }
      if(y_axis != 0){
         output_toggle(Y_AXIS_PULSE);
         y += 1;
         y_axis -= 1;
      }
      if(z_axis != 0){
         output_toggle(Z_AXIS_PULSE);
         z += 1;
         z_axis -= 1;
      }
      delay_ms(200);
   }
}

la unica información correcta que recibo es la de FLAGS y x_axis

Muchas gracias de antemano

A proposito, el main del programa es el siguiente

Código:
#include <18F4550.h>                                     // Definición de registros internos del PIC18F4550.
#fuses HSPLL,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOWDT,NOMCLR
#device adc = 8
#use delay(clock=48000000)

#define SPINDLE_ENABLE PIN_E1

#define USB_HID_DEVICE TRUE                              //Utilizamos el protocolo HID de USB

#define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT 
#define USB_EP1_TX_SIZE 8                                // Definición del tamaño del buffer de salida.

#define USB_EP1_RX_ENABLE USB_ENABLE_INTERRUPT 
#define USB_EP1_RX_SIZE 8                                // Definición del tamaño del buffer de entrada.

/*********************************************************************************************************/
// Definición de las librerías utilizadas.
#include <pic18_usb.h>                                   // Drivers's USB del PIC18F4550.
#include "USB_easyHID.h"                                 // Descriptores protocolo HID USB
#include <usb.c>                                         // Funciones del USB.
#include "CNC_settings.c"

/*********************************************************************************************************/
/*                                           Programa principal                                          */
/*********************************************************************************************************/

void main(){

   Settings();                                           //Llamamos a settings
   while(1){
      usb_task();                                        // Configuramos el puerto USB.
      if (usb_enumerated()){                             // Si el puerto es enumerado y configurado por el host..
         if (usb_kbhit(1)){                              //Si hay datos esperando en el buffer de entrada...
            get_data_axis_motion();
         }
      }
   }  //Fin del while
}  //Fin del main
 
Última edición:
La verdad no veo razón para que no te funcione. Fijate aumentando el buffer de recepción y de envío haber que sucede...también puede ser que estes teniendo problema con el archivo de descriptores.

Un saludo !
 
^ Muchas Gracias por el consejo Jonathan, la verdad aun así no funcionó. Aumenté el tamaño de los buffers, revise los descriptores detalladamente, revisé el proyecto VB6 que genera el EasyHID, y no encontré solución. Yo sospecho que puede ser por el software de visual, ya que estoy casi seguro que el programa del pic está en orden. Sin embargo, pude recibir los 8 bytes provenientes del PC con un pequeño arreglo en ambos programas...

Código:
while(i<5){
            if (usb_kbhit(1)){
               usb_get_packet(1,data_in,2);
               switch (i) {
                  case 1    :   FLAGS = data_in[0];
                                x_axis = data_in[1];
                  break;
     
                  case 2    :   X_MSB = data_in[0];
                                y_axis = data_in[1];
                  break;
     
                  case 3    :   Y_MSB = data_in[0];
                                z_axis = data_in[1];
                  break;
     
                  case 4    :   Z_MSB = data_in[0];
                                JOG = data_in[1];
                  break;
               }
               i += 1;
            }
         }

Y en visual...

Código:
BufferOut(1) = na
BufferOut(2) = CByte(Text1.Text)
WriteSomeData
BufferOut(1) = CByte(Text5.Text)
BufferOut(2) = CByte(Text2.Text)
WriteSomeData
BufferOut(1) = CByte(Text6.Text)
BufferOut(2) = CByte(Text3.Text)
WriteSomeData
BufferOut(1) = CByte(Text7.Text)
BufferOut(2) = CByte(Text4.Text)
WriteSomeData

Disculpenme otra vez, es posible que este problema se deba a estos Warnings del Pic c a la hora de compilar?

Código:
Interrupts disabled during call to prevent re-entracy (usb_token_reset)
Interrupts disabled during call to prevent re-entracy (usb_flush_out)
Interrupts disabled during call to prevent re-entracy (usb_tbe)
Interrupts disabled during call to prevent re-entracy (usb_flush_in)

ya que las funciones que se listan ahi, segun lo que leí en la documentación de los descriptores de pic c (usb.h, usb.c, pic18_usb.h, usb_hw_layer.h) estas funciones son indispensables para preparar los buffers antes y/o despues de enviar o recibir datos. Es posible que al ser deshabilitados, esto me impida recibir y/o enviar paquetes de datos de 2 o mas bytes?

De ante mano muchas gracias por su opinion
 
Última edición:
a la hora de grabar el hex al pic me sale error , es necesario grabarlo con el pickit? yo uso un grabador jdm , estare agradecido con los consejos que me des , mañana subo una foto de la placa

Hola como estás. El programador puede ser cualquiera que soporte el PIC18F2550, en si mismo el error que te aparece puede ser de hardware...intentá probar con otro grabador haber que sucede.

Un saludo !
 
hola moyano ,gracias por la respuesta tan rapida, intente grabarlo con un pickit que un amigo mio tiene y me da un mensaje (error level voltaje)pese ah que el pickit reconoce el pic , el grabador jdm con el que cuento logre grabar varias cosas en el pic 18f2550 sin ningun problema pero a la hora de grabar el hex del proyecto me sale error, quise compilarlo yo mismo usando las librerias que dejastes yo uso la v 4.114 y me da 9 errores mejor dicho warning, alo mejor sera eso oh quizas no pero aun haci dejo estos datos . y si en el peor de los casos fuera el hardware tendrias la amabilidad de pasarnos los archivos para poder armarnos un grabador jdm eh buscado en el foro y hay una gran cantidad de aportes , entonces creo que mejor seria una recomendacion si tubieras tiempo q grabador jdm me recomendarias.
 
Última edición:
que VID y PID debo poner en los descriptores para que el driver de la pc lo reconosca? en modo bulk transfer, tengo puesto VID 0461 y PID 0003 pero el driver de microchip no reconoce el pic y la pc si. que sera?
 
gracias por el dato jhon5191 , estare bajando esa version y la compilare , bueno soy muy novato en lo que es programacion pero quiero aprender . mi pregunta seria como hago un downgrade del CCS , igualmente gracias .

este es el mensaje que me da el programa a la hora de grabarlo , alguien me podria decir que significa ese mensaje .
http://imageshack.us/photo/my-images/835/errorti.png/


y una ultima consulta ,en esta imagen hay algun error en la configuracion?,aun haci muchas gracias a los que desinteresadamente me dan sus consejos


http://imageshack.us/photo/my-images/829/configuracion.png/
 
Última edición:
Hola amigos, espero y me puedan ayudar con un problema que tengo, estoy haciendo comunicación USB con LabVIEW y puedo activar 4 salidas del pic18f4550 las salidas van a un optoacoplador 4N25 y del otro lado los opto transistores activan 4 relevadores de CD a 5v ( hasta este punto puedo energizar y desenergizar cada rele las veces que quiera desde LabVIEW el problema empieza cuando) en los contactores de un rele conecto otro relevador de 24V pero de CA y en los contactores de este rele se conecta un motor trifásico de 330V, ahora el problema surge cuando activo este rele el motor funciona correctamente 2 ó 5 paros y arranques pero en un momento dado la secuencia en el pic se cógela y no puedo accionar más este rele y ninguno de los otros 3, esto solo pasa al conectar el rele de 24v de CA antes de eso los 4 rele de CD se activan y desactivan desde LabVIEW las veces que se desee.
 
Disculpen no tienen algun programa en c++ para el uso de comunicacion de pc con puerto ya sea serie, paralelo o de preferencia usb, si lo tienes y de mas preferencia que sea de control y monitoreo, como el que mencionaste en el post anterior sobre uno de usb.

Soy algo nuevo en esto de programar, asi en C++, se lo basico pero hasta ahi, encuanto a programar el pic o lo que se ocupe, tambien cuento con una GAL, nose si eso ayude, asi mismo, un programador tambien para tal cosa, el cual lo ocupamos en la universidad, de momento mañana les digo que marca es el programador y si es usable para tal funcion.
 
Hola amigos,
he estado visitando las 93 apasionantes páginas de este foro con todo este excelente material acerca del usb y les hago llegar mis mas sinceras felicitaciones por tratar este tema con altura y excelente nivel profesional. Muchas gracias por las colaboraciones principalmente de los amigos Jonathan y Meta entre otros. Cordiales saludos desde Uruguay. Elflamen
 
hola amigo moyano estaba leyendo bastante de tu material de usb+pic18f2550 .....bueno la duda o problema que tengo es que en el ejemplo numero 1 el sofware de control no me funciona o esque tengo que instalar algo antes............. gracias de antemano
 
Última edición por un moderador:
Atrás
Arriba