Autor Tema: Implementar Buffer circular en CCS  (Leído 1902 veces)

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

Desconectado hernanutn

  • PIC16
  • ***
  • Mensajes: 117
Implementar Buffer circular en CCS
« 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.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Implementar Buffer circular en CCS
« Respuesta #1 en: 13 de Febrero de 2017, 09:01:32 »
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.

Desconectado hernanutn

  • PIC16
  • ***
  • Mensajes: 117
Re:Implementar Buffer circular en CCS
« Respuesta #2 en: 13 de Febrero de 2017, 19:17:46 »
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;

Código: [Seleccionar]
#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
}