Usb y labVIEW , entre otros

Jockelnice, antes que nada quiero darle una felicitación por sus excelentes aportes.

Tengo una pregunta, en el programa que usted nos muestra para enviar la señal del ADC por usb usando labview, ¿cuales son los cambios que se tendrian que hacer en el programa en c para que el conversor funcione con los 10 bits?. Me imagino que se nececita declarar adc =10 tambien modificar define USB_EP1_TX_SIZE 2 al menos para dos bytes, ya ves que el conversor de 10 bits necesita dos bytes para almacenar su valor por lo que se necesitan enviar 2 bytes para enviar el valor completo. Tambien modificar esto en el código

Código:
dato=read_adc(); 
               delay_us(10); 
               
               envia[0]= make8(dato,0);
               envia[1]=make8(dato,1);
               usb_put_packet(1,envia,2,USB_DTS_TOGGLE); //enviamos el paquete de tamaño 1byte del EP1 al PC**/

Donde dato que es donde se guarda la conversión es un int 16 y entonces en el arreglo envia de 2 bytes guardamos el byte bajo y el alto de la conversión y enviar esto por usb

Ya lo hice pero no me funciona con tu programa en labview para 8.2. Por eso te queria preguntar sobre como se hace.

Saludos
 
si claro tienes razon el lo del "USB_EP1_TX_SIZE 2" y e en lo de los 10 bits yo tuve el mismo problema con el conversor a 10 bits pues la verdad lo que pude observar es que el conversor si guarda alta y baja pero es forma de registros ( como se trabajaba en assembler ) , en c no ocurre esto es decir el numero queda guardado como eso como un numero de 10 bits .

la solucion fue hacer una parte de codigo que tomara ese numero y separara la parte alta de la baja y asi si se puede enviar

Código:
 set_adc_channel(0);
                      delay_us(4);
                      dato=read_adc();
                      delay_us(10);
                      parte_baja =(int)dato;   // separo la parte baja 
                      parte_alta =(int)((dato& 0x300)>>8); // separa la partealta
                      envia[0]=parte_baja;       
                      envia[1]=parte_alta;
Código:
 usb_put_packet(1,envia,2,USB_DTS_TOGGLE);      // envia alta y naja
y pues en labview solo es tener en cuenta que llegan dos datos y se tienen que unir , tengo que mirar algunos codigos ya que no recuerdo en este momento muy bien como lo hice

PDT.... la forma en que lo hiciste no se si funciona o no ya que no lo probe , solo muestro la forma en que yo lo hice, por ejemplo no comprendo lo de make8 bueno cualquier cosa busco el codigo completo o algo asi

saludos ......
 
Gracias Jokel por tu explicación, entonces lo que yo pensaba si era correcto, lo que tu me explicas es exactamente lo mismo solo que programado de otra manera. La función make8 sirve para separar la parte baja y alta de un dato int16.

Muchas Gracias Jokel por tu ayuda, lo de labview voy a tratar de implementarlo entoces eso me falta unir los dos datos.

Excelente foro, desde ahora por aqui voy a andar :) ayudando tambien en lo que pueda Saludos
 
jokelnice gracias a tus aportes y una preguntilla.

En el programa que realizaste: "recibir_datos_cdc_662" cuando lo simulo con proteus y Labview.
En Labview recibo DATO LEIDO:r bytes leidos: 1 , DATO LEIDO:rr bytes leidos: 2,
DATO LEIDO:0 bytes leidos: 0 , así sucesivamente cuando RB0=1.

No entiendo porque recibo el caracter 'r',porque hay veces que los bytes leidos son 2 cuando el micro le programas q te envie el dato de 8 bits.
Respecto el analizador usb de proteus donde puedo ver el paquete de envio.
Siento mis duda de inexperto en el bus usb, todos los libros q encuentro estan en ingles.
 
Última edición:
jokelnice gracias a tus aportes y una preguntilla.

En el programa que realizaste: "recibir_datos_cdc_662" cuando lo simulo con proteus y Labview.
En Labview recibo DATO LEIDO:r bytes leidos: 1 , DATO LEIDO:rr bytes leidos: 2,
DATO LEIDO:0 bytes leidos: 0 , así sucesivamente cuando RB0=1.
como lo pudiste simular

No entiendo porque recibo el caracter 'r',porque hay veces que los bytes leidos son 2 cuando el micro le programas q te envie el dato de 8 bits.
debe haber algun problema en alguna parte
Respecto el analizador usb de proteus donde puedo ver el paquete de envio.
Siento mis duda de inexperto en el bus usb, todos los libros q encuentro estan en ingles.
se debe cargar en proteus el archivo .cof y no el .hex al hacer esto el trabaja con un archivo en donde podemos ver el comportamiento durante la ejecusion para eso se usa el boton de step " al aldo del de correr el codigo " si todo esta bien el parara el circuito y nos mostrara un listado de variables y su valor en ese momento y con respecto al usb se puede ver todo el buffer para ver que datos hay . saludos ....
 
Jokelnice gracias de nuevo:


1) Lo simule a la vez proteus y Labview, primero al run del proteus y entonces Labview ya me aparecia el puerto virtual serie y la daba al run.

2) Ya te he hecho caso he puesto el .Cof y de más, pero sigue apareciendo la r en Labview cuando transmito desde el proteus, supongo q juntar los 2 simulando da este tipo de errores, o no encuentro el problema.

3) Ya he analizado la variable dato con Proteus y si retransmite el caràcter con código hexadecimal 0x00 con RB0=0 simbolo ASCII (NUL) y 0x01 con RB1=1 simbolo ASCII (SOH).

dato=input_b()
printf(usb_cdc_putc,"%c",dato);

Si sabes algo Jokelnice ya me diras cuando puedas, no se si habías probado simular a la vez Proteus y Labview con comunicación USB CDC, y si es efectiva o causa errores.
Un saludo y siento las molestias!
 
Hola a todos he stado trabajando con el modo usb bulk transfer me gustaria saber si alguien tiene un programa en labview que envie y reciba n bytes en el end point yo he hecho un programa pero los datos que llegan al pic parpadea le agradezco la ayda de antemano
 
hola, bueno aqui les presento mi primer trabajo de comunicacion Labview85 con el PIC18f4550 que nos dejaron en el colegio, se trata de lo siguiente:
lectura y escritura.
escritura: con el labview se deben introducir 2 numeros, estos se deben desplagar tanto internamente como externamente. usando 2 display de 7 segmentos en los puertos B y D del PIC respectivamente. Y Colocando 2 Displays simulados en el Labview.
lectura: desde un puerto, en este caso se nos pidio usar los A (4,3,1,0) y C (7,6,1,0) con un dipswitch ingresar un byte de tal forma que el labview nos marque en codigo ASCII el simbolo o letra requerido.

aca les pongo unas imagenes para que me comprendan:

Código:
[IMG]http://i251.photobucket.com/albums/gg284/KiraKamiX/frontpanel1.jpg[/IMG]






[IMG]http://i251.photobucket.com/albums/gg284/KiraKamiX/blockpanel.jpg[/IMG]
Código:
/*CONFIGURACION PIC*/

#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 "usb_cdc.h"
#rom int 0xf00000={1,2,3,4}

void main() {
   int8 x, y;
   int8 r1, r2, r3, r4, r5, r6, rt1, rt2, rt3;
   int8 s1, s2, s3, s4, s5, s6;
   set_tris_b(0x00);
   output_b(0x00);
   usb_cdc_init(); // Configuramos al puerto virtual.
   usb_init(); // Inicializamos el stack USB.
     while(!usb_cdc_connected()) {}
       do{usb_task();
          if (usb_enumerated()){
            if(usb_cdc_kbhit()){  
                y=usb_cdc_getc();
                x=usb_cdc_getc();
                output_b(0x00);
               
Switch(x)
{
case 0x30:
output_b (0b01110111);
break;
case 0x31:
output_b (0b00010100);
break;
case 0x32:
output_b (0b10110011);
break;
case 0x33:
output_b (0b10110110);
break;
case 0x34:
output_b (0b11010100);
break;
case 0x35:
output_b (0b11100110);
break;
case 0x36:
output_b (0b11100111);
break;
case 0x37:
output_b (0b00110100);
break;
case 0x38:
output_b (0b11110111);
break;
case 0x39:
output_b (0b11110100);
break;
default:
output_b (0b00000000); 
}


Switch(y)
{
case 0x30:
output_d (0b01110111);
break;
case 0x31:
output_d (0b00010100);
break;
case 0x32:
output_d (0b10110011);
break;
case 0x33:
output_d (0b10110110);
break;
case 0x34:
output_d (0b11010100);
break;
case 0x35:
output_d (0b11100110);
break;
case 0x36:
output_d (0b11100111);
break;
case 0x37:
output_d (0b00110100);
break;
case 0x38:
output_d (0b11110111);
break;
case 0x39:
output_d (0b11110100);
break;
default:
output_d (0b00000000); 
}

      rt3 = 0;
      r1 = input_a(); 
      r2 = (r1&0xff);
      r3 = (r2&0b00000011);
      r4 = (r2>>1);
      r5 = (r4&0b00001100);   	  
      rt1 = (r3|r5);
      s1 = input_c();
      s2 = (s1&0xff);
      s3 = (s2<<4);
      s4 = (s3&0b00110000);
      s5 = (s2&0b11000000);
      rt2 = (s4|s5);
      rt3 = (rt1|rt2);
      printf(usb_cdc_putc,"%c",rt3);
              }
             }
       }while (TRUE);
}

Este es el programa en el PIC, como pueden ver yo uso bootloader, los case son para decodificar el Codigo ASCII y convertirlo a numeros en el display, la parte final son los corrimientos y operaciones a nivel bit para el uso del puerto a y c.

y les dejo este pequeño video de prueba (disculpen por la calidad):

http://www.youtube.com/watch?v=kqEIXEey3C8

una duda que tengo es, como indicarle al pic que escriba, lea o ambos, si me pudieses ayudar Jokelnice, ya que le
estoy enviando todo a la vez, no me ha dado problema pero si me gustaría saber.
 

Adjuntos

  • new.rar
    34 KB · Visitas: 419
bueno el proyectico colega , en cuanto a lo de la escritura o lectura se puede realizar una combinacion en donde el programa le envie una combinacion diferente para que lea escriba etc , seria una de muchas formas
 
q tal nesesito ayuda
estoy trabajando el usb con la mpusbapi y labview.
capto los datos del pic en arreglos de 128 byts, y he podido hasta graficarlos en labview.
pero quisiera meterle filtros pasabandas a mi senal para darle efectos, pero no encuentro como, ya q si integro el filtro me manda error.
porfa ayuda.
adjunto programa.
gracias
 

Adjuntos

  • chido1.zip
    17.5 KB · Visitas: 330
hola jokelnice estoy tratando de hacer lo que tu pegaste aca en el blog,,, mi dispositivo pic ha sido detectado,, a la pc,,, pero al momento de abrir LABVIEW,, simplemente no recibo ningun data,,, cual podria ser mi problema,,, estoy usando el bootloader al cargar el programa del CCS... gracias
 
uyyyyy hola JOKELNICE como va todo?, ufff desde que pude pasar esa señal seno a traves del USB, me olvide del tema, te acuerdas que me colabaste con eso? pues bueno ahora voy a intentar lo mismo pero para 10 bits por que la vez pasada lo trabaje a 8(el conversor), asi ke retomo el foro, aunque me parece que eso lo discutimos fue en otro tema, en el de jhonatan moyano creo, entonces retomemos, je
 
hola disculpen me interesa mucho el tema seria posible que me digan que version del compilador CCs estan usando y que labview se esta usando para realizar los ejemplos de la primera pagina por favor...y si no es molestia seria posible que me ayuden con información del compilador para poder comenzar a programar a y algo adicional que micro estan usando yo poseo un 18F2550 se pued usar ese o no muchas gracias de antemano
 
muchas gracias amigo lo voy a poner en practica porque en la u me piden este tipo de cosas y me quiero adelantar un poco y tambien porque el labview me gusta mucho
 
hola, como van, tengo una pregunta, alguno de ustedes ha trabajado pasando array de datos de 10bits a labview???, he tratado pero el conversor de queda en ceros:S.... alguna sugerencia???
 
bueno el proyectico colega , en cuanto a lo de la escritura o lectura se puede realizar una combinacion en donde el programa le envie una combinacion diferente para que lea escriba etc , seria una de muchas formas
Si, gracias por el consejo, de hecho ahora estoy trabajando con labview y 2 pic18f4550, uno solo actua como puente y el otro trabaja con un sensor de temperatura, una memoria eeprom, un reloj en tirmpo real, y un driver para controlar un motor con pwm. en cuanto lo tenga al 100, se los mostraré. saludos.
 
Atrás
Arriba