TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Kamus23 en 04 de Mayo de 2011, 19:03:44

Título: Como hacer un bufer de recepcion
Publicado por: Kamus23 en 04 de Mayo de 2011, 19:03:44
a ver e buscado y leido t releido en el foro pero no logro entender como hacer un buffer de recepcion para puerto serial... tengo un pic que me envia serialmente el valor de la temperatura tomada por un lm35
PIC TX

Código: [Seleccionar]
char temp
.....
.....
hacemos todo los del CAD y tenemos el valor de la temperatura y la envio serialmente al otro PIC
putc(0xff);
 putc(temp);

aja mi si uso un cable para comunicar ambos PIC no hay problema... el problema es que quiero hacerlo inalambricamente pero necesito emplaer un buffer de recpcion para capturar el dato valido y no cualquier dato o ruido

PIC RX

Código: [Seleccionar]
#use rs232(baud=2400, xmit=PIN_C6, rcv=PIN_C7)
char temp1=' ';
#int_rda
void serial_isr() {
    temp1=0x00;
   if(kbhit()){
         temp1=getch();
         printf("\r\n%d ",temp1); // envia la temperatura serialmente
         lcd_gotoxy(8,1);
         printf(lcd_putc,"\fT=%d",temp1);  //MUESTRA EN EL LCD EL VALOR DE TEMPERATURA
         delay_ms(100);
}


hasta ahi funciona bien usando como medio de trasnmisio el cable... pero cuando paso a RF no me funciona...

quiero es hacer un buffer en donde primero guarde la trama y pregunte si esta presente el dato 0xff que es mi comienzo de trama para poder decir que es un dato valido....

e visto en el foro que dicen algo asi:

int i=0;
char buffer[8]=;
luego guardan y empiezan a hacer un bucle para comparar los primero bits si son correctos.... que alguien si puede me explique mas de este temaaa  :-/


Título: Re: Como hacer un bufer de recepcion
Publicado por: PalitroqueZ en 04 de Mayo de 2011, 20:44:35
como la comunicación es unidireccional, entonces solo tienes una opción: detectar y enganchar correctamente la trama de entre tantas que llegan.

una idea podría ser que a la trama que coloques un encabezado y un fin de trama (puede ser un carácter que no tenga relación con los datos que quieres transmitir).

siguiendo la idea, y mirando el código que Subió Diego :

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

el pic procesará los datos de byte en byte


Código: [Seleccionar]
#int_rda
void serial_isr() {                    // Interrupción recepción serie USART
 if(kbhit()){                        // Si hay algo pendiente de recibir ...
      rcvchar=getc();                  // lo descargo y ...
      addcbuff(rcvchar);               // lo añado al buffer y ...
   }
}

luego en addbuff

void Add_buffrec(char c){                         // Añade caracter al Buffer de Recepcion
     if c==xxxx{
     // aqui va el codigo que corresponde al fin de trama
        disable_interrupts(int_rda);
     }
     if c==yyy
     // aqui va el codigo que corresponde al inicio de trama
     bandera=1 //activa el procesamiento de captura de datos
    }
    if bandera==1{
         buffrec[xbuffrec++]=c;               // Añade caracter recibido al Buffer
    }
}
Título: Re: Como hacer un bufer de recepcion
Publicado por: Suky en 04 de Mayo de 2011, 22:01:35
Aprovechando que tienes un microcontrolador de ambos lados, puedes agregarle a la trama un CheckSum como para determinar que los datos recibidos son validos.


Saludos!
Título: Re: Como hacer un bufer de recepcion
Publicado por: jukinch en 05 de Mayo de 2011, 11:13:59
Kamus23:
              Para ver sobre lo que explica Suky  de CheckSum
podés ver aquí :
http://www.todopic.com.ar/foros/index.php?topic=25627.msg209598#msg209598
           Allí BrunoF de manera muy clara enseña cómo realizar un CRC para diversos dispositivos.
          Saludos.
                Jukinch
Título: Re: Como hacer un bufer de recepcion
Publicado por: Kamus23 en 09 de Mayo de 2011, 00:02:13
graciasssss jejeje estoy en fases de prueba con el buffer, apenas tenga resultados les comento..
y con respecto al checksum mmm me parece muy buena idea... leere el articulo del CRC a ver si comprendo como usarlo...
Título: Re: Como hacer un bufer de recepcion
Publicado por: Suky en 09 de Mayo de 2011, 10:39:14
y con respecto al checksum mmm me parece muy buena idea... leere el articulo del CRC a ver si comprendo como usarlo...

Un CheckSum sencillo que utilizan por ejemplo los GPS es:

Código: C
  1. CheckSum=0;
  2. for(k=0;k<10;k++){
  3.        CheckSum^=Trama[k];
  4. }

Con eso ya tienes 1 byte para controlar si la data recibida es la misma que el transmisor envío o paso algo  :mrgreen:


Saludos!
Título: Re: Como hacer un bufer de recepcion
Publicado por: Kamus23 en 09 de Mayo de 2011, 15:32:35
jejejej ya hice la prueba con el ejemplo de buffer que me facilito el pana palitroqueZ, solo tengo algunos detallitos que corregir... ya que logro recibir el dato correcto, pero no logro desabilitar y habilitar la interrupcion serial para esperar un nuevo dato.. ahi les dejo el codigo

Código: [Seleccionar]
// CONSTANTES /////////////////////////////////////////////////////////////////

int const lenbuff=32;                  // Longitud de buffer, Ajustar
                                       // a lo que desees (o te sea posible)

// VARIABLES EN RAM ///////////////////////////////////////////////////////////

int  xbuffrec=0x00;                       // Índice: siguiente char en cbuff
char buffrec[lenbuff];                   // Buffer
char rcvchar=0x00;                     // último caracter recibido
int1 bandera=0;                    // Flag para indicar comando disponible
char x=0x00;
char fin=0x00;
void  addcbuff(char c);                 // añade caracter recibido al buffer

#int_rda
void serial_isr() {                    // Interrupción recepción serie USART
 if(kbhit()){                        // Si hay algo pendiente de recibir ...
      rcvchar=getc();                  // lo descargo y ...
      addcbuff(rcvchar);               // lo añado al buffer y ...
      rcvchar=0;
   }
}

void addcbuff(char c){ // Añade caracter al Buffer de Recepcion
     if (c==0x22){
     // aqui va el codigo que corresponde al fin de trama
     fin=c;
        putc(x);
        bandera=0;}
      if (c==0x21){
     // aqui va el codigo que corresponde al inicio de trama
     bandera=1; //activa el procesamiento de captura de datos
    }
    if (bandera==1){
        x= buffrec[xbuffrec++]=c;               // Añade caracter recibido al Buffer
}
}
void main(){
setup_adc_ports(NO_ANALOGS); //puerto ADIGITALES
lcd_init();                       //INICIALIZA EL LCD
set_tris_a(0x01);
enable_interrupts(global);
enable_interrupts(int_rda);
 do{
 if(fin==0x22){
 lcd_putc("\fCONTROL TEMPERATURA"); //IMPRIME EN PANTALLA
lcd_gotoxy(7,2);                  //COLOCA EL CURSOR EN COLUMNA 7 FILA 2
printf(lcd_putc,"T=%d",x); //muestro el dato en la LCD en decimal
 delay_ms(500);
 }
}while(1);

 }
       

cuando hablamos de este ejemplo de ceckSum, que significa  ^=  ????
      CheckSum=0;
      for(k=0;k<10;k++){
            CheckSum^=Trama[k];
      } 
Título: Re: Como hacer un bufer de recepcion
Publicado por: Suky en 09 de Mayo de 2011, 16:31:32
Citar
^  ->  Bitwise exclusive or operator

Es un operador de C.
Título: Re: Como hacer un bufer de recepcion
Publicado por: Kamus23 en 09 de Mayo de 2011, 23:01:31
Citar
^  ->  Bitwise exclusive or operator

Es un operador de C.

mmmm sep jejeje se que es un operador de C, pero es un Or exclusivo?? me puedes decir que es lo que hace en si? gracias
Título: Re: Como hacer un bufer de recepcion
Publicado por: Suky en 10 de Mayo de 2011, 10:02:12
Citar
^  ->  Bitwise exclusive or operator

Es un operador de C.

mmmm sep jejeje se que es un operador de C, pero es un Or exclusivo?? me puedes decir que es lo que hace en si? gracias

Si es or exclusivo bit a bit. En wikipedia puedes ver una tabla de verdad


Saludos