TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado 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?
#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!
-
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?
#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.
-
Este hilo del foro de MCHP tal vez sea útil:
https://www.microchip.com/forums/m94120.aspx (https://www.microchip.com/forums/m94120.aspx)