Autor Tema: Protocolo para RS485  (Leído 37965 veces)

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

Desconectado ales

  • PIC10
  • *
  • Mensajes: 33
Protocolo para RS485
« en: 12 de Abril de 2008, 17:38:30 »
Hola amigos, gracias a la información encontrada en el Foro pude lograr el HW y SW de un protocolo para la comunicación RS485.
 Aqui se las paso, el SW con CCS y HW con Proteus 7.2.
No les explico nada porque no se si a alguien le hará falta, en caso que si, bueno me preguntan y les doy los detalles.

Gracias a todos por su ayuda y espero que lo aprovechen.

saludos. :-/

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Protocolo para RS485
« Respuesta #1 en: 12 de Abril de 2008, 19:12:04 »
esta muy completo, gracias pro el aporte, podrias explicarnos en qeu consistia mas o menos todo el proyecto?? para que tengamos una idea de como va y donde se lo puede aplicar

te ha quedado mbien :mrgreen:

y tb una pregunta, porque usaste ese micro? simple gusto o tiene algo que lo hace indispensable

un saludo, muy buen aporte :-/ :-/
.

Desconectado ales

  • PIC10
  • *
  • Mensajes: 33
Sobre el Protocolo
« Respuesta #2 en: 13 de Abril de 2008, 13:01:25 »
El protocolo RS485 que tuve que hacer formará parte de mi trabajo de diploma de la universidad, verás que la identificación (o sea la dirección) de los esclavos es por hardware, esto es necesario porque todos los PIC Slaves tendrán el mismo Software, ellas serán las encargadas de recoger información de sensores que tendrán conectadas por la otra UART del PIC. Por eso fue que escogí este PIC porque tiene dos UART por HW y por SW es un dolor de cabeza la simulación de UART que hace el CCS.
El Master también en un momento determinado se conectará via serie con una PC para recibir toda la configuración necesaria para el funcionamiento.
Y toda la información que le vaya pidiendo a los esclavos la procesará y almacenará en una MMC.

Entonces el protocolo como tal:
-El Master envía en un byte la dirección del esclavo con el que quiere comunicarse y en el bit LSB de este mismo byte con 0 informa que va a escribir y con 1 que va a leer (tipo I2C)
-El esclavo con esa ID envía su propia ID hacia el Master como respuesta de que está recibiendo la información (o sea: ACK).
-Y en caso que el Master vaya a escribir en el Esclavo envía ahora la Cant. de bytes que va a transferir al Esclavo.
- El esclavo espera esta cantidad y la envía de nuevo al Master como Ack, y así se comprueba que llegó bien la información.
-Después el Master comienza la transferencia de los bytes.
Si el Master quiere leer al Esclavo, entonces despues de enviar la ID lo que hace es esperar del Esclavo la cantidad de bytes que este vaya a transferirle y como Ack el Master envía dicha cantidad de nuevo al esclavo.
-Después el Esclavo comienza la transferencia.
-Cualquiera de los dos que esté transfiriendo, nada más termine el otro envía el byte 0xFF para que el otro conozca que ya fue recibido el paquete.

 En caso que en la espera de algún Ack se desbordara la INT TIMER0 que se activa cuando se espera el ACK se retorna ERROR en la escritura o lectura porque han pasado 1.6 segundos y creo que es suficiente como para considerar un problema, de todas formas podemos varias este tiempo.

Saludos Cryn. :-/ :-/

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Protocolo para RS485
« Respuesta #3 en: 14 de Abril de 2008, 00:16:51 »
gracias por lso detallles :mrgreen:

ahora si esta claro :-/ :-/

y ya lo implementaste?? cuanndta distancia puede aguantar??

muy buen trabajo, felicidades :-/
.

Desconectado ales

  • PIC10
  • *
  • Mensajes: 33
Re: Protocolo para RS485
« Respuesta #4 en: 14 de Abril de 2008, 00:28:33 »
Hola Cryn, aún no lo he implementado, porque no he terminado pero en un futuro quizás no muy lejano pueda.

Sobre la distancia, supongo que soporte los 1200 metros del RS485, yo solo lo necesito para unos 50 metros como máximo pero en un ambiente muy ruidoso por ello la necesidad del rs485, el sistema ira instalado en una intercepción semafórica.

gracias por las felicitaciones, no eran necesarias.

saludos. :-)

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
Re: Protocolo para RS485
« Respuesta #5 en: 25 de Abril de 2008, 08:40:11 »
Enhorabuena Cryn, yo estoy trabajando en algo parecido a lo tuyo pero más simple, tengo que transferir datos desde un pic al pc,... el pc interrumpe cada hora al pic para que vuelque una tabla que tendrá guardada el pic, he pensado en usar el bus usb en el ordenador porque quiero que se pueda usar en los ordenadores portátiles, para ello he de  comprar un adaptador usb-rs232 para luego añadir un max485 que saque la señal mediante esa capa física. ¿Crees que hago lo correcto?

O existe otra opción más eficaz?

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Protocolo para RS485
« Respuesta #6 en: 25 de Abril de 2008, 09:06:17 »
Enhorabuena Cryn, yo estoy trabajando en algo parecido a lo tuyo pero más simple, tengo que transferir datos desde un pic al pc,... el pc interrumpe cada hora al pic para que vuelque una tabla que tendrá guardada el pic, he pensado en usar el bus usb en el ordenador porque quiero que se pueda usar en los ordenadores portátiles, para ello he de  comprar un adaptador usb-rs232 para luego añadir un max485 que saque la señal mediante esa capa física. ¿Crees que hago lo correcto?

O existe otra opción más eficaz?

cheapekt si usarás un adaptador usb-rs232 entonces tu interfaz es RS232.  Lo del adaptador será obligatorio para todo que quiera usar tu aplicación.

Si además le agregas un RS485, lo haces aún más específico.

Si piensas usar directamente RS485, te sugiero compres un adaptador USB-RS485 y asunto solucionado.

La otra alternativa, aunque requiere de instalación del lado de la pc, es que hagas todo via USB. 
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Protocolo para RS485
« Respuesta #7 en: 25 de Abril de 2008, 23:28:42 »
Enhorabuena Cryn

 :shock:

 :D :D :D pero si yo ni hice nada  :roll: :mrgreen:

jejeje

el de los derechos de autor aqui es ales :mrgreen:
.

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
Re: Protocolo para RS485
« Respuesta #8 en: 28 de Abril de 2008, 02:25:39 »
Jejejee....

Lo siento ales,   entonces todo el merito es tuyo!!!
BUeno y el de los compañeros, muchas gracias

Saludos!

Desconectado ales

  • PIC10
  • *
  • Mensajes: 33
Re: Protocolo para RS485
« Respuesta #9 en: 29 de Abril de 2008, 09:44:51 »
Hola cheapekt, te acabo de enviar un mensaje preguntando a que protocolo te referias y bueno ahora acabo de ver este tema y me doy cuenta a que te referias.

Pues cualquier cosa aqui estoy....

saludos.

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
Re: Protocolo para RS485
« Respuesta #10 en: 29 de Abril de 2008, 11:45:58 »
yo estoy trabajando en algo parecido a lo tuyo pero más simple, tengo que transferir datos desde un pic al pc,... el pc interrumpe cada hora al pic para que vuelque una tabla que tendrá guardada el pic, he pensado en usar el bus usb en el ordenador porque quiero que se pueda usar en los ordenadores portátiles, para ello he de  comprar un adaptador usb-rs232 para luego añadir un max485 que saque la señal mediante esa capa física. ¿Crees que hago lo correcto?



¿Hablando del tema, es posible que programe esto mediante TCP/IP,  con sockets? o es un disparate lo que he dicho.

Muchas gracias, saludos

Desconectado ales

  • PIC10
  • *
  • Mensajes: 33
Re: Protocolo para RS485
« Respuesta #11 en: 29 de Abril de 2008, 20:05:19 »
Yo nunca he trabajado con usb y las pic, lo tengo en mente para futuros proyectos, pero te recomiendo que leas el datasheet del conversor usb-rs485 y debe aclararte algunas dudas.

Hablas del puerto RS323 del PIC, y el PIC no tiene RS232 el tiene salida TTL, o sea 0 y 5V oara su comunicación serie y la PC si tiene RS232 por lo que para comunicar la PIC con la PC por puerto serie necesitas un MAX232 para convertir TTL/RS232 y viceversa. Pero si el Conversor te da USB/RS485  conectas este RS485 a otro que iria al PIC.
O sea, PC conectada por USB al USB/RS485 y este a un RS485/TTL a la PIC.

Cuando te digo RS485 me refiero a un MAX485.
Y estoy seguro que desde la PIC se envía serie al MAX485 porque eso es lo que el recibe ahora la información a enviarle para que se envíe después por USB depende de los comandos que leas en el datasheet del conversor y del funcionamiento por USB en la PC con respecto a esto que no tengo idea.

Saludos.



Desconectado zagoaristides

  • PIC12
  • **
  • Mensajes: 99
    • deportes de contacto y fitness
Re: Sobre el Protocolo
« Respuesta #12 en: 02 de Abril de 2009, 16:37:33 »
El protocolo RS485 que tuve que hacer formará parte de mi trabajo de diploma de la universidad, verás que la identificación (o sea la dirección) de los esclavos es por hardware, esto es necesario porque todos los PIC Slaves tendrán el mismo Software, ellas serán las encargadas de recoger información de sensores que tendrán conectadas por la otra UART del PIC. Por eso fue que escogí este PIC porque tiene dos UART por HW y por SW es un dolor de cabeza la simulación de UART que hace el CCS.
El Master también en un momento determinado se conectará via serie con una PC para recibir toda la configuración necesaria para el funcionamiento.
Y toda la información que le vaya pidiendo a los esclavos la procesará y almacenará en una MMC.

Entonces el protocolo como tal:
-El Master envía en un byte la dirección del esclavo con el que quiere comunicarse y en el bit LSB de este mismo byte con 0 informa que va a escribir y con 1 que va a leer (tipo I2C)
-El esclavo con esa ID envía su propia ID hacia el Master como respuesta de que está recibiendo la información (o sea: ACK).
-Y en caso que el Master vaya a escribir en el Esclavo envía ahora la Cant. de bytes que va a transferir al Esclavo.
- El esclavo espera esta cantidad y la envía de nuevo al Master como Ack, y así se comprueba que llegó bien la información.
-Después el Master comienza la transferencia de los bytes.
Si el Master quiere leer al Esclavo, entonces despues de enviar la ID lo que hace es esperar del Esclavo la cantidad de bytes que este vaya a transferirle y como Ack el Master envía dicha cantidad de nuevo al esclavo.
-Después el Esclavo comienza la transferencia.
-Cualquiera de los dos que esté transfiriendo, nada más termine el otro envía el byte 0xFF para que el otro conozca que ya fue recibido el paquete.

 En caso que en la espera de algún Ack se desbordara la INT TIMER0 que se activa cuando se espera el ACK se retorna ERROR en la escritura o lectura porque han pasado 1.6 segundos y creo que es suficiente como para considerar un problema, de todas formas podemos varias este tiempo.

Saludos Cryn. :-/ :-/


Genial el código ya lo analicé todo y eso que odio leer código de otro, pero me gusta la claridad aunque le hubiera puesto más comentarios para los que son foráneos como yo.

Ahora mi pregunta, de esta parte del código, fijate que la comenté para ir entendiéndola y no volver a pensar tanto digamos jeje. Está bien lo que pienso?

Esta parte de Código 

   //este que sigue sería un case especial cuando myCOM.cntRx o sea la cuenta de bytes recibidos
   if ((myCOM.cntRx > 2) && (myCOM.reading == true)) // Si recibimos más de de 2 bytes y estamos leyendo
   {
      if (myCOM.Slave_Active == true)
         myCOM.Buffer[myCOM.cntRx - 3] = dato;  // Este es el buffer que guardará los bytes recibidos y es - 3 
                                                // porque empezamos con myCOM.cntRx en 3 o sea queda dde. 0
      if ((myCOM.cntRx - 2) == myCOM.cnt_a_Rx)  // Acá probamos si ya llegamos al final del buffer. En este caso
                                                // cuando lleguemos al dato 20 myCOM.cntRx será 22
                                                // 20 + 1 de Dir+R/W + 1 de Cant. de Bytes a recibir
      {
         myCOM.cntRx = 0;                       // Reseteamos para una nueva comunicación
         myCOM.cnt_a_Rx = 0;                   
         
         if (myCOM.Slave_Active == true)       
         {                                      // Reseteamos las variables para una nueva comunicación
             myCOM.tramaLista = true;
             myCOM.tramaProcesada = false;
             myCOM.reading = false;
             myCOM.Slave_Active = false;
             myCOM.cnt_a_Tx = 0;
             write1byte_master(0xFF);     // Comando de Recepcion buena de bloque de datos
         }
      }
   }

Mil Gracias
« Última modificación: 02 de Abril de 2009, 17:31:07 por zagoaristides »
Nadie nació sabiendo...Que genio ese Nadie!!!

Desconectado ales

  • PIC10
  • *
  • Mensajes: 33
Re: Protocolo para RS485
« Respuesta #13 en: 05 de Abril de 2009, 12:39:24 »
Zagoaristides, este protocolo lo realicé hace como 6 meses para la tesis de ingeniería, por lo que la verdad que no recuerdo bien, pero estoy casi seguro que es como dices,  :D :D jjjaaaja, resulta que en estos momentos entiendes mejor el código que yo.
Pero recuerdo que después le agregué además código CRC y quedó mejor implementado, si tienes interés en utilizarlo me dices y lo busco para enviartelo.

Saludos, Ales.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Protocolo para RS485
« Respuesta #14 en: 06 de Abril de 2009, 11:39:04 »
creo que un CRC nos vendría muy bien a todos

un saludo y gracias
.


 

anything