TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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
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
#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 :-/
-
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
#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
}
}
-
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!
-
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
-
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...
-
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:
CheckSum=0;
for(k=0;k<10;k++){
CheckSum^=Trama[k];
}
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!
-
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
// 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];
}
-
^ -> Bitwise exclusive or operator
Es un operador de C.
-
^ -> 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
-
^ -> 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