Autor Tema: USART con MPSIM  (Leído 2597 veces)

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

Desconectado pollastre

  • PIC12
  • **
  • Mensajes: 65
USART con MPSIM
« en: 12 de Julio de 2006, 13:47:20 »
Hola a todos,

llevo bastante avanzado el proyecto que tengo entre manos, y cuando ví la característica de simular I/O para la USART por software a través de MPSIM, pensé que esto me podría ahorrar muuucho tiempo de pruebas.

Sin embargo, despues de dar algunas vueltas con el "estimulador" USART y consultar algunos foros de microchip, la sensación general que tengo es que el tema de la simulación de la USART tiene algunos fallos que, o bien por mi ignorancia o bien por el propio MPLAB IDE (uso la v7.40), el asunto no termina de funcionar correctamente.
Si alguno de vosotros se ha peleado con el tema de la simulación USART, agradecería sus comentarios y/o ayuda.

Por ejemplo, para empezar no sé por qué, pero si le meto el siguiente archivo de estímulos a la simulacion USART, algo tan sencillo como :

//--------
wait 10000 ms
41 42 43   
// simplemente mando el paquete "ABC"
//-------------
 
en cuanto cumplen los 10 segundos de espera, la simulación USART me lanza una interrupcion de RX en toda regla , PIR1<RCIF> = 1, aun cuando tengo explícitamente desactivada esa interrupción ( PIE1<RCIE> = 0 ). De hecho, si marcas un breakpoint en la rutina de handler de la interrupcion de RX e inspeccionas el valor de PIE1 en ella, se ve perfectamente como RCIE = 0..... es decir, estoy en medio de una interrupción a  la que teoricamente no debería poder llegar nunca !!!

Se diría que el hecho de inyectar un archivo USART hace que salte la interrupción RX aunque la tengas deshabilitada con RCIE = 0... cosa que evidentemente no puede ser... o algo está muy mal aquí o yo estoy pasando algo gordo por alto.

Otro comportamiento raro que tiene es que en ese mismo breakpoint, que es la llegada del primer caracter (0x41), me salta RCSTA<OERR> = 1 , es decir, me da un overrun del RCREG. Si en teoria el breakpoint detiene completamente la ejecucion del codigo, es imposible que me haga un overrun del RCREG, ya que este es un FIFO de dos niveles. Lo único que se me ocurre es que la USART simulada , de alguna manera que no sé, siga "inyectando" caracteres a pesar del breakpoint, con lo cual hace saltar el overrun.

Como veis, todo muy oscuro.... lo que unido a algunos comentarios de otros usuarios en foros de microchip, donde reconocen que la simulacion de USART está "rota" en varios aspectos, me da la impresion de que esta simulacion no puede usarse con total confianza....

gracias por vuestras opiniones!


Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: USART con MPSIM
« Respuesta #1 en: 12 de Julio de 2006, 17:54:45 »
pollastre yo he usado la estimulación de usart y anda excelentemente bien, jamás tuve problemas.

Me parece que lo que te sucede a tí, es que se te activa OTRA interrupción, pero en el vector de interrupción (0x04) tu verificas si está encendido PIR1,RCIF antes que el flag que realmente produjo la interrupción.

Por ejemplo, si tienes habilitada la interrupción del timer1, y ocurre la misma (T1IE=1 y T1IF=1) , y en el vector de interrupción tu primero verificas el estado de RCIF, pues bien, como está activado el flag de RCIF el pic solo hace lo que tu le dices...

Es casi seguro que ese es tu problema.

Sino, puedes hacer lo siguiente.  Captura la pantalla cuando el simulador salta a 0x04, con una ventana WATCH donde se vean los siguientes registros

PIE1, PIE2, PIR1, PIR2, INTCON.

Además que por supuesto se vea el código del vector de interrupción.

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 pollastre

  • PIC12
  • **
  • Mensajes: 65
Re: USART con MPSIM
« Respuesta #2 en: 12 de Julio de 2006, 19:10:00 »
er.... mira, no tengo a mano ahora mismo mi entorno MPLAB, pero solamente haciendo un repaso mental del código, creo que tienes toda la razón.

Perfectamente puede ser lo que dices... por cuanto según recuerdo del datasheet, PIR1<RCIF> se pone a 1 independientemente de que RCIE esté o no activado... y si como tú dices salta *otra* interrupción, realmente puede encontrarse con RCIF = 1 sin ningun problema.

en cuanto pueda lo miro con el MPLAB delante.... pero creo que, una vez más, diste en el clavo.

gracias 10^3

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: USART con MPSIM
« Respuesta #3 en: 12 de Julio de 2006, 23:11:31 »
Bueno , ojalá sea eso , lo puedas corregir y sigas con tu software!  :-/ :-/

Y sino, pues bueno, te seguiremos echando una mano.   :) :) :)

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 pollastre

  • PIC12
  • **
  • Mensajes: 65
Re: USART con MPSIM
« Respuesta #4 en: 13 de Julio de 2006, 05:06:20 »
bueno, ya he podido echarle un ojo, y casi está listo.

el problema venía de dos sitios. Uno de ellos es parecido a lo que sugerías, por intentar ahorrar codigo coloqué un unico retfie al final de todas las evaluaciones de banderas de interrupcion (no recordé que las banderas no son excluyentes, vamos que puede haber varias de ellas activas en un momento dado). Cuando sucedia una interrupcion T0IF se hacía, y al volver la subrutina seguia evaluando las condiciones para otras ints. Lo próximo que pasaba era que tambien se encontraba RCIF activa(*), y entraba tambien de cabeza en esa subrutina... un T0IF estaba lanzando dos subrutinas de manejo de interrupcion, vamos.

(*) lo cual nos lleva al ultimo detalle que he visto con el tema de la USART, a ver si me puedes confirmar si estoy equivocado en esto.... suponte que le lanzas por el simulador de usart una cadena "ABC", con un wait de 10 segundos. Al mismo tiempo tienes en tu codigo un delay de unos 20 segundos. Antes del delay RCSTA<SPEN> = 0 y RCSTA<CREN> = 0, es decir, explicitamente quiero tener la usart desactivada en recepcion porque hasta que no pase el delay de 20 segundos no me interesa "escuchar" lo que me transmitan.

Lo que me despista de esto, es que cuando se lanza ABC, RCIF se activa(!!) a pesar de que SPEN=CREN=0 . No sólo eso, sino que siguen llegando "obedientemente" caracteres... A...B...C ... y cuando llega el C, me lanza un overrun RCSTA<OERR> = 1. Si en teoria la recepcion de la USART está completamente desactivada...... pero sigue recibiendo caracteres en vez de ignorarlos, saltando su OERR correspondiente, etc.

Ahora, claro, en cuanto haces BSF PIE1,RCIE, como tiene puesto a 1 un RCIF, inmediatamente salta a la interrupcion.... he solucionado esto - de momento - haciendo que la interrupcion resetee CREN si detecta que OERR = 1, pero no sé, me parece un poco raro que "por narices" tengas que prevenir un OERR a pesar de que tienes tu USART desconectada en recepcion.

En resumen... ahora ya funciona todo estupendo, pero la pregunta que me queda es si existe alguna manera *definitiva* de desactivar "de verdad" la usart en recepcion. Lo único que me queda por probar es hacer TRISB<RX>=0... a ver si con eso tiene cojones de seguir recibiendo caracteres ;-)

gracias !


                   

Desconectado pollastre

  • PIC12
  • **
  • Mensajes: 65
Re: USART con MPSIM
« Respuesta #5 en: 13 de Julio de 2006, 05:20:14 »
pues de momento así lo he arreglado... a la hora de activar por primera vez la recepcion, en vez de simplemente esto :

--------------------------------
; activar recepcion en USART
bsf RCSTA,CREN    ; recepcion continua
bsf RCSTA,SPEN    ; activar puerto serie
--------------------------------

lo he cambiado por esto :

--------------------------------
movf RCREG,0
movf RCREG,0      ; vaciado del FIFO RCREG, que tiene 2 niveles, con lo que RCIF -> 0
bcf RCSTA,CREN
bsf RCSTA,CREN    ; reset 0-1 de recepcion continua, para quitar condicion OERR
bsf RCSTA,SPEN    ; activar puerto serie
--------------------------------

de esta manera haces una especie de "limpieza" de la USART, pues viene "sucia" de antes.... vacias RCREG, quitas OERR y atomaticamente RCIF se pone a cero, con lo cual la usart empieza a funcionar en un estado "limpio".

Lo más sorprendente de todo es que incluso funciona ;-)

saludos,

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: USART con MPSIM
« Respuesta #6 en: 13 de Julio de 2006, 08:23:16 »
de esta manera haces una especie de "limpieza" de la USART, pues viene "sucia" de antes.... vacias RCREG, quitas OERR y atomaticamente RCIF se pone a cero, con lo cual la usart empieza a funcionar en un estado "limpio".
Así es,

El OERR se quita únicamente borrando el RCSTA,CREN

El FERR se quita leyendo 2 ó 3 veces el RCREG.

Lo más sorprendente de todo es que incluso funciona ;-)

No es casualidad, es producto de tu esfuerzo  :) :)
- 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)