TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: hernanutn en 12 de Febrero de 2017, 17:45:13
-
Hola, quisiera saber como se implementaria o donde puedo buscar ejemplos para el pic..
Porque la duda que tengo es que estoy muestreando con un timer a 12khz muestra por muestra y lo cargo en un vector, cuando completo 64 bytes(MODO USB HID) lo envio por usb hacia labview.
En labview por ejemplo para tomar 12000 muestra en un 1s tarda 4s y no se si entre paquete y paquete de 64 byte pierdo tiempo de muestro y con el buffer circular se hace en tiempo real.
Desde ya gracias.
-
Aplicar un buffer circular en C no es especifico a un PIC, es puro C.
Buscando por google encontre este codigo.
https://github.com/dhess/c-ringbuf
Te sugiero que lo leas, quites el codigo que no necesitas, y lo personalizes para tu trabajo si es que lo que deseas es velocidad y tamaño.
Pero de paso vas a ver como es que se maneja el buffer.
Hay varios metodos de control de buffer, hace un tiempo elgarbe trajo otra implementacion que se encuentra limitada a tamaños 2^x , pero que hace de su control mucho mas simple. Esta en el subforo de ARM y el tema es sobre dereferenciar un puntero.
-
Encontre este codigo lo que agregue es lo del int main() supongo que deberia estar funcionando porque inprimi 20 valores en total con 10 valores con 2 y 10 con 3 y el tamaño del buffer es de 10;
#include<stdio.h>
#define BUFSIZE 10
int buf[BUFSIZE];
int *pIn, *pOut, *pEnd;
int full;
void buf_init();
int buf_put(int c);
int buf_get(int *pc);
int main(){
int c;
int valor;
int i;
buf_init();
for(i=0;i<20;i++){
if(i<10){
c=2;
buf_put(c);
}
if(i>=10 && i<20){
c=3;
buf_put(c);
}
buf_get(&valor);
printf("%d\n",valor);
}
return 0;
}
// init
void buf_init()
{
pIn = pOut = buf; // init to any slot in buffer
pEnd = &buf[BUFSIZE]; // past last valid slot in buffer
full = 0; // buffer is empty
}
// add int 'c' to buffer
int buf_put(int c)
{
if (pIn == pOut && full)
return 0; // buffer overrun
*pIn++ = c; // insert c into buffer
if (pIn >= pEnd) // end of circular buffer?
pIn = buf; // wrap around
if (pIn == pOut) // did we run into the output ptr?
full = 1; // can't add any more data into buffer
return 1; // all OK
}
// get a int from circular buffer
int buf_get(int *pc)
{
if (pIn == pOut && !full)
return 0; // buffer empty FAIL
*pc = *pOut++; // pick up next char to be returned
// printf("%d",*pc);
if (pOut >= pEnd) // end of circular buffer?
pOut = buf; // wrap around
full = 0; // there is at least 1 slot
return 1; // *pc has the data to be returned
}