Usb y labVIEW , entre otros

Disculpe amigo quisiera saber que es lo que hace en esta parte del codigo


if(usb_cdc_kbhit()){
y=usb_cdc_getc();
x=usb_cdc_getc();
output_b(0x00);

Que tal amigos del foro tengo unas cuantas preguntas que me gustaria me las respondieran si no es mucha molestia:

Como puedo recibir una trama con el pic y como puedo enviarla a esta desde labview, tengo este problema ya que debo manejar una matriz de leds rgb desde labview y tenia pensado eviar una trama al pic con los valores para el pwm de los tres colores, agradezco de antemano su ayuda
 
Última edición:
tengo una pregunta como declaro en el pic el numero de muestras que deseo, por que veo en los codigos que usan por ejemplo delay_ us(10),,,, esto corresponde a la frecuencia que queiren muestreao o como?

gracias...
 
if(usb_cdc_kbhit()){ // Parte de codigo que emula un COM con el PIC, ver post principal

usb_cdc_getc();funciona como cualquier getc, pero es un getc especial para tomar un byte desde USB (con emulacion de COM a.k.a. puerto serial), se almacena en una variable.

output_b(0x00); //despliega en el puerto B (00000000), sería como un clear.
 
HAAAAA!!! bueno despues de habes sacado mi desesperacion por que todos hablan de cdc. si es muy bonito. pero leeeennntoooooo. bueno. espero me puedan alludar.

primero que nada como diriamos aca en mexico eres una riata jokelnice. la neta es que por flojera he estado trabajando con el CDC desde hace un año y he querido evolucionar al bulk, pero no me termina de entrar.

me preguntaba si podrias subir lo que posteaste en la pagina 5 de este foro pero para LB 8.2 ya que embebi las librerias para usar y no me deja jalarlas a mi diagrama de bloques.:D

porfas y gracias desde ya.
 
hola nahumof,,,esos son los descriptores que tienes que modificar, en el archivo del driver que te proporciona microchip, los cuales el vid y pid, deben ser iguales en el archivo .h de tu compilador (CCS) ya sea que manejes
usb_desc_scope.h o la similar Usb_scope.h,,, esto es muy importante leelo muy bien porque de esto depende que tu driver de micrcrochip sea valido, sino nunca te va a reconocer tu hardware, estas modificaciones en el programa de tu pic son indispensables, ahora en el programa de labview no se que estes usando yo uso la call library como todos aca creo jejej ya que es modo bulk,,, suerte y lee todo de pies a cabeza y si estoy de acuerdo contigo el jokelnice es una riata saludos y lo que hagas compartelo aca se aprende experimentando jajaja
 
hola karl 87 gracias por tu comment, si pues lo de los descriptores si ya lo habia entendido, y ya lo habia hecho. si me detecta mi dispocitivo, pero no se como usar el call library node... no encuentro ayuda util al respecto...y me parecio interezante integrar los modulos de subVI's que no secomo se usan ni para que.(bueno ahora tu me dices que nadamas son los descriptores) pero para que open??? y close??? read?? writhe??

ya antes habia trabajado con bulk pero con unos ejemplos de CCS ya que compre el kit de evaluacion USB hace mas de un año...si lo quieres lo subo, solo no tendran que hurgar en la carpeta jajaja.:)

la onda es que no se como utilizarlo en LB... si tienen algo de ayuda se agradece...
saludos
 
Hola jokelnice...
que pena ver tan tarde el foro, despues de casi 9 meses, pero ahora lo necesito...
necesito enviar dos datos diferentes a labview por usb. Utilizare usb_cdc como tu lo explicaste, pues me parecio muy bueno. la pregunta es como hago para que los dos datos se actualicen automaticamente y se ubiquen como deben ir, me explico, como hago para enviar los datos y recibir el dato 1 como temperatura, y el segundo como humedad.
Te agradeceria si me pudieras explicar.
y muy buen foro.....
 
Que tal bueno, aca les traigo un pequeño proyecto con cdc, se trata de una señal con PWM para un ventilador, para el control de temperatura mediante un sensor DS1620.
Este sensor tiene una precision de 0.5°C por lo que es aceptable, tiene un termostato en el chip, con alarmas de temperaturas altas y bajas, segun se configure mediante el PIC18F4550.


Nuevaimagen1.jpg

Código:
#include <18f4550.h>
#fuses HSPLL,NOWDT,NOBROWNOUT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,MCLR,NOPBADEN,WRTB
#use delay(clock=48000000) //FREC OSC

#build(reset=0x800, interrupt=0x808)
#org 0x000, 0x7ff { }

#include <DS1620v2.c>       //Libreria Sensor de TEMP DS1620 3Wire
#include <usb_cdc.h>        //Libreria para emular el puerto Serial

void main()
{

  unsigned int8 PWM1;                                //Variable PWM
  char X, Y, Y1, Y2, Y3, Y4;                         //Variable PWM
  char h1, h2, h3, l1, l2, l3;                       //Variable para TEMP
  float v1, v2, v3;                                  //Variable para TEMP

  setup_ccp2(CCP_PWM);                               //Modulo CCP2 en modo PWM PIN_RC1
  setup_timer_2(T2_DIV_BY_16,255,16);                //Configuracion Frecuencia de Osc
  set_pwm2_duty(0);                                  //PWM con valor Cero al inicio
 
  DS1620_Init();           //Inicializa el Sensor

    data1=52;              //Valor de TH Inicial 26.0°C
    data2=46;              //Valor de TL Inicial 23.0°C
    DS1620_HWrite(data1);  //Escribe TH=26.0°C
    DS1620_LWrite(data2);  //Escribe TL=23.0°C

 usb_cdc_init();                       // Configuramos al puerto virtual.
  usb_init();                          // Inicializamos el stack USB. 
  while(!usb_cdc_connected()) {}       // espera a detectar una transmisión de la PC (Set_Line_Coding).
  do{usb_task();
    if (usb_enumerated()){       // Espera a que el dispositivo sea enumerado por el host.
      if(usb_cdc_kbhit()){       // En espera de nuevos caracteres en el buffer de recepción. 

X=usb_cdc_getc();              //########## ESPERA DEL PRIMER COMANDO (P/T)
   switch(X)            //########## ANALIZA EL PRIMER COMANDO
   {
   case 'P':      //############################ Recibe caracter P(PWM)      
        Y1=usb_cdc_getc();             //Recibe de RS232 valor de las centenas
        Y2=usb_cdc_getc();             //Recibe de RS232 valor de las decenas
        Y3=usb_cdc_getc();             //Recibe de RS232 valor de las unidades
        Y1=(Y1-48)*100;
        Y2=(Y2-48)*10;
        Y3=Y3-48;
        Y4=(Y1+Y2+Y3);         //Suma de los 3 valores 
        PWM1=(Y4*2.55);        //Factor de PWM
        set_pwm2_duty(PWM1);   //PWM Ciclo de trabajo igual a PWM1
        break;                 //Break del PWM


  case 'T':     //################################## Recibe caracter T(TEMP)
        Y=usb_cdc_getc();             //Comando leer o escribir (W/R)
        switch(Y)
        {
        case 'W':                    //Recibe comando W(Write TH-TL)
        h1=usb_cdc_getc();           //Recibe de RS232 valor de las centenas TH
        h2=usb_cdc_getc();           //Recibe de RS232 valor de las decenas TH
        h3=usb_cdc_getc();           //Recibe de RS232 valor de las unidades TH  
        l1=usb_cdc_getc();           //Recibe de RS232 valor de las centenas TL
        l2=usb_cdc_getc();           //Recibe de RS232 valor de las decenas TL
        l3=usb_cdc_getc();           //Recibe de RS232 valor de las unidades TL

        h1=(h1-48)*100;
        h2=(h2-48)*10;
        h3=h3-48;
        data1=(h1+h2+h3)*2;
        l1=(l1-48)*100;
        l2=(l2-48)*10;
        l3=l3-48;
        data2=(l1+l2+l3)*2;

        DS1620_HWrite(data1); //Escribe TH
        DS1620_LWrite(data2); //Escribe TL   
        break;
   
        case 'R':             //Recibe comando R(Read TH-TL-TEMP)
        v1=DS1620_Readh();       //Lee del sensor la TH
        v2=DS1620_Readl();       //Lee del sensor la TL
        DS1620_start();       //Inicio de la conversion de TEMP 
        delay_ms(100);
        v3=DS1620_ReadT();       //Lee la TEMP del sensor
        delay_ms(100);
        DS1620_stop();        //Para la conversion del sensor
        v1=V1/2;    //Divide valor entre 2, asi lo maneja el sensor.
        v2=V2/2;    //Divide valor entre 2, asi lo maneja el sensor.
        v3=V3/2;    //Divide valor entre 2, asi lo maneja el sensor.
        printf(usb_cdc_putc,"%f",v1);  //Enviar a USB valor flotante de TH(00.00)
        printf(usb_cdc_putc,"%f",v2);  //Enviar a USB valor flotante de TL(00.00)
        printf(usb_cdc_putc,"%f",v3);  //Enviar a USB valor flotante de TEMP(00.00)
        break;        
        
        default:
        break;
        }
  break; // BREAK DEL SENSOR
  
  default:
  break;
  }
              }
             }
       }while (TRUE); //Ciclo infinito
}


No soy muy buen programador, pero de que funciono me funciono ;)
 
hola nahumof, yo creo que tienes que leer un poco mas acerca de esto, Todo el sistema se basa en abrir y cerra PIPES, que nos sierven para establecer la comunicación, esto es independiente de los descriptores, pues esto como tu dices de abrir o cerrar, es nada mas enel pograma de LAbview ya que cada PIPE que abres tiene un proceso individual, basico Abrir, Leer, y Cerrar, porque sino lo haces no te va a jalar, por eso en cada CALL, se necesitan declarar las variables y especifcar si es de lectrua o escritura, o si cierra o abre, . aqui te posteo algo que lei....

Mpusbopen: (instance, pVID_PID, pEP, dwDir, dwReserved)

Devuelve el acceso al pipe del endpoints con el VID_PID asignado.

· Instance (Input): Un número de dispositivo para abrir. Normalmente, se utiliza primero la llamada de MPUSBGetDeviceCount para saber cuántos dispositivos hay.
· pVID_PID(Input):String que contiene el PID&VID del dispositivo objetivo. El formato es “vid_xxxx&pid_yyyy”. Donde xxxx es el valor del VID el yyyy el del PID, los dos en hexadecimal.
Ejemplo:
Si un dispositivo tiene un VID=0x04d8 y un PID=0x000b, el string de entrada es: “vid_0x04d8&pid_0x0010”.

Mpusbwrite: (handle, pData, dwLen, pLenght, dwMilliseconds)

· handle(Input):Identifica la pipe del endpoint que se va a escribir. La pipe unidad tiene que crearse con el atributo de acceso MP_WRITE.
· pData (Output): Puntero al buffer que contiene los datos que se van a escribir en la pipe.
· dwLen(Input):Especifica el número de bytes que se van a escribir en la pipe.
· pLenght (Output):puntero al número de bytes que se escriben al llamar esta función. MPUSBWrite pone este valor a cero antes de cualquier lectura o de chequear un error.
dwMilliseconds(Input):Especifica el intervalo de time-out en milisegundos. La función

Mpusbread(handle, pData, dwLen, pLenght, dwMilliseconds):

· handle(input):Identifica la pipe del Endpoint que se va a leer. La pipe unidad tiene que crearse con el atributo de acceso MP_READ.
· pData(output):puntero al buffer que recibe el dato leído de la pipe.
· dwLen(input): Especifica el número de bytes que hay que leer de la pipe.
· pLenght (output): Puntero al número de bytes leídos. MPUSBRead pone este valor a cero antes de cualquier lectura o de chequear un error.
· dwMilliseconds(input):Especifica el intervalo de time-out en milisegundos. La función vuelve si transcurre el intervalo aunque no se complete la operación. Si dwMilliseconds=0, la función comprueba los datos de la pipe y vuelve inmediatamente. Si dwMilliseconds es infinito, el intervalo de time-out nunca termina.

Mpusbclose (handle):
Cierra una determinada unión.
· handle(Input):Identifica la pipe del Endpoint que se va a cerrar.
 
Ya he podido controlar con VISA de labView mi dispositivo HID, es una aplicacion sencila de encender y pagar un led, la cual desarrollo Moyano Jonathan (de otro foro), pero el lo hacia con VB. Ahora espero poder adentrarme mas y desarrllar alicaciones propias y enfocadas a lo que necesito.

Definitivamente estos foros me han servido mucho...

Saludos

Podrías ayudarme, estoy conectando el pic por HID pero no logro conmutar el led, ya creé el driver con visa y lo reconoce a la perfección pero no logro conmutar el led, podrías postear el firmware del pic para comparalo con el que tengo (gracias al Moyano).

Gracias
 
Problema resuelto, al parecer algo andaba mal en la configuración del pic, si les interesa puedo ver como postear (soy nuevo en el esto de los foros) un ejemplo completo adquiriendo datos por el ADC del pic para visualizarlo en una gráfica con opciones como guardar los valores en un archivo de datos, realizar acciones a voluntad dependiendo del comportamiento de la señal entre otras cosas...

Saludos.
 
hola, definitivamente este post me ha sacado de muchos lios (lo cual agradezco infinitamente), pero ahora tengo una pregunta, alguien ha intentado enviar datos desde una EEPROM hacia el PC, yo lo he intentado pero como necesito guardar 100 datos en la 24lc256 al leer los datos desde el labview se pierden, alguien sabe que pueda estar sucediendo?
 
hola, definitivamente este post me ha sacado de muchos lios (lo cual agradezco infinitamente), pero ahora tengo una pregunta, alguien ha intentado enviar datos desde una EEPROM hacia el PC, yo lo he intentado pero como necesito guardar 100 datos en la 24lc256 al leer los datos desde el labview se pierden, alguien sabe que pueda estar sucediendo?

Que hay, primero que nada, ¿còmo comunicas el pic con la pc?, postea tu codigo, igual puedo ayudarte
 
Saludos, actualmente tengo una aplicacion donde comunico via USB el PIC 16F877 (Con Proton) y la PC (LabView), todo funciona perfecto.

Una vez que la comunicacion estaba funcionando, se me ocrrio desconectar el cable de comunicacion. Entonces en LabView se genero un error que me colgo la aplicacion.

Ahora, mi pregunra, ¿es posible en base a ese error se pueda detener la comunicacion antes que el programa se cuelgue?

Si me pueden ayudar con respecto a esto estare muy agradecido, gracias.
 
Saludos, actualmente tengo una aplicacion donde comunico via USB el PIC 16F877 (Con Proton) y la PC (LabView), todo funciona perfecto.

Una vez que la comunicacion estaba funcionando, se me ocrrio desconectar el cable de comunicacion. Entonces en LabView se genero un error que me colgo la aplicacion.

Ahora, mi pregunra, ¿es posible en base a ese error se pueda detener la comunicacion antes que el programa se cuelgue?

Si me pueden ayudar con respecto a esto estare muy agradecido, gracias.

Primero y dependiendo del loop que estes usando podrìas monitorear la línea de error usando el unbundle cluster, cuando la variable de error cambie de estado a verdadero puedes direccionar tu programa a una parte donde obligues a la aplicaciòn finalizar la comunicación sin colgar tu computador.

Por otro lado aqui tengo ya una versiòn preliminar del prorama que elaboré con la ayuda de este foro y el de "control de dispositivos por medio del modulo del pic18f2550", la siguiente meta es usar un ADC de 12 o 16 bits a una velocidad de mìnimo 3Ks/s. En cuanto tenga algo con gusto se los comparto.
 

Adjuntos

  • preliminar_1.bmp
    96.5 KB · Visitas: 264
Tienes toda la razón, agradezco tu respuesta. Gracias. Esto fue lo que hice:

Ya lo solucione con el CLUSTER UNBUNDLE, conectado a ERROR OUT, desconecte el cable y vi el código del error con el SIMPLE ERROR luego con esa información la compare con el código generado CLUSTER UNBUNDLE y si el código era el mismo, definitivamente cable había sido desconectado y le envío el mensaje al usuario. Objetivo cumplido.

Saludos y de verdad muchísimas gracias por tu respuesta
 
Hola a todos. Soy nuevo en esto, tengo un problema Labview no me reconoce el USB, por más que miro el código de labview veo que esta correcto, pienso que el error radica en las librerías del pic. A continuación dejo el código c del pic. Utilizo el labview 2009, el ejemplo de jokelnice del adc.
He cambiado en el PicUSB.h
USB_MAX_EP0_PACKET_LENGTH, //max packet size for endpoint 0. (SLOW SPEED SPECIFIES 8)
0x88,0x04, //vendor id (0x04D8 is Microchip)
0x11,0x00, //product id, me gusta el 11 ;)
Y en el vi introduzco: la identificación de vendedor y del producto vid_04d8&pid_0011
 
Hola mi problema es que no me consigue ubicar el USB, tras instalarlo me aparece siempre el mismo problema y no se como solucionarlo.

Saludos
 

Adjuntos

  • Dibujo2.JPG
    Dibujo2.JPG
    24.9 KB · Visitas: 89
  • Dibujo1.JPG
    Dibujo1.JPG
    43.2 KB · Visitas: 66
Atrás
Arriba