TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: dorothygarcia31 en 02 de Marzo de 2023, 22:51:24

Título: USB Bulk Velocidad
Publicado por: dorothygarcia31 en 02 de Marzo de 2023, 22:51:24
Hola a todos, soy nuevo en el foro, y no se a quien mas recurrir :(  Tengo un proyecto que consta de un PIC18F4553 con un xtal de 40 Mhz, donde necesito recibir 250 Kbytes de un microfono en un segundo, el circuito es muy sencillo por ahora solo esta el microfono conectado al PIC y de ahi se conecta a la computadora por metodo Bulk, en la computadora leo los paquetes de 64 bytes con Labview.
El problema que tengo es que solo llegue a 5,000 Bytes por segundo aproximadamente, pero leo en internet que activando mas endpoints puedo mandar mas paquetes, pero no lo se hacer, alguien podria por donde podria empezar?

Ademas, tambien leia que el Isocrono es mas rapido, es muy dificil de implementar?

Código: [Seleccionar]
#include <18F4553.h>
#DEVICE ADC=8
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL10,CPUDIV1,VREGEN,MCLR
#use delay(clock=48000000)


#define USB_HID_DEVICE     FALSE
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK
#define USB_EP1_RX_ENABLE  USB_ENABLE_BULK
#define USB_EP1_TX_SIZE    64 //put_packet
#define USB_EP1_RX_SIZE    64

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

#use fast_io(a)
#use fast_io(b)
#use fast_io(c)

#byte ADCON2 = 0XFC0
#byte ADCON1 = 0XFC1
#byte ADCON0 = 0XFC2
#byte UCON = 0XF6D
#byte UCFG = 0XF6F
#byte porta = 0xf80 // Identificador para el puerto A.
#byte portb = 0xf81 // Identificador para el puerto B.
int8  recibir[6];                 
int  enviar[64];
int16 Dato_RA0;

#define Activar_Int   recibir[0]
#define Salida_Dig1   recibir[1]
#define Salida_Dig2   recibir[2]


#define LED_ON   output_high // Función para encender el LED.
#define LED_OFF  output_low  // Función para apagar el LED.

#define IN1      PIN_B1
#define IN2      PIN_B2

#define OUT_PWM  PIN_C2
#define OUT1     PIN_B5
#define OUT2     PIN_B3

void main(void)
{
   
   int i = 0;     
   ADCON1 = 0b00001110;
   ADCON0 = 0b00000011;
   ADCON2 = 0b00001110;
   UCON =   0b00101100;
   UCFG =   0b00010100;
   

   usb_init();
   usb_task();
   usb_wait_for_enumeration();
   delay_ms(50);

   // Secuencia de confirmación de enumeración.
   LED_ON(OUT1);
   delay_ms(250);
   LED_OFF(OUT1);
   
   while (TRUE)
   {
      if(usb_enumerated())          // True si el USB ha sido enumerado.
      {
         if (usb_kbhit(1))          // True si hay datos en el buffer de recepción.
         {
            usb_get_packet(1,recibir,8);
                     
            if (Activar_Int==1)     // Salidas activadas
            {     
               if(Salida_Dig1 == 1) LED_ON(OUT1);
               else LED_OFF(OUT1);

               if(Salida_Dig2 == 1) LED_ON(OUT2);
               else LED_OFF(OUT2);
           }       
         }
                 

  for(i = 0; i<=63; i= i+1){   
   enviar[i]=read_adc();   // Muestrear para mayor estabilidad en la lectura.
 //  enviar[i]= Dato_RA0 >> 8;
 //  enviar[i+1] = Dato_RA0 & 0xFF;
  }
         usb_put_packet(1,enviar,64,USB_DTS_TOGGLE); //Envío los datos al USB
       
      }
   }
}

Estaria muy agradecido con sus comentarios.
Saludos!
Título: Re:USB Bulk Velocidad
Publicado por: DominusDRR en 03 de Marzo de 2023, 00:04:08
Hola a todos, soy nuevo en el foro, y no se a quien mas recurrir :(  Tengo un proyecto que consta de un PIC18F4553 con un xtal de 40 Mhz, donde necesito recibir 250 Kbytes de un microfono en un segundo, el circuito es muy sencillo por ahora solo esta el microfono conectado al PIC y de ahi se conecta a la computadora por metodo Bulk, en la computadora leo los paquetes de 64 bytes con Labview.
El problema que tengo es que solo llegue a 5,000 Bytes por segundo aproximadamente, pero leo en internet que activando mas endpoints puedo mandar mas paquetes, pero no lo se hacer, alguien podria por donde podria empezar?

Ademas, tambien leia que el Isocrono es mas rapido, es muy dificil de implementar?

Código: [Seleccionar]
#include <18F4553.h>
#DEVICE ADC=8
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL10,CPUDIV1,VREGEN,MCLR
#use delay(clock=48000000)


#define USB_HID_DEVICE     FALSE
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK
#define USB_EP1_RX_ENABLE  USB_ENABLE_BULK
#define USB_EP1_TX_SIZE    64 //put_packet
#define USB_EP1_RX_SIZE    64

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

#use fast_io(a)
#use fast_io(b)
#use fast_io(c)

#byte ADCON2 = 0XFC0
#byte ADCON1 = 0XFC1
#byte ADCON0 = 0XFC2
#byte UCON = 0XF6D
#byte UCFG = 0XF6F
#byte porta = 0xf80 // Identificador para el puerto A.
#byte portb = 0xf81 // Identificador para el puerto B.
int8  recibir[6];                 
int  enviar[64];
int16 Dato_RA0;

#define Activar_Int   recibir[0]
#define Salida_Dig1   recibir[1]
#define Salida_Dig2   recibir[2]


#define LED_ON   output_high // Función para encender el LED.
#define LED_OFF  output_low  // Función para apagar el LED.

#define IN1      PIN_B1
#define IN2      PIN_B2

#define OUT_PWM  PIN_C2
#define OUT1     PIN_B5
#define OUT2     PIN_B3

void main(void)
{
   
   int i = 0;     
   ADCON1 = 0b00001110;
   ADCON0 = 0b00000011;
   ADCON2 = 0b00001110;
   UCON =   0b00101100;
   UCFG =   0b00010100;
   

   usb_init();
   usb_task();
   usb_wait_for_enumeration();
   delay_ms(50);

   // Secuencia de confirmación de enumeración.
   LED_ON(OUT1);
   delay_ms(250);
   LED_OFF(OUT1);
   
   while (TRUE)
   {
      if(usb_enumerated())          // True si el USB ha sido enumerado.
      {
         if (usb_kbhit(1))          // True si hay datos en el buffer de recepción.
         {
            usb_get_packet(1,recibir,8);
                     
            if (Activar_Int==1)     // Salidas activadas
            {     
               if(Salida_Dig1 == 1) LED_ON(OUT1);
               else LED_OFF(OUT1);

               if(Salida_Dig2 == 1) LED_ON(OUT2);
               else LED_OFF(OUT2);
           }       
         }
                 

  for(i = 0; i<=63; i= i+1){   
   enviar[i]=read_adc();   // Muestrear para mayor estabilidad en la lectura.
 //  enviar[i]= Dato_RA0 >> 8;
 //  enviar[i+1] = Dato_RA0 & 0xFF;
  }
         usb_put_packet(1,enviar,64,USB_DTS_TOGGLE); //Envío los datos al USB
       
      }
   }
}

Estaria muy agradecido con sus comentarios.
Saludos!

Según las hojas de datos, a Full Speed,  FS-USB(12Mbit/s), no 12 Mega bytes.

Estos ería 1536 Kbytes por segundo, podrías conseguirlo

Sin embargo, también tienen en teoría 32 endpoints que suponiendo que pudieras usar todos, que no es así, serían 32 bytes, más de eso no podrías conseguir.

También tienes un buffer en RAM reservado para el USB de 1kbyte (1024 bytes). (Otro cuello de botella)

Poco complicado lo que estás pidiendo para un microcontrolador de 8 bits.

Tal vez deberías usar uno de 16 o 32 bits.

Título: Re:USB Bulk Velocidad
Publicado por: DominusDRR en 03 de Marzo de 2023, 00:12:35
Este hilo del foro de MCHP tal vez sea útil:

https://www.microchip.com/forums/m94120.aspx (https://www.microchip.com/forums/m94120.aspx)