Autor Tema: velocidad recepción datos UART  (Leído 3573 veces)

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

Desconectado superprp

  • PIC16
  • ***
  • Mensajes: 137
velocidad recepción datos UART
« en: 01 de Abril de 2008, 18:23:05 »
Buenas,

Mi pregunta era sobre la lectura de los datos del puerto serie, es decir, cada vez que me llega un dato al PIC, me interrumpe y lo recibo de RCREG, lo leo y me salgo de la interrupción. Hasta ahí bien, pero desde el PC se mandan cadenas de varios BYTES en una misma trama, por lo tanto éste metodo de leer es muy dificultoso, cuando te interrumpen porque te envian un dato en el PIC, puedes leer 1byte, y seguidamente otro y así hasta que veas q RCREG está vacío?? hay alguna forma de leer mas rápido que por interrupciones uno a uno???

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: velocidad recepción datos UART
« Respuesta #1 en: 01 de Abril de 2008, 18:49:15 »
Que tal superprp!
Mira eso no es problema si trabajas con lenguajes de alto nivel  como el proton, pic basic,ccs...
por ejemplo en proton podrias crear un array con la longitid del numero de bytes a recibir, asi

dim str1[8] as byte  'aqui puedes almacenar hasta 8 datos

serin portb.0, 84, [str1] 'conesta instruccion puees almacenar los datos que llegan por el puerto b bit 0 a 9600 Baudios
print at 1, 1, dec str1   ´y asi muestras por pantalla el valor decimal del dato recibido

En el foro hay mucha informacion al respecto, si programas en asembler hay muchas rutinas en el foro que puedes consultar o por internet.
Se me olvidaba si trabajas con un cristal de 4Mhz el tiempo que tarda el micro en ejecutar cada instruccion es de 1us (con excepcion de las de salto que tardan el doble) ahora bien si te estas comunicando a 9600 bps esto daria una velocidad de 1/9600 = 104.16us la duracion de cada bit, si multiplicamos esto por 10 (1 bit de start 8 de datos y uno de stop)nos daria 1041.6us el tiempo que tarda en llenarse el buffer de recepcion por lo que puedes realizar facilmente una rutina que te permita leer el buffer y esperar por el nuevo dato, sin ningun problema y si quieres mayor velocidad puedes utilizar un cristal de 20Mhz y con ello subir mucho mas la velocidad del usart

saludos
« Última modificación: 01 de Abril de 2008, 18:58:35 por RALF2 »

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 624
Re: velocidad recepción datos UART
« Respuesta #2 en: 01 de Abril de 2008, 20:12:08 »
Hola superprp, la cosa es mas o meno asi , El USART de los PIC de gama media tienen un buffer de recepcion de dos bytes y medio, esto que quiere decir, bueno que puedes tener dos bytes en espera mientras estas recibiendo un tercero para leer el registro RCREG antes de que se produzca un overflow y se produzca un error.

Por ejemplo si transmites a 9600 baudios , tienes aproximadamente 1 ms entre bytes ,cuando se envian de forma continua claro, entonces cuando recibes el primer byte y RCIF se pone en uno  tienes 2,5 ms para leer ese primer byte antes de que la llegada de los otros produzcan  overflow,  esto puedes hacerlo revisando cada cierto tiempo el RCIF o con interrupciones, que me parece mas eficiente.

Cuando utilizas interrupciones  debes de tratar de hacer la rutina de atencion de interrupcion pequeña , esto para que no pierdas mucho tiempo en ella, lo mas simple en este caso es  que cuando recibas un byte lo guardes en un buffer hasta que todos los bytes que esperas lleguen, osea que el PIC debe poder determinar cuando terminar de recibir ya sea fijando una cantidad de bytes o poniendo un timeout

Bueno espero haberte ayudado

Saludos
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: velocidad recepción datos UART
« Respuesta #3 en: 01 de Abril de 2008, 21:35:26 »
Hola, tanto en assembler como en un lenguaje de alto nivel lo podes implementar. La idea es implementar un buffer en anillo, donde tenes un buffer de recepcion de un largo determinado ( depende de la RAM disponible ) y dos indices, uno es actualizado cuando se produce la interrupcion y el otro es actualizado por la funcion que saca los datos, cuando los dos indices son iguales supones que todos los datos recibidos ya fueron leidos. Hay mucha info en la web sobre como implementar "ring buffers", y la idea puede ser implemantada en un lenguaje de alto nivel como en assembler.
Saludos !

Desconectado superprp

  • PIC16
  • ***
  • Mensajes: 137
Re: velocidad recepción datos UART
« Respuesta #4 en: 02 de Abril de 2008, 04:27:47 »
entonces la idea es que tarde poquito en atender cada dato, los guarde, y los voy procesando y leyendo en los ratos libres, porque me sucede cuando le envio al PIC durante 30 segundos o así un monton de paquetes de 4bytes espaciados temporalmente 50ms unos paquetes de otros, y durante 15 o 20 segundos bien, pero llega un momento en el que satura, en condiciones normales, cada paquete que me envian de 4bytes lo proceso correctamente, pero en condiciones de intentar "petar" el programa no lo aguanta

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 624
Re: velocidad recepción datos UART
« Respuesta #5 en: 02 de Abril de 2008, 10:40:03 »
En tu caso (paquetes de 4 bytes cada 50 ms)  podrias realizar la recepcion de la siguiente forma:

Creas un buffer de 4 bytes en memoria(RxBuffer), utilizas un contador de bytes (Cont) , un puntero (I) y una bandera (DatosOK), en la rutina de interrupcion  haces algo asi :
Código: [Seleccionar]

void ISR_Rx()
{
RxBuffer[I] = RCREG;      //Lees el byte
Cont ++;
if(Cont ==4)
DatosOK = 1;
}

Una vez que la bandera DatosOK sea puesta en uno tu programa tendra 50 ms para procesar estos 4 bytes, por lo que en tu programa principal deberas revisar cada cierto tiempo esta bandera para saber cuando procesar los bytes recibidos. Adicionalmente puedes deshabilitar la interrupcion de recepcion mientras procesas los bytes y cuando terminas de procesarlos  vuelves a habilitar esa interrupcion e inicializas otra vez las variables que usas en la rutina de interrupcion (Cont = 0;    I = 0 y DatosOK = 0)

Saludos
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube


 

anything