Autor Tema: UART PIC  (Leído 9001 veces)

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

Desconectado superprp

  • PIC16
  • ***
  • Mensajes: 137
Re: UART PIC
« Respuesta #15 en: 05 de Agosto de 2008, 12:05:58 »
Solo sucede en la recepción, en ésta tengo un while para leer datos mentras haya, ya que no creo que me lleguen datos mas rápidos de lo que tardo en leerlo. Uso dos indices, uno para leer datos y los guardo en un vector, y otro para enviar los datos.

Cuando llegan gran cantidad de bytes me deja de funcionar y el resto de interrupciones sigue funcionando, teniendo todas las interrupciones la mima prioridad, incluso dandole más prioridad a la recepción, alguna vez me a petado, pero ahora tb alguna vez, en lugar de la recepción deja de atenderme otras interrupciones como la del convertidor AD.

En las rutinas de interrupcion tengo el minimo código para que emplee el menor tiempo posible para que no intente atender a dos interrupciones a la vez, ya que si no una se la dejará sin atender y entonces ya deja de funcionar (creo que es lo que me está pasando, pero no lo entiendo porque a 20MIPS debería sobrarle tiempo para todo
« Última modificación: 05 de Agosto de 2008, 12:13:38 por superprp »

Desconectado Javicho

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 570
Re: UART PIC
« Respuesta #16 en: 05 de Agosto de 2008, 12:57:05 »
No queda otra que hacer una busqueda exhaustiva del error, para ello debes probar muchas cosas hasta las que creas obvias pero igual pruebalas, con esto me refiero a lo siguiente por ejemplo dices que estas trabajando a 20MIPS, quizás por alguna razón por ahi tu pic esta trabajando a 10MIPS o quizas menos y por ello cuando sales de la interrupción llegaron mas datos, hazle un test simple con un led para que verifiques tu velocidad, otro punto seria por ejemplo verificar que la recepción de datos trabaja bien para ello desactiva todo lo demas y asi sucesivamente anda probando cada cosa si no tienes osciloscopio prueba con prender un led al pasar por puntos criticos en tu programa y al salir de la RSI lo apagas por ahi derepente el led se queda prendido y no se paga eso quiere decir que nunca salió del RSI entonces asi te vas dando cuenta por donde esta el problema ... es tedioso hacer esto pero es muy eficaz.

Javicho.

Desconectado superprp

  • PIC16
  • ***
  • Mensajes: 137
Re: UART PIC
« Respuesta #17 en: 05 de Agosto de 2008, 13:12:53 »
Tengo unas dudas sobre el funcionamiento de las UART, te comento:
Cuado tu pones putUART1(buffer); esto envia el vector buffer por el puerto serie, pero si el vector tiene 4 posiciones, y son de tipo char, quiere decir que envias 4 bytes, esto como se hace? se envian un byte y hasta que no se envien todos no sigue ejecutando instrucciones? lo pone en algun registro de envio y sigue realizando tareas el pic y eso se va enviando? como va exactamente?

Es que además de dejar de recibir datos cuando me llegan muchos a la vez, tengo un problema constante y es la pérdida de bytes, ya que el pic hace de puente (tiene dos UART) y lo que recibe por un sitio lo manda por el otro, extrañamente de los 80 bytes que le envio solo el 60% de las veces llega el mensaje completo, siempre se pierde un byte, y no siempre es el mismo

Desconectado Javicho

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 570
Re: UART PIC
« Respuesta #18 en: 05 de Agosto de 2008, 13:26:51 »
Bueno aun no he usado los dsPICs, pero hasta los PIC18 he visto que se mantiene la misma filosofia en cuanto al USART se refiere, es decir, antes de enviar un byte debes verificar que el buffer de transmisión está vacio, si mandas 4 bytes uno tras otro el buffer se va a llenar y no vas a poder enviar mas bytes, se bloquea.

Igual pasa con la recepción, si no lees a tiempo el buffer se llena y no recibe mas bytes, tambien se bloquea, por eso para evitar esto hay flags tanto para recibir como para transmitir que te indican en que momento puedes enviar el siguiente byte.

Intuyo que esta filosofia debe mantenerse aun en los dsPICs.

Javicho.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: UART PIC
« Respuesta #19 en: 05 de Agosto de 2008, 19:29:26 »
Hola gente me meto un poco, la filosofia del manejo de la UART sea el micro que sea es atravez de colas circulares, como te comentaron antes, cuando vos envias a transmitir un "string" o un buffer, se deberian copiar estos datos a la cola circular de transmicion y se activa la interrupcion correspondiente. Ahora cuando se genera una interrupción por registro de transmicion vacio, la funcion de bajo nivel verifica que exista algo para transmitir y lo pone en el registro de transmicion. Para darse cuenta cuanto tiene que transmitir usa dos indices uno llamdo Head ( cabeza ) y otro Tail ( cola ) la idea es que cuando son iguales es que se transmitio todo. La función que manda a transmitor ( puts ) incrementa el indice Head y el handler de interrupcion maneja el Tail.
Con respecto a la recepcion la idea es la misma, salvo que normalmente la interrupcion maneja el indice Head y la funcion que lee maneja el Tail. La condición de error Overrun es que entro otro caracter en el registor de recepcion antes de que el anterior haya sido leido, en ese caso como te comentaron tenes que tener en cuenta la velocidad en la que lees y el baud rate al que trabajas.
La explicación se refiere a una UART generica que se aplica a cualquier micro.

Saludos !

Desconectado superprp

  • PIC16
  • ***
  • Mensajes: 137
Re: UART PIC
« Respuesta #20 en: 12 de Agosto de 2008, 04:08:13 »
y cuando una UART deja de funcionar (ya sea porque deja de atender interrupciones, o porque hay algun flag de error activo) como puede hacer que funcione de nuevo? que bits son los indispensables que hay que volver a activar o borrar para que vuelva a funcionar?

Además, yo entiendo que la función putUART ya controla el envio de bits, yo simplemente los pongo y ésta función debe enviarlos todo, lo que no se es si ésta función puede llegar a saturarse (no creo, porque tampoco mando tantos bits, solo es al recibirlos)
« Última modificación: 12 de Agosto de 2008, 04:26:45 por superprp »

Desconectado kdtguerrag

  • PIC10
  • *
  • Mensajes: 2
Re: UART PIC
« Respuesta #21 en: 18 de Septiembre de 2008, 03:52:12 »
Que tal amigos, estoy trabajando con el uart de un pic 16f877a, en este pic recibo una cadena de caracteres y de esta cadena necesito identificar ciertos caracteres que se encuentran por la mitad de la cadena, estoy programando con serin y serout pero esto funciona para un caracter y no se como guardar caractreres seguidos, alguien ha programado esto?, les agradesco mucho su ayuda...

Saludos

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: UART PIC
« Respuesta #22 en: 18 de Septiembre de 2008, 09:27:21 »
¿porque me deja de enviar la UART cuando le recibe muchos datos??? alguien sabe a que puede ser debido o como solucionarlo?
el bit de OERR se me activa y lo borro por software, no entiendo porque se activa ya que en la rutina de atencion a la interrupcion leo el dato y salgo y trabajo a 20MIPS no debería saltar ya que no desborda (no se porq otra razon se puede activar este bit) aun así funciona bien, excepto algunos momentos que pierde algun bit o byte, ¿ideas?

El bit ese se podría activar o bien por ruido al encender el PIC o bien por algún desfasaje en los baudeajes (y cuando hablo de desfasaje hablo de más de un 5 o 10%). 

Quisiera saber cómo es que borras el bit de OERR, tal vez allí tengas el problema.

Además revisa si tienes ruido en el canal de comunicación, cómo es el vínculo físico? es decir usas un cable? si es así es muy largo? es mallado?

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: UART PIC
« Respuesta #23 en: 18 de Septiembre de 2008, 09:32:42 »
Que tal amigos, estoy trabajando con el uart de un pic 16f877a, en este pic recibo una cadena de caracteres y de esta cadena necesito identificar ciertos caracteres que se encuentran por la mitad de la cadena, estoy programando con serin y serout pero esto funciona para un caracter y no se como guardar caractreres seguidos, alguien ha programado esto?, les agradesco mucho su ayuda...

kdtguerrag por lo que comentas de Serin y Serout asumo que estas usando algún basic ¿no?

No he usado el basic para PICs, pero la idea general de cómo se resuelve en C, aplica para cualquier lenguaje ya que el problema no está en el lenguaje sino en que el PIC tiene un buffer pequeño para la usart de 2 bytes, del cual leerás uno por vez.

La idea es la siguiente, creas un arreglo o cadena en memoria y le vas agregando caracteres en la posición indicada por un contador.

Por ejemplo, te paso un pequeño listado de pasos, en ningún lenguaje en particular.

1. Contador = 0; Cadena = ""
2. Recibes un caracter
3. Cadena = Cadena + caracter
    contador = contador+1
4. Recibes un caracter
5. Cadena = Cadena + caracter
    contador = contador+1

...
...

y así sucesivamente , lo deverás hacer hasta que contador llegue a un valor límite que le impongas (tampoco puede ser muy grande ya que el pic tiene memoria limitada).


Tal vez en el foro de Basic haya alguien que tenga una solución específica para el problema, si te pasas por allí con la pregunta de seguro encontrarás una respuesta más  puntual.   :)

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)


 

anything