Autor Tema: RS485 y Terminales ocupadas en otras cosas - Sincronizar tiempos de HSERIN  (Leído 5954 veces)

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

Desconectado Marioguillote

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 1926
    • Servisystem
Hola a todos !

He comenzado a comunicarme vía RS485 desde el/la PC con distintos dispositivos que les paso a contar.

Un Relé, un DIMMER, un Termómetro I2C (STCN75), un sensor de temperatura y humedad SHT11, un anemómetro, un indicador de dirección de viento y un portón levadizo.
Aún no los he conectado “todos juntos” en la red RS485 sino que he ido comunicándome desde el/la PC de a uno y todo a salido de maravillas.
Los bytes van y vienen comunicando las unidades de manera satisfactoria.
Conecto ó desconecto el relé, mido temperatura, varío la intensidad de una lámpara, todo perfecto, pero ... , pero ...

Estoy ante un inconveniente que interpreto requiere más de experiencia y habilidad imaginativa (que no tengo), que de técnica (que tampoco tengo  :D ) y por eso he decidido crear éste hilo para compartir con Uds. los distintos métodos que utilizan a menudo y/o conocer sus ideas acerca de cómo manejar los tiempos de interrogación/respuesta entre CPU (la/el PC) y Terminales (por darles un nombre)

Grafiquémoslo con un ejemplo:

Tengo mi terminal “Termómetro I2C” que constantemente está sensando la temperatura de un ambiente y controlando si debe conectar calefacción ó ventilación a la misma, para mantener un ambiente agradable de estar.
Es decir, la terminal decide si conecta ó no un relé ú otro (calefacción / ventilación) y a su vez muestra la info en un LCD 16X2.

Desde el CPU y a través de la aplicación que realizo en VB6 llamo a la terminal “por su nombre”, le envío la instrucción para que me informe un dato cualquiera de todos los que maneja (por ejemplo: si la calefacción está encendida) y le indico el final de la instrucción.
El PIC de la terminal requerida “escucha” el llamado, “contesta” la interrogación con los datos solicitados, el CPU lee los datos y los muestra en pantalla en la aplicación en VB6 para así obtener una graficación al estilo de un sistema domótico..

Una teoría hermosa que no logro hacer funcionar cómo quisiera y como se debiera.  :(

Generalmente, cuando desde el CPU genero la interrogación y la envío al bus; el PIC interrogado está haciendo otra cosa, menos estar “atento” con la instrucción “HSERIN” (con ésa leo los datos provenientes del CPU).
Lo hago funcionar, pero generando un evento REPEAT-UNTIL en la aplicación de la CPU hasta que el PIC del terminal conteste, ya que antes generaba ráfagas de 20 ó 30 envíos de instrucciones hacia el PIC y los tiempos no coincidían casi nunca y cuando quería activar remotamente un relé con un botón (por ejemplo), debía hacer clic sobre el mismo muchas veces hasta que coincidieran los tiempos de escucha del terminal.

Sobre éste tema me gustaría leer acerca de las experiencias de Uds.
Cómo ponen a la escucha a terminales que están constantemente trabajando en otras cosas?
Utilizan el mismo método que yo? Bombardear el bus hasta que la terminal requerida escuche y conteste ? Yo interpreto que no es el modo.
Utilizan el TMR0 y que cada determinado tiempo se controle la llegada de información? Es lo mismo que antes. Van a existir muchas oportunidades en que los tiempos no coincidan ….  :(

Cómo hacer coincidir los tiempos ?

En las redes que han visto ó fabricado Uds.; las terminales sólo “contestan peticiones de órdenes” ó las hay también “autónomas” ?.
Es decir, que a intervalos regulares de tiempo envían por sí solas información a la red sin que dependan de un mando desde el CPU ó desde otra terminal, cómo podría ser un terminal con fotodetector  para encender la iluminación exterior al anochecer y apagarla al amanecer y a su vez mostrarlo en la pantalla del CPU a dicho estado.

Resumiendo:
Logro comunicar por RS485 de maravillas, pero no me doy cuenta cómo hacer para armonizar los tiempos de comunicación entre la CPU y las laboriosas terminales, que no son simples “oyentes” a la espera de una instrucción que puedo enviar en cualquier momento. Son trabajadoras que disponen de un tiempo de escucha limitado, que no logro dominar.

Sobre esto quería compartir experiencias con Uds.

Gracias a los que me puedan comprender y ayudar.

Saludos.
Mario.

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: RS485 y Terminales ocupadas en otras cosas - Sincronizar tiempos de HSERIN
« Respuesta #1 en: 14 de Agosto de 2008, 15:28:12 »
Hola Mario un gusto leerte de nuevo. Generalmente yo trabajo todo mediante software y no por interrupciones y me ha pasado lo mismo el PIC no responde hasta que deja de hacer "su tarea". Lo cual me daba el mismo problema que a ti. En mis casos hasta ahora no ha sido con el RS485 si no mas con el RF lo que hacia es repetir la sentencia que me da la orden que busco dentro de las subrutinas que hace el PIC.

Suena algo engorroso o que consume mas memoria pero es la solucion que he encontrado hasta ahora al no usar interrupciones. Por ejemplo si estoy en un for haciendo un blink o moviendo un motor dentro de ese for inserto una condicino digamos if a =X then datos asi si x le llega en ese momento al PIC se sale de lo que esta haciendo me contesta mi peticion. Para poder regresarla despues de que me conteste en lugar de saltar directo meto el gosub y me regresa de nuevo a donde estaba.

Quizas el master Dogflu tengauna mejor idea que esto tan arcaico.

Saludos
"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."

Desconectado Marioguillote

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 1926
    • Servisystem
Re: RS485 y Terminales ocupadas en otras cosas - Sincronizar tiempos de HSERIN
« Respuesta #2 en: 14 de Agosto de 2008, 19:31:06 »
Hola Max !  :)

Hacía muchas lunas que no cruzábamos líneas, celebro éste hecho.

Es bueno lo que dices, de hecho los manuales expresan eso cuando hay que atender las interrupciones.
Por ejemplo si tienes que hacer un DELAYMS 200, tú estarías haciendo algo similar a ésto :

FOR A = 0 TO 199 : IF ... (llegan las instrucciones) THEN GOSUB acción : NEXT

Para que a cada momento el sistema esté atento a la llegada de datos desde el bus, pero lamentablemente hay cosas que no se pueden desmenuzar y que ocupan un tiempo "físico" a veces crítico ó clave en un proceso cómo ser una lectura I2C, un PRINT en un LCD y tantas otras cosas que consumen tiempo en un programa.

De igual modo, es muy importante tener en cuenta el método que usas. Suena muy bueno. Lo voy a ensayar en pruebas a ver que tanto ayuda a coordinar las acciones.

....  tenga una mejor idea que esto tan arcaico.

Creo que una vez le leí a Maunix (donde estás Maunix ? Volvé !) que cualquier método es válido y sirve mientras el programa cumpla con la acción que deseamos realizar.

Seguimos experimentando.

Un abrazo Max ! Gracias por la ayuda !
Espero que la familia ande bien.

Mario

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
Re: RS485 y Terminales ocupadas en otras cosas - Sincronizar tiempos de HSERIN
« Respuesta #3 en: 14 de Agosto de 2008, 19:48:22 »
Hola Mario, si bien la solucion esta por el lado del ASM, yo he tenido que emplear micros pequeños, sin interrupciones (16c54), y la comunicacion por soft
asi que lo primero que hacía, era verificar el estado del pin de lectura...
y como tenia que realizar alguna otra demora, alli dentro, seguia verificando el estado del pin de entrada, entonces marcaba una bandera
esta bandera me esta indicando que tiene que ir a atender la comunicacion

en definitiva, el programa, a cada paso que esta realizando, y entre pasos, verifica la comunicacion... se entiende?

Cada proceso, tiene que ser de un tiempo menor a medio bit  :mrgreen:, por lo cual, trabajaba solo a bajas velocidades (1200)

Un abrazo!

Norberto
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado Marioguillote

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 1926
    • Servisystem
Re: RS485 y Terminales ocupadas en otras cosas - Sincronizar tiempos de HSERIN
« Respuesta #4 en: 14 de Agosto de 2008, 20:11:45 »
Hola Norberto !

Entonces los que no manejamos ASM cómo hacemos ?  :8}

Lo que estás expresando, no es lo mismo que utilizar el TMR0 al menor tiempo posible para que atienda la interrupción ? Que diferencia creés que habría ?

Yo estoy comunicando muy bien a 34800, pero no tendría problemas en hacerlo a menor velocidad si fuese necesario.

Un abrazo Norber !

Mario (El que promete y no cumple)

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: RS485 y Terminales ocupadas en otras cosas - Sincronizar tiempos de HSERIN
« Respuesta #5 en: 14 de Agosto de 2008, 20:23:34 »
Realmente ya se ha dicho todo, y estoy de acuerdo que todo es valido si el programa realiza la tarea que se desea. De todas formas realizamos trabajos realmente complicados a los que no les damos importancia. Pero en el sistema que mencionas lo mejor es utilizar micros con módulos uar y activar las interrupciones. Y por supuesto crear bases de tiempo para eliminar los delays o pausas en el programa. Hace algún tiempo estuve controlando 5 servomotores mediante RF que viene a ser lo mismo que con rs485 y teniendo en cuenta que hacia un uso masivo de interrupciones el sistema funciono bastante bien. Realmente con una buna estructura de programa y una buena distribución del tiempo en las tareas quedamos sorprendidos de lo que es capaz de hacer un simple PIC.
Saludos desde Granada, España.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: RS485 y Terminales ocupadas en otras cosas - Sincronizar tiempos de HSERIN
« Respuesta #6 en: 14 de Agosto de 2008, 21:08:29 »
Hola Mario!

¿Y que pasaría si haces que la PC se comporte como una verdadera servidora?

Es decir, cada dispositivo sería el que inicia las peticiones.

Para enviar de un Dispositivo hacia la PC:

El Dispositivo inmediatamente envía paquete al PC y espera respuesta inmediata de la PC.

Para enviar de PC a un Dispositivo:

Cada vez que un dispositivo tiene tiempo "libre", envía una pregunta indicando si la PC desea enviarle algo. En ese momento espera atento a si la PC quiere pedirle algo. La PC responde con la instruccion si requeria algo del dispositivo, o responde "No, gracias" :D.

De esta manera, sólo la PC es la que debe estar atenta a la llegada de datos, y los disp. sólo envían y reciben datos cuando pueden tener las orejitas paradas.

Tal vez te genere un tráfico de datos grandes(depende de tus necesidades) y deberías contemplar las colisiones en el bus.

Es sólo una idea que con un código prolijo y siempre y cuando no haya una barbaridad de dispositivos, me parece completamente concebible.

Saludos ;)
« Última modificación: 14 de Agosto de 2008, 21:12:40 por BrunoF »
"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 Marioguillote

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 1926
    • Servisystem
Re: RS485 y Terminales ocupadas en otras cosas - Sincronizar tiempos de HSERIN
« Respuesta #7 en: 15 de Agosto de 2008, 00:34:25 »
Hola Carlos !  :)

Elijo éstas dos expresiones donde se reflejan los fundamentos de tu idea, según mi interpretación.

...  lo mejor es utilizar micros con módulos uar y activar las interrupciones. Y por supuesto crear bases de tiempo para eliminar los delays o pausas en el programa.

..... Realmente con una buna estructura de programa y una buena distribución del tiempo en las tareas quedamos sorprendidos de lo que es capaz de hacer un simple PIC.

Es básicamente lo veníamos charlando desde el principio del hilo; y veo que todos coinciden en hacer una estructura de programa bien "fina" para que los tiempos se ajusten correctamente.
Gracias por estar amigo.

--------------------------------------------------------

.....  y deberías contemplar las colisiones en el bus.

Es sólo una idea que con un código prolijo y siempre y cuando no haya una barbaridad de dispositivos, me parece completamente concebible.

Hola Bruno !  :)

Claro que es una idea concebible ! y la forma que se me ocurre (tal vez no sea posible, pero se ocurre de entrada) es que los dispositivos no larguen información ó petición de envío de forma aleatoria en cualquier momento sino que lo hagan luego de un determinado tiempo posterior a una "escucha" del bus.
Si el bus se encuentra "ocupado" porque hay otros terminales transmitiendo ó recepcionando, el terminal se queda en un bucle de espera hasta que se desocupe el bus y allí comenzar su transmisión.

Habría que organizar un protocolo. Pensar, seguir estudiando, seguir investigando.

Buen dato Bruno, muy creativo por cierto. Gracias !  :wink:

Saludos a todos !
Mario

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: RS485 y Terminales ocupadas en otras cosas - Sincronizar tiempos de HSERIN
« Respuesta #8 en: 15 de Agosto de 2008, 01:57:29 »
A mí no me parece tan extraño que el PC, cuando necesite hablar con un dispositivo, envíe de forma reiterada por el bus el código de identificación de ese dispositivo hasta que se encuentre libre.
Además, si el programa del dispositivo está optimizado para acudir con frecuencia al bus a ver si hay algo pendiente de procesar, pues mejor que mejor.
Obviamente habrá que controlar los Timeouts para no dejar al PC en una eterna espera si el dispositivo está colgado o desconectado.
Suerte con ese pedazo proyecto, Don Mario.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: RS485 y Terminales ocupadas en otras cosas - Sincronizar tiempos de HSERIN
« Respuesta #9 en: 15 de Agosto de 2008, 07:41:21 »
Como bien dice Bruno solucionar los problemas del Hard con Soft.
Pero de todas formas imagino que lo ideal seria tener una controladora lo suficiente potente como controlar todas las placas sin necesidad de utilizar el ordenador, o solo en contadas ocasiones e incluso sin la necesidad de utilizarlo. Hace tiempo cuando comencé con los PIC mi prioridad fue la de construir un búfer que añadiera una cantidad de memoria a los escuálidos Bytes de entrada de la UAR y por supuesto intentar trabajar sin utilizar paradas absolutas del micro (delay = pause = wait =KK).

Saliendo un poco del tema:

Y para trabajar con sistemas con multitud de terminales lo ideal es montar un protocolo de comunicaciones nos permita trabajar en red y dejarlo abierto a futuras ampliaciones del sistema. Para lograr esto se puede crear un sistema en el que se envía una serie de tramas y que posteriormente se espera una respuesta de acuse de recibo. En general cuando se envía una trama al sistema todos los elementos reciben y analizan la trama y deciden si quedan en silencio o deben de generar una respuesta junto con una acción interna de esta forma no hay porque tener un elemento que es el que dirige la comunicación. Pero como dice Nocturno no tiene importancia que un master dirija la comunicación repitiendo varias veces hasta lograr respuesta (para suplir el defecto del hard), por supuesto como bien dice hay que saber cuantos intentos son necesarios para marcar como malfuncionamiento la placa remota y dejarla fuera de la red. De todas formas el utilizar funciones para la simulación de módulos en general no es una buena idea teniendo en cuenta que los micros mas o menos completos no salen ya caros.

PD. Hay que tener en cuenta que una vez construido el protocolo y las rutinas de control de los módulos internos, son prácticamente las misma para cualquier otro proyecto.
Yo uso rutinas que tienen mas de 8 años y que por supuesto son optimizadas en código y rapidez y construidas con el mismo lenguaje. En general y por propia experiencia la estructura de nuestro código fuente es fundamental.
Y no es mi interés ni propósito darle clases de programación a nadie... :mrgreen:
« Última modificación: 15 de Agosto de 2008, 07:44:33 por dogflu66 »
Saludos desde Granada, España.

Desconectado Marioguillote

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 1926
    • Servisystem
Re: RS485 y Terminales ocupadas en otras cosas - Sincronizar tiempos de HSERIN
« Respuesta #10 en: 16 de Agosto de 2008, 00:54:00 »
A mí no me parece tan extraño que el PC, cuando necesite hablar con un dispositivo, envíe de forma reiterada por el bus el código de identificación de ese dispositivo hasta que se encuentre libre.

Ése preciso punto era el que me inquietaba un poco.
Si bien venimos validando la obtención del propósito cómo meta, me parecía poco elegante dicha opción y por éso quería compartir ésta experiencia con Uds. para aprender las formas más apropiadas y más utilizadas en éstos casos.

Suerte con ese pedazo proyecto, Don Mario.

Gracias Manolo !  :) 

Y no es mi interés ni propósito darle clases de programación a nadie... :mrgreen:

Sin embargo a muchos nos viene bárbaro y estamos muy agradecidos de tener personas con las que se pueda charlar, debatir, plantear y compartir un método de trabajo tratando de lograr una optimización.
Al menos yo, soy un eterno agradecido de cada aporte de ideas que me han brindado en éste hilo.  :)

Sigo atento en el hilo por si aparecen otros amigos con otros métodos.

Saludos !
Mario

Desconectado jansuini

  • Moderador Local
  • PIC24F
  • *****
  • Mensajes: 566
Re: RS485 y Terminales ocupadas en otras cosas - Sincronizar tiempos de HSERIN
« Respuesta #11 en: 16 de Agosto de 2008, 12:46:44 »
Mario:
Te comento como lo tengo resuelto con dispositivos modbus:
En la instrucciòn serin hay un tiempo de espera de caracteres relativamente grande ,ejemplo 1000 milisegundos ,si no ingresaron carcterse salgo a mi rutina de lecturas de variables internas y demas ,esta rutina normalmente es muy rapida, microsegundos seguramente y retorno a esperar caracteres por el puerto serie desde la master ,si llegar caracteres veo que correspondan a mi numero de esclavo ,de no ser asi tambien aprovecho y ejecuto la rutina de variables internas y retorno a la lectura del puerto.-

Todo esto me funciona mayormente sin problemas
Espero te sirva
Jorge

Desconectado RALF2

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2062
Re: RS485 y Terminales ocupadas en otras cosas - Sincronizar tiempos de HSERIN
« Respuesta #12 en: 16 de Agosto de 2008, 13:21:42 »
Hola amigos!
Muy interesante el tema  :mrgreen:
Mario los pic los estas programando con el pic basic pro?
Porque si utilizas interrrupciones por hardware para que cuando la pc le envie una orden al pic para que por ejemplo le de status de la temperatura este responda de inmediato. No importando si en ese momento entra en una rutina que genere un pause por ejemplo de 1 segundo, esto si y solo si, es posible si utilizas el psi o el proton  :D
POorque creo que el pic basic pro no te lo permite  :(

Esa es una opcion claro esta lo  que comentan los amigos.
Y si utilizas interrupciones por hardware en proton puedes usar el serin en vez del hserin  :shock: :mrgreen:
ojo esto ultimo abria que probarlo puesto que no lo he hecho  :?

Saludos