TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: RedPic en 23 de Octubre de 2007, 18:15:53

Título: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: RedPic en 23 de Octubre de 2007, 18:15:53
Introducción:

Venimos hablando desde hace tiempo del RS485, de cómo montarlo con los PIC's y de cómo implementar algún algoritmo fácil para que varios dispositivos contesten cuando se les pregunte, y solo entonces. Rescato aquí un pequeño proyecto de hace unos meses en el que hicimos exactamente eso: Un PIC 16F628A que habla con el PC mediante RS485 y es capaz de comandar un sencillo Relé. Poca cosa para algunos pero todo un logro para muchos.  :mrgreen:

Con este proyecto podemos aprender todas las técnicas básicas para implementar una red RS485 con dispositivos diferenciados hablando con un PC que va a actuar como MASTER.

1ª Parte: El Hardware.

El esquema:

Este pequeño proyecto tiene pocas cosas, un PIC 16F628A sin cristal externo, vamos a usar el oscilador interno a 4Mhz, un Relé de 5V que vamos a activar con un simple transistor y una pequeña fuente alrededor de un 7805 para poder utilizar 12V, y por supuesto, un SN75176 que es uno de los muchos chips idénticos al MAX485 pero mas baratos.

(http://picmania.garcia-cuervo.net/images/profesional/profesional_-_rele485_-_01_-_schema_-_thumb.gif) (http://picmania.garcia-cuervo.net/images/profesional/profesional_-_rele485_-_01_-_schema.gif)

El PCB que me salió es este :

(http://picmania.garcia-cuervo.net/images/profesional/profesional_-_rele485_-_03_-_board_nets_-_thumb.gif) (http://picmania.garcia-cuervo.net/images/profesional/profesional_-_rele485_-_03_-_board_nets.gif)

Que con sus componentes aparece así:

(http://picmania.garcia-cuervo.net/images/profesional/profesional_-_rele485_-_02_-_board_components_-_thumb.gif) (http://picmania.garcia-cuervo.net/images/profesional/profesional_-_rele485_-_02_-_board_components.gif)

Una vez construido y dándole la "primera luz" mostraba este aspecto:

(http://picmania.garcia-cuervo.net/images/profesional/profesional_-_rele485_-_06_-_primera_luz.jpg)

Continuará ...
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: RedPic en 23 de Octubre de 2007, 18:16:58
2ª Parte: El Software.

El dispositivo que vamos a montar es un SLAVE, esclavo, de una Red RS485.

Este firmware tiene la característica de tener que conmutar de Low un Pin del PIC para recibir desde la USART, que es el estado por defecto, a High para poder transmitir, son las funciones USART_activa_rx() y USART_activa_tx().

La recepción se realiza sobre un buffer, carácter a carácter, de forma que sólo al recibir un carácter especial de finalización podemos pasar a procesar lo recibido. Para ello usamos la interrupción de la USART y la funcione USART_add_to_buffer(). El carácter de finalización de una trama lo tenemos definido con un define const char end_of_transmit = '!' con vistas a facilitar su cambio según las necesidades. Yo he utilizado el carácter '!' para indicar el fin de la trama, podéis coger el que queráis.

Como la transmisión de un mensaje del MASTER es broadcast, todos lo oyen, es imprescindible que cada PIC lleve un identificador único en la red RS485, para que se sienta aludido, responda, sólo cuando dicho identificador único aparezca en la trama enviada por el MASTER. Para ello he implementado un define const char WhoAmI = '1'; que ha de ser único para cada PIC, así a uno le pondremos '1', a otro '2' ... etc.

Como además podemos tener en la misma red varios tipos de dispositivos, que no sean éste Relé en la Lejanía, le he colocado otro define que me dice a qué tipo de dispositivo vamos a responder. En nuestro caso vamos a usar const char WhatAmI = 'R';

Y por último necesitamos al menos una orden directa para ejecutar una función específica. La única orden que he implementado es const char Command_Execute = 'X'; que va a producir una conmutación del Relé de un segundo de tiempo.
 
Todo esto significa que el PC MASTER va a transmitir un frame del estilo de "R1X!" cuyo significado sería: Mensaje a los Dispositivos de Tipo 'R', al concreto dispositivo '1' para que ejecute el Comando 'X', fin de transmisión.

Todos los PIC escucharán este mensaje pero sólo el PIC que sea de Tipo 'R', que tenga el identificador concreto '1' ejecutará el comando 'X'.

Y por último, para comprobar que la orden ha sido recibida correctamente este mismo PIC que sí va a ejecutar la orden recibida responderá con una trama del estilo de "R1A!" significando que el Relé 1 ha actuado correctamente.

Fijaos que todos los demás oirán ese "R1A!" pero no harán nada porque no son el '1' ni 'A' es un comando válido.

El código completo es:

Código: C++
  1. /** \file firmware_iRELE485-628.c
  2.  * \brief Este fichero contiene el cuerpo principal del Firmware del\n
  3.  * dispositivo auxiliar satélite de la iACD V1.0.4. denominado iRELE485-628
  4.  *
  5.  * Integra todos los subsistemas y funciones implementados.\n
  6.  * Source para el compilador CCS C v.3.242
  7.  *
  8.  * Microprocesador : <b>16F628A</b> (18 pines PDIP) \n\n
  9.  * Fuses utilizados: \n
  10.  * \li <b>INTRC</b> Internal RC Osc
  11.  * \li <b>MCLR</b> Master Clear pin enabled
  12.  * \li <b>NOWDT</b> No Watch Dog Timer
  13.  * \li <b>NOPROTECT</b> Code not protected from reading
  14.  * \li <b>NOPUT</b> No Power Up Timer
  15.  * \li <b>NOBROWNOUT</b> No brownout reset
  16.  * \li <b>NOLVP</b> No low voltage prgming, B3(PIC16)
  17.  * \li <b>NOCPD</b> No EE protection
  18.  *
  19.  * \author Diego Márquez García-Cuervo \n
  20.  * <http://picmania.garcia-cuervo.net>
  21.  *
  22.  * \version 1.0.0.A
  23.  */
  24.  
  25. ///////////////////////////////////////////////////////////////////////////////////////////////////
  26. //
  27. // Definiciones estándar del 16F628A
  28. //
  29. ///////////////////////////////////////////////////////////////////////////////////////////////////
  30.  
  31. #include <16F628A.h>
  32.  
  33. ///////////////////////////////////////////////////////////////////////////////////////////////////
  34. //
  35. // Fuses y ajuste de Clock
  36. //
  37. ///////////////////////////////////////////////////////////////////////////////////////////////////
  38.  
  39. #fuses INTRC,MCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP,NOCPD
  40. #use delay(clock=4000000)
  41.  
  42. ///////////////////////////////////////////////////////////////////////////////////////////////////
  43. //
  44. // Defines y Constantes
  45. //
  46. ///////////////////////////////////////////////////////////////////////////////////////////////////
  47.  
  48. /*! \def DRIVER_RELE
  49.  *   Pin accionador del Relé número 1 \li HIGH : Relé ON.
  50.  */
  51. #define DRIVER_RELE PIN_B4
  52.  
  53. /*! \def TX_485_ENABLE
  54.  *  Pin que habilita la transmisión por el canal RS485
  55.  * \li LOW Habilita recepción RS485
  56.  * \li HIGH Habilita transmisión RS485.
  57.  */
  58. #define TX_485_ENABLE PIN_B5
  59.  
  60. /*! \def bytes_for_USART_buffer
  61.  *  \brief Establece el número de bytes de longitud del buffer de la USART.
  62.  */
  63. #define bytes_for_USART_buffer 12
  64.  
  65. /*! \var const char VERSION
  66.  *  \brief Versión del Firmware.
  67.  */
  68. const char VERSION[]="1.0.0\0";
  69.  
  70. /*! \var const char WhatAmI
  71.  *  \brief Identificador de tipo de dispositivo: 'R' Relé.
  72.  */
  73. const char WhatAmI = 'R';
  74.  
  75. /*! \var const char WhoAmI
  76.  *  \brief Identificador de dispositivo.
  77.  */
  78. const char WhoAmI = '1';
  79.  
  80. /*! \var const char Command_Execute
  81.  *  \brief Comando que indica ejecución de acción : Activar Relé
  82.  */
  83. const char Command_Execute = 'X';
  84.  
  85. /*! \var const char end_of_transmit
  86.  *  \brief Carácter que indica fin de transmisión (no buffereable)
  87.  */
  88. const char end_of_transmit = '!';
  89.  
  90. ///////////////////////////////////////////////////////////////////////////////////////////////////
  91. //
  92. // Canal de Comunicación
  93. //
  94. ///////////////////////////////////////////////////////////////////////////////////////////////////
  95.  
  96. #use rs232(baud=9600,xmit=PIN_B2,rcv=PIN_B1)
  97.  
  98. ///////////////////////////////////////////////////////////////////////////////////////////////////
  99. //
  100. // Prototipos de Funciones
  101. //
  102. ///////////////////////////////////////////////////////////////////////////////////////////////////
  103.  
  104. void USART_activa_tx(void);
  105. void USART_activa_rx(void);
  106. void USART_add_to_buffer(char c);
  107.  
  108. ///////////////////////////////////////////////////////////////////////////////////////////////////
  109. //
  110. // R A M : Variables Globales Estáticas
  111. //
  112. ///////////////////////////////////////////////////////////////////////////////////////////////////
  113.  
  114. /*! \var USART_buffer
  115.  *  \brief Buffer de la USART
  116.  */
  117. static char USART_buffer[bytes_for_USART_buffer];
  118.  
  119. /*! \var USART_nextRec
  120.  *  \brief Indice del Buffer de la USART
  121.  */
  122. static int8 USART_nextRec;
  123.  
  124. /** \var Command
  125.   * \brief Comando válido para ejecutar.
  126.   */
  127. int8 Command;
  128.  
  129. ///////////////////////////////////////////////////////////////////////////////////////////////////
  130. //
  131. // Funciones
  132. //
  133. ///////////////////////////////////////////////////////////////////////////////////////////////////
  134.  
  135. /** \brief Abre el canal RS485 para transmitir.
  136.   * \return void
  137.   */
  138. void USART_activa_tx(void){
  139.   output_high(TX_485_ENABLE);
  140.   delay_ms(5);
  141. }
  142.  
  143. /** \brief Abre el canal RS485 para recibir.
  144.   * \return void
  145.   */
  146. void USART_activa_rx(void){
  147.   delay_ms(5);
  148.   output_low(TX_485_ENABLE);
  149.   delay_ms(1);
  150. }
  151.  
  152. /** \brief Inicializa el Buffer de la USART
  153.   *
  154.   * Recoge el último carácter recibido desde la USART sobre USART_buffer
  155.   * e incrementa en 1 el índice USART_nextRec.\n\n
  156.   * Si el carácter recibido es Retorno de carro '\\r' ó 0x0D comprueba identidad de dispositivo y comando recibido
  157.   *
  158.   * \return void
  159.   */
  160. void USART_add_to_buffer(char c){
  161.  
  162.    USART_buffer[USART_nextRec++]=c;
  163.    if(USART_nextRec==bytes_for_USART_buffer){
  164.       USART_nextRec=0;
  165.    }
  166.  
  167.    if(c==end_of_transmit){
  168.       --USART_nextRec;
  169.       if(USART_buffer[USART_nextRec-3]==WhatAmI){
  170.          if(USART_buffer[USART_nextRec-2]==WhoAmI){
  171.            if(USART_buffer[USART_nextRec-1]==Command_Execute){
  172.               Command=0x01;
  173.            }
  174.          }
  175.       }
  176.       USART_nextRec = 0;
  177.    }
  178. }
  179.  
  180. ///////////////////////////////////////////////////////////////////////////////////////////////////
  181. //
  182. // Rutinas de Servicio de Interrupciones
  183. //
  184. ///////////////////////////////////////////////////////////////////////////////////////////////////
  185.  
  186. #int_rda
  187. /** \brief Interrupción por : Recepción del Canal Serie.
  188.   *
  189.   */
  190. void interrupt_service_rutine_rda(void) {
  191.  
  192.    char USART_nextChar;
  193.  
  194.    USART_nextChar='\0';
  195.    if(kbhit()){
  196.       USART_nextChar=getc();
  197.       USART_add_to_buffer(USART_nextChar);
  198.    }
  199. }
  200.  
  201. ///////////////////////////////////////////////////////////////////////////////////////////////////
  202. //
  203. // M A I N
  204. //
  205. ///////////////////////////////////////////////////////////////////////////////////////////////////
  206.  
  207. /** \brief Constituye el núcleo principal del sistema
  208.   *
  209.   * \return void.
  210.   */
  211. void main(void) {
  212.  
  213.    setup_oscillator(OSC_4MHZ);
  214.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  215.    setup_timer_1(T1_INTERNAL|T1_DIV_BY_4);
  216.    setup_timer_2(T2_DISABLED,0,1);
  217.    setup_comparator(NC_NC_NC_NC);
  218.    setup_vref(FALSE);
  219.    port_b_pullups(False);
  220.    set_tris_b(0b00000010);
  221.    output_low(DRIVER_RELE);
  222.    delay_ms(100);
  223.  
  224.    USART_nextRec = 0;
  225.    Command = 0x00;
  226.  
  227.    USART_activa_rx();
  228.    delay_ms(333);
  229.  
  230.    enable_interrupts(global);
  231.    enable_interrupts(int_rda);
  232.  
  233.    USART_activa_tx();
  234.    printf("[iRELE485-628] v.%s\r\n",version);
  235.    USART_activa_rx();
  236.  
  237.    do{
  238.  
  239.       if(Command==0x01){
  240.          Command =0x00;
  241.  
  242.          USART_activa_tx();
  243.          printf("R%cA%c\r\n",WhoAmI,end_of_transmit);
  244.          USART_activa_rx();
  245.  
  246.          output_high(DRIVER_RELE);
  247.          delay_ms(2000);
  248.          output_low(DRIVER_RELE);
  249.        }
  250.  
  251.    } while(true);
  252. }
  253.  
  254. ///////////////////////////////////////////////////////////////////////////////////////////////////
  255. //
  256. // End of firmware
  257. //
  258. ///////////////////////////////////////////////////////////////////////////////////////////////////

Ea, mañana más.  :mrgreen:

Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: ema en 23 de Octubre de 2007, 18:50:46
El proyecto parece bueno pero no estan las imagenes.

Saludos
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: Azicuetano en 23 de Octubre de 2007, 19:08:45
OOhhh... que grande Diego.

Yo tengo ya medio acabada mi comunicación RS485 utilizando las funciones que nos dan los señores de CCS (trama=origen, destino, datos, checksum). La verdad es que me ha costado un poco entenderlas, pero bueno, en cuanto el programa pase mi bataría de pruebas, lo cuelgo en este hilo para que esté toda la documentación al respecto más conglomerada  :D


Un saludo desde Alicante.
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: RedPic en 23 de Octubre de 2007, 19:08:48
Acabo de reiniciar el servidor. Tened paciencia porque es un servidor casero y hay veces que el tráfico le viene largo, alto y ancho.  :mrgreen:
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: Nocturno en 24 de Octubre de 2007, 01:27:23
Muy instructiva la práctica; gracias maestro.
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: Mario en 24 de Octubre de 2007, 03:11:38
Muy interesante.

Se intentará realizar algo parecido pero con BASIC; esta información será de gran utilidad.





PD: ¡¡¡Necesito meterme a CCS pero ya!!!  :D
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: ema en 29 de Octubre de 2007, 17:43:33
La verdad que muy bueno lo tuyo.
Felicitaciones y gracias por compartirlo tan explicitamente.

En alguna otra vida tu has sido profesor!!!!!!!

Saludos
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: zonadjarn en 30 de Octubre de 2007, 14:56:51
Muy interesante, gracias por informarme de este hilo que estas creando, permaneceré atento para poder ver como hacer mi trabajo relacionado con esto....Saludos
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: stk500 en 11 de Noviembre de 2007, 08:44:53
Hola Redpic!
Una pregunta porque estoy luchando con DMXPack?
yo uso de driver el SN75176, quizas tu ha visto el esquema, me sucede que dandole Señal DMX en su entrada me sale en la salida pin 1
Ocilaciones de corriente continua, cosa que no estoy seguro si debe ser asi, lastima no estoy en mi trabajo para comprobarlo, y claro el dimmer no me funciona como debe ser :x las lucces me hace detellos pero no regula :?
claro esta que si TX trasmite RX recibe la señal detectada debe dar una corriente que es la que me gustaria saber!
 :mrgreen:
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: xrom en 12 de Noviembre de 2007, 19:54:04
Magnífico ejemplo Redpic sobre el Bus 485. Me he tomado la libertad de crear la simulación en Proteus para su mejor comprensión. Un saludo y felicidades por el foro.

Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: RedPic en 13 de Noviembre de 2007, 02:53:39
Muchas gracias xrom por tu aporte, los amigos del Foro y yo te lo agradecemos.  :mrgreen:
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: valdorre en 22 de Noviembre de 2007, 19:08:08
hola, estoy haciendo pruebas con rs485 y me estan dando bastante batalla.
generaba errores en la comunicacion de los datos, como si tubiera interferencias.
paso a comentar algunos cambios que hice con los que logre que se comunicara un 877 con la pc. use sn75176.
 #use rs232(baud=38400,xmit=PIN_C6,rcv=PIN_C7, enable=PIN_C5).
 puse resistencias de 10k a positivo en tx, rx y enable.   
 en la salida del sn75176 puse una resistencia de 120 ohms entre las patas 6 y 7 y de 1k de la pata 7 a vss y de la pata 6 a vdd.

Diego, hay alguna otra cosa que pueda hacer?? la velocidad de comunicacion es bastante alta, sera por eso??  :?
saludos

Osvaldo

Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: MGLSOFT en 22 de Noviembre de 2007, 23:13:57
Que cableado utilizas para unir los nodos??? :shock:
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: RedPic en 23 de Noviembre de 2007, 02:24:21
Según la norma las resistencias de 120 Ohms deben ir en ambos extremos de la red RS485, cerrando entre sí los dos hilos tanto junto al SN751766 como junto al PC. Yo normalmente o no pongo ninguna o pongo las dos.
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: valdorre en 23 de Noviembre de 2007, 08:08:27
hola, gracias por responder,
Que cableado utilizas para unir los nodos??? :shock:
estoy usando cable de red utp, que es lo que tengo a mano :mrgreen:
Diego, voy a probar poniendole las 2 resistencias (ahora tiene solo lado pc)
con las resistencias a positivo en las patas 1, 2-3 y 4 del sn75176 de me solucionaron los problemas (aparentemente)
lei por ahi que lo que sucede en que el sn75176 y los pics tienen distintos umbrales de transicion de alto a bajo y por eso genera errores de comunicacion...

saludos
Osvaldo
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: MGLSOFT en 23 de Noviembre de 2007, 08:30:41
Une las masas de ambos circuitos, en lo posible utilizando la malla o en su defecto uno de los pares del cable...
Utilizas uno de los pares trenzados para el 485, no?? :mrgreen:
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: valdorre en 23 de Noviembre de 2007, 09:38:00
upss.... me parece que se me escapo la tortuga....
no se si no me equivoque con la coneccion de los pares trenzados.... a la tarde te cuento.
en cuanto a la masa, alimento el nodo remoto pos el mismo cable de red

saludos 
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: RedPic en 23 de Noviembre de 2007, 15:35:50
En temas de comunicaciones la mejor información, con diferencia de todo los demás que he encontrado, son las Application Notes de Maxim (http://www.maxim-ic.com/). Y en el tema del RS485 mas aún si cabe.

Te recomiendo las Application Notes by Category : Interface Circuits : RS485 (http://www.maxim-ic.com/appnotes10.cfm/ac_pk/14#30)

Y de ellos uno que no tiene desperdicio, y que en temas de RS485 debería ser de obligada lectura antes de ponerse hacer nada con este sistema: Guidelines for Proper Wiring of an RS-485 (TIA/EIA-485-A) Network (http://www.maxim-ic.com/appnotes.cfm/an_pk/763)

(http://media.maxim-ic.com/images/appnotes/763/DI23Fig04.gif)

Cuando leemos ésta última AppNote nuestro conocimiento del RS485 empieza a ser algo cierto y no las ideas difusas que teníamos antes.  :mrgreen:



 
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: MGLSOFT en 23 de Noviembre de 2007, 16:07:28
Buena nota, Diego!! :mrgreen:
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: RedPic en 23 de Noviembre de 2007, 16:09:55
En la empresa en la que trabajo soy el encargado de impartir las clases de formación de los nuevos técnicos que entran a trabajar en ella, y como además trabajamos muchísimo con redes RS485 una de las primeras cosas que hago es que ésa nota en concreto se la sepan de memoria y comprendan hasta el último detalle de lo que se cuenta en ella.  :mrgreen:

Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: valdorre en 23 de Noviembre de 2007, 17:19:06
muchas gracias por la info Diego.... la voy a estudiar y voy a prestar mas atencion para no cometer mas errores como equivocarme con el par trenzado... :mrgreen:
saludos y gracias
Osvaldo

pd: siempre me pasa que las cosas que me complican son los descuidos....
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: MGLSOFT en 23 de Noviembre de 2007, 21:29:54
Leete todas las leyes de Murphy !!! :mrgreen: :mrgreen:

A todos nos pasan...
Solucionaste el problema??? :)
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: valdorre en 23 de Noviembre de 2007, 22:25:56
si, hasta ahora funciona bien, gracias por todo... voy a seguir con las pruebas

saludos
Osvaldo
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: MGLSOFT en 24 de Noviembre de 2007, 08:34:07
Me alegro !!! :-/ :-/
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: RedPic en 15 de Enero de 2008, 10:47:24
OOhhh... que grande Diego.

Yo tengo ya medio acabada mi comunicación RS485 utilizando las funciones que nos dan los señores de CCS (trama=origen, destino, datos, checksum). La verdad es que me ha costado un poco entenderlas, pero bueno, en cuanto el programa pase mi bataría de pruebas, lo cuelgo en este hilo para que esté toda la documentación al respecto más conglomerada  :D


Un saludo desde Alicante.

¿ :shock:? ¿Lo acabaste? ja, ja, ja  :D :D :D
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: Azicuetano en 15 de Enero de 2008, 19:40:50
No tío no  :(

Al final se me hincharon las narices (por no decir otra cosa) y me hice yo el protocolo de comunicación (reutilicé uno que ya tenía hecho y probado).

Con las funciones del CCS unas veces funcionaba... otras no... uufff, un disparate que no veas.

Tras mucho meditar el tema me fío más de mi protocolo.

Y me pregunto yo mismo a mis adentros... por que diablos no hice eso desde el principio? Y la respuesta es... pues porque soy un cenutrio  :D


Un saludo desde Alicante.
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: Enigma en 21 de Marzo de 2008, 16:28:23
Hola muchachos espero esten bien!!!, Estee! bueno, estoy por trabajar en un proyecto que tengo de una materia de la universidad y bueno me encontre con que tengo que usar el protocolo RS485 del cual no se nada cabe destacar!!! He estado toda la mañana leyendo por aquí, leyendo por allá! y la verdad que miestras más leo, pos más me enredo :(... Haber, he estado leyendo el progtrama del señor REdpic, pero no entiendo unas instrucciones allí... se lo que hace, pero no se porque hace ciertas instrucciones!!!!

Empieza mi set de preguntas:

1) Esto siempre tiene que ser así:
Citar
Este firmware tiene la característica de tener que conmutar de Low un Pin del PIC para recibir desde la USART, que es el estado por defecto, a High para poder transmitir, son las funciones USART_activa_rx() y USART_activa_tx().

Es decir, siempre se tienen que conmutar?

2) En el programa, con respecto a las funciones void USART_activa_tx(void), dice que está es para activar la transmisión... o.k perfecto.... y void USART_activa_rx(void) dice que es para activar la recepción, muy chevere también, pero por que usar RB5?? los pines de TX y RX no son Rb1 y Rb2???

3) También en el código.... Sr. REdpic, en otro foro vi que el Sr, pocher le hizo unas preguntas, a la cual usted le contesto esto:

Cita de: redpic
Diego te hago unas preguntas, a ver que te parece:

1ª ¿Para que sirve?:

  if(USART_nextRec==bytes_for_USART_buffer){
     USART_nextRec=0;}

Quizá sirva por si se desborda el Buffer, o por si no lee el byte de fin de transmisión (!) que se inicialize el índice.

Exacto

2ª ¿Los delay_ms tienen que ser del orden de esos valores, para que no hayan problemas? He hecho una prueba cargandomelos y se comunican físicamente bien(y con PROTEUS también).

Estos delays son para usar el conversor RS232-RS485 para conectarme al PC, es semiautomático y detecta cuando tiene que conmutar  de recepción a transmisión o viceversa y requiere un tiempo para hacerlo. Si tus dispositivos están siempre en el modo correcto puedes eliminarlos y en paz


Umm!! la verdad, la verdad!!! quede en las mismas!!! :(... Si me puede explicar, por favor se lo agradeceria enormemente!!! :mrgreen:
Sobre todo la primera pregunta que le hizo el Sr. pocher!, es decir, no entiendo por que la letra C.... y que quiere decir con devolverse al indice!!

3) Esto:
 if(c==end_of_transmit){
    --USART_nextRec;
    if(USART_buffer[USART_nextRec-3]==WhatAmI){
      if(USART_buffer[USART_nextRec-2]==WhoAmI){
        if(USART_buffer[USART_nextRec-1]==Command_Execute){
          Command=0x01;

Porque eso?? Rayos!!!! mientras más veo el programa más me enredo!!! su lógica es demasiado avanzada para mis pequeños conocimientos!!!! :?

Aunque no se le puede quitar que está bien didáctico el ejemplo!!!

4), con respecto a la simulación en proteus!!!
Esa conexión siempre se hace así con los max487?? Y porque la Not que va de un max487 a otro???? Otra cosita, el CTS, que señal es esa???

Ustedes disculpen mi gran falta de conocimientos y las preguntas idiotas que a lo mejor hice, pero es que de pana soy nueva en esto y estoy echa un lio además de que tengo mucho interes en aprender, y que mejor manera de hacerlo, que preguntandole a los que más saben! :mrgreen:!!!! Disculpen la molestia, gracias!! Espero su respuesta!!!

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: RedPic en 21 de Marzo de 2008, 18:42:17
Ahí va el set de respuestas:

1.- El protocolo RS485 utiliza ambos hilos tanto para transmitir como para recibir. Por ello Ó se transmite Ó se recibe, no se puede hacer con dos hilos las dos cosas al mismo tiempo. Así que es imprescindible conmutar al MAX485 (o el SN75176 en mi caso) para que Ó transmita Ó reciba.

2.- Efectivamente RB1 y RB2 son RX y TX del PIC y están conectados como corresponde a los RO y DI del MAX485 (o el SN75176 en mi caso) pero como hay que conmutar el MAX485 (o el SN75176 en mi caso) entre recepción y emisión entonces tengo que utilizar otro Pin del PIC para hacerlo y utilicé RB5 aunque podía haber elegido cualquier otro que estuviese libre.

Ten en cuenta que el MAX485 (o el SN75176 en mi caso) con DE/RE en Low recibe en RS485 por A y B, lo decodifica y transmite en TTL por RO, y con DE/RE en High recibe en TTL por DI, lo codifica y lo transmite en RS485 por A y B.

3.A.- El PIC recibe caracteres de uno en uno, uno detrás de otro. Mi programa los va recibiendo y los va guardando en la variable USART_buffer que es una matriz (un arreglo) de 12 bytes de largo. USART_nextRec es una variable en RAM que incremento (le sumo 1) cada vez que recibo un carácter y que me sirve de índice para guardar el caracter recibido en USART_buffer.

Así al principio USART_nextRec vale 0 y USART_buffer está vacío. Cuando llega el primer carácter lo guardo en USART_buffer[USART_nextRec] (o sea en USART_buffer[0]) e incremento USART_nextRec por lo que USART_nextRec vale 1.

Cuando llega el segundo carácter hago lo mismo, o sea que lo guardo en USART_buffer[USART_nextRec] (o lo que es lo mismo: en USART_buffer[1]) e incremento USART_nextRec por lo que USART_nextRec vale ahora 2.

Así ¿hasta cuando? ... Pues hasta que reciba un carácter especial  que me diga "YA HE TERMINADO". Pero si no recibo este carácter especial, por cualquier tipo de fallo, podría darse el caso de ir recibiendo caracteres mucho mas allá de los 12 bytes que tiene USART_buffer de capacidad. Por ello tengo ese límite en el que si recibo mas caracteres de los que caben en USART_buffer vuelvo a poner USART_nextRec a 0 y así me aseguro que no voy a ir guardando caracteres recibidos a lo largo de toda mi RAM.

3.B.- Si no pones todo el código o lees todo el código va a ser difícil que lo entiendas. Me explico:

En la interrupción por recepción de la USART void interrupt_service_rutine_rda(void) tengo

Código: C#
  1. void interrupt_service_rutine_rda(void) {
  2.   char USART_nextChar;
  3.   USART_nextChar='\0';
  4.   if(kbhit()){
  5.      USART_nextChar=getc();
  6.      USART_add_to_buffer(USART_nextChar);
  7.   }
  8. }

O sea que recibo un carácter sobre USART_nextChar y simplemente llamo a la función USART_add_to_buffer(USART_nextChar) pasándole como parámetro el carácter recibido.

Pero es que la definición de esta función es:

Código: C#
  1. void USART_add_to_buffer(char c);

Y ahí es donde tienes la "letra c"

Es el parámetro de entrada de la función encargada de guardar el último carácter recibido en el buffer de recepción.

Esta función de USART_add_to_buffer hace dos cosas.

Una: guarda en el buffer el último carácter recibido y ...

Dos: Mira si se dan las condiciones necesarias para ejecutar una orden si, y solo sí, lo recibido está completo, y también que lo recibido es "para mí en concreto", y también que lo recibido es para "mi tipo de dispositivo", y también que la orden recibida es "ejecuta un comando".   

Si todas estas condiciones se dan entonces cargo el valor 0x01 en Command para que sea ejecutado en el main() del programa.

Todo esto creía que lo tenía bien explicado en el texto del post original. Pero parece que o no esta suficientemente claro o simplemente no lo has leído e intentas comprender directamente qué hace el programa leyendo el código del mismo sin tener en cuenta qué es lo que pretendo hacer con este programa.

Un consejo: Yo, cuando intento comprender un programa primero sustituyo las constantes por sus valores definidos en ellas y después lo leo traduciéndolo al idioma hablado normal. Por ejemplo es ese trozo de código que no comprendes haría ...

Imaginemos que recibo "R1A!" tal como digo en el texto que explica el programa, entonces las variables tendrían los siguientes contenidos:

USART_buffer = {R,1,A,!}
USART_nextRec = 3

Código: CSS
  1. if(c=='!'){
  2.     --USART_nextRec;
  3.     if(USART_buffer[0]=='1'){
  4.       if(USART_buffer[1]=='R'){
  5.         if(USART_buffer[2]=='X'){
  6.           Command=0x01;


Y lo leería: Si el carácter recibido es '!' (el que me indica que la transmisión es completa) entonces decrementa el indice de caracteres recibidos y comprueba si el primer carácter recibido es '1' (o sea si es para mí), y si el segundo cáracter es 'R' (o sea si es para mi tipo que es un Rele) y si el tercer carácter es 'X' (o sea que ejecute una orden). Si todo es correcto entonces carga un 1 en Command.

Como decía en el texto original:

"Todo esto significa que el PC MASTER va a transmitir un frame del estilo de "R1X!" cuyo significado sería: Mensaje a los Dispositivos de Tipo 'R', al concreto dispositivo '1' para que ejecute el Comando 'X', fin de transmisión.

Todos los PIC escucharán este mensaje pero sólo el PIC que sea de Tipo 'R', que tenga el identificador concreto '1' ejecutará el comando 'X'.
"

4.- En cuanto al Proteus no tengo ni idea porque nunca lo he utilizado.  :?

No se si habré sabido explicarme mejor, pero ya sabes que aquí estamos para lo que podamos ayudar.  :mrgreen:

Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: Enigma en 21 de Marzo de 2008, 23:07:19
Hola Sr. Red pic, gracias por responder!!! En estos momentos estoy analizando y revisando
lo que coloco en el post.... O.k, tengo unas dudas! y disculpe nuevamente la molestia!

Nuevamente un segundo set de preguntas:

Cita de: REDPIC
USART_nextRec es una variable en RAM que incremento (le sumo 1) cada vez que recibo un carácter y que me sirve de índice para guardar el caracter
recibido en USART_buffer.

1.) Cuando dice Indice... Se refiere a una especie de variable contador o algo así??

2.) Esa función X, que especifica... pues no está dada como tal? o si?

.....

Continuará!!!!! (Sigo leyendo, y sigo analizando y mientras lo hago pues me surgen más preguntas!!!! :s) :?

Atte: Enigma... La llanerita de Guayana  :-)



P.D: Si lei la primera parte del post!!! pero es que no la comprendi mucho y me fui directamente al programa!!!  (No fue su explicación,
Lo hizo muy bien, soy yo, es que me tienen que explicar con manzanitas!!! jejejeje :mrgreen:)
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: valdorre en 22 de Marzo de 2008, 00:04:45
hola enigma, el índice (USART_nextRec)  es una variable que te indica en que posición se deberá almacenar en la variable USART_buffer el proximo caracter que se va a recibir.
perdón Diego por contestar por vos...

Saludos
Osvaldo
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: Enigma en 22 de Marzo de 2008, 02:43:19
Ahh o.k... ya entendi!!! si era como estaba pensando!!!!! :mrgreen: Gracias amigo valdorre!!!!

Ahora otra preguntica, y de pana disculpen nuevamente!!! pero es que no lo veo!!! :(
 :oops:

USART_buffer[USART_nextRec++]=c;
Aja aquí dice (creo), que le asignas la letra C al incremento de USART_nextRec++... Umm!!  puedo preguntar porque?? Todo lo demás lo entendi fino, lo que me explico... pero esto de la C aún me hace ruido!!! :(

O no, bueno ya va... Aja... con esto:
if(c==end_of_transmit){
    --USART_nextRec;
Aja se dice, que si C es igual al final de transmisión el cual es !, entonces decrementa!!! o.k, chevere, pero no seria c= USART_buffer[USART_nextrec++] ?? para que en c esten los caracteres y así poder comparar????


Atte: Enigma... La llanerita de Guayana :-)

Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: Enigma en 24 de Abril de 2008, 22:03:49
Hola de nuevo!!!! Tengo una pregunta con respecto al protocolo RS485....

Tengo entendido, que por este protocolo se transmiten señales de corriente, por la longitud del cable el cual es ideal para grandes distancias.......

Ahora mi pregunta es:

Sr. REDPIC usted está transmitiendo una señal de corriente o de voltaje por el RS485????

La otra pregunta:

Cuantos terminales está usando para la transmisión y recepción???? 2 verdad??

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: RedPic en 25 de Abril de 2008, 14:37:38
Si, utilizo dos hilos y la verdad es que no tengo ni idea de si la transmisión de señales hardware es por corriente o por voltaje. Yo tenía entendido que es por voltaje diferencial entre ambas líneas. No se si te servira darle un vistazo al IC que utilizo, el SN75176.
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: Nocturno en 26 de Abril de 2008, 03:05:43
Si no estoy equivocado, por RS485 se transmite corriente en vez de voltaje porque es menos sensible a los ruidos.
Esa es la razón por la que en el extremo se coloca una resistencia, que establece una diferencia de potencial en sus extremos y convierte la información en voltaje.
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: Enigma en 26 de Abril de 2008, 14:08:24
ummm!!! Entiendo!!!

Pero tengo más preguntas!!! No se, si es que en verdad es así de enredado o es que en realidad yo soy la que se está complicando la vida!!!
Yo creo que es la segunda opción!!!
Haber si alguien que tenga experiencia en este protocolo le pueda explicar a está novata!!!

Aja, en ese circuito vi las terminales!!! pero mi prgunta es, a que conectar de la computadora se conecta las señales del RS485??, hay un conector en especial? Estoy enredada vale!!! :(

Atte: Enigma... La llanerita de Guayana
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: RedPic en 26 de Abril de 2008, 14:53:27
Como hasta hace poco la PC disponía de un puerto RS232 utilizamos un conversor RS232 a RS485. Yo en concreto utilizaba el ATEN IC485SN (en este (http://www.todopic.com.ar/foros/index.php?topic=2300.msg74806#msg74806) post hablámos de él)

Imagino que debe haber muchos modelos USB a RS485, o incluso fabricárselo uno mismo con un PIC con USB y un MAX485 o SN75176.

(http://www.aten-usa.com/product_images/main/IC485SN_A.jpg)
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: Enigma en 26 de Abril de 2008, 15:09:43
Otras preguntas??

La primera está en la suguiente imágen?

(http://img182.imageshack.us/img182/4906/ic485snall2.jpg)

y la otra es; ¿ La única manera de lograr una conexión 485 con un pic, es esa??? Usando un conversor RS485 a 232 o viceversa???

Nocturno, sino te molesta, me podrías hablar un poco más de esto:
Cita de:  nocturno
Esa es la razón por la que en el extremo se coloca una resistencia, que establece una diferencia de potencial en sus extremos y convierte la información en voltaje.
[/Nocturno]

He estado leyendo el manual MAXIM y otros tutoriales, pero me enredo más!!! lo explican muy técnico!!! :S Gracias y disculpen!!! pero solo quiero aprender!!!  :oops:

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: RedPic en 26 de Abril de 2008, 15:26:36
Si, ese es el conector RS485. El RJ11 que hay a su lado está conectado en paralelo a ese de clemas con tornillos para poder ponerle un conector como los del teléfono, de quita y pon. En el post que te indiqué hay una fotografía del mío conectado.

La pregunta no es exactamente esa. Si tienes un PIC con conexión RS485 y quieres conectarlo a un PC debes ver qué puertos tiene tu PC y cómo puedes conectarlo a un RS485.

¿Tienes puerto RS485 en el PC? No, pues entonces hay que probar otra cosa ...
¿Tienes puerto RS232 en el PC? Si, pues entonces un conversor de RS232 a RS485 (los hay, ATEN por ejemplo)
¿Tienes puerto USB en el PC? Si, pues entonces un conversor de USB a RS485 (los hay, Controltemp por ejemplo)
¿Tienes puerto Ethernet en el PC? Si, pues entonces un conversor de Ethernet a RS485 (los hay, Tibbo por ejemplo)

Y así dependiendo de qué puertos tenga hacia el exterior tu PC.

Para el asunto de cómo configurar una red RS485 ya puse en un post anterior (este (http://www.todopic.com.ar/foros/index.php?topic=19057.msg140353#msg140353)) un documento que es imprescindible leerse ante de acometer ningún proyecto con RS5485.



Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: Enigma en 26 de Abril de 2008, 15:55:16
Ahhh o.k entiendo!!!! Imágine esa respuesta pero queria estar segura!!! :lol:

Otras preguntas!! (Es que cada vez que leo materiales y veo diagramas, me surgen más preguntas) Creo que estás serán las últimas,  :?

He visto el diagrama circuital, que hicieron en proteus, acerca de su post... También lei el link de maxim!! aparte del manual que tengo acá en casa!

He visto que hacen la conexión de un receptor y transmisor!!! (con los MAX485)....

Porque usar dos integrados?? porque no conectar las terminales a y b directo al pc a través de algún conversor  485 a 232 o algo???
(http://img181.imageshack.us/img181/1738/dibujoev4.jpg)

Porque no de aquí al pc??

(http://img181.imageshack.us/img181/5493/dibujo1qb5.jpg)

Atte: Enigma... La llanerita de Guayana :D
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: Enigma en 27 de Abril de 2008, 14:13:02
 :?

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: Enigma en 13 de Agosto de 2008, 12:27:44
Hola, una pregunta y disculpen la insistencia!!! será que es posible comunicar la conexión RS485 a través de un cable db9 normalito, conectado los terminales de RX y TX (del cable) a los pines 6 y 7 de del max485, del segundo integrado de está imágen:
(http://img181.imageshack.us/img181/1738/dibujoev4.jpg)


Así como se hiciera con la comunicación EUSART del pic 4550, cuando se quiere hacer la comunicación RS232??? o es necesario algún tipo de conversor de rs232 a 485??

Es decir, hacer esto:

(http://img361.imageshack.us/img361/4076/todopicxj9.jpg)

Atte: Enigma... La llanerita de Guayana :D
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: todopic en 13 de Agosto de 2008, 20:32:05
Hola LLanerita!, te voy a contestar segun tu esquema con otra pregunta...  :shock:

mirando el esquema de la izquierda... conectas un PIC....

¿ que tensiones maneja? (RS485 .. de 0 a 5 voltios)...

Mirando a la derecha, ... que conectas ? una pc... ¿ que tensiones maneja? 

la PC, en su DB9, espera una señal de (teoricamente)  +12 ó -12 voltios....

pero que tensiones le estas entregando con el integrado... solo  0 a 5 voltios  :mrgreen:

Lo que necesitas es emplear un adaptador de rs485 a rs232, que lo podrias realizar colocando un sn75176 y un max232  :-)

Un abrazo!

Norberto
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: Enigma en 13 de Agosto de 2008, 21:03:39
Hola todopic, gracias por responder, de verdad que agradezco el interes  :lol:

Respondiendo a tus preguntas:

Si, manejo tensiones de 0 - 5V, porque es lo que mando a transmitir desde el conversor analogico - digital.
Si, conecto un pc, por el puerto serial (DB9)...

Umm!! osea del max485, donde stoy colocando el db9, coloco un max232?? o un convertidor??? :?

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: todopic en 13 de Agosto de 2008, 23:55:06
 :-/  Hola Enigma, creo que me exprese mal... yo lo que intentaba, era hacerte ver, (con preguntas) que el max485, trabaja con tensiones TTL, es decir 5 voltios, por lo tanto, seria incompatible conectarlo directamete a la pc, en la entrada RS232, que trabaja con +12 0 -12, ¿se entiende?

entonces, la comunicacion entre un punto y otro, lo estableces como un par de cables en modo diferencial, es decir, empleas 2 cables, que mientras uno esta en ALTO, el otro esta en BAJO, y viceversa..., a estas lineas se les da el nombre de A y B
Como ya te explico Diego, para setear cual max485 "escucha" y cual "transmite" , se necesita colocar las habilitaciones respectivas en cero o uno (a masa o a +5 voltios), por eso se necesita un pin mas del micro

Como la PC, trabaja en su puerto serie con tensiones de  +12 -12 , (232) tienes que "adaptarlas" a tu comunicacion (485) de 0 a 5v

Para eso, empleas luego del max485 que estaria del lado de la PC, un max232

si te interesa, tengo un circuito, simple, que funciona perfectamente...

Norberto
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: Enigma en 14 de Agosto de 2008, 10:27:23
Ahh o.k... no había entendido la expresión de las oraciones jejejeje :oops:... UMMM o.k entiendo...

Cita de: todopic
Como ya te explico Diego, para setear cual max485 "escucha" y cual "transmite" , se necesita colocar las habilitaciones respectivas en cero o uno (a masa o a +5 voltios), por eso se necesita un pin mas del micro


Esto si en dado caso, la información se va a transmitir y a recibir.... Ahora, si yo quisiera solamente transmitir datos del pic a la pc, solo transmitir... Se podría colocar las habilitaciones del max485 a tierra y VCC, es decir, las habilitaciones del max485 que van pegado al pic a vcc, y las habilitaciones de max485 que van al max232 a tierra???... En vez de usar un pin más del pic???

Por cierto, si me interesa el circuito que me ofreces!!! jejeje

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: todopic en 14 de Agosto de 2008, 11:44:50
Ok, si eso es correcto, puedes dejar conectadas las patitas de RE y DE (2 y 3 del SN75176) directamente, segun la funcion de transmitir o recibir....

Este es el circuito, probado y funcionando!

Suerte!

Norberto
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: Enigma en 14 de Agosto de 2008, 17:26:24
Umm!! excelente explicación.... Ahora una pregun tica con respecto a tu circuito, es algo que he visto en los libros y no lo veo aqúí plasmado:

la resistencia que va en el segundo max485:
En está imagen... no es necesario colocarla???



(http://img361.imageshack.us/img361/326/copiade485a232gu0.jpg)

Atte: Enigma... La llanerita de Guayana  :-)
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: MGLSOFT en 14 de Agosto de 2008, 18:08:55
Ya esta puesta, es R3. :mrgreen: :mrgreen:
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: RedPic en 14 de Agosto de 2008, 18:24:49
No.

El esquema de Todopic es la mitad de lo que se necesita para conectar un PIC a un PC mediante RS485, utilizando como paso intermedio una conexión RS232, que es la única de que dispone un PC, realizada con un MAX232. Por eso sólo se ve una única resistencia de 120 Ohms. La otra debe estar en el otro MAX485, que es el que adapta los niveles de RS485 a TTL para el PIC. Digamos que esta es la mitad del circuito completo que corresponde a la conexión del PC y el otro podría ser el mío para el PIC que tienes al principio de este hilo.

La conexión total debe ser:

PC <-RS232-> MAX232 <-TTL-> MAX485 <---------RS485---------> MAX485 <-TTL->PIC

Si, y solo si, la conexión es ésta que he puesto, que solo tiene dos dispositivos RS485, entonces junto a cada uno de los MAX485 tienes que tener una resistencia de 120 Ohms puenteando las líneas A y B del RS485.

En caso de tener mas dispositivos RS485, cada uno de ellos con su propio MAX485, entonces sólo tienen que tener la resistencia de 120 Ohms los dos de los extremos de la línea RS485 y no cualquiera de los intermedios. A esto te conoce como "cerrar" una red RS485.

Nota:
En Rojo los dispositivos a conectar.
En Azul los protocolos y niveles de comunicaciones a utilizar.
En Negro los adaptadores de niveles necesarios.
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: Enigma en 15 de Agosto de 2008, 12:23:58
 :shock: Wao!!! Vaya y Dios dijo.. Hagase la luz, y la luz se hizo!!! :shock:

Berro lo he entendido todo perfectamente!!! Amigo RedPic, usted es el mejor oyó. Ni los profesores que tengo aquí me habían explicado tan bien!!!

He aquí mi diagramita de lo que entendi!: Espero estar en lo cierto.. :?

(http://img383.imageshack.us/img383/456/dibujokr5.jpg)



Muchas gracias, voy a montar este circuito... Si tengo alguna duda podré seguir consultando verdad? :?

Y disculpen tanta lentitud de mi parte, es que los protocolos de comunicación y todo lo que tenga que ver con redes y comunicaciones no son mi fuerte!!! Lo mio es programación y software de comunicación para la parte de Instrumentación y control... Jejeje pero entiendo que tengo que saber de esto para mis conocimientos!!!

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: RedPic en 15 de Agosto de 2008, 12:27:15
Exacto.  :mrgreen:

Nota muy Importante:

Fíjate el detalle tan bonito que tiene el esquema de Todopic, en cómo está conectado RE/DE a R2OUT cuya entrada R1IN está tomada en paralelo a R1OUT.

La explicación de esto es que los MAX485 o leen las lineas RS485 (A y B) o escriben en las líneas RS485 (A y B), pero no pueden hacer ambas cosas al mismo tiempo. No son como los TX y RX del RS232 o el TTL que son independientes y que cada una tiene su función, el TX para transmitir y el RX para recibir.

Las líneas A y B del RS485 o reciben ambas o transmiten ambas. Por eso decimos que tenemos que cambiar el "estado" del MAX485 para que lea o escriba, y esto lo conseguimos cambiando el estado lógico de RE/DE.

En bajo, Low o a GND RE/DE, el MAX485 "recibe" A+B y transmite lo recibido por RO.
En alto, High o a VCC RE/DE, el MAX485 "escribe" A+B" con lo que recibe por DI.

Esta función de conmutar el estado del MAX485 del PIC la hago con un PIN del mismo dedicado a eso, así si estoy en recepción lo pongo en bajo y si quiero transmitir algo primero lo pongo a HIGH y después transmito.

En la parte del PC, la del RS232, no tenemos un PIN dedicado a eso, pero la solución de Todopic es sencilla, elegante e imaginativa. Cuando el canal RS232 está transmitiendo R1OUT a DI se pone en alto, en paralelo inyecta esta señal en R2IN cuya salida R2OUT conectada a RE/DE pasa también a alto con lo que el MAX232 se conmuta a "emisión". Cuando no emite R1OUT a DI pasa a bajo e igual hace con RE/DE por lo que el MAX485 se conmuta a "recepción".

O sea un conmutador automático para el MAX485. Me gusta.  :mrgreen:
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: Enigma en 15 de Agosto de 2008, 13:00:38
Ahh ok, entiendo, pero como te pregunte antes por allá arriba, eso se hace en dado caso que haya transmisión y recepción.. Pero si solamente quiero transmitir información desde el pic a la pc... podría colocar esa linea fija a VCC no?? Digo para que me escriba todo lo que recibe por R0, y me lo escriba a las líneas A  + B y lo mande a la pc... o me equivoco??? :?

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: RedPic en 15 de Agosto de 2008, 13:02:36
Exacto Enigma, en el del PIC dejas RE/DE a alto, siempre transmitiendo, y en el del PC dejas RE/DE a bajo, siempre recibiendo, y así no te complicas la vida.
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: Enigma en 15 de Agosto de 2008, 13:08:59
 :mrgreen: jejeje Gracias... Ya mismo me voy a poner a montar y probar a ver que tal.. En seguida termine publico mis experiencias!!! Jejeje Gracias!!!! :D

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: Enigma en 18 de Agosto de 2008, 20:23:49
Holas de nuevo, he estado probando la comunicación y me ha generado unos problemitas!!! y bueno revisando los diagramas me ha surgido una duda...

En la siguiente imágen... La conexión que va del max485 al max232, es para convertr niveles TTL a niveles a 12 y -12 para adpatarlos a la pc cierto...? que sería el equivalente que si se conectase el pic, que manda niveles TTL directo a max 232 que hace la misma conversión, como cuando se traba con la Eusart normalita!!! Ahora me he dado cuenta que cuando yo trabajo la Eusart normal, pues se conectan Rx el pic con el R1out del max232 y el Tx del pic con el T1in del max232... Pero en la conexión cuando se usa 485 pues se conecta el Ro (recepción) al T2in del max232 y el Do del max485 al R1out del max232....

(http://img513.imageshack.us/img513/6522/copiade485a232xq0.jpg)

Ahora, estás conexiones cuando se usa o no el max 485 no deberian ser iguales????  si igual se están llevando niveles TTl a voltajes de Rs232, solo que con distints integrados (max485 y pic)

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: Enigma en 19 de Agosto de 2008, 12:19:12
Buenas noticias.... :lol: Me ha funcionado la comunicación 485 - 232....
Aunque todavia tengo la duda que plantee anteriormente!!!

Ahora lo que me resta es bajarle ese consume de corriente de los integrados, que no se como diablos lo haré, pero bueno allí veré!!!!:?


Atte: Enigma... La llanerita de Guayana :-)
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: Enigma en 05 de Septiembre de 2008, 12:34:08
RedPIC una preguntica, cuando hiciste está comunicación con el 485, alguna vez se te ocurrio medirle el consumo de corriente?? Es decir, no le mediste la corriente que el integrado consumia cuando estaba en funcionamiento y cuando no? para ver con cuanto se alimentaba él???.. Si se la mediste cuanto te dió?? :?

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: RedPic en 06 de Septiembre de 2008, 07:58:54
RedPIC una preguntica, cuando hiciste está comunicación con el 485, alguna vez se te ocurrio medirle el consumo de corriente??

No, lo siento pero no lo medí.  :?
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: Kid_Bengala en 06 de Septiembre de 2008, 11:01:43
algun software para analizar tramas?

Dispongo de varios dispositivos colgados de un bus de datos RS485 y un PC como master, necesito emular el PC con un pic y no dispongo de los codigos de comunicacion ni acceso al codigo fuente. Dispongo de un convertidor 485-232 para PC ¿existe algun software para ver las tramas que van por el bus de datos?. muchas gracias.

saludos de antonio
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: Marioguillote en 06 de Septiembre de 2008, 11:43:54
Hola Enigma !  :)

Yo estoy trabajando actualmente con un proyecto que involucra RS485 y estoy utilizando el SN75176.
Cuando comencé a diseñar la placa que vá conectada a la PC con el MAX232 y el SN75176, intenté alimentarla directamente con DTR y/ó RTS desde el mismo COM1, pero no me funcionó.

Al investigar porqué me sucedía ésto y al alimentar dicha placa de forma externa, descubrí que en Tx, la placa (MAX232 + SN75176) me consumía cerca de los 70mA !!!  :shock: por lo que tuve que dotarla de una fuente de alimentación independiente.
Podría haber sacado alimentación de la misma PC pero es para una aplicación que podría llamarse "móvil", por lo que la alimentación de energía debía acompañarse con la interface.

No sé cuál será el consumo del MAX485 pero debe estar próximo supongo. Habría que revisar el datasheet.

Espero te sirva el comentario.

Saludos.
Mario
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: RedPic en 06 de Septiembre de 2008, 16:34:14
Mirando los Datasheets veo que el SN75176 de Texas Instruments consume 60 mA en transmisión y el DS75176B de National consume 55 mA.
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: Enigma en 10 de Septiembre de 2008, 10:14:10
Hola Muchachos gracias por estar atentos, yo no habìa respondido, porque la pagina ha estado obtusa y siempre decia SERVICE UNABLE!  :? Pero gracias a Dios ahorita logre ingresar...
 
ES interesante lo que comentas Marioguillote, yo estoy trabajando en un proyecto "Pasivo" y pues necesito la comunicaciòn 485... Intente sacar la misma también de la PC, pero fue un intento fallido puesto que el consumo es de 30mA. Pero a diferencia tuya estoy usando un ADM485AN que es el mismo MAX485 pero es de la Analog Device, donde según su datasheet el consumo ha de ser entre 0.7 y 2.2mA :shock: lo cual para mi es perfectisimo, porque lo minimo que requiero son 4mA de consumo del circuito. Pero al parecer como siempre, todo en papel es bello hermoso, puesto que en la realidad no es así, porque cuando estoy transmitiendo un dato y le mido el consumo, este es de 25mA :shock: osea!!!  ... de 2.2mA a 25mA es la locura :z)  y bueno, ´lo peor de todo es que no dice de ninguna resistencia ni de ningún arreglo que hacerle para que en realidad consuma lo que tiene que consumir!! Y lo peor de todo es que no puedo conectarle fuente externa, porque entonces ya pasaría de Pasivo a Activo! y no es la idea!!!! :? Estoy frita, he hecho miles de circuitos para bajar ese consumo y nada, porque o smplemente no transmite, o se calienta o consume más de lo que debe! :?

P.D: Adjunto les envio el datasheet del ADM485AN para que comprueben que el consumo que les dije es cierto!

Y lo que dice RedPic con lño del consumo del SN75176 es muy cierto acabo de ver el datasheet y es la locura en consumo de corriente!!! :z)

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: Marioguillote en 11 de Septiembre de 2008, 08:46:10
Hola Enigma !

.... pero es de la Analog Device, donde según su datasheet el consumo ha de ser entre 0.7 y 2.2mA ...

Según el datasheet, yo entiendo eso cómo Salidas Habilitadas = Output Enable, lo que no significa "Transmitiendo"

Si te fijas más arriba en el gráfico que has puesto, en la primera sección donde están las especificaciones del driver, habla de corrientes de cortocircuito de hasta 250 mA en las salidas y más abajo en el datasheet donde están las curvas características, se vé que la corriente de salida vá a llegar a los 100 mA cómodamente,con estados bajos ó altos en las entradas.

Debieras alimentar al menos momentáneamente la placa que utilizas de interface, con una fuente externa y lograr la comunicación a través del bus.
Una vez que hayas comunicado exitosamente, medir la corriente de consumo de la interface.
Seguramente te consumirá valores cercanos a lo que te estamos expresando con Diego.
El puerto serie al no poder entregarte toda la energía que necesitas para hacer funcionar la interface y te hará cometer errores de creer que la misma no funciona; cuando es en realidad que el COM1 no puede darle la energía suficiente para transmitir.

Respecto a que no puedes conectarle una fuente externa porque pasarías de un sistema pasivo a uno activo, puedo decirte que tu conectarás la interface a una PC y nada te impedirá sacar 5 Volts de la misma PC para alimentar tu interface. No entiendo porqué has tenido un intento fallido  :shock: la fuente de la PC entrega muchos amperes a 5 Volts por lo que no veo el motivo de que no puedas sacarla de allí. (vuelve a probar.... cables rojos)
Estamos de acuerdo en que no será solo conectar en COM1 y ya está !, pero puedes sacar energía de la misma PC si la aplicación es fija (por más "pasiva"que sea)

Creo que no podrás evitar la alimentación externa (de donde provenga).
Corrientes de 2 mA a niveles TTL no llegarían a más de 20 metros en cualquier cable ... es correcto que consuman entre 50 y 100 mA los IC éstos.

Saludos !
Mario
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: Enigma en 12 de Septiembre de 2008, 23:17:01
Umm si te entiendo! Tu me dices extraer los cables de 5V de la fuente de la pc! Eso seria una solución bastante razonable siempre y cuando la aplicación va dirigida a procesos cercanos al area de control... Pero imagina en una industria, que el transmisor este en campo y la sala de control este a 200 o 300 metros del area... No me seria factible alimentar con la pc, la targeta interface que estoy diseñando, al menos que lleve un cable que salga de la fuente de la pc que está en sala de control hasta el area donde se encuentra el transmisor! un poco engorroso!

Yo lo que estaba pensando era pues, en vista de que solo puedo usar 20mA que es lo que debe consumir el circuito como tal (bueno en realidad son 4mA), pero podría usar los otros 16mA cuando cuando necesite transmitir. Es decir, en cristiano. Cuando la conexión RS485 este en "linea", que se yo identificando esa conexión de alguna manera (aún no se como :?), pues en ese momento mi transmisor no tomara medidas de campo, solo limitará a enviar la información que previamente he almacenado en forma de historial en la eeprom interna del pic; y cuando desconecte el cable de transmisión, pues que se detecte esa conexión de alguna manera y pues encender el transmisor para que siga recogiendo datos! No se si estará muy loca esa idea! :shock:

PD; Por cierto tienes razón con lo del datasheet... Sorry!   :oops:

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: Marioguillote en 13 de Septiembre de 2008, 00:46:46
Hola nuevamente Enigma !

Umm si te entiendo! Tu me dices extraer los cables de 5V de la fuente de la pc! Eso seria una solución bastante razonable siempre y cuando la aplicación va dirigida a procesos cercanos al area de control... Pero imagina en una industria, que el transmisor este en campo y la sala de control este a 200 o 300 metros del area... No me seria factible alimentar con la pc, la targeta interface que estoy diseñando, al menos que lleve un cable que salga de la fuente de la pc que está en sala de control hasta el area donde se encuentra el transmisor! un poco engorroso!

No, no, no señorita ...  :)

La interface la debes tener siempre "pegada" (por dar un término figurado) a la PC.
Tú sales y/o entras a la PC con RS232 y allí mismo, en la misma plaqueta debe estar el conversor a RS485 (ADM485AN).
No puedes salir de la PC, recorrer 200 metros y colocar en el campo a la interface.
RS232 (lo que tienes en el COM1 ó Puerto Serie) no te permite una distancia de cable mayor a 15 metros, entonces sí ó sí deberás tener la interface junto a la PC y luego de allí sí puedes irte los metros que quieras con el cableado y allá donde tú quieras a los metros que desees, colocas tu PIC con el otro ADM485AN, que naturamente deberás alimentarlos con cualquier fuente de energía que dispongas en el lugar que emplaces esa "terminal" ó cualquiera de las tantas terminales que puedas "colgar" del bus RS485.

Se entiende la idea ?

Tu sistema remoto que yo he denominado "terminal" al momento de transmitir los datos almacenados te consumirá entre 50 y 100 mA sin que lo puedas evitar y a ésa corriente la deberás sacar de una fuente de alimentación que estará en el lugar de aplicación.
Si en el lugar de aplicación (allá lejos de la interface "RS485 - PC" receptora de los datos) no dispones de una toma de corriente, deberás pensar en algún sistema de baterías recargables y lógicamente en el método de recarga en los horarios en que el sistema no esté en uso, acercándolo hasta la toma de energía más próxima que tengas.

Son ideas, claro.

Pero conceptualmente debes comprender que desde el COM1 ó Puerto Serie y utilizando RS232 tal cómo sale, no puedes recorrer más que 15 metros. Precisamente por éso se "convierte" a RS485. Para lograr largas distancias de comunicación.

Si no es claro lo que trato de explicar, podría hacer algunos dibujos para graficar mejor el tema.

Saludos llanerita ! Nos leemos !

Mario
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: Enigma en 14 de Septiembre de 2008, 20:17:02
Hola de nuevo marioguillote!

Cita de: Marioguillote

La interface la debes tener siempre "pegada" (por dar un término figurado) a la PC.
Tú sales y/o entras a la PC con RS232 y allí mismo, en la misma plaqueta debe estar el conversor a RS485 (ADM485AN).
No puedes salir de la PC, recorrer 200 metros y colocar en el campo a la interface.
RS232 (lo que tienes en el COM1 ó Puerto Serie) no te permite una distancia de cable mayor a 15 metros, entonces sí ó sí deberás tener la interface junto a la PC y luego de allí sí puedes irte los metros que quieras con el cableado y allá donde tú quieras a los metros que desees, colocas tu PIC con el otro ADM485AN,

Ummm! si ya entendi jejeje bueno sabes que esa es la idea que tengo desde el principio.


Cita de: Marioguillote
que naturamente deberás alimentarlos con cualquier fuente de energía que dispongas en el lugar que emplaces esa "terminal" ó cualquiera de las tantas terminales que puedas "colgar" del bus RS485.

Tu sistema remoto que yo he denominado "terminal" al momento de transmitir los datos almacenados te consumirá entre 50 y 100 mA sin que lo puedas evitar y a ésa corriente la deberás sacar de una fuente de alimentación que estará en el lugar de aplicación.


Esta es la cuestión, que teoricamente no debo disponer de una alimentación externa, por la condición pasiva que tiene el transmisor.... Estos ADM485 debo alimentarlos con el mismo circuito pasivo sin fuente! está un poquito rudo, pero creo que se puede hacer si hago una multiplexación de señales de alimentación! Por ejemplo: Cuando el transmisor este midiendo variables, pues el consumira su 4mA correspondientes si ningún problema. En este momento la parte de transmisión estará apagada( para que el ADM485 no consuma la corriente y no cargue la salida)... Ahora cuando vaya a transmitir, pues multiplexo la señal desde donde se alimenta el transmisor a la parte de transmisión, claro bajando esos 24V a 5V para alimentar el pic. La cuestión esá en que no se como detectar cuando sea conectado el cable 485 para que el pic haga la multiplexación solo, automaticamente! No se como hacer que el pic me detecte que el cable ha sido habilitado para transmitir! No se ha de haber un bit que se activa en la transmisión, pero no se, porque en cuestiones de transmisión de datos usando estos protocolos pues me hago un rollo! no se nada!, se justo lo necesario! :( :?

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: totuer en 16 de Enero de 2009, 14:05:05
Hola a todos
Sobre la idea del hilo de hacer un conversor rs232 a rs485 lo implemente con un pic 16f627 (economico3 USS en Bs As) un max232 y un max485 y anda de maravillas usé la usart fisica con el 485 y una usart por software con la pata de recepcion en rb0 para la interrupcion externa y por rda, por lo demas solo basta con imprimir lo recogido en el puerto contrario con las practicas funciones fprintf (stream, ... y kbhit(stream). gracias a todos por el aporte.
Sigo tratando de solucionar mis problemas de reflecciones en una red 485 que estoy tratando de armar.
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: RedPic en 16 de Enero de 2009, 21:25:15
No se te olvide el tema de las resistencias de 120 Ohms en cada extremo de la red. A mi desaparecieron los "ecos" en cuanto las puse.
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: totuer en 17 de Enero de 2009, 12:59:12
Si ya las puse y mejoro, pero me encontre con un problema cuando mando datos de pc a pc con el teclado anda barbaro pero cuando los datos los mando desde un pic (muchos) se bloquea la comunicacion y tengo que desconectar y conectar para que retome, creo que se me está desbordando el buffer propio del micro. en cuanto ande subo todo. :x :x :( :x
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: totuer en 17 de Enero de 2009, 19:23:55
Graciasssssss. ENIGMA  :-)
No se que seria de mi vida sin el diagrama de conversor rs232 a rs485.
Anda diez puntos, le hice una pequeña modificacion, solo cambié los capacitores por 1 uF,(lo recomienda MAXIM) y el circuito anda de maravillas a cualquier velocidad.
Amigo Red sin tu rele a la lejania no podria haber ni empezado Gracias. :mrgreen:
Gracias gracias y gracias a todos, despues de 5 dias de intenso laburo ahora hablo entre micros a 100 metros sin problemas y a 9600bd que no es poco(seguiré probando velocidades).
 :-/ :-/ :-/
Pd: no abandone el otro pero se cuelga el micro  :(
Pd 2 Les comento que ahora que tengo comunicacion voy a desarrollar una red de micros que midan y envien las mediciones a la pc para graficar y almacenar, identificandose y que suenen una alarma si alguna de sus mediciones(6) está fuera de rango, mostrando por pantalla (LCD local 128x64 y PC) el motivo y guardando la info.
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: sanpic en 19 de Marzo de 2009, 20:17:38
Hola amigos , les cuento que estoy iniciandome en el PicC y me encuentro intentando modificar el ejemplo de Diego.
Les cuento que he logrado hacer correr el mismo en una red 485 con 5 esclavos y a 57600 bpos y funciona perfectamente.
Ahora , pretendo usar un Maestro para preguntar a los esclavos y sacar al PC de la red 485 para que no le llegue todo el tráfico de la misma.
He logrado que a través de un bucle el Maestro haga las preguntas y los esclavos respondan correctamente , ahora tengo problema para que el Maestro una vez que recibe una respuesta cree un  evento (en principio sólo prenda un led  PIN_RELE , luego envie la trama ecibida por el esclavo a traves de soft UART al PC)


EL IDentificatorio del maestro es 0 (cero) , o sea que cuando circule un mensaje con prefijo R0X , es una respuesta de un esclavo y sólo lo dee interpretarlo él.
Entonces , el Maestro pregunta (R1X..R9X) y recibe del esclavo 7 lo siguiente  R0X$R7X;abcde$! , que se interpretaria asi : mensaje para el Maestr (R0X) , soy el esclavo 7 (R7X) , este es mi mensaje ($R7X;abcde$) , fin de transmisión (!)

Todo va perfecto , el maestro les pregunta a todos y recibe respuesta del 7 (lo veo perfecto en el tráfico de la 485) , el único problema es que el maestro no interpreta la llegada del mensaje para él ya que no realiza el parpadeo del led.


Les pego el bucle , el resto es exactamente igual al código original.
Cualquier ayudita es bien recibida.

Saludos a todos.


Código: [Seleccionar]
do{
 

      for(veces=1; veces<=10; ++veces) {     // creo un bucle para realizar las peticiones de consulta a los esclavos
         delay_ms(25);
         USART_activa_tx();
         delay_ms(5);
         printf(":R%dX!\r\n",veces);
         USART_activa_rx();
         delay_ms(10);
         enable_interrupts(global);
         enable_interrupts(int_rda);
     
         // si recibo alguna contestación de algún esclavo entonces parpadeo un led
         if(Command==0x01){
            Command =0x00;     
 //           USART_activa_tx();
 //           printf(USART_buffer);       
 //           USART_activa_rx();   
            output_high(DRIVER_RELE);
            delay_ms(50);
            output_low(DRIVER_RELE);
          }
      }   
   } while(true);




Edito:   Solucionado , tenía mal la trama de recepción.
Les paso el dato , quizás lo sepan , yo como estoy recién mirando el C , lo acabo de descubrir. :P
Cuando configuramos el define para la comunicación , existe una opción para hacer de habilitador en la comunicación rs485 , y el comando es ENABLE. O sea definiendo un PIN al momento de transmitir se activa a 1 y en cuanto deja de transmitir se pone a 0


#use rs232(baud=9600,xmit=PIN_B2,rcv=PIN_B1)    // modo normal


#use rs232(baud=9600,xmit=PIN_B2,rcv=PIN_B1, ENABLED=PIN_B3)  // definimos B3 como enabled

Realmente lo he probado y funciona perfectamente , en el ejemplo de Diego deshabilite las funciones activa_tx y activa_rx y funciona sin inconvenientes.


Diego mil gracias por este pedazo de ejemplo que has escrito. Un abrazo.




Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: dawaherjesus en 20 de Marzo de 2009, 15:03:17
Como les va, me ha ayudado mucho el tema ya que tengo un proyecto que es manejar unos reles en la distancia pero no los voy a manejar desde la PC sino con otro PIC, como hago para poner el PIC como master.

Lo que quiero hacer es que cuando pise un pulsador en el PIC master mande la instrucción por el MAX485 y el otro PIC slave lo reciba y active el rele por cierto tiempo
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: sanpic en 21 de Marzo de 2009, 18:40:20
Hola , el código del mensaje anterior , hace una barrida constante preguntando a todos los esclavos y escuchando respuesta.
Si en tu caso sólo deseas que la barrida se haga como consecuecia de algun evento (pulsador sobre un pin o algo ) debes adecuarlo a tu necesidad.


Saludo a todos.
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: sanpic en 21 de Marzo de 2009, 19:21:50
Hola.
Siguiendo con el ejemplo de Diego (y para complicar) , necesito implementar que el Identificador del esclavo no sea implementado por el firmware sino que se pueda setear mediante jumpers , y cuando se cambie la posición de los jumper , con sólo resetear el pic , tome el nuevo identificador.
Para eso utilizo el puerto A , hago la lectura y la convierto para que sea el valor de "WhoAmI"
Peroooo , no me reconoce el dispositivo.  :P
Creo que el problema viene por el lado de la conversión del int a chr , me esta agregando algun caracter que cuando hace la comparación   
Código: [Seleccionar]
if(USART_buffer[USART_nextRec-2]==WhoAmI){  la halla incorrecta.
Se agradece cualquier orientación.


Saludos a todos.


Código: [Seleccionar]
int8 A0,A1,A2,A3,A4,IdControl;
char WhoAmI[2];


void main()
{

   ...
 
  A0 = input(PIN_A0);
  A1 = input(PIN_A1);
  A2 = input(PIN_A2);
  A3 = input(PIN_A3);
  A4 = input(PIN_A4);
 
  IdControl = A0 + A1*2 + A2*4 + A3*8 + A4*16;
  printf("Mi ID control es : %d \r\n", IdControl);   //perfecto , me muestra el valor correcto
  delay_ms(10);
  sprintf(WhoAmI,%d,IDControl);  // transformo el entero
  printf("WhoAmI es : %s \r\n", WhoAmI);   //perfecto , me muestra el valor correcto
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: dogflu66 en 21 de Marzo de 2009, 20:17:25
He estado revisando el hilo, me ha parecido muy interesante. Quisiera añadir que para probar una línea RS485 se puede hacer conectandola directamente al PC (RS232) sin adaptador, tan solo hay que tener las siguientes precauciones:

http://www.todopic.com.ar/foros/index.php?topic=14917.msg129023#msg129023
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: sanpic en 22 de Marzo de 2009, 15:08:22
Solucionado , el problema estaba en la definición de la variable , se debe agregar un lugar más , ya que la función sprintf() durante la conversión agrega al valor convertido el caracter null , y modificar la función original para que me aceptara más de 1 digito para tener asi en lugar de hasta 9 esclavos , 31.
Si Diego lo autoriza , pego las modificaciones , no quiero salirme del mensaje original.

Saludos a todos.






Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: RedPic en 22 de Marzo de 2009, 15:17:22
Claro que si, el hilo es de todos.  :mrgreen:
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: dawaherjesus en 22 de Marzo de 2009, 19:06:59
Disculpen alguno de ustedes me puede dar un ejemplo en CCS de lo que quiero hacer¿?

Lo que quiero hacer es esto: presionar un pulsador que esta conectado a un PIC, el PIC al recibir la señal del pulsador y manda por MAX485 una instrucción el PIC SLAVE recibe la instrucción y activa un rele

La parte del PIC SLAVE ya la tengo echa pero la del PIC MASTER no sep aun como
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: sanpic en 23 de Marzo de 2009, 11:41:50
Hola , solucionado el tema de la conversión.
El problema era que la función sprintf() , agrega un caracter extra a la conversión , que es null.
Los cambios realizados sobre el código original :



Código: CSS
  1. int8 IdControl;  //Identificador segun seteo del dipswitch en portA
  2. int8 A0,A1,A2,A3,A4;
  3. static char WhoAmI[3];       // definir 3 posiciones en lugar de 2 , la funcion sprintf() agrega un caracter null a la conversion      
  4.  
  5.  
  6.  
  7. // se agregan 2 lineas de codigo a la funcion original USART_add_to_buffer
  8.  
  9.  
  10. void USART_add_to_buffer(char c){
  11.  
  12. USART_buffer[USART_nextRec++]=c;
  13.   if(USART_nextRec==bytes_for_USART_buffer){
  14.     USART_nextRec=0;
  15.   }
  16.  
  17.   if(c==end_of_transmit){
  18.     --USART_nextRec;
  19.     if(USART_buffer[USART_nextRec-4]==WhatAmI){
  20.       if(USART_buffer[USART_nextRec-3]==WhoAmI[0]){         // se modifica esta linea para leer el primer digito
  21.        if(USART_buffer[USART_nextRec-2]==WhoAmI[1]){        // se modifica esta linea para leer el segundo digito
  22.         if(USART_buffer[USART_nextRec-1]==Command_Execute)   // se modifica esta linea para aceptar parametro
  23.            Command=0x01;    
  24.       }
  25.      }
  26.     }
  27.     USART_nextRec = 0;
  28.   }
  29. }
  30.  
  31.  
  32.  
  33. // se modifica los parametros de la funcion sprintf() en main()
  34.  
  35. void main()
  36. {
  37.  
  38. ....
  39.   A0 = input(PIN_A0);   //leo puerto A.0
  40.   A1 = input(PIN_A1);   //leo puerto A.1
  41.   A2 = input(PIN_A2);   //leo puerto A.2
  42.   A3 = input(PIN_A3);   //leo puerto A.3
  43.   A4 = input(PIN_A4);   //leo puerto A.4
  44.  
  45.   IdControl = A0 + A1*2 + A2*4 + A3*8 + A4*16;  //establezco el IdControl mediante los jumpers de configuración
  46.  
  47.   sprintf(WhoAmI, "%02d", IdControl);    //se establece el ID para WhoAmI  , de ahora en más y dependiendo de los jumpers por ej: esclavo 5 será 05 (menos de 1 digito se rellena con cero a la izquierda debido al %02d en sprintf) y tendremos la posibilidad de tener hasta 31 esclavos online. Por las dudas aclarar que cada vez que se realiza un cambio en los jumpers se debe hacer reset al pic para que tome el nuevo ID

Este codigo solo va en el Esclavo.
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: dawaherjesus en 21 de Mayo de 2009, 22:52:55
disculpa para que es el conector que esta al lado del pic que dice TTL que van conectado a RB1 y RB2 cual es su función
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: micronet3 en 31 de Julio de 2009, 13:26:52
hola disculpen la ignorancia, que significa la siguiente funcion
   
USART_nextChar='\0';
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: MLO__ en 31 de Julio de 2009, 13:28:45
Hola.

Tal como lo escribes, no es funcion, es solo la asignacion del NULL a la variable, es decir, le das el valor de 0.

Saludos
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: micronet3 en 31 de Julio de 2009, 16:44:33
hola disculpen la ignorancia, que significa la siguiente funcion
  
USART_nextChar='\0';

ok amigo muchas gracias
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: zagoaristides en 03 de Agosto de 2009, 03:13:01
Gente, una pregunta...Puede ser que el Proteus simule bastante mal el RS485? Porque hace cosas increibles a veces. Gracias.
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: MLO__ en 03 de Agosto de 2009, 13:28:16
Pues a mi no me ha dado lata nunca.

Control de un malacate . RS485 (http://www.todopic.com.ar/foros/index.php?topic=23175.0)
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: Suky en 03 de Agosto de 2009, 13:44:07
No lo he utilizado mucho, pero tampoco he tenido problemas. A que te refieres con cosas increíbles?


Saludos!
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: septiembre_negro en 09 de Octubre de 2009, 17:13:59
Hola le yendo este magnifico hilo gracias al cual por fin logre hacer funcionar mi red rs485 hay una parte del código que por mas vueltas que le doy no logro entender se lo que hace ahí pero no entiendo la lógica de como lo hace la parte de código en cuestión es esta

Código: [Seleccionar]
  if(c==end_of_transmit){
      --USART_nextRec;
      if(USART_buffer[USART_nextRec-3]==WhatAmI){
         if(USART_buffer[USART_nextRec-2]==WhoAmI){
           if(USART_buffer[USART_nextRec-1]==Command_Execute){
              Command=0x01;
           }
         }
      }
      USART_nextRec = 0;
   }

OK como lo explica el señor red pic la intención de esta parte del código es comparar si la trama recibida es igual a la que tenemos definida en el código.
Asea que si transmito por el Terminal esto R1X! el programa lo recibe así en el buffer
USART_buffer[0]=R
USART_buffer[1]=1
USART_buffer[2]=X
USART_buffer[3]=!
Entonses porque hace esto        --USART_nextRec ????
Y esto                                        if(USART_buffer[USART_nextRec-3 ?????

Cuando mi poco desarrollada e inexperta lógica me dice que debería ser así
Código: [Seleccionar]

      if(USART_buffer[USART_nextRec[0]==WhatAmI){
         if(USART_buffer[USART_nextRec[1]==WhoAmI){
           if(USART_buffer[USART_nextRec[2]==Command_Execute

Como siempre agradezco la ayuda que puedan brindarme  por más que intento entenderlo solo me enredo más



Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: MLO__ en 09 de Octubre de 2009, 22:56:08
Es similar a lo que dices, resulta que cuando defines un vector el último valor es el null, por ende, para hacer la comparación, tal como lo hace el maestro RedPic, debe mermar en uno al valor del index del vector, si no, estaría comparando con el valor siguiente al que él quiere comparar.

Saludos
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: Nocturno en 10 de Octubre de 2009, 01:33:11
El tema se ha resuelto en este hilo:
http://www.todopic.com.ar/foros/index.php?topic=27894.0

Septiembre_negro, está prohibido duplicar los mensajes. Fíjate el lío que acabas de montar.
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: elfrancho en 30 de Abril de 2011, 20:49:43
Sres gracias a ustedes he entendido mucho mejor hacerca de este protocolo, sólo me queda una duda, este circuito de relay a distancia es capaz de recibir datos y también enviar?

Preguntitas varias:

- Siempre que se envía datos con el master, conviene ponerlo a la escucha con los pines DE/RE ? ¿lo mismo para los esclavos?
- Si tengo varios dispositivos conectados informando eventos al master, como podría evitar que dos esclavos transmitan al mismo tiempo?
- Hasta cuantos dispositivos esclavos se pueden colocar en la linea?


SALUDOS!!!

FrAnChO !!!!
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: zdenkas en 08 de Marzo de 2012, 06:49:20
Simule el circuito y cuando recive la cadena de acciona durante un pequeño tiempo y luego se pone a cero el pin , quitandole la pausa y el comando 0x00, lo puedo dejan enclavado, pero como se podria hacer que por ejemplo mandando la cadena R1Y! se desactivara, y que mandando la cadena R1X! se activara, aparte de que mande tambien el resultado al maestro de dicha situacion, gracias...
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: zdenkas en 12 de Marzo de 2012, 16:37:10
Cambiando el nombre del rele R1X! me responde que se activo dicho rele, pero cambio el nombre del esclavo por otro A1X!, se activa pero me responde que se activo el R1X, y no encuentro en donde cambiar la cadena de respuesta, a parte por mas que intento modificar el programa para poder activar y desactivar dicho esclavo me da error al compilarlo, agradeceria una mano,por que de c no comprendo casi nada, suelo usar mas el basic y el flowcode, gracias....... :shock: :shock: :shock: :shock:
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: BINARIO en 29 de Noviembre de 2013, 11:18:42
Hola, esta muy bueno tu post, lo estoy estudiando ahora, yo lo que quiero hacer es leer una trama RS485 de un sensor de humedad y eso poder mostrarlo en un display, espero poder lograrlo saludos desde cordoba argentina.
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: BINARIO en 04 de Septiembre de 2014, 16:33:44
Aun no le agarro la mano, lo he probado funcionando con la simula que subio el colega, pero cuando voy a probar el hardware en simulacion sin los micros no logro prender un led de un lado o del otro, no se si necesariamente tiene que haber un gestionador de protocolo para que se puede producir una comunicacion, para entenderlo queria simular con interruptores de un lado y leds del otro para ver si entendia el principio de funcionamiento del protocolo y de los sn75179 o los max, pero de momento no me ha funcionado, hoy dedique todo el dia a estudiar esto, pero me voy con las manos vacias no he logrado hacer funcionar mi prototipo, quisiera hacerlo andar con la libreria RS485.c no porque menosprecie la ayuda y la info del colega red pic, si no porque me parece que a esa libreria puedo adaptarla mejor a mis necesidades.

fue de mucha ayuda la informacion la verda excelente los tutoriales que sube el colega, espero lograr mas avances mañana mi cabeza parece una ensalada ahora saludos! :-/ :-/ :-/
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: BINARIO en 04 de Septiembre de 2014, 16:35:30
me olvidaba, lo que yo pretendo hacer es comunicarme con un sensor que se maneja solo por RS485 emplea 3 o 4 comandos basicos, necesito implementar eso porque es un sensor viejo que para la comunicacion utilizaba unas HPQ pero son costosas y me parece que se le puede dar una buena solucion con pics.
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: BINARIO en 08 de Septiembre de 2014, 16:23:14
Alguno logro hacerlo mediante la libreria RS485.c de CCS ???
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: GabrielD en 11 de Noviembre de 2014, 13:44:14
Hola maestro Diego gracias por todo :D , estoy empezando con la comunicacion 485 y toda su informacion fue muy util, muy bien explicado todo. Estoy implementando una comunicacion entre un pic 18f2550 y un 18f4550 y por fin me funciono siguiendo su ejemplo :)

Bueno me despido, gracias nuevamente y q les vaya bien a todos :)
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: RedPic en 11 de Noviembre de 2014, 14:03:33
Hola maestro Diego gracias por todo :D , estoy empezando con la comunicacion 485 y toda su informacion fue muy util, muy bien explicado todo. Estoy implementando una comunicacion entre un pic 18f2550 y un 18f4550 y por fin me funciono siguiendo su ejemplo :)

Bueno me despido, gracias nuevamente y q les vaya bien a todos :)

Me alegra que te sirva de algo mi modesto trabajo. Un abrazo.  :mrgreen:
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: GabrielD en 11 de Noviembre de 2014, 18:18:51
Hola nuevamente a todos y al maestro Diego, saliendo ya de los ejemplos he empezado a trabajar nuevamente en mi proyecto en el cual necesito implementar comunicacion SPI y la RS485 con el pic 18f4550 como ya habia mencionado. El problema es que comparten un mismo pin del pic (RC7) en este se encuentra el RX para la comunicacion RS y SDO para la SPI.

Explico un poco lo que tengo que hacer:

Tengo que leer con el pic por RS485 un dato proveniente de un medidor de voltaje, almacenarlo y enviar este mismo dato por SPI a un modulo de Radio Frecuencia que se encargara del envio posterior ( el modulo que trabajo es el nrf24L01+ por si alguien de casualidad tiene problemas con ese les puedo ayudar  :mrgreen:).

Alguien tiene alguna idea o sugerencia de como hacer el intercambio de protocolo?

Muchas gracias :)
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: KILLERJC en 11 de Noviembre de 2014, 19:24:42
Se que el SPI funciona por encargo, me explico, cuando el micro le manda el clk al otro dispositivo este manda los datos, por lo tanto si no le manda clock no va a haber salida desde el dispositivo al PIC. Con esto quiero decir que podes habilitar el SPI leer y volver a desabilitarlo para usarlo con el rs485.

Podes usar algo como esta en el diagrama de la primer hoja, e intentar desabilitar las lineas TX y RX poniendolas en alta impedancia, mientras trabajas con el SPI. Mientras trabajas con el RS485 no importaria el estado de SDO del pic siempre y cuando no le des pulsos de CLK o este en bajo CS para que no tome/envie ningun dato extra.

Resumen:

Activo alta impedancia
Cambio a SPI
Mando datos/ Recibo ( esto incluye el pin de CS )
Cambio a UART
Desactivo Alta impedancia
Uso el RS485
Vuelvo al comienzo ? xD
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: GabrielD en 11 de Noviembre de 2014, 22:59:41
Resumen:

Activo alta impedancia
Cambio a SPI
Mando datos/ Recibo ( esto incluye el pin de CS )
Cambio a UART
Desactivo Alta impedancia
Uso el RS485
Vuelvo al comienzo ? xD


jajaja gracias killer, cuando dices cambio a UART te refieres a que desactivo el CS y detengo el CLK cierto?
es que como en el datasheet dice que SDO toma prioridad del puerto temia que no pudiera usarlo para el RX.
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: KILLERJC en 12 de Noviembre de 2014, 00:02:50
jajaja gracias killer, cuando dices cambio a UART te refieres a que desactivo el CS y detengo el CLK cierto?
es que como en el datasheet dice que SDO toma prioridad del puerto temia que no pudiera usarlo para el RX.

el CS lo deberia manejar el SPI, en PIC la salida dice SS (negado por que CS del objetivo es generalmente negado tambien )

Con el SPI:

En el registro SSPCON1 :
bit 5 SSPEN: Master Synchronous Serial Port Enable bit
1 = Enables serial port and configures SCK, SDO, SDI and SS as serial port pins(2)
0 = Disables serial port and configures these pins as I/O port pins(2)

Ahi podrias habilitar/desabilitar esos pines (como SPI).

Con el EUSART:

En el registro RCSTA:
bit 7 SPEN: Serial Port Enable bit
1 = Serial port enabled (configures RX/DT and TX/CK pins as serial port pins)
0 = Serial port disabled (held in Reset)

Podrias habilitar/deshabilitar el EUSART.

Imagino que multiplexarias eso, es decir para usar el EUSART lo pones como I/O al SPI ( 0 en SSPCON1.SSPEN ) y activas el bit RCSTA.SPEN,
y luego para el SPI al reves. Deberia andar por que activar esos bits son requisitos que exige el datasheet.

Te copio lo del datasheet:
SPI: To enable the serial port, MSSP Enable bit, SSPEN(SSPCON1<5>), must be set.
EUSART: In order to configure RC6/TX/CK and RC7/RX/DT/SDO as an EUSART: bit SPEN (RCSTA<7>) must be set (= 1)
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: GabrielD en 12 de Noviembre de 2014, 12:48:32
OK killer muchas gracias :) voy a revisar entonces y te estare comentando
Título: Re: El RS485, un Relé en la lejanía: Hardware y Software
Publicado por: GabrielD en 19 de Noviembre de 2014, 20:33:08
Hola a todos, bueno vengo a comentarles que por cuestiones de agilizar tiempo en mi proyecto me toco mudarme al 16f877A que tiene el SPI y el puerto uart separado, asi que ahora sera comunicacion entre el 16f877a y un 18f2550.

Por cierto he estado haciendo pruebas con la comunicacion RS485 enviando un array de numeros enteros {1,2,3,4}  e incrementandolos y volviendolos a enviar cada 2 segundos y he notado lo siguiente:

1) la trama recibida los almaceno en el mismo vector del ejemplo del maestro RedPic, la rutina de recepcion es la misma ( igualmente despues del array de numeros envio el '!' para indicar el fin del mensaje), pero al imprimir el vector de recepcion(UART_buffer) en el lcd, se ve que siempre la primera posicion del vector   (UART_buffer[0] ) tiene el valor 0 y en las siguientes cuatro posiciones si estan los cuatro numeros.

2) no siempre llegaba el array perfecto; a veces llegaba primero dos ceros (0) a veces se repitia el ultimo numero o a veces llegaba dos veces el array.
Asi que cambie la rutina de envio a un solo numero que se incrementara. Este igualmente llegaba en la posicion UART_buffer[1] del vector pero siempre llego perfecto, no se repetia el numero ni tampoco llegaban dos ceros antes que el, asi que el problema se presentaba con el array.


Por cierto he estado usando la funcion putc() para enviar los datos, no se si el 0 que llega de primero sea por protocolo como un dummy byte.

No se si a alguien mas le ha pasado esto o si se han fijado de esto.

Gracias y que esten bien :)