Autor Tema: Hasta que punto es fiable el INT_RDA ??  (Leído 2997 veces)

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

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Hasta que punto es fiable el INT_RDA ??
« en: 06 de Marzo de 2007, 15:41:02 »
Hola a todos, queria saber si alguien a tenido problemas con la interrupcion de recepcion por el puerto seri (INT_RDA).

Estoy haciendo una aplicacion en la que recibo bastantes caracteres y a veces se come algunos, me explico con un ejemplo:

Tendira que recibir esto
0x0d 0x0a OK 0x0d 0x0a
0x0d 0x0a CONNECT,1234567890 0x0d 0x0a

y pareces que aveces se coma algunos caracteres.

Creo que podria ser de la interrupcion, se puede producir en mitad de algun proceso del programa y dejar a medias lo que estaba haciendo, y por eso a veces funciona bien y otras no.

Alguien a tenido algun problema de este tipo????

Un saludo.
BitPIC

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Hasta que punto es fiable el INT_RDA ??
« Respuesta #1 en: 06 de Marzo de 2007, 16:00:33 »
No, nunca he tenido problema alguno con la INT_RDA usándola con los pines de la USART del PIC.
Y estoy a 115200 baudios ...

Código: C
  1. #use rs232(baud=115200, xmit=EM202_RX, rcv=EM202_TX)

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Azicuetano

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1020
    • Aplicaciones Electrónicas en Alicante.
Re: Hasta que punto es fiable el INT_RDA ??
« Respuesta #2 en: 06 de Marzo de 2007, 19:53:58 »
Yo núnca he detectado el problema que comentas colega bitpic.

Lo que si que me ha pasado y que es relativamente curioso es lo siguiente.

En una aplicación que continuamente mandaba datos desde el PIC al PC (y del PC al PIC) se me producían colisiones y se colgaba totalmente el micro. Se quedaba atascado con un funcionamiento un poco extraño. Al final, para no modificar el hardware haciendo un control de flujo en la comunicación con 2 lineas adicionales utilicé lo siguiente:

Código: [Seleccionar]
#use rs232(baud=9600, xmit=pin_C6, rcv=pin_C7, ERRORS)
La interrupción se queda:

Código: [Seleccionar]
#int_rda
void serial_isr()
{
//   Keypress=0x00;

   if ( rs232_errors & 0x04 )  // get framing error bit from Rx status reg
   {
      cRxErrorFlag=1;
   }


   if(kbhit())
   {

      Keypress=getc();

      buffer_char(Keypress);                       // lo recibo y lo añado al Buffer de Recepcion

//      rtc_get_date(day,mth,year,dow);      //coge hora,minuto,segundo
//      printf("\n%2u/%2u/%2u/%2u", day, mth, year, dow);
  }
}

Y en el bucle principal tenía:

Código: [Seleccionar]
if(cRxErrorFlag==1)
   {
      printf("ERROR*ERROR#");
      cRxErrorFlag=0;
   }

De esta forma cada vez que se me producía este error, mandaba al PC el comando "ERROR*ERROR#" y se rearmaba la comunicación como si nada hubiera pasado (exceptuando la pérdida del dato que colisionó, claro). Esto me está salvando el pescuezo mientras implemento el control de flujo  :mrgreen:


Un saludo desde Alicante.

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Re: Hasta que punto es fiable el INT_RDA ??
« Respuesta #3 en: 07 de Marzo de 2007, 11:41:16 »
No se si puede ser porque tengo definidos dos puertos, uno software y otro hardware, pero el software ahora mismo para hacer las pruebas no lo uso, solo uso el hardware.

#include <18F252.h>

#fuses HS,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOWDT

#use delay(clock=20000000)
#use I2C(master,sda=PIN_B1,scl=PIN_B0,FAST,FORCE_SW)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, stream=BLUETOOTH,errors)
#use rs232(baud=9600, xmit=PIN_B3, rcv=PIN_B4, stream=SD,errors)

Esta es la configuracion que tengo. No se si puede ser por tener dos puertos serie o por algun fuse que no haya configurado bien ???

Gracias, segurie investigando a ver de que puede ser.
BitPIC

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Re: Hasta que punto es fiable el INT_RDA ??
« Respuesta #4 en: 07 de Marzo de 2007, 12:23:02 »
Creo que ya he encontrado la solucion, era una tonteria en la que no me habia fijado. En un bit de flanco que tenia para saber si habian llegado datos en vez de ponerlo a 0 haciendo flag=0 habia puesto flag==0 sin querer y solo por esa tonteria, ni lo detectaba el CCS ni me habia dado cuenta yo, pero no funcionaba.

Otra pregunta, a lo mejor tendira que abrir otro hilo pero por si es de facil solucion lo digo aqui, una vez que me han llegado los datos los guardo en un bufer y los muestro en una LCD asi:

printf(gclcd_putc,"1.%c 2.%c 3.%c",cbuff[0],cbuff[1],cbuff[2]);

y me queda lo siguiente:

1. 2.O 3.K  // esto solo es para ver que llega bien el dato y en que posicion del bufer esta cada letra.

y luego para saber si ha llegado un OK hago esto:

if(cbuff[1]=="O" && cbuff[2]=='K'){   // Comparo inicio del buffer con comando
      gclcd_gotoxy(10,40);
      printf(gclcd_putc,"OK");
}

Pero esto no me funciona y no se por que. El codigo es el siguiente:

void procesa_comando(void){

   flagcommand=0;

   if(cbuff[1]=="O" && cbuff[2]=='K'){   // Comparo inicio del buffer con comando
      gclcd_gotoxy(10,40);
      printf(gclcd_putc,"OK");
   }

   if(cbuff[1]=='C' && cbuff[2]=='O'){   // Comparo inicio del buffer con comando
      gclcd_gotoxy(10,50);
      printf(gclcd_putc,"Conexion");
   }
   
   if(cbuff[1]=='D' && cbuff[2]=='I'){   // Comparo inicio del buffer con comando
      gclcd_gotoxy(10,60);
      printf(gclcd_putc,"Desonexion");
   }
   
   gclcd_gotoxy(10,n);
   printf(gclcd_putc,"1.%c 2.%c 3.%c",cbuff[0],cbuff[1],cbuff[2]);
   
   inicbuff();                          // Borro buffer.
   
   if(n<120){
      n=n+10;
   }else{
      n=10;
   }

}

Alguien sabe por que puede ser???
BitPIC

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Hasta que punto es fiable el INT_RDA ??
« Respuesta #5 en: 07 de Marzo de 2007, 12:31:41 »
Creo que debes revisar bien el código, porque puede pasarte algo como lo siguiente:

Recuerda en principio que el proceso de interrupción es asincrónico, es decir, no sabes cuando va a ocurrir, así que si estás en una parte de tu programa donde vas a comenzar a leer un caracter que ya tu INT_RDA guardó en una variable y justo antes de hacer la lectura, hay otro dato disponible y entra la IT, entonces seguramente perderás el dato no leido porque INT_RDA debe sobreescribirlo y cuando te retorne a tu programa, habrás perdido el dato que ibas a leer.

Lo mejor para este tipo de problemas es tener una cola circular con dos punteros uno al primer dato a sacar de ella y otro al último dato metido, así INT_RDA pone datos y tu programa saca datos sin temor a que se pierdan caracteres.

Este es un método, pero no el único.

Espero que te sirva

Un saludo Reinier

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Re: Hasta que punto es fiable el INT_RDA ??
« Respuesta #6 en: 07 de Marzo de 2007, 12:49:13 »
gracias reiniertl pero la parte de la interrupcion ya esta arreglada habia sido un despiste mio, como decian RedPic y Azicuetano funciona de momento perfectamente, el problema que tengo ahora es que cuando comparo los char del bufer que he creado con los datos recibidos no me hace bien la comparacion.  :-)
BitPIC

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Re: Hasta que punto es fiable el INT_RDA ??
« Respuesta #7 en: 07 de Marzo de 2007, 13:05:36 »
Bueno igual pregunto demasiado deprisa, tambien he descubierto por que no funcionaba  :D no me digais porque pasa pero era cuestion de poner un retardo antes de hacer las comparaciones.

De momento esto empieza a funcionar bien despues de  3 dias jejeje :D (tampoco esta mal si tenemos en cuenta que nunca he hecho nada con interrupciones ejej)

Bueno gracias por todo.

Un saludo
BitPIC

Desconectado umalrovi

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 158
    • Aplicaciones Electrónicas
Re: Hasta que punto es fiable el INT_RDA ??
« Respuesta #8 en: 01 de Mayo de 2007, 05:55:42 »
Buenas Bitpic, esa función para recibir/mandar datos por la RS232 la utilizo yo también ya que dentro de poco publicaré un proyecto del control del PIC con Labview. Esa rutina me la conozco muy bien de la página del foro y de redpic.

Cuando entras en la función procesa_comando () y luego comparas el inicio del buffer con el comando, debes hacerlo desde la posición 0 del buffer. Si te has definido en variables en RAM como lo hizo Redpic:
int xbuff=0x00;
char cbuff[lenbuff];

if(cbuff[1]=="O" && cbuff[2]=='K'){   // Comparo inicio del buffer con comando
      gclcd_gotoxy(10,40);
      printf(gclcd_putc,"OK");
}

Deberás cambiar cbuff [1] por cbuff[0], se quedaría así:

if(cbuff[0]=="O" && cbuff[1]=='K'){   // Comparo inicio del buffer con comando
      gclcd_gotoxy(10,40);
      printf(gclcd_putc,"OK");
}

Ya me dices que tal te ha ido, un saludo desde la terreta Alicantina!!!
Aplicaciones Electrónicas
http://www.neoingenia.com/