TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: dogflu66 en 20 de Diciembre de 2004, 18:39:00
-
Algunas veces se me bloquea la usart en modo rx si no leo suficientemente rapido los registros de esta, lo he solucionado activando sus interrupciones para saber cuando tengo dato nuevo y evitar el bloqueo, sabe alguien como detectar que esta bloqueada y desbloquearla en tiempo de ejecucion.....
-
Vale, pues tu mismo te has contestado.
Segun la hoja de caracteristicas de los pics, estos tienen un buffer de entrada de dos bytes "y algo". Es decir tienen dos bytes mas el que se esta recibiendo, si al terminar de recibirse el tercero no has vaciado el buffer de entrada, se satura y se bloquea.
Hay un bit que te indica que el buffer se ha saturado y hay que resetearlo para desbloquear la recepcion.
El desbloqueo debe hacerse por programa.
Para saber el nombre exacto del bit... a la hoja de datos, creo que el nombre es diferente en algunas series de la gama alta y como no dices con que pic ni con que lenguaje trabajas...
-
El bit del que hablas es el OERR, es del registro RCSTA.
Los pics de la gama media son iguales, me refiero a la instruccion y registro.
No basta con limpiar este bit, debes hacer bcf RCSTA,CREN y luego bsf RCSTA,CREN para limpiar el error.
OERR significa overrun error, o sea que como dice el colega arriba no has leido los 2 bytes del FIFO y el tercero que ha entrado , bloqueándote la USART.
Salutes
-
El PIC es PIC16F877
El lenguajes es Basic Compilado
Gracias por la respuesta, conocía estos registros y el problema que pueden dar
Pero no di con la tecla para asegurar un desbloqueo de los dos bytes famosos
añadire estas instrucciones en la tabla de interrupciones para que se ejecuten en el caso de detectar el error.
Mis plaquitas me funcionan bien y no me dieron fallos de comunicacion pero es una tranquilidad sabiendo que este fallo esta controlado, a estos dos registros de la USART les he añadido 50 posiciones de memoria para formar un buffer completo y entiendo por que los registros de la USART funcionan de esta manera, para no perder datos, mi buffer por software funciona igual, si se llena no deja entrar mas datos para no perder ningun comando acumulado, hay que tener en cuenta que es una red inalambrica de plaquitas funcionando con pic16f876 y pic16f877... 
-
Yo tengo implementadas en un par de proyectos las rutinas que hay en la pagina de melabs ( con algunas modificaciones ) para recepcion por interrupcion en las cuales esta explicado el como desbloquear tras un error y el como detectarlo.
Hay una cadena de mensajes del amigo abago sobre un proyecto en el que se peleo mucho con este tema y esta todo muy desarrollado.
Leetelo y veras como el colega llego a tener algo funcionando perfectamente.
-
Gracias, echare un vistazo...
-
Saludos, acabo de leer sobre tu inquietud y precisamente tengo la misma, escribo para preguntar si encontraste alguna solución ya que yo no lo he logrado, intente recetear el bit OERR de esta manera
bcf RCSTA,CREN ;Deshabilita recepcion
bcf RCSTA,SPEN ;SPEN=1 Deshabilita puerto serie
bsf RCSTA,CREN ;habilita recepcion
bsf RCSTA,SPEN ;SPEN=1 habilita puerto serie
pero no lo soluciona, estoy intentando recibir datos de un gps y mostrarlos en pantalla, lo que seria una de las etapas de mi proyecto,
por el momento solo me muestra los dos primeros bytes.
-
La mejor solucion es usar la interrupcion para recibir caracteres. De esa forma no deberia jamas producirse un overrun. Y lo guardas en un buffer, luego podes tranquilo dentro del programa principal leer el buffer ese.
-
Ok muchas gracias por el dato, me pondré a trabajar en eso