Autor Tema: Problema con múltiples serial por software (Solucionado)  (Leído 5589 veces)

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

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5552
    • Picmania by Redraven
Problema con múltiples serial por software (Solucionado)
« en: 23 de Mayo de 2013, 08:15:24 »
Buenas a tod@s. Aquí os presento un problema con el que llevo varios días liado y no logro solucionar, a ver si alguno de ustedes tiene alguna experiencia similar y me puede arrojar alguna luz.

Compilador CCS C 4.093. No puedo migrar a versiones mayores, salvo como último recurso, ya que tengo un firmware bastante complejo que no es compatible con la 4.140, por ejemplo, y preferiría mantenerlo, salvo que descubramos que lo que me pasa es exactamente un bug de esta versión.

PIC 18F4550 corriendo a 48 MHz, con una sola USART dedicada a una conexión serie que no puedo tocar.

Se me ha planteado la necesidad de recibir información de uno o dos dispositivos serie nivel TTL y por lo tanto he añadido dos #use rs232() adicionales, éstos por Software obviamente. Para minimizar los riesgos he decidio bajar la velocidad de estos dispositivos a tan solo 1200 baudios, es suficiente para las pruebas y no me hace falta más velocidad.

Código: CSS
  1. #use rs232(baud=115200, xmit=EM202_RX, rcv=EM202_TX, ERRORS, RESTART_WDT, stream=MAINCOM)
  2. #use rs232(baud=1200, rcv=PIN_B5, FORCE_SW, INVERT, RESTART_WDT,stream=COMH1)
  3. #use rs232(baud=1200, rcv=PIN_B4, FORCE_SW, INVERT, RESTART_WDT,stream=COMH2)

El MAINCOM es la USART y los COMH1 y COMH2 los canales serie por Software. COMH1 lee el PIN_B5 y COMH2 lee el PIN_B4 que son los únicos que tengo libres, no tengo posibilidades por hardware de utilizar ningún otro, aunque en principio esto no debería de influir.

Para la recepción de ambos canales serie virtuales tengo el correspondiente código dentro de bucle infinito:

Código: CSS
  1. void main(void){
  2.  
  3.    int1 Ever=true;
  4.    main_on_reset();
  5.    do{
  6.       restart_wdt();
  7.       /////////////////////////////////////////////////////////////////////////////////////////////
  8.       //
  9.       // Tratamiento de lecturas TTL Serie en H1 y H22
  10.       //
  11.       /////////////////////////////////////////////////////////////////////////////////////////////
  12.       // SERIAL COM HEAD 1
  13.       if(kbhit(COMH1)){
  14.          c_H1 = fgetc(COMH1);
  15.          if(c_H1!=0x00){
  16.                Code1[Next_byte1++]=c_H1;
  17.          }
  18.       }
  19.       // SERIAL COM HEAD 2
  20.       if(kbhit(COMH2)){
  21.          c_H2 = fgetc(COMH2);
  22.          if(c_H2!=0x00){
  23.                Code2[Next_byte2++]=c_H2;
  24.          }
  25.       }
  26.       /////////////////////////////////////////////////////////////////////////////////////////////
  27.  
  28.      // Aquí mucho más código ....
  29.  
  30.       /////////////////////////////////////////////////////////////////////////////////////////////
  31.    }while(Ever);
  32. }

Como véis están perfectamente separados ambos canales, con pines distintos, con variables de recogida y almacenamiento distintos ....

Pues bien, funciona perfectamente, maravillosamente, espectacularmente ... pero ... pero solo el que esté en primer lugar.

Me explico: En el caso del código de arriba recibo perfectamente sobre Code1 lo que transmita por  PIN_B5 ¡¡¡ y por PIN_B4 !!!  Conecte donde conecte mi dispositivo, en PIN_B5 ó en PIN_B4 siempre recibo por PIN_B5 :shock:

Ahora si modifico el orden de las recogidas, y pongo el de PIN_B4 antes que el de PIN_B5
:
Código: CSS
  1. void main(void){
  2.  
  3.    int1 Ever=true;
  4.    main_on_reset();
  5.    do{
  6.       restart_wdt();
  7.       /////////////////////////////////////////////////////////////////////////////////////////////
  8.       //
  9.       // Tratamiento de lecturas TTL Serie en H1 y H22
  10.       //
  11.       /////////////////////////////////////////////////////////////////////////////////////////////
  12.       // SERIAL COM HEAD 2
  13.       if(kbhit(COMH2)){
  14.          c_H2 = fgetc(COMH2);
  15.          if(c_H2!=0x00){
  16.                Code2[Next_byte2++]=c_H2;
  17.          }
  18.       }
  19.       // SERIAL COM HEAD 1
  20.       if(kbhit(COMH1)){
  21.          c_H1 = fgetc(COMH1);
  22.          if(c_H1!=0x00){
  23.                Code1[Next_byte1++]=c_H1;
  24.          }
  25.       }
  26.       /////////////////////////////////////////////////////////////////////////////////////////////
  27.  
  28.      // Aquí mucho más código ....
  29.  
  30.       /////////////////////////////////////////////////////////////////////////////////////////////
  31.    }while(Ever);
  32. }

entonces sobre Code2 recibo perfectamente lo que transmita por  PIN_B4 ¡¡¡ y por PIN_B5 !!!  Conecte donde conecte mi dispositivo, en PIN_B4 ó en PIN_B5 siempre recibo por PIN_B4 :shock:  :shock: :shock:

Monitorizo Code1 y Code2 tras concluir la recepción y siempre se carga el primero que coloque de ambos. Como os digo ya no tengo idea de qué mas pruebas hacer ... estoy ligeramente desesperado  :? :? :?

¿Alguna idea?
« Última modificación: 26 de Mayo de 2013, 04:59:56 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5552
    • Picmania by Redraven
Re: Problema con múltiples serial (por software)
« Respuesta #1 en: 24 de Mayo de 2013, 03:50:02 »
¿Ninguna idea?

Como uso los pines B4 y B5 voy a intentar utilizar la interrupción por cambio de puerto B para discernir si estoy recibiendo por el uno u el otro pin, a ver si así consigo algo ...  :5]
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Problema con múltiples serial (por software)
« Respuesta #2 en: 24 de Mayo de 2013, 08:21:50 »
Querido Diego, es raro lo que te ocurre, y no tengo una solución mágica que poder aportarte, pero me voy a permitir contarte algunas consideraciones por si no las has tenido en cuenta:
- en las usart por software, la función kbhit() devuelve un 1 en cuanto recibe el bit de start de la transmisión. Como lo tienes a 1200baudios, tardará un ratito en llegar el byte entero y, sin embargo, tú haces un getc() justo detrás. Supongo que ese getc es el encargado de hacer la espera pero, ¿estás seguro?. Puedes usar el parámetro TIMEOUT en el #use para este fin.
- la velocidad de ejecución de ese bucle infinito en el que están los kbhit() debe ser, al menos, 10 veces la frecuencia de la comunicación. En nuestro caso, el bucle tendrá que girar por lo menos a 12KHz.
- si hay algún error en la transmisión, quizás tenga efectos secundarios como el que te ocurre. Puedes resetear estos errores automáticamente incluyendo el parámetro ERRORS en el #use

Suerte

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5552
    • Picmania by Redraven
Re: Problema con múltiples serial (por software)
« Respuesta #3 en: 24 de Mayo de 2013, 12:44:58 »
Si, manolo, ya he probado todas las combinaciones, incluido el ERRORS. Bajé también al mínimo el Baud Rate precisamente para asegurarme que la frecuencia es la correcta y efectivamente, el getc() se espera a que llegue el carácter, tan es así que me salta el Watchdog y tuve que ponerle el RESTAR_WDT para que pudiesen llegar sin resetearme el PIC.

Al final quedó así:

Código: CSS
  1. #define H2_CP          PIN_B4
  2. #define H1_CP          PIN_B5
  3.  
  4.    #use rs232(baud=1200, rcv=H1_CP, INVERT, RESTART_WDT, stream=COMH1, ERRORS, DISABLE_INTS)
  5.    #use rs232(baud=1200, rcv=H2_CP, INVERT, RESTART_WDT, stream=COMH2, ERRORS, DISABLE_INTS)

La recepción es "perfecta". Quiero decir que recibe correctamente lo que el otro dispositivo envía. Lo raro, lo realmente extraño es la "confusión" que monta entre COMH1 y COMH2. Siempre "recibe" por el KBHIT() que ponga primero en orden de ejecución del programa.

Con un dispositivo conectado físicamente su TX con el pin H2_CP, el COMH2, recibo la información por el COMH1  :shock:

Si pongo los trozos de código al revés, el KBHIT(COMH2) antes que el  KBHIT(COMH1) entonces recibe el H2_CP  :shock:

Es como si ambos pines recibiesen en paralelo y se procesase el primero en ejecutarse. Independiente de si los #USE RS232 estén  en ese orden o al revés.  :shock:

Te juro que no lo entiendo.
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Problema con múltiples serial (por software)
« Respuesta #4 en: 24 de Mayo de 2013, 15:36:46 »
Hola Diego,

podrías generar el archivo .lst y adjuntarlo?

Cuidado que va a figurar todo el código fuente, si hay problemas de propiedad intelectual, al menos el listing del main para ir viendo si se ve el problema.

"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5552
    • Picmania by Redraven
Re: Problema con múltiples serial (por software)
« Respuesta #5 en: 24 de Mayo de 2013, 16:55:53 »
Hola Diego,

podrías generar el archivo .lst y adjuntarlo?

Cuidado que va a figurar todo el código fuente, si hay problemas de propiedad intelectual, al menos el listing del main para ir viendo si se ve el problema.



Te lo he pasado por privado, no podemos publicarlo completo 8)
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Problema con múltiples serial (por software)
« Respuesta #6 en: 24 de Mayo de 2013, 17:02:04 »
No hay problema.

Por otro lado, RB4 y RB5 tienen pullup habilitadas? Es decir, te aseguras que cuando dichas líneas están en reposo se asegure un nivel de reposo en las señales TTL? Porque si están flotando, suele pasar que por cercanía si ingresa una señal a un pin próximo los contiguos flotante también adquieran ese estado lógico, y por ende explicaría el por qué ambas reciben lo mísmo, sin discriminar una de la otra.

"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5552
    • Picmania by Redraven
Re: Problema con múltiples serial (por software)
« Respuesta #7 en: 24 de Mayo de 2013, 18:56:52 »
Si, Bruno, me he asegurado de que las pull-ups estén habilitadas.
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Problema con múltiples serial (por software)
« Respuesta #8 en: 25 de Mayo de 2013, 02:15:34 »
¿Tienes ICD3 u otro tipo de debugger?
Se podría seguir paso a paso el programa hasta ver porqué ocurre eso.

Si no tienes ninguno, en Coria hay uno esperándote.

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 627
Re: Problema con múltiples serial (por software)
« Respuesta #9 en: 25 de Mayo de 2013, 04:18:36 »
Yo creo que es uno de los famosos bugs del CCS no creo que sean los pines del micro, en este caso podria probar con otra version del compilador o probar cosas que puedan no tener sentido pero que al final funcione, por ejemplo yo probaria hacer el #use rs232(baud=1200, rcv=PIN_B5, FORCE_SW, INVERT, RESTART_WDT,stream=COMH1) justo antes del if(kbhit(COMH1)) , quien sabe capaz y funciona.

a mi tambien me gustaria ver el .lst , solia hacer eso cuando el ccs se ponia dificil, capaz y veo que hace mal, si quiere lo reviso

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 RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5552
    • Picmania by Redraven
Re: Problema con múltiples serial por software ¡¡¡Solucionado!!!
« Respuesta #10 en: 25 de Mayo de 2013, 06:43:11 »
Por otro lado, RB4 y RB5 tienen pullup habilitadas? Es decir, te aseguras que cuando dichas líneas están en reposo se asegure un nivel de reposo en las señales TTL? Porque si están flotando, suele pasar que por cercanía si ingresa una señal a un pin próximo los contiguos flotante también adquieran ese estado lógico, y por ende explicaría el por qué ambas reciben lo mísmo, sin discriminar una de la otra.

Si, Bruno, me he asegurado de que las pull-ups estén habilitadas.

Bingo, bingo, bingo, bingo  :mrgreen: :mrgreen: :mrgreen:


Tenías razón amigo Bruno ... y yo también.  :o

Vamos a ver.

No es un bug del CCS (increíble pero cierto) Tenías razón Bruno al decirme que el problema podría venir por la indefinición del estado de los pines, y sin embargo yo también tenía razón al decirte que las pull-ups estaban habilitadas. ¡¡¡ Pero son una cagada de pull-ups !!!

Hace muchos años posteé aquí mismo en el foro (no recuerdo exactamente donde pero podríamos buscarlo) que las pull-ups del 18F4550 se conectan (y desconectan) cuando les da la gana. Y éste es el caso, las pull-ups del 18F4550 hacen exactamente lo que quieren. Por ello les he colocado unas pull-ups externas de 3K3 Ohms.

Pero curiosamente aún no es suficiente. Me explico:

El dispositivo que conecto transmite a nivel TTL ¡¡¡ pero invertido !!! (de ahí la necesidad en el #USE RS232 del parámetro INVERT) ya sabéis que el estándar es poner a VCC en reposo y transmitir los bits con pulsos a GND, este va exactamente al revés. Por ello que si conecto el cacharro a mi pin tengo que colocarle la dichosa pull-up para que lo lea correctamente, él en reposo lo tira a masa y envía los bits con pulsos a positivo a través de la pull-up.

Pero es que tengo dos entradas, dos #USE RS232, en dos pines del puerto B, pero ¡¡¡ solo tengo un dispositivo emisor !!! por lo que conectando uno al dispositivo el otro se queda "al aire". Y si le pongo también una pull-up a ese pin desconectado entonces la pseudo-usart se queda flipada ya que interpreta esa señal a positivo como un infinito bit de inicio, su correspondiente KBHIT() lo deja colar y el GETC() se queda esperando a que finalice el Universo.

Solución: Colocarle una pull-up al pin conectado al dispositivo emisor ¡¡¡ y una pull-down al que está libre !!!  :mrgreen: :mrgreen: :mrgreen:

Así el pin desconectado está tirado a masa a través de su pull-down y la pseudo-usart no lo "ve" y el otro, el conectado con su pull-up, funciona correctamente al transmitir los bits con tan solo "liberar" la conexión y que sea el VCC el que los genere.

Ea, que no soy tan fea ... y si lo soy ¡que lo sea!  :D :D :D


Edito: El cacharro es este, un Lector de Códigos de Barras Honeywell 3310g



« Última modificación: 25 de Mayo de 2013, 06:48:52 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 627
Re: Problema con múltiples serial (por software)
« Respuesta #11 en: 25 de Mayo de 2013, 09:15:43 »
problema de hardware, eh interesante.
felicidades por solucionarlo.


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 BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Problema con múltiples serial (por software)
« Respuesta #12 en: 25 de Mayo de 2013, 10:51:50 »
Felicitaciones Diego!  :-/ :-/

Anoche había estado mirando el código y te iba a decir exáctamente lo que ya has descubierto: que el código del CCS estaba bien, y que tuvieras cuidado porque veía invertido el estado de las UART. No te lo dije porque sólo tuve un rato y no quería apresurarme, pero como siempre, estás un paso adelante y ya has solucionado el problema.


"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5552
    • Picmania by Redraven
Re: Problema con múltiples serial (por software)
« Respuesta #13 en: 25 de Mayo de 2013, 13:07:34 »
Muchas gracias Bruno, Sander, Nocturno por vuestros consejos.

Teniéndoos a vosotros todo es más fácil  :mrgreen: :mrgreen: :mrgreen:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Problema con múltiples serial (por software)
« Respuesta #14 en: 26 de Mayo de 2013, 02:18:27 »
¡Menudo follón!, me alegro que lo tengas resuelto.
Qué raro que no haya sido culpa de CCS  :mrgreen:


 

anything