Autor Tema: Problema con visualización de datos en Visual basic 6.0 y HID  (Leído 6289 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado jonathanPIC888

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
Problema con visualización de datos en Visual basic 6.0 y HID
« en: 24 de Febrero de 2009, 03:08:45 »
Hola a todos, tengo una duda que me ha estado comiendo la cabeza varios días.

Se trata de un visor del valor que toma una entrada analógica del PIC18F2550. El protocolo de comunicación que estoy utilizando es HID (human interface device).
Mi problema es que el valor que se muestra en el visor de texto no concuerda con lo que se muestra en el display LCD.

Mi código es el siguiente:

Firmware en C de CCS para el PIC18F2550.
Código: [Seleccionar]
// Programa: Hace una prueba de funcionamiento del LCD 2x16 y el ADC.
// Programador: Moyano Jonathan.
// Fecha: 13/02/09


#include <18F2550.h> // Definición de registros internos del PIC18F2550.
#DEVICE ADC=8 // CAD con 8 bits de resolución , justificación a la derecha.
#fuses NOMCLR,XTPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN
// NOMCLR: No vamos ha usar el PIN MCLR, el reset se hará por soft.
// XTPLL: Vamos a usar un cristal de 4.00Mhz.
// NOWDT: No vamos a usar el perro guardian.
// NOPROTECT: Memoria no protejida contra lecturas.
// NODEBUG: No utilizamos código para debugear.
// NOLVP: No utilizamos el modo de programación con bajo voltaje.
// USBDIV: signfica que el clock del usb se tomará del PLL/2 = 96Mhz/2 = 48Mhz.
// PLL1: significa que el PLL prescaler no dividirá la frecuencia del cristal. para XT = 4Mhz.
// CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejamos como está.
// NOVREGEN: habilita el regulador de 3.3 volts que usa el módulo USB.
// NOPBADEN: Deshabilitamos el módulo conversor ADC del puerto B.
#use delay(clock=48000000)

#DEFINE USB_HID_DEVICE TRUE // Vamos a utilizar el protocolo HID.

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

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

/*********************************************************************************************************/

 #define use_portb_lcd TRUE // Puerto B usado para el LCD.

// Librerías utilizadas.
#include <LCD.c>
#include <pic18_usb.h>    // Drivers's USB del PIC18F2550.
#include <usb_desc_hid.h> // Descriptores USB.
#include <usb.c> // Funciones del USB.
/*********************************************************************************************************/

// Variables globales.
long valor; // Variable que guarda el valor del ADC.


void main() {
int8 dato[1];  // Variable que va a guardar el valor del ADC.
OUTPUT_A(0);  // todos salidas
OUTPUT_B(0) ;           
OUTPUT_C(0);

   lcd_init();    // inicia la LCD
   set_tris_a(0x3);  // ra0=entradas, los demas=salida
   set_tris_b(0x0); 
   set_tris_c(0x0);                     
   setup_adc_ports( AN0 || VSS_VDD );  // canal AN0, Vref+ = Vdd, Vref- = Vss
   setup_adc(ADC_CLOCK_DIV_64);
   set_adc_channel(0);
   lcd_putc("\f");  // para evitarme un retardo y que no parpadee la LCD
   usb_init_cs();    // inicia el USB y sale. Va de la mano con usb_task().
   while(1){ // bucle infinito
      valor = read_adc();
      dato[0] = valor;
      usb_task(); // Configuramos el puerto USB.
                  if (usb_enumerated()) // Si el puerto es enumerado y configurado por el host..
                  {
                    usb_put_packet(1,dato,1,USB_DTS_TOGGLE); // Mando el valor del adc por USB.
                   
                  }
      lcd_gotoxy(1,1); // Posicionamos el cursor.
      printf(lcd_putc,"Valor=%3lu",valor);
   }
}

El código fuente del programa es el siguiente:

Código: [Seleccionar]
Private Sub datos_Timer()
Dim datos As Byte ' Variable que contiene el valor del ADC.
dato = ReadBuffer()
Valor.Text = dato
ReadReport
End Sub

Private Sub estado_conexión_Timer()
    If FindTheHid Then ' Si el dispositivo está coenctado al host.
       USB_ESTADO.BackColor = &HC000&
    Else ' En cambio si no está conectado.
       USB_ESTADO.BackColor = &HFF& ' Prende LED rojo.
    End If
End Sub
Private Sub Form_Unload(Cancel As Integer)
    Dim Result As Long
    ' Cierra los puertos de comunicaciones.
    Result = CloseHandle(HIDHandle)
    Result = CloseHandle(ReadHandle)
End Sub


Acá están las inmágenes que muestran la diferencia de los datos visualizados:

Lo que muestra la PC:


Lo que muestra el LCD:



En el link de descarga se encuentra el programa de control.

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: Problema con visualización de datos en Visual basic 6.0 y HID
« Respuesta #1 en: 24 de Febrero de 2009, 08:54:09 »
Creo que tienes un problema con el tipo de datos. Para visualizar correctamente el valor debes convertirlo a texto con la función Str(valor).
Además en el firmware del pic "valor" es una variable tipo long y dato es int8. verifica que se guarda correctamente, sino prueba colocando

dato[0]=int8(valor);

Otra cosa creo que deberías esperar a que el pc te envíe un pedido del dato para mandar dicho dato con
 if (usb_kbhit(1)) {
......
}
Esto último no se si es necesario
« Última modificación: 24 de Febrero de 2009, 09:03:36 por pablomanieri »

Desconectado jonathanPIC888

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
Re: Problema con visualización de datos en Visual basic 6.0 y HID
« Respuesta #2 en: 25 de Febrero de 2009, 02:40:21 »
La verdad hice como vos dijiste y nada sigue mandando errores, es más ahora ni siquiera me muestra el dato  :?. La verdad no se como poder arreglarlo cualquier cosa despues  posteo más dudas. Mientras tanto sigo investigando.

Desconectado PalitroqueZ

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Problema con visualización de datos en Visual basic 6.0 y HID
« Respuesta #3 en: 25 de Febrero de 2009, 14:10:31 »
Hola jonathan

deberias hacer como dice pablo, enviale un dato al pic, para establecer con seguridad un flujo.

en caso de ser así, debes usar la función ReadAndWriteToDevice

no se me había ocurrido el solo leer datos, pero el pic no puede estar enviando datos continuamente sin algún tipo de control.

otra sugerencia, usa un programa analizador de protocolo usb. ej: el Advanced USB Port Monitor o el Snoopy pro, y así verificas que es lo que realmente transmite el pic.

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado jonathanPIC888

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
Re: Problema con visualización de datos en Visual basic 6.0 y HID
« Respuesta #4 en: 25 de Febrero de 2009, 19:30:42 »
Pali hice como vos decís pero no me da resultado tampoco.  :lol: más tarde posteo mi segunda versión no funcional ajjajaj. He usado el snoopy pro que decis. Me leí todo el tuto que hiciste sobre usb. Ahora estoy aprendiendo HID y por lo pronto se  bastante info sobre el usb gracias a vos.
Igual le voy a dar pelea hasta que me salga, pero me parece que el problema mio radica en el soft de control en visual basic mas que en el fimware del pic.

Desde ya gracias por tu ayuda voy a ver la función Readandwritetodevice a ver que pasa.

Desconectado PalitroqueZ

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Problema con visualización de datos en Visual basic 6.0 y HID
« Respuesta #5 en: 26 de Febrero de 2009, 19:13:51 »
ánimo jonathan que si funciona.

yo he logrado transmitir por usb con la clase hid y funciona. A mi me pasó una cosa con ese código de Jan, y es el tiempo de espera de recibir el buffer con los datos recibidos al llamar ReadFile

...
  Result = WaitForSingleObject _
        (EventObject, _
        6000)
...

en mi caso, el programa se quedaba colgado ese tiempo, asi que se lo bajé un poco, pero si es cierto que funciona.

y el snoopy que te muestra? porque asi como tienes el firmware, deberia ser capaz (si ha enumerado correctamente) de ver los datos en los pipes en cada transmisión. Es mas hasta tendrias que pausar el snoopy porque se saturaría con la cantidad de info que va recopilando.

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado jonathanPIC888

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
Re: Problema con visualización de datos en Visual basic 6.0 y HID
« Respuesta #6 en: 27 de Febrero de 2009, 02:03:16 »
Mañana te muestro todos los datos y los "avances" si asi se puede decir. Lo único que se es que no he podido visualizar ni un bit. Pero le voy a dar pelea hasta el final (que me funcione jaj)  :-/

Desconectado jonathanPIC888

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
Re: Problema con visualización de datos en Visual basic 6.0 y HID
« Respuesta #7 en: 06 de Marzo de 2009, 18:17:57 »
Pali luego  de renegar y renegar lo he conseguido tengo comunicación bidireccional utilizando Visual Basic , C de CCS y easyHID.  :-/ :-/ :-/ :-/ :-/ :-/

Luego posteo los resultados .. Gracias por tu ayuda  :-)

Desconectado ARMEL

  • PIC10
  • *
  • Mensajes: 2
Re: Problema con visualización de datos en Visual basic 6.0 y HID
« Respuesta #8 en: 08 de Abril de 2010, 20:35:19 »
Hola..jonathanPIC888 buscando informacioncon respecto a comunicacion PIC - PC via USB..me encontre con tu proyecto muy interesante...y ademas esto me ayuda aprendeR para los que tenemos conocimientos un poco bagos al respecto..ya se k paso casi un año y kiza tus archiosvos estan un poco olvidado pero quisiera bueno si se puede k lo compartieras para ver cual fue tu correccon ...de antemano gracias por haber compartido el 1 codigo ;-)