Ah, es fácil Pali. Usando un osciloscopio conectado a un pin del pic y enviando datos por usb cíclicamente modo bulk...
do{
output_high(USBOK);
MideMCP3201(); //Hace medición de los 5 ADC's
output_low(USBOK);
transOK=0; //No ha enviado paquete
while(transOK==0) //No pudo enviar, intenta de nuevo
transOK=usb_put_packet(1, doutprima, 12, USB_DTS_TOGGLE);
}while(ByteRec[1]--);
Cuando el led está encendido está llevándose a cabo la medición ADC. Cuando el led está apagado se está intentando enviar el paquete de 12 bytes a la pc.
La función usb_put_packet entrega un 1 cuando el paquete ya llegó a la pc. Cuando el paquete sigue en espera en el endpoint del pic (ya se pasó al buffer pero no ha llegado a la pc) entonces usb_put_packet entrega un 0.
Esta rutina en particular es la que me entrega 5.85kBps (kilo Bytes por segundo). El cálculo es el siguiente...
Tiempo ADC = 10us (medido con osciloscopio y confirmado contando instrucciones en ensamblador).
Tiempo envío paquete 12 bytes = 2ms (medido con osciloscopio)
Tadc + Tusb = 2.01ms
12bytes / 2.01ms = 5970.1 Bytes / s =
5.9kBpsAhora una rutina cdc...
if(usb_cdc_kbhit()) //Si se recibe petición
{
comando=usb_cdc_getc();
//Si el comando es 'a'
if(comando=='a')
{
while(1)
{
//Para medir el tiempo desde la medición hasta que ya se envió por USB
//enciendo la terminal RB7 (solo para debug)
//Tiempo en alto = Medición ADC (se espera que sea 10us)
//Tiempo en bajo = Lectura y envío USB (se espera que sea 40.2us)
output_high(USBOK);
MideMCP3201(); //Hace medición de los 5 ADC's
output_low(USBOK);
usb_cdc_putc(doutprima[0]);
usb_cdc_putc(doutprima[1]);
usb_cdc_putc(doutprima[2]);
usb_cdc_putc(doutprima[3]);
usb_cdc_putc(doutprima[4]);
usb_cdc_putc(doutprima[5]);
usb_cdc_putc(doutprima[6]);
usb_cdc_putc(doutprima[7]);
usb_cdc_putc(doutprima[8]);
usb_cdc_putc(doutprima[9]);
usb_cdc_putc(doutprima[10]);
usb_cdc_putc(doutprima[11]);
}
}
}
De la misma forma, cuando el led está encendido se está midiendo el ADC (10us). El tiempo que tarda enviar 12 bytes usando usb_cdc_putc es de 40.2us (led apagado), pero no es constante, hay unos tiempos "muertos" de 550us entre envíos que sospecho son los tiempos en que la pc le manda el token de petición de datos al usb; sospecho que el pic atiende esa interrupción para escuchar a la pc.
No hay forma de calcular la velocidad ya que los 550us se presentan de forma aleatoria entre envíos. Si esos 550us no existieran o los despreciara entonces me aventuraría a calcular la velocidad así...
Tadc = 10us
Tusb = 40.2us
Tadc + Tusb = 50.2us
12bytes / 50.2us = 239043 bytes/s
Te darás cuenta que el método que implemento es a modo de breakpoint, pero no detengo la ejecución del programa, con un led veo exactamente cuándo el pic pasa por cada instrucción y qué tiempo toma llevar a acabo varias.
Edito:
Y contestando tu pregunta de cuándo empiezo a contar el tiempo, no cuento tiempo de inicio... saco una velocidad con un solo envío de paquete (bulk) o byte (cdc). El método funciona al 100% con el modo bulk ya que los envíos son casi constantes, pero no funciona con el cdc porque hay tiempos muertos aleatorios entre envíos.
Lo que puedo hacer es implementar una rutina como la tuya en la que se cuentan los bytes recibidos y se dividen entre el tiempo transcurrido, de esa forma sacaría una velocidad promedio.
Mi problema es que no puedo trabajar con una velocidad promedio, necesito una velocidad constante ya que no puedo retrasar o adelantar la toma de muestras del adc. Los tiempos muertos de 550us son los que me ponen en jaque mate.