Comunicación RS-485 PIC C CCS

De mi intervención anterior...

SIC "...he visto que usas velocidad de 9600, intenta bajar a 1200..."

Las resistencias de terminación en las dos puntas de 120ohms son necesarias(no se si las culpables de que no te funcione a ti el sistema).

Las distancias que usas no son largas pero no tengo ni la mas pálida idea de que has echo tu en lo físico/real....conexiones, alimentación, etc, etc.

Una cosa es el esquema, plano, etc. y otra muy distinta la construcción real y física en si.
 
Tengo esas plaquetas que se venden de Arduino de RS485 con unas placas con los pic16f886 con par telefonico que no hay mas de un metro entre una laca y otra con una en el medio ningun secreto mas que eso, por eso preguno es necesario con esas plaquetas rs485 de arduino poner resistencias? porque son un circiuito completo esas plaquetas de arduino. y voy a probar a bajar la velocidad.
 
Hola dcsalg, veo que estas padeciendo con el problema este del rs485.
Por lo que leí en simulación esta funcionando todo.

Entonces ahora es cuestión de atacar al hardware, para esto se puede hacer lo siguiente:
Verificar que los módulos rs485 estén en buen estado.

Para esto nos olvidamos de todo el protocolo implementado (solo se cambia el programa, el circuito debe estar armado sin que le falte nada) y solo usamos el puerto serie.
Se elige un supuesto maestro y este envía una trama de datos cualquiera a los demás que serían los esclavos, los esclavos deberían recibir la misma información que envió le maestro, si alguno de los esclavos no recibe los datos correctamente entonces ya sabremos a quien centrar la atención.
Supongo que para verificar si recibió los datos se puede usar un lcd u otros puertos serie conectados a la pc.
 
Hola Saint_ lo que sucede que no es que hay un maestro o un esclavo todos se comunican con todos, lomque utilizo son esos modulos de RS485 que se venden y lo que sucede que no siempre es el mismo el que responde segun como se le antoja a veces reacciona siempre uno o los 3 o a veces ni recibe entonces es como que me deja descolocado todo esto. tendra algo que ver porque no utilizo el RS232 de la plaqueta y utilizo por software? pero la realidad que no creo que sea eso la libreria de CCS esta bastante bien realizada, el problema es que si tengo 3 plaquetas, y transmito de la 1 la plaqueta 2 y 3 lo reciban y enciendan el led, como un repetidor de la 1 seria, y si se me ocurre apagar el led de la laqueta 2, que la plaqueta 1 y 3 lo apaguen, y si enciendo de la 3, que la plaqueta 1 y 2 enciendan, no resulta. Baje velocidad, la comunicacion esta a 1 metro entre plaquetas, y es cosa de no creer uno un par telefonico como puse antes para esta prueba que para un metro de distancia me va a servir como prueba y lo peor que como vi en su momento que funcionaba en la computadora construi las 3 plaquetas quedo lindo pero me pasa esto y me agarro una cosa adentro que no lo puedo creer porque le estoy haciendo de todo, nose ya porque lado viene el problema. :cry:
 
Normalmente en I2C se usa un maestro y los demás son esclavos, lo que tu estás haciendo caería en multimaestro y es tiene sus detalles, en lo posible seria que trabajes en modo maestro-esclavo.
 
Saint_ estoy usando RS485, no I2C.
Recién ahora comienzan a funcionar las plaquetas, lo que no entiendo es por qué tengo que resetar cada plaqueta con el boton de reset, si no, no funcionan.
O sea, conecto las plaquetas que son 3 y nada, presiono reset, esa comienza a funcionar, luego presiono el reset de la siguiente y así, si no presiono el reset, nada.
Es como si arrancara mal el programa, no sé. ¿Estará mal el orden de las líneas de código?
 
Última edición por un moderador:
Saint_ ¿Y cómo hago eso de maestro esclavo? Porque en caso de I2C pones Master y los Otros Slave.
Y otra consulta. ¿Si yo presiono una tecla en un esclavo para que encienda su led y quiero que encienda el led en el maestro, el esclavo no pasa ser master?
Porque el que envía en este caso es el esclavo y no puedo estar interrogando con el maestro a todo momento los esclavos.
Creo porque esa linea también se usa para otras cosas, si-no estaría todo el tiempo ocupada en interrogar.
 
Última edición por un moderador:
En realidad el maestro es que decide que va a hacer los esclavos.

En el caso de que si el en el esclavo se presiona una tecla y este enciende un led, se debería guardar el estado del led en alguna variable y cuando el maestro le pida información recién el esclavo le envié el dato esto implica que el maestro deberá interrogar periódicamente al o los esclavos, los esclavos pueden estar haciendo sus tareas y solo enviar información cuando el maestro se los pida. Por eso en la trama RS485 normalmente se envía el id del que inicia la comunicación (este podría ser el maestro), el ID del destinatario (podría ser el esclavo), numero de bytes enviados, datos y el ackt, de este modo se pueden detectas si hubo errores y si eso pasa entonces retransmitir.
 
Disculpa que tarde en responder, voy a probar eso que me dijiste, tendría entonces que crear una central que valla chequeando esos módulos la macana que nose a que frecuencia puedo chequear? , una consulta trabaja así un sistema domotico? si hago conexión por rs485 y tengo módulos por la casa de 4 canales que es lo que fabrique con un pic cada modulo, que puedo encender con teclas eso lo guardo en una variable y la central recibe ese dato y si hay otro modulo que tendría que repetir por ejemplo un canal del modulo que tome la central se lo envía? nose si me explique bien? yo por ejemplo había pensado dos módulos con el mismo nombre si uno enciende enviaba el dato y si hay otro con el mismo nombre hacia lo mismo. De esta manera la central toma de uno y lo envía al otro. voy a probar. ojala me salga me va a llevar un tiempito porque tengo que hacer la central pero ojala funcione. Tendría que hacer que el modulo que almaceno la información una vez que la central lo lea cambie un estado de alguna bandera para que no repita eso de nuevo o no es necesario eso que opinas?
 
nose a que frecuencia puedo chequear?
yo creo que con 100ms es suficiente.
si hago conexión por rs485 y tengo módulos por la casa de 4 canales que es lo que fabrique con un pic cada modulo, que puedo encender con teclas eso lo guardo en una variable y la central recibe ese dato y si hay otro modulo que tendría que repetir por ejemplo un canal del modulo que tome la central se lo envía?
Si un esclavo (tarjeta, modulo teclado o lo que sea) tiene que mandar información a otro esclavo, forzosamente el maestro tiene que leer la información del primer esclavo y luego enviársela al segundo esclavo.
yo por ejemplo había pensado dos módulos con el mismo nombre si uno enciende enviaba el dato y si hay otro con el mismo nombre hacia lo mismo. De esta manera la central toma de uno y lo envía al otro.
No es buena idea que dos módulos tengan el mismo nombre, id o dirección a menos que ambos se comporten exactamente igual ...pero exactamente igual, de otro modo igual habría problemas en el bus de comunicaciones. En estos casos cada esclavo debería tener su propio nombre, id o dirección y todo controlado por el maestro
 
sabes Mientras lo estoy haciendo me doy cuenta que no me convence algo, la central tiene un display que muestra la hora, tiene un teclado para configuracion, y si me pongo a chequear uno por uno, que aun no lo pude lograr, pierde tiempo en el chequeo desatendiendo lo demas, la cosa es que en todo caso la central escuche lo que los demas puedan enviar y no realizar un chequeo uno por uno no es alfo muy practico eso me parece. es como poner el despertador a las 4 de la mañana y estar despierto mirando la hora y cuando sean las 4 te levantas. Lo ideal es que haga sus cosas y cuando pasa algo en el modulo llame la atencion. pero ahi en este caso la central ya no es que chequea. por eso algo no comprendo de lo maestro y esclavo. en todo caso los modulos de 4 canales funcionen encendiendo las luces, si tenes una casa de dos pisos lo ideal es que en el piso de ariba pongas otro modulo, si se enciende la luz del frente de la casa planta baja lo que tiene que hacer es que el modulo de arriba dice ah encendio afuera de abajo yo voy hacer lo mismo afuera pero en el piso de arriba y enciende. entonces te queda todo el frente iluminado. Claro este ejemplo es sencillo con dos ahora imaginar con 3 o 4 modulos.
 
sabes Mientras lo estoy haciendo me doy cuenta que no me convence algo, la central tiene un display que muestra la hora, tiene un teclado para configuracion, y si me pongo a chequear uno por uno, que aun no lo pude lograr, pierde tiempo en el chequeo desatendiendo lo demas...
Todo depende de que tan bien se maneje los recursos del microcontrolador, por ejemplo (sumiendo que el microcontyrolador tiene 3 temporizadores, puerto serie harware...) al diplay se le asigna el temporizador 0, al teclado el temporizador 1, aún queda el temporizador 2 para que efectué la consulta a los esclavos y mediante la interrupción del puerto serie atender los datos enviados por los esclavos, todo está en que tan bien se distribuyan las tareas.
 

D@rkbytes

Moderador
Sí, por eso el microcontrolador dispone de varios periféricos, timers e interrupciones.
No es bueno ni conveniente hacer todo en el bucle principal del programa.
 
Hola, ya voy adelantando pero tengo un problema ue nose como solucionarlo, tengo la central y dos modulos por ejemplo modulo 1 con direccion 0x20 y modulo dos con direccion 0x30.
Entonces enciendo la luz en el modulo 1, y la trama es se me ocurrio asi 0x4c 0x01 es un ejemplo ese el 0x4c es para que sepa que es una LUZ, el segundo que es 0x01 seria el estado de la luz osea un estado del pin de salida si es 0x00 luz apagada y si es 0x01 encendid, pero el inconveniente es, la cemtral escanea los modulos primero 0x20 y despues el 0x30, entonces vos encendes la luz del mosulo uno osea del 0x20 lee el estado y lo envia al modulo 0x30, osea la central envia 0x4c 0x01, pero si apago del modulo dos la luz cuando chequea el modulo 1 y ve que el modulo 2 esta apagado lo enciende de nuevo entonces no puedo apagarlo del dos se enciende y se apaga del uno y la cosa que se pueda hacer de ambos lados, como puedo solucionar eso? gracias
 
Pues me imagino que en algún lugar de ti código tienes banderas que no se actualizan en cuanto se hace un cambio de estado por parte del maestro o de los esclavos. La solución no debería ser muy complicada pero depende de cómo este estructurado tus programas.
 
Hola Estube haciendo el programa y es una cosa que no va, nada practico si la central tiene que chequear es engorroso, chequea los modulos que cual encendio la luz si hay una relacion con otro modulo le envia el dato para que lo encienda y lo mismo al contrario, si hay un modulo que tiene direccion 0x30 y otro con 0x20 chequea el primero si no tiene relaciones con otros modulos no hace nada, pero si tiene (como es l relacion hay que hacer un programa en el master que haga relaciones entre modulos) lee el modulo 0x30 luego lo envia el dao al 0x20, pero si no precionaste y encendiste la luz en ese chequea el 0x20 y si es asi lo envia al 0x30 para que lo copie, bueno eso ahora extendelo a unos 30 modulos y relaciones es no solo tedioso sino poco practico y no solo eso sino lo lento ques todo esto, no es mas facil que el odulo 0x30 le envie el dato al 0x20 y listo y lo mismo al reves con una copia al master para que sepa lo que hace. entonces es mucho mas rapido asi. el maestro sabe lo que sucede pero no administra, se envian los datos entre modulos. y como sabe la direccion del otro modulo el 0x30 por ejemplo por un dipswitch. pero la consulta no tendria que haber problemas con los datos que viajan en la linea , la libreria RS485 no esta preparada para chequear la linea cuando esta libre? cuando se usa el comando RS485send?bueno eso es lo que quise hacer desde un principio hace meses y es lo que no funciona bien
 
Bueno, si prefieres trabajar en modo multimaestro y ya que la pregunta es más puntual. Te cometo que existe la función rs485_wait_for_bus(tiempo_en_ms); que espera a que el bus este libre y la función rs485_send_message(int to, int len, int* data); devuelve 1 si se envió los daros correctamente y 0 si hubo fallo.

Te convendría mucho darle una buena mirada a la librería que CCS trae para el RS4856.
 
Arriba