Autor Tema: USB-Conversor AD de dos Canales  (Leído 2711 veces)

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

Desconectado Medusa

  • PIC18
  • ****
  • Mensajes: 252
USB-Conversor AD de dos Canales
« en: 11 de Marzo de 2009, 02:36:46 »
Hola a Todos  :g),

Quiero implementar un modulo USB de adquisicion de datos analogicos que reciba los dos canales AD0, AD1 independientemente es decir sin tener que hacer la seleccion del canal activo desde la PC, para ello he usado el ejemplo de J1M el PicUSB, mi problema es el siguiente:

En la parte de la PC no logro recibir ambos canales a la vez, cuado deshabilito uno de ellos todo funciona muy bien, como podran ver he definido dos EndPoints del USB(USB_EP1, USB_EP2), quisiera saber cual es mi error :-)

 
Código: [Seleccionar]
#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN
#use delay(clock=20M)

#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

#define USB_EP2_TX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint2) for IN bulk/interrupt transfers
#define USB_EP2_RX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint2) for OUT bulk/interrupt transfers
#define USB_EP2_TX_SIZE    1                 //size to allocate for the tx endpoint 2 buffer
#define USB_EP2_RX_SIZE    3                 //size to allocate for the rx endpoint 2 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_C0
#define LEDR    PIN_C1

#define LED_ON  output_high
#define LED_OFF output_low

Int Val_AN0,Val_AN1;
Float Sensor1,Sensor2;

#use standard_io(a)
#use fast_io(b)

void Leer_ADC1(void){                     
   setup_adc(adc_clock_div_32);           
   setup_adc_ports(AN0|VSS_VDD);
   set_adc_channel(0);                   
   delay_us (200);
   Val_AN0=read_adc();                   
   usb_put_packet(1, Val_AN0, 1, USB_DTS_TOGGLE);
   
}

void Leer_ADC2(void){                     
   setup_adc(adc_clock_div_32);           
   setup_adc_ports(AN0|VSS_VDD);
   set_adc_channel(1);                   
   delay_us (200);
   Val_AN1=read_adc();                   
   usb_put_packet(2, Val_AN1, 1, USB_DTS_TOGGLE);
   
}

void main(void) {

   LED_OFF(LEDV);                   
   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
      {
       Leer_ADC1();
       Leer_ADC2();
      }
    }
 }

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: USB-Conversor AD de dos Canales
« Respuesta #1 en: 11 de Marzo de 2009, 03:33:49 »
Cambia la forma de enviar los datos. Adquiere los datos analógicos, guardalos y luego envia un paquete con los dos valores:

Código: C
  1. #define medida1    bufferO[0]
  2. #define medida2    bufferO[1]
  3.  
  4. set_adc_channel(0);                    
  5. delay_us (200);
  6. medida1=read_adc();
  7.  
  8. set_adc_channel(1);                    
  9. delay_us (200);
  10. medida2=read_adc();
  11.  
  12. usb_put_packet(1, bufferO, 2, USB_DTS_TOGGLE);
No contesto mensajes privados, las consultas en el foro

Desconectado Medusa

  • PIC18
  • ****
  • Mensajes: 252
Re: USB-Conversor AD de dos Canales
« Respuesta #2 en: 11 de Marzo de 2009, 15:24:06 »
Hola suky, he seguido tu sugerencia pero no logro recibir ningun dato en la PC  :(

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: USB-Conversor AD de dos Canales
« Respuesta #3 en: 11 de Marzo de 2009, 18:06:34 »
Y del lado del PC que software utilizas??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Medusa

  • PIC18
  • ****
  • Mensajes: 252
Re: USB-Conversor AD de dos Canales
« Respuesta #4 en: 11 de Marzo de 2009, 18:23:15 »
Estoy usando Labview

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: USB-Conversor AD de dos Canales
« Respuesta #5 en: 11 de Marzo de 2009, 18:34:31 »
Y esta realmente configurado para leer dos canales??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Medusa

  • PIC18
  • ****
  • Mensajes: 252
Re: USB-Conversor AD de dos Canales
« Respuesta #6 en: 11 de Marzo de 2009, 20:03:05 »
si, ExpectedReceiveLength=2, en la labview me indica que recibe 2 datos pero siempre son cero a pesar de que a los conversores les estoy aplicando señales variables

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: USB-Conversor AD de dos Canales
« Respuesta #7 en: 11 de Marzo de 2009, 21:48:57 »
Y estas seguro que recibes el mismo tipo de datos que envia el dispositivo USB ??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: USB-Conversor AD de dos Canales
« Respuesta #8 en: 11 de Marzo de 2009, 23:26:30 »
Ya habias usado anteriormente (En otro proyecto)
Código: C
  1. setup_adc(adc_clock_div_32);
?
Prueba colocando antes de while(TRUE),
Código: C
  1. setup_adc_ports(AN0_TO_AN1|VSS_VDD);
  2. setup_adc(ADC_CLOCK_INTERNAL);

Y para capturar el valor analógico solo selecciona el canal con:
Código: C
  1. set_adc_channel(x);
No contesto mensajes privados, las consultas en el foro