TODOPIC
Microcontroladores PIC => dsPIC => Mensaje iniciado por: ingwirbo en 12 de Octubre de 2012, 01:37:28
-
Estimados
Tengo el siguiente problema:
Se que el buffer de recepcion del dspic30f4013 es de 4 bytes. Ahora en la aplicación que estoy trabajando estoy utilizando los dos puertos seriales, y cada uno se conecta a dos equipos diferentes, por lo que por uno de los puertos me estan interrogando a traves del uart2 y yo estoy interrogando al otro equipo a traves del uart1, entonces dado esto se da el caso en que mientras estoy interrogando el equipo a traves del uart1, simultaneamente me estan interrogando por el uart2, por lo que no tengo en cuenta estos datos. Pero entonces que pasa, que cuando estoy disponible para recbir los datos de quien me interroga, parece que el puerto pierde sincronía o no recibe el último dato, parece que estuviera recibiendo un dato anterior y no el que acaba de llegar, y la unica forma de volverlo a recibir normalmente es deshabilitando y luego volviendo a habilitar el uart2.
Por favor existe alguna forma de borrar el buffer de recepción sin necesidad de deshabilitar el uart2. O cualquier otra sugerencia para evitar este problema se los agradeceria mucho.
-
Hola, yo normalmente uso interrupciones para la lectura del uart y manejo directamente el código, es decir no recurro a las librerias de microchip. Cómo lo estas haciendo?, si es posible coloca el código para ver como lo estás haciendo.
saludos.
-
Hola, yo normalmente uso interrupciones para la lectura del uart y manejo directamente el código, es decir no recurro a las librerias de microchip. Cómo lo estas haciendo?, si es posible coloca el código para ver como lo estás haciendo.
saludos.
Estimado Kallitos
No estoy usando interrupciones porque en el momento que estoy interrogando al equipo a traves del uart1, no puede detener este proceso para atender el uart2. por esta razón el problema sucede cuando estoy atendiendo simultaneamente los dos puertos ya que siempre le doy prioridad al uart1 y lo que llega al uart2 solo lo tengo en cuenta cuando estoy esperando respuesta por aqui (esto es un slot de 500 ms).
Este es una parte del codigo:
ESTADO_SURTIDORES:
MOV #0X00010,W0
MOV W0,CONTEO
MOV #0X0900,W2
MOV #0X0000,W0
MOV W0,CARA_SURTIDOR
MOV BANDERAS_SURTIDOR,W0
CALL DESHABILITAR_UART2
ESTADO_SURTIDORES_A:
;********************** ;ESTE ES EL SLOT DE TIEMPO DE 500 ms QUE ESPERO PARA RECIBIR UNA INTERROGACION EN UART1
CALL INICIAR_TIMER3
CALL RECIBIR
BTSS T_ESPERA,#0
GOTO TEST_485
CALL PARAR_TIMER3
;**********************
ESTADO_SURTIDORES_LP:
CLRWDT
CALL PARAR_TIMER3
CALL TDELAY ;***********50 MILISEGUNDOS
CALL HABILITAR_UART2
; CALL DESHABILITAR_UART1
;*******************
MOV CARA_SURTIDOR,W0
CALL PARIDAD_PAR
CALL ENVIAR2
CALL RECIBIR2
MOV W0,DATA0
CALL RECIBIR2
MOV W0,DATA1
GOTO ESTADO_SURTIDORES
Espero haya sido claro.
Gracias y Saludos
-
Joer en asm no veo nada, espero alguien mas te ayude.
Saludos.
-
Kallitos
Independientemente de que sea asm, por casualidad sabes como borrar el bufer del usart sin necesidad de deshabilitarlo, o tu tienes alguna forma de hacerlo.
Porque tengo una duda, cuando nos dicen que en el buffer tiene una capacidad de 4 bytes esto significa que el usart es capaz de almacenar hasta 4 bytes antes de que este es leido, ahora si quiero recuperar todos estos bytes almacenados en el buffer tendría que leer 4 veces el UxRXREG. o como maneja esto el usart?.
Te agradezco si conoces algo al respecto.
Saludos
-
Si no pensas nunca escuchar la recepción de datos por UART2 mientras estás escribiendo/leyendo de la UART1, lo mejor que me parece que podés hacer es deshabilitar la UART2 justo antes de comenzar a trabajar sobre la UART1, y volver a habilitarla al terminar su trabajo.
El que indica desbordamiento del buffer es el flag OERR, mapeado en UxSTA<1>. Se setea en varias situaciones, entre ellas, cuando has superado la capacidad de almacenamiento del buffer de la UART. El datasheet no indica nada al respecto, pero tal vez limpiándolo (poniendolo a cero) te limpie también el buffer de recepción. Igualmente creo que con limpiar ese bit, no tendrías la necesidad de reiniciar la UART.
Saludos.
-
El que indica desbordamiento del buffer es el flag OERR, mapeado en UxSTA<1>. Se setea en varias situaciones, entre ellas, cuando has superado la capacidad de almacenamiento del buffer de la UART. El datasheet no indica nada al respecto, pero tal vez limpiándolo (poniendolo a cero) te limpie también el buffer de recepción. Igualmente creo que con limpiar ese bit, no tendrías la necesidad de reiniciar la UART.
Estimado Brunof
Con relación a lo que me comentaste y que cito aqui, la solución fue la siguiente: en ningún momento deshabilité el uart2, simplemente antes de utilizarlo sense la bandera de OERR que me indicaste y si estaba en uno la borraba de lo contrario la dejaba igual. de esta forma he logrado que nunca se pierda la sincronía de los datos cuando leo uno u otro puerto.
Muchas Gracias
Saludos
-
Considero que tanto para recibir y/o transmitir en ambos puertos no es necesario deshabilitar el modulo "opuesto", la situación amigo es que uso C30 y alli lo que hago es hacer un arreglo de bytes a modo de buffer por software.
La recepción usando interrupción indica cuando llega el byte, en el código de la interrupción leo el buffer lo guard en el buffer e inmediatamente salgo de la misma, y claro usar un byte que indique la operación con los datos recibidos.
En la transmisión de igual manera, hacer un buffer e iniciar el procedimiento habilitando la interrupción y en el código de interrupción leer el buffer y colocarlo en el registro TX.
Considero que los dspic son lo suficientemente rápidos para hacer lo que mencionas, he usado muchas interrupciones en el mismo micro y éste no me ha decepcionado.
saludos!!
-
Considero que tanto para recibir y/o transmitir en ambos puertos no es necesario deshabilitar el modulo "opuesto", la situación amigo es que uso C30 y alli lo que hago es hacer un arreglo de bytes a modo de buffer por software.
La recepción usando interrupción indica cuando llega el byte, en el código de la interrupción leo el buffer lo guard en el buffer e inmediatamente salgo de la misma, y claro usar un byte que indique la operación con los datos recibidos.
En la transmisión de igual manera, hacer un buffer e iniciar el procedimiento habilitando la interrupción y en el código de interrupción leer el buffer y colocarlo en el registro TX.
Considero que los dspic son lo suficientemente rápidos para hacer lo que mencionas, he usado muchas interrupciones en el mismo micro y éste no me ha decepcionado.
saludos!!
Estimado Kallitos
Entiendo lo que mencionas pero al habilitar la interrupción te comento que me podría suceder. Resulta que cuando yo interrogo el equipo a traves de uart1, podría obtener una respuesta hasta de 120 bytes, por lo cual si en el momento que estoy recibiendo estos datos se acitva la interrupción del uart2 pues voy a recibir tambien información de quien me interroga a traves de este puerto que también son tramas granddes (50 bytes), entonces puede suceder que pierda datos que son críticos del equipo conectado al uart1. por esta razón preferí no usar las interrupciones en este caso. Ahora con relación al problema que tenía, borrando la bandare de OERR cuando esta se activa pude solucionar el inconveniente que tenía.
De verdad muchas gracias por tu valiosa ayuda.
Saludos,
-
No leí que ya lo habías solucionado. :)
Saludos.