Autor Tema: Buffer FIFO en C30 para pic24F  (Leído 5640 veces)

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

Desconectado Enrique_86

  • PIC12
  • **
  • Mensajes: 62
Buffer FIFO en C30 para pic24F
« en: 30 de Noviembre de 2009, 11:32:29 »
Hola a todos, estoy trabajando en un proyecto y me veo en la necesidad de implementar una registro FIFO de 50 niveles, he estado revisando informacion y encontre el siguiente link. Lo he tratado de compilar pero no me funciona en el C30, me parece que hay tipos de datos que no estan declarados apropiadamente, estoy modificando y revisando.
Alguien tiene algun ejemplo de como hacer dicha pila FIFO, me podrian ayudar? Gracias de antemano.  :-/
...enrique  :-)

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Buffer FIFO en C30 para pic24F
« Respuesta #1 en: 30 de Noviembre de 2009, 12:35:51 »
Yo alguna vez he necesitado hacer algo parecido y lo he resuelto usando un array y dos punteros, uno para saber dónde tengo que escribir el próximo dato que llegue, y otro para saber dónde leer el próximo dato. El array lo considero "circular", sin principio ni final, cuando llego a la última posición continúo por la 0.
De esta manera, tendrías que:
- si PunteroLectura = PunteroEscritura -> la pila está vacía
- si (PunteroEscritura = (PunteroLectura - 1)) o ((PunteroLectura = 0) y (PunteroEscritura = 49)) -> la pila está llena

Para escribir un dato sólo tendrías que comprobar que hay espacio y hacer lo siguiente:
Pila[PunteroEscritura++]=Dato;
if (PunteroEscritura==TamañoPila)
    PunteroEscritura=0;

Para leer un dato sólo tendrías que ver si no está vacía y hacer lo siguiente:
Dato=Pila[PunteroLectura++];
if (PunteroLectura==TamañoPila)
    PunteroLectura=0;

Suerte

Desconectado Enrique_86

  • PIC12
  • **
  • Mensajes: 62
Re: Buffer FIFO en C30 para pic24F
« Respuesta #2 en: 30 de Noviembre de 2009, 14:31:25 »
Hola Nocturno, gracias por responder, uhm si tu idea suena bien voy a probar y te comento que tal me va. Viste el link de mi mensaje anterior, el estilo empleado para hacerlo parece mas interesante, emplear un push(dato); y un dato=pull(); me ha parecido bien voy a tratar de mezclar las dos cosas.. Gracias por tu ayuda!  :)
...enrique  :-)

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Buffer FIFO en C30 para pic24F
« Respuesta #3 en: 30 de Noviembre de 2009, 14:40:50 »
Lo he mirado por encima, pero como es en inglés he salido corriendo.

De todas formas, el push y el pull los tienes implementados en mi post anterior :)

Desconectado Enrique_86

  • PIC12
  • **
  • Mensajes: 62
Re: Buffer FIFO en C30 para pic24F
« Respuesta #4 en: 01 de Diciembre de 2009, 11:32:43 »
Hola Nocturno, ayer estuve revisando informacion y como dices mas que un FIFO necesito un buffer circular, ya que se comportaria como un FIFO pero no haria el desplazamiento de datos uno por uno como lo hace un FIFO hardware, ya que haciendo esa tarea perdería tiempo.
Para mi proyecto necesito tres pilas iguales por lo que he declarado lo siguiente:

Código: [Seleccionar]
struct fifo{
int ptr_e;           //puntero de escritura
int ptr_l;            //puntero de lectura
char reg[50];     //vector de datos
}fifo1, fifo2, fifo3;

Luego creo las funciones de escritura y lectura:

Código: [Seleccionar]
void push(char dato)
{
fifo1.reg[fifo1.ptr_e]=dato;
if(fifo1.ptr_e<fifo1.ptr_l)
{
if(fifo1.ptr_l<=99)
{
fifo1.ptr_l++;
}
else
{
fifo1.ptr_l=0;
}
}
if(fifo1.ptr_e<=99)
{
fifo1.ptr_e++;
}
else
{
fifo1.ptr_e=0;
}

}

char pull(void)
{
char temp;
if((fifo1.ptr_l==0)&&(fifo1.ptr_e==0))
{
temp= 0x1F;
}
if(fifo1.ptr_l==fifo1.ptr_e)
{
fifo1.ptr_l=0;
fifo1.ptr_e=0;
temp=0x1F;
}
//if((fifo1.ptr_l<fifo1.ptr_e)
else
{
temp=fifo1.reg[fifo1.ptr_l];
if(fifo1.ptr_l!=99)
{
fifo1.ptr_l++;
}
else
{
fifo1.ptr_l=0;
}
}
return temp;
};

Como veras las funciones de escritura y lectura solo funcionan para la primera estructura fifo1, estoy tratando de hacer una funcion general para que funcione con cualquier estructura del mismo tipo. Aun no lo consigo, me podrías ayudar?.. o alguien del foro?. Gracias de antemano.  :)
...enrique  :-)

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Buffer FIFO en C30 para pic24F
« Respuesta #5 en: 01 de Diciembre de 2009, 13:08:28 »
No soy muy ducho en estructuras pero, ¿no la puedes pasar a la función como parámetro?

Código: C
  1. void push(&fifo_X, char dato)
  2. {
  3.         fifo_X.reg[fifo_x.ptr_e]=dato;
  4.         if(fifo_X.ptr_e<fifo_X.ptr_l)
  5.         {
  6.                 if(fifo_x.ptr_l<=99)
  7.                 {
  8.                         fifo_x.ptr_l++;
  9.                 }
  10.                 else
  11.                 {
  12.                         fifo_x.ptr_l=0;
  13.                 }
  14.         }
  15.         if(fifo_x.ptr_e<=99)
  16.         {
  17.                 fifo_x.ptr_e++;
  18.         }
  19.         else
  20.         {
  21.                 fifo_x.ptr_e=0;
  22.         }
  23.        
  24. }
  25.  
  26. char pull(&fifo_X)
  27. {      
  28.         char temp;
  29.         if((fifo_x.ptr_l==0)&&(fifo_x.ptr_e==0))
  30.         {
  31.                 temp= 0x1F;    
  32.         }
  33.         if(fifo_x.ptr_l==fifo_x.ptr_e)
  34.         {
  35.                 fifo_x.ptr_l=0;
  36.                 fifo_x.ptr_e=0;
  37.                 temp=0x1F;
  38.         }
  39.         //if((fifo_x.ptr_l<fifo_x.ptr_e)
  40.         else
  41.         {
  42.                 temp=fifo_x.reg[fifo_x.ptr_l];
  43.                 if(fifo_x.ptr_l!=99)
  44.                 {
  45.                         fifo_x.ptr_l++;
  46.                 }
  47.                 else
  48.                 {
  49.                         fifo_x.ptr_l=0;
  50.                 }
  51.         }
  52.         return temp;
  53. };

Desconectado Enrique_86

  • PIC12
  • **
  • Mensajes: 62
Re: Buffer FIFO en C30 para pic24F
« Respuesta #6 en: 03 de Diciembre de 2009, 11:54:28 »
Hola nocturno!, despues de batallar con las estructuras y la sintaxis que emplean en el C30, encontre la forma de pasar una estructura como parametro de una funcion, en este caso tenemos que pasar la estructura como variable y no como valor, ademas de cumplir con ciertas sintaxis.  Una mayor explicacion la pueden encontrar en esta pagina. Por Cierto el C30 cumple bien con el estandar del C, para este aspecto. :)
Un codigo como ejemplo.

Declaracion de la estructura y las variables relacionadas
Código: [Seleccionar]
struct datos_carnet
{
int numero;
};

struct datos_carnet dni1, dni2;

Declaracion de la funcion
Código: [Seleccionar]
void escribir_dni(struct datos_carnet* dni,int dato1);

Funcion
Código: [Seleccionar]
void escribir_dni(struct datos_carnet* dni,int dato1)
{
dni->numero=dato1;
}

Uso de la funcion
Código: [Seleccionar]
escribir_dni(&dni1,50);


Con lo anterior mencionado, mi codigo para el registro FIFO quedaria asi:

Código: [Seleccionar]

struct reg_fifo
{
int ptr_e;
int ptr_l;
unsigned char reg[50];
};
struct reg_fifo fifo1, fifo2, fifo3;

void push(struct reg_fifo* fifo, char dato);
char pull(struct reg_fifo* fifo);

void push(struct reg_fifo* fifo, char dato)
{
fifo->reg[fifo->ptr_e]=dato;
if(fifo->ptr_e<fifo->ptr_l)
{
if(fifo->ptr_l<=99)
{
fifo->ptr_l++;
}
else
{
fifo->ptr_l=0;
}
}
if(fifo->ptr_e<=99)
{
fifo->ptr_e++;
}
else
{
fifo->ptr_e=0;
}
}

char pull(struct reg_fifo* fifo)
{
char temp;
if((fifo->ptr_l==0)&&(fifo->ptr_e==0))
{
temp= 0x1F;
}
if(fifo->ptr_l==fifo->ptr_e)
{
fifo->ptr_l=0;
fifo->ptr_e=0;
temp=0x1F;
}
//if((fifo->ptr_l<fifo->ptr_e)
else
{
temp=fifo->reg[fifo->ptr_l];
if(fifo->ptr_l!=99)
{
fifo->ptr_l++;
}
else
{
fifo->ptr_l=0;
}
}
return temp;
};


Gracias por tu ayuda nocturno, espero haber contribuido al foro. Saludos.  :mrgreen:



PD: ¿como coloco la enumeracion y los colores a los segmentos de codigo?.

...enrique  :-)

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Buffer FIFO en C30 para pic24F
« Respuesta #7 en: 03 de Diciembre de 2009, 12:51:55 »
Para colorearlo, selecciona el trozo de código de programa y en el desplegable que pone "GeSHi" eliges "C".
Me alegro que lo tengas resuelto.

Desconectado darklord

  • PIC10
  • *
  • Mensajes: 17
Re: Buffer FIFO en C30 para pic24F
« Respuesta #8 en: 25 de Diciembre de 2009, 19:08:30 »
Hola Enrique

Hace un tiempo yo necesite hacer un buffer circular para almacenar un stream de datos. De hecho puse un mensaje por el foro, aunque no llamo mucho la atención. No recuerdo que tan completo esta el código que subí, pero recuerdo que cuando puse el mensaje ya funcionaba el código en varios compiladores de C.

http://www.todopic.com.ar/foros/index.php?topic=23922.0

Ojala te sirva, al menos como fuente de más ideas.

Saludos  ;-)
« Última modificación: 25 de Diciembre de 2009, 19:11:47 por darklord »

Desconectado Enrique_86

  • PIC12
  • **
  • Mensajes: 62
Re: Buffer FIFO en C30 para pic24F
« Respuesta #9 en: 13 de Enero de 2010, 02:12:07 »
Hola Darklord, toda contribucion es siempre bienvenida, gracias!!  :mrgreen:
...enrique  :-)


 

anything