Usb y labVIEW , entre otros

Estoy utilizando la comunicacion de usb por bulk con la funcion call library de labview para hacer uso de la libreria Mpusbapi.dll de microchip
 
aquii les dejo el programa del pic 18F4550 en CCS C y el digrama en labview


#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)

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


#define USB_HID_DEVICE FALSE //deshabilitamos el uso de las directivas HID
#define USB_EP1_TX_ENABLE USB_ENABLE_BULK //turn on EP1(EndPoint1) for IN bulk/interrupt transfers
#define USB_EP1_RX_ENABLE USB_ENABLE_BULK //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE 1 //size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE 3 //size to allocate for the rx endpoint 1 buffer



#include <pic18_usb.h> //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include <PicUSB.h> //Configuración del USB y los descriptores para este dispositivo
#include <usb.c> //handles usb setup tokens and get descriptor reports



#define LEDV PIN_C1
#define LEDR PIN_C0
#define LED_ON output_high
#define LED_OFF output_low

#define modo recibe[0]
#define param1 recibe[1]
#define param2 recibe[2]
#define resultado envia[0]


void main(void) {

int8 recibe[3]; //declaramos variables
int8 envia[1];
set_tris_d(0x00);
set_tris_e(0x00);
output_d(0x00);
output_e(0x00);

setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);


LED_OFF(LEDV); //encendemos led rojo
LED_ON(LEDR);

usb_init(); //inicializamos el USB

usb_task(); //habilita periferico usb e interrupciones
usb_wait_for_enumeration(); //esperamos hasta que el PicUSB sea configurado por el host

LED_OFF(LEDR);
LED_ON(LEDV); //encendemos led verde

while (TRUE)
{
if(usb_enumerated()) //si el PicUSB está configurado
{
if (usb_kbhit(1)) //si el endpoint de salida contiene datos del host
{
usb_get_packet(1, recibe, 3); //cojemos el paquete de tamaño 3bytes del EP1 y almacenamos en recibe

if (modo == 0) // Modo_Analogico
{
resultado = read_adc();

usb_put_packet(1, envia, 1, USB_DTS_TOGGLE); //enviamos el paquete de tamaño 1byte del EP1 al PC

}

if (modo == 1) // Modo_Led
{
resultado = read_adc();

usb_put_packet(1, envia, 1, USB_DTS_TOGGLE); //enviamos el paquete de tamaño 1byte del EP1 al PC
output_d(param1);
output_e(param2);
}

}
}
}
}
 
si amigo el adjunto no aparece , para enviarlo tienes que ire a modo avanzado despues agregar una imagen o archivo al examen , buscas el archivo ( algunas archivos no los sube por ejemplo los vi de labview entonces tienes que comprimirlos (winrar winzip etc) )y en cuanto al codigo los consejos de los moderadores es que todo lo que sea codigo baya precisamente entre las etiquetas "codigo"
 
jokelnice ojala me ayudes a resolver mi problema y me enseñes como le hiciste para adquirir señales de un sensor que en el video lo simulabas con un potenciometro (el conversor ( 10 bits ) y lo enviaba por usb_ bulk )
 
aqui les dejo la tarjeta que desarrolle
estoy manejando 4 E/S digitales y 3 relevadores para cargas y 6 entradas analogicas
donde puse un pontenciometro en la entrada AN0 para hacer simulaciones
 

Adjuntos

  • dsc00081_160.rar
    388.4 KB · Visitas: 916
si claro mira haber estuve revisando tu codigo empezemos por el del microcontrolador
1) te falta definir la resolucion del conversor aunque creo que por default esta a 8 bits
2) lo segundo es definir que va hacer la targeta observado vi que era
a. 6 entradas analogos aca solo probaremos uno
b. 4 entradas digitales y cuatro salidas dgitales tendriamos que definirlsa por aparte
c. 3 relevadores que supongodeben ser salidas digitales

3) lo mas aconsejable asi lo hice yo es " tambien estoy haciendo una targeta de adquicion " es probar cada cosa por aparte y lo que hice a lo ultimo unir todo , piensa que estariamos muy debuenas en donde todo lo que hicieramos nos saliera el primer intento te aconsejo primero las salidas digitales despues entradas y finalmente el conversor

estuve mirando el codigo y si hay unos errores o mas hay que depurar si te fijas estamos leyendo el conversor en dos instancias deberia ser en una sola .
y en cuanto a el codigo en labview tambien hay que hacer mejoras ,pero te parece si poco a poco las solucionamos y te propongo que desarrollemos la targeta por partes . la primera seria enviar datos del pc al micro y que el micro mande esto aun puerto y tendriamos las salidas digitales ....
 
Hola paisano y colega jokelnice...
Una pregunta. ¿Que ventajas/desventajas tiene el trabajar en BULK y no en CDC?, ya que tengo entendido que esta última está especializada en transferencia de comunicación (ej. cable-módem) y la BULK en almacenamiento masivo (ej. Memorias USB).... Recuerde que en electrónica también se aplica el principio KISS http://es.wikipedia.org/wiki/Principio_KISS... :LOL: ... Y si es solo una DAQ ¿Para que "almacenar", si eso lo puede hacer Labview? (De hecho esa parte me tiene truncado... El almacenamiento de datos...)

También se me hace loable que trabaje en Labview ya que permite ser superflexible para las condiciones y gustos cambiantes del usuario final, algo que en visual se vuelve tedioso, y de hecho imposible para el usuario final, (si acaso el crear una paleta de colores, jajajaja...) cosa que en Labview no sucede... (Ahi le paso un "tip" para cuando tenga que exponer su tesis.)

Esta es la primera vez que escribo un post, y me honra hacerlo con un colega de la Distri (o no "yamisiño", jajajaja!...).
P.D: No creo que se imagine quien soy...
 
hey, jokelnice, he trabajado el usb en forma hid, y cdc, pero aun no lopuedo hacer por la forma bulk transfer, por falta de un sofware para leer y enviar datos, se gun he leido este post,ud ya lo maneja , seria tan amable de indicarme como hacerlo, si tiene de casualida un ejemplo de labiew que maneje esto, estari muy agradecido
 
jokelnice ya probe la salidas digitales funcionan muy bien, presisamente eso fue lo que hice probar parte por parte. pero al probar las entradas analogica la respuesta es muy retardada no es en timpo real .
me gustaria que me compartieras tu codigo que hiciste para ver cuales son mis errores y si podemos mejorar algo.
 
a thoranaga venga pachito ese milagro encontrarmelo por aca , venga y alcon8212 es quien yo creo que es , pero venga para resolverle la duda hay va el usb tiene varias clasificaciones , una es la forma como trabaja o algo asi
entonces una explicacion sencilla
usb - cdc ( Comunication device class) : es una comunicacion de baja velocidad , se caracteriza por emular si es asi que se dice un puerto serial un puerto "com" es decir que si se hace bien nos podemos como cualquier comunicacion serial precisamente

usb-hid
( human interface device ) : tambien es de baja velocidad su principal caracteristica es que no se necesita ningun tipo de driver para que funciones ya que funciona gracias al plug and play es el utilizado en los mouse , los joystick etc
usb- msd ( mass storage device ) este es el protocolo con el que funiconas las memorias usb no es el bulk como crees de este si no eh averiguado nada solo el nombre
usb-bulk ( transmisión por bolcamiento ) es la mas rapida de todas , si necesita driver para realizar la comunicacion es la mas estable .
una explicaion sencilla . pero consisa colegas
venga y lo del principio KISS cierto muy cierto , no lo habia escuchado bueno . bueno.

a juan_d si se esta manejando por bulk transfer con la api proporcionada por microchip y para comenzar ah entenderlo hay unos ejemplos publicados anteriormente muestra la explicacion de sencilla de como la podemos hacer funcionar y en cuanto al sotware para poder y enviar los datos se puede en cualquiera , visual basic , c++ , c#, etc... solo mente depende de poder integrar la api de microchip

a adrianjpc ok estoy preparando los ejemplos ya que yo tengo la version 8.6 y casi nadie la tiene entonces estoy pasando los ejemplos a la 8.2 para que la mayoria lo pueda ver .......

saludos
 
ah ok entonces ahi va si alguien lo necesita en 8.2 avisen
bueno pues aca va el codigo , esto solo es el codigo para probar el adc
Código:
#include <18F4550.h>
#DEVICE ADC=8
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)

#define USB_HID_DEVICE FALSE //deshabilitamos el uso de las directivas HID
#define USB_EP1_TX_ENABLE USB_ENABLE_BULK //turn on EP1(EndPoint1) for IN bulk/interrupt transfers
#define USB_EP1_RX_ENABLE USB_ENABLE_BULK //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE 2 //size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE 2 //size to allocate for the rx endpoint 1 buffer

#include ".\librerias\pic18_usb.h" //libreria suministrada por picc para el manejo de pic 18fxxx
#include ".\librerias\PicUSB.h" //Configuración del USB y los descriptores para este dispositivo ,ademas la identificacion del dispositivo ( id - vendor)
#include ".\librerias\usb.c" //handles usb setup tokens and get descriptor reportsç

void main(void) {
int8 recibe[2]; //declaramos variables
int8 envia[0];
int8 x,y,i;
int16 dato;
/*set_tris_b(0x00);
//set_tris_d(0x7f);
output_b(0x00);*/

usb_init(); //inicializamos el USB
usb_task(); //habilita periferico usb e interrupciones
usb_wait_for_enumeration(); //esperamos hasta que el PicUSB sea configurado por el host
                            //es decir esperar hasta que el dispositivo lo reconozca el pc
setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_INTERNAL);

while (TRUE){
   if(usb_enumerated()){//si el PicUSB está configurado
       if (usb_kbhit(1)){//si el endpoint de salida contiene datos del host
         usb_get_packet(1,recibe,1); //cojemos el paquete de tamaño 1bytes del EP1 y almacenamos en recibe
           if( recibe [0]=='1'){//  si llego un "1" entonces activa el conversor  
               set_adc_channel(0);
               delay_us(4);
               dato=read_adc();
               delay_us(10);
               envia[0]=dato;
               usb_put_packet(1,envia,,USB_DTS_TOGGLE); //enviamos el paquete de tamaño 1byte del EP1 al PC**/
              }
           }
         }
      }
    }
este es el codigo para enviar el valor leido del conversor fue el primer ejemplo conversor a 8 bits despues lo mejore a 10 y se vio cierta mejoria

y en cuanto a los vi despues de hacer varios codigos pude concluir que es mejor utilizar el codigo , en si es decir sin llamar subvis a no ser que claro se invoquen dinamicamente que funciono igual , tambien me di cuenta que directa o indirectamente influye el pc en el que estamos corriendo ya que por experiencia una cosa era lo que yo observaba en la casa y otra lo que veia en la "u" cuando haciamos pruebas con otro equipo saludos y comenten sus experiencias para mejorar
 

Adjuntos

  • ejemplo_adc_labview_506.rar
    39.7 KB · Visitas: 945
  • labview_82_119.rar
    45.6 KB · Visitas: 783
Que tengan unescelente día.

Me presento mi nombre es Luis, soy docente en la UTA (universidad Técnica de Ambato), y quisiera si ustedes me pueden ayudar a utilizar dichos puertos como el serial, paralelo, y USB el cual ya es muy difundido para la utilizanción de los sistemas de comunicación. La razón es que necesito impartir éstos conocimiéntos a mis alumnos para que ellos puedan realizar sus proyectos y así que ellos puedan construir sus circuitos y que no esten comprando ya que son muy caros, pero bueno quisiera si alguien me da una manito para pooder aprender a utilizar dichos puertos utilizando logicamente LabView, yo estoy con la versión 7.0 ya que en la universidad sólo tienen la licencia de dicha versión pero también utilizo la versión 8.2, en lo que tiene que ver a PICs utilizo el PIC16F6877A, se programar utilizando el Maplab o utilizand el compilador CCS tambien e simulado en la plataforma de Proteus pero quisiera no sólo llegar a simular, más bien mi objetivo es realizar prácticas completamente a la vez didácticas que ésto me sirvan para futuros proyectos.

De antemano Gracias por su aporte
 
adrianjpc pues mira al utilizar el conversor a a 8 biys tendremos 5/255 =19.6mv/bit y a 100bita 5/1023=4.88mv/bit
lo que quiere decir que en 8 bits cada 19.6mv el cpnversor va a identificar o va representar como un bit ( digital) , mientras que con diez bits sera cada 4.8 mv por lo tanto tendremos una mejor resolucio a la hora de leer , lo que quiere decir que minetras los dispositivos trabajen a mas bits seran mucho mejor .

apm como no este tipo de foros esta hecho para todos , y si claro , entre todos podemos colaborar , en cuanto al manejo de los puertos si se ha venido desarrollado en labview , se han venido trabajando con el compilador de microcontrolador ccs picc habria que recopilar alguna información para su comprension y despues se estaria publicando el mas sencillo sera el serie , el paralelo y el usb tiene un poco mas de trabajo porque como tal no esta incorporado en labview como si lo esta serie .
saludos
 
Atrás
Arriba