Autor Tema: Sincronismo en el RS232  (Leído 3526 veces)

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

Desconectado palermo

  • PIC10
  • *
  • Mensajes: 24
Sincronismo en el RS232
« en: 06 de Mayo de 2006, 21:01:09 »
Hola a todos !!!

Amigos, actualmente estoy comunicando un 16f877 con el pc a traves de
una aplicacion q hice en java, hasta ahora solo utilizo los pines Tx y Rx.

Algunas veces funciona bien y otras no.
Me he dado cuenta q todo es problema del sincronismo:

La aplicacion le envia un codigo y unos parametros para q el pic realize una
tarea y espera por la respuesta del pic.
La aplicacion no sabe cuando exactamente el pic ha terminado de procesar
o si sigue ocupado todavia.

Me he dado cuenta q necesito usar las banderas del puerto serial q indican
cuando el dispositivo esta listo para recibir/leer datos del puerto.
Creo q esas banderas se llaman algo asi como: RTS o CTS, no se exactamente.

Amigos, me gustaria q alguien me hechara una manito para poder sincronizar
el pic con el pc.

MUCHAS GRACIAS !!!

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Sincronismo en el RS232
« Respuesta #1 en: 07 de Mayo de 2006, 13:04:08 »
Hola a todos !!!

Amigos, actualmente estoy comunicando un 16f877 con el pc a traves de
una aplicacion q hice en java, hasta ahora solo utilizo los pines Tx y Rx.

Algunas veces funciona bien y otras no.
Me he dado cuenta q todo es problema del sincronismo:

La aplicacion le envia un codigo y unos parametros para q el pic realize una
tarea y espera por la respuesta del pic.
La aplicacion no sabe cuando exactamente el pic ha terminado de procesar
o si sigue ocupado todavia.

Me he dado cuenta q necesito usar las banderas del puerto serial q indican
cuando el dispositivo esta listo para recibir/leer datos del puerto.
Creo q esas banderas se llaman algo asi como: RTS o CTS, no se exactamente.

Amigos, me gustaria q alguien me hechara una manito para poder sincronizar
el pic con el pc.

MUCHAS GRACIAS !!!


No suele ser necesario sincronizar si tu sistema operativo te permite 'bufferear' los datos que recibes por la usart.

Es solo cuestion de tiempo.

En la PC cuando envias la orden de mandar unos bytes por la usart , esto puede tardar de unons milisegundos a cientos de milisegundos dependiendo del sistema operativo y de la carga del sistema.

En la respuesta pasa lo mismo, puedes poner a esperar de inmediato pero puede que no hayas recibido nada aún porque aún no se envió la trama de salida.

El CTS y RTS no te ayudará en mucho si el problema está en la pc.  Sirve mas que nada para que el PIC 'sepa' que alguien le va a enviar algo y para dejar de dar prioridad a lo que estaba haciendo para darle prioridad a la comunicacion exterior.

Espero se haya entendido.

Solucion? Pon delays grandes en el lado de la PC, no porque el pic los necesite sino que el software de la pc no tiene que abandonar la rutina antes de que el sistema operativo le informe que ya tiene los datos.

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 palermo

  • PIC10
  • *
  • Mensajes: 24
Re: Sincronismo en el RS232
« Respuesta #2 en: 07 de Mayo de 2006, 13:08:32 »
...,muchachos, tengo muchas dudas de q es exactamente lo q tengo q hacer, miren esto:

//FUNCCION EN JAVA Q ENVIA DATOS AL PTO. SERIAL
public synchronized void enviarCaracter( char c ) {
   this.puerto = ( SerialPort )this.idPuerto.open( this.usuario, 2000 );
   this.flujoSalida = this.puerto.getOutputStream();
   this.puerto.setSerialPortParams( this.transf, this.bitsDat, this.bitsPara, this.pari);

   this.flujoSalida.write( ( int )c );
   this.flujoSalida.close();
}

como se pueden dar cuenta, asi saque un pin del pic y lo ponga en uno
para avisarle a la aplicacion q aun no es tiempo de leer los datos...
...,en la funcion enterior, no veo por ningun lado lo del RTS o CTS.
es mas, no se de donde pueda leerlos para saber si estan en 0 o en 1.

....

ESTOY ENREDADO !!!

Desconectado palermo

  • PIC10
  • *
  • Mensajes: 24
Re: Sincronismo en el RS232
« Respuesta #3 en: 07 de Mayo de 2006, 13:34:32 »
gracias maunix...
mira, ya yo he tenido en cuenta lo q me has dicho, el codigo q uso es:


    private static boolean funcion_borrarConfiguracionActual( PuertoSerial ptoSerial ) {
        //char funcion_borrarConfiguracionActual = '8';
        delay();
        ptoSerial.enviarCaracter( funcion_borrarConfiguracionActual );
        delay();
        delay();
        delay();
        delay();
        delay();
        delay();
        delay();
        delay();
        delay();
        delay();
        delay();
        delay();
        delay();
        delay();
        String resp = ptoSerial.recibirCadena();
        if ( resp.equals( "SI" ) ) {
            return true;
        }
        else if ( resp.equals( "NO" ) ) {
            return false;
        }
    }
    //ESOS DELAY's SON INACEPTABLES, SI MI PROFESOR DE ALGORITMO LOS VIERA,
    // ME PONDRIA UN CERO EN TODAS LAS MATERIAS, HASTA EN MATEMATICAS.


eso es algo parecido a lo q tu me dices, cierto?.. bueno, asi lo hago actualmente.
..., pero es indecuado y ademas falla a cada rato, ¿por q?, pues mira:
1. Cuando corrí la aplicacion en otro pc con una velocidad muchisima mayor a la del mio,
    todo fue un desastre, me tocó ponerle otra cantidad mas de delay's, y asi probando y probando hasta
    q por fin funcionó.
2. otra cosa, como normalmente los el tiempo de los delay's no es exactamente el tiempo q tarda el pic
    en procesar los datos, sino q es mucho mayor, el proceso demora pero DEMASIADO, ya q necesito enviar
    muchos datos.
3. ademas, todo es mas seguro si SINCRONIZO AMBOS DISPOSITIVOS...
   
...pero el problema es ¿como?

...


Desconectado JavisusII

  • PIC12
  • **
  • Mensajes: 79
Re: Sincronismo en el RS232
« Respuesta #4 en: 07 de Mayo de 2006, 16:19:26 »
Buenas Palermo

Las comunicaciones serial entre el PC y el uC suelen hacerse mediante interrupciones, Tanto en la banda del soft
(VC++,VB,Java,etc) como en la del micro.

Si no las utilizas está claro que tendrás que implementar otra señal física para realizar el 'sincronismo'. Por ejmplo
la señal RTS,DTR podría ser...

1-soft pone en alto DTR
2-el micro baja RTS
3-el soft pregunta y baja DTR
2-el micro realiza la tarea y pone en alto RTS
3-cuando el soft detecte la subida del RTS, lee los datos.  :-)


Xavi (Barcelona)

Desconectado palermo

  • PIC10
  • *
  • Mensajes: 24
Re: Sincronismo en el RS232
« Respuesta #5 en: 07 de Mayo de 2006, 19:30:12 »
amigos, miren lo q he encontrado:

                PTO. SERIE (DTE)
        Pin   Nombre   Sentido   Significado
        1   GND      0V
        2   TxD   salida   Salida de datos
        3   RxD   entrada   Entrada de datos
        4   DTR   salida   Preparado para recibir
        5   CTS   entrada   Vía libre para enviar
        6   V      +12V


...,segun eso, creo q solo tengo q utilizar el pin de CTS y lo unico q tendria q
hacer es tirar otro cable desde el pic hasta el CTS del pc y ponerlo en
cero (0) cuando el pic este trabajando o ponerlo a uno (1) cuando el pic
ha dejado de realizar la operacion y esta listo para recibir mas datos.

...,y tambien he encontrado como revisar el pin de CTS en java, miren:

public abstract void setFlowControlMode(int flowcontrol)

    Sets the flow control mode.

    Parameters:
        flow - control Can be a bitmask combination of

            * FLOWCONTROL_NONE: no flow control
            * FLOWCONTROL_RTSCTS_IN: RTS/CTS (hardware) flow control for input
            * FLOWCONTROL_RTSCTS_OUT: RTS/CTS (hardware) flow control for output
            * FLOWCONTROL_XONXOFF_IN: XON/XOFF (software) flow control for input
            * FLOWCONTROL_XONXOFF_OUT: XON/XOFF (software) flow control for output


...claro q no se como configurar el puerto, solo hay dos opciones para utilizar el CTS:
            * FLOWCONTROL_RTSCTS_IN: RTS/CTS (hardware) flow control for input
            * FLOWCONTROL_RTSCTS_OUT: RTS/CTS (hardware) flow control for output

¿como configuro el puerto, con la IN o con la OUT?

ademas, configurarndo bien el puerto serial, estoy seguro q él mismo
esperara a q el pic le diga q se ha desocupado y q ya puede ir a leer los datos
q el pic le va a entregar.


....
amigos, regalenme su opinion y diganme si todo lo q dije del CTS tiene sentido o no.
o si tengo q hacer como lo sugiere javi, con dos hilos mas: el RTS y el DTR...

« Última modificación: 07 de Mayo de 2006, 19:44:53 por palermo »

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Sincronismo en el RS232
« Respuesta #6 en: 07 de Mayo de 2006, 20:29:45 »
1) La 'interrupción' se debe utilizar si la PC estará esperando datos que el PIC mandará cuando se le antoja.  Técnicamente por software en general no se usa una interrupción de 'hardware' sino un 'evento' generado por el sistema operativo, es decir interrupciones de software.

2) Ahora bien, si tu mandarás un dato al pic y luego esperas la respuesta,  es ahi donde entran en juego los delays. Ya que si bien el hardware de la PC recibirá los bytes en forma inmediata (tipicamente tienen 16 bytes de buffer por hardware) el sistema operativo no tomará cuenta de esto hasta no 'consultar' dicho dispositivo.

Si este es tu caso de 'nada' sirve que uses el DTR y el CTS.  ¿Para que?  Imaginemos la secuencia
La PC quiere enviar el dato entonces activa el DTR, el pic toma cuenta y deja de hacer lo que hacia y da prioridad a la usart.  La pc manda los datos, el pic los procesa y responde.
Al responder lo hace de inmediato o con un delay.  La PC no tomará cuenta hasta que el sistema operativo no haya leído el hardware de su USART.  Además si se reciben varios bytes habrá que ir esperando  a que esten disponibles todos los bytes.

3) Pongamos otra situacion.  El pic recibe los datos y activa la señal de CTS.  La PC cuando detecta esta señal (tampoco es algo rápido) activa el DTR y ahi el pic envia los datos.  Nuevamente estarán disponibles cuando el sistema operativo lo disponga.

En este punto es que los delays son 'variables'.  Las pcs no sirven para temporizaciones pequeñas y de precisión.  De hecho hace años se matan la cabeza para ver si se puede solucionar esto.  Incluso los sistemas operativos en tiempo real con un micro a 3Ghz tiene problemas para atender un evento que transcurre en el orden de las decenas de microsegundos! Siendo que el tiempo de instrucción es del orden de los picosegundos!

Por eso los delays.

Si no anda pon mas delays, si sigue sin andar... revisa tu hardware o las rutinas que usas en java.

Si quieres puedes contar algo mejor de como quieres hacer la comunicación , en el código no te puedo ayudar porque no uso java.

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 JavisusII

  • PIC12
  • **
  • Mensajes: 79
Re: Sincronismo en el RS232
« Respuesta #7 en: 08 de Mayo de 2006, 14:07:33 »
Muy buenas Palermo, efectivamente el sincronismo por hardware es una muy factible elección, aunque yo sólo la
utilizo para direccionar el SN75176 .(comunicación diferencial half duplex).

He leído a nuestro amigo maunix y .. un par de dudas

  La 'interrupción' se debe utilizar si la PC estará esperando datos que el PIC mandará cuando se le antoja.  Técnicamente por software en general no se usa una interrupción de 'hardware' sino un 'evento' generado por el sistema operativo, es decir interrupciones de software.

¿intrerrupciones software? no lo había oído.

2) Ahora bien, si tu mandarás un dato al pic y luego esperas la respuesta,  es ahi donde entran en juego los delays. Ya que si bien el hardware de la PC recibirá los bytes en forma inmediata (tipicamente tienen 16 bytes de buffer por hardware) el sistema operativo no tomará cuenta de esto hasta no 'consultar' dicho dispositivo

No te entiendo Maunix,  yo así no programo, no le encuentro el sentido a la frase.¿me perdí algo en la escuela técnica superior?

Si este es tu caso de 'nada' sirve que uses el DTR y el CTS.  ¿Para que?  Imaginemos la secuencia
La PC quiere enviar el dato entonces activa el DTR, el pic toma cuenta y deja de hacer lo que hacia y da prioridad a la usart.  La pc manda los datos, el pic los procesa y responde.
Al responder lo hace de inmediato o con un delay.  La PC no tomará cuenta hasta que el sistema operativo no haya leído el hardware de su USART.  Además si se reciben varios bytes habrá que ir esperando  a que esten disponibles todos los bytes.


Sólo  DTR ,nooo, el pic debe dar cuenta con otra señal por ejemplo RTS,CTS, utilizadas por SOFTWARE!!!!

3) Pongamos otra situacion.  El pic recibe los datos y activa la señal de CTS.  La PC cuando detecta esta señal (tampoco es algo rápido) activa el DTR y ahi el pic envia los datos.  Nuevamente estarán disponibles cuando el sistema operativo lo disponga

No, estarán disponibles cuando el software bajo (como tu bien decías) evento de entrada los reciba. Delay????
que delay , microsegundos?(eso no es nada)


En este punto es que los delays son 'variables'.  Las pcs no sirven para temporizaciones pequeñas y de precisión.  De hecho hace años se matan la cabeza para ver si se puede solucionar esto.  Incluso los sistemas operativos en tiempo real con un micro a 3Ghz tiene problemas para atender un evento que transcurre en el orden de las decenas de microsegundos! Siendo que el tiempo de instrucción es del orden de los picosegundos!   :shock:

¿Por qué esta frase ha que viene ?? no entiendo nada.

Si no anda pon mas delays, si sigue sin andar... revisa tu hardware o las rutinas que usas en java.
   ¿¿¿¿¿????? :5]

Bueno en fin,  hasta pronto amigo Palermo









Xavi (Barcelona)

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Sincronismo en el RS232
« Respuesta #8 en: 08 de Mayo de 2006, 19:30:36 »
Amigo JavisusII , las respuestas eran para Palermo pero si te quedan dudas aquí te expongo mi explicación.


JavisusII: 1) ¿intrerrupciones software? no lo había oído.

Asi es, desde tiempos lejanos en las PCs no todo se puede hacer por hardware, solo 15 IRQs para el sistema y muchos eventos que atender, desembocaron en la necesidad de proveer algun otro método de acceder a 'interrupciones'.
Es ahi que surgieron las interrupciones de software, en principio como funciones de BIOS luego en los sistemas operativos multitarea como Windows como 'eventos'.
Un evento interrumpe el flujo del programa y DEBE ser atendido.  un evento puede estar ocasionado por una interrupción de hardware o bien por algun evento de software (por ejemplo Fin de Archivo) o algún TimeOut.
Estas son las llamadas interrupciones de software.

Si buscas en google encontrarás mucha mas información al respecto.


2)
Citar
Escrito por Maunix
2) Ahora bien, si tu mandarás un dato al pic y luego esperas la respuesta,  es ahi donde entran en juego los delays. Ya que si bien el hardware de la PC recibirá los bytes en forma inmediata (tipicamente tienen 16 bytes de buffer por hardware) el sistema operativo no tomará cuenta de esto hasta no 'consultar' dicho dispositivo

JavisusII: No te entiendo Maunix,  yo así no programo, no le encuentro el sentido a la frase.¿me perdí algo en la escuela técnica superior?


Oh... que humor.  En fin, la dejo pasar. No se que no entiendes de la frase pero he aquí mi explicación a ver si ahora si se entiende.  Tampoco se como programas ni que te han dado en la escuela técnica superior, solo digo como son algunos 'timings' inevitables en una comunicacion PC vs Hardware.  Además muchos de los conocimientos no se adquieren en la Universidad sino en libros, gralmente las universidades no son tan rápidas para adaptarse a las nuevos cambios ni tampoco pueden seguir todo lo que a uno le interesa.  De hecho yo aprendí lo que queria saber fuera de la Universidad porque eran cosas tan específicas que no habia materias que las contengan.

El software de la PC manda un byte a la USART... en realidad 'cree' que manda el byte, ya que el byte queda en cola de espera por el sistema operativo el cual lo enviará al integrado cuando 'se le plazca'.  Esto es así en CUALQUIER sistema operativo multitarea.  El sistema operativo hace muchas cosas por vez y no porque le digamos manda un dato por la usart va a dejar de reproducir los MP3 o bajar datos de internet o bien, atender una interrupción de disco duro o de la placa de video.  Esto provocaría las hermosas pantallas azules a las que nos tenia tan acostumbrado windows.

En el PIC eso no existe (al menos en los casos comunes), el pic recibe el dato y puede responder de inmediato.  La PC recibirá en su hardware esos bytes.  Si los bytes son mayores a 16, tiene que si o si atenderlo el sistema operativo o sino se llenará el buffer y habrá un overflow.   Digo 16 porque los integrados de usart compatibles con el 16550 tienen un buffer de salida y de entrada de 16 bytes.  Es aquí donde el SISTEMA OPERATIVO debe vaciar ese buffer de usart antes de que se llene.  Luego el sistema operativo + el componente que usemos para comunicarnos con el puerto serie se tienen que entender de manera que se genere un evento de recepción de datos por usart.  Y dije evento,  no necesariamente tiene que ser una interrupción.

Es ahí donde entra en juego el tema del 'delay' del lado del PIC para no enviar de inmediato.

Hay combinaciones de componentes con Windows que permiten leer miles de bytes por segundo, hay otros componentes que de suerte leen 100 bytes por segundo...no son eficientes.


3)
Citar
Si este es tu caso de 'nada' sirve que uses el DTR y el CTS.  ¿Para que?  Imaginemos la secuencia
La PC quiere enviar el dato entonces activa el DTR, el pic toma cuenta y deja de hacer lo que hacia y da prioridad a la usart.  La pc manda los datos, el pic los procesa y responde.
Al responder lo hace de inmediato o con un delay.  La PC no tomará cuenta hasta que el sistema operativo no haya leído el hardware de su USART.  Además si se reciben varios bytes habrá que ir esperando  a que esten disponibles todos los bytes.
JavisusII: Sólo  DTR ,nooo, el pic debe dar cuenta con otra señal por ejemplo RTS,CTS, utilizadas por SOFTWARE!!!!

Jeje, el pic tiene un software directamente asociado a sus pines, es decir Hardware.  Un cambio en un pin que denominemos CTS se refleja en microsegundos a la salida.  Esto la PC no lo puede ver tan velozmente.  Es ahi donde de nuevo entran en juego los delays.....


4)
Citar
3) Pongamos otra situacion.  El pic recibe los datos y activa la señal de CTS.  La PC cuando detecta esta señal (tampoco es algo rápido) activa el DTR y ahi el pic envia los datos.  Nuevamente estarán disponibles cuando el sistema operativo lo disponga

JavisusII: No, estarán disponibles cuando el software bajo (como tu bien decías) evento de entrada los reciba. Delay???? que delay , microsegundos?(eso no es nada)

Aqui no serian microsegundos serian milisegundos.  Son necesarios para que el sistema operativo realmente tome cuenta de la situacion.  A partir de ahi el software recien puede 'conocer' el estado del hardware.


5)
Citar
En este punto es que los delays son 'variables'.  Las pcs no sirven para temporizaciones pequeñas y de precisión.  De hecho hace años se matan la cabeza para ver si se puede solucionar esto.  Incluso los sistemas operativos en tiempo real con un micro a 3Ghz tiene problemas para atender un evento que transcurre en el orden de las decenas de microsegundos! Siendo que el tiempo de instrucción es del orden de los picosegundos!   :shock:

JavisusII: ¿Por qué esta frase ha que viene ?? no entiendo nada.

Viene a que por mas que creamos que la PC es rápida,  no siempre lo será y más cuando querramos comunicarnos con un PIC.  He oido muchas veces: "Tengo un Pentium IV de 2Ghz... como no voy a poder leer datos a 57600 bps" y luego no les anda nada.  Precisamente porque el hermoso y veloz pentium está atendiendo 200, 300 o 400 hilos de ejecución al mismo tiempo y esto le impide ser tan rápido como un PIC que solo está abocado a una tarea.

De hecho en las pcs se siguen usando y se seguirán usando por muuucho tiempo los DMA, los Caché, los Buffers, etc.

Cualquier otra cuestión aquí estaré.

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