Autor Tema: protocolo de comunicaciones rs485  (Leído 4376 veces)

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

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
protocolo de comunicaciones rs485
« en: 24 de Julio de 2009, 12:10:04 »
hola, bueno les cuento que estoy tratando de crear un protocolo de comunicaciones, para el bus rs485, voy a controlar varios nodos, el problema se presenta, cuando envio datos desde el master en este caso desde la pc, a un nodo especifico, los demas nodos tambien reciben los datos, lo reciben en las variables respectivas pero obviamente solo evaluan esos datos si esta dirigido a el,   todos los nodos sufren un parpadeo muy molesto, esto lo noto porque tienen un led. y el led esta conectado a la salida del microcontrolador(16f628).
como evitar ese parpadeo, porque cuando el master envia datos, todos los nodos lo reciben, y por lo tanto estan en la rutina de interrupcion, pero aun asi el parpadeo del led que esta conectado al pin RB0  se nota.
sabe alguien a que se debe ese parpadeo?
 o como puedo implementar un protocolo de comunicaciones para el bus rs485?

muchas gracias por su ayuda

 

Desconectado darck_khronos

  • PIC18
  • ****
  • Mensajes: 493
Re: protocolo de comunicaciones rs485
« Respuesta #1 en: 24 de Julio de 2009, 12:14:53 »
hola, bueno les cuento que estoy tratando de crear un protocolo de comunicaciones, para el bus rs485, voy a controlar varios nodos, el problema se presenta, cuando envio datos desde el master en este caso desde la pc, a un nodo especifico, los demas nodos tambien reciben los datos, lo reciben en las variables respectivas pero obviamente solo evaluan esos datos si esta dirigido a el,   todos los nodos sufren un parpadeo muy molesto, esto lo noto porque tienen un led. y el led esta conectado a la salida del microcontrolador(16f628).
como evitar ese parpadeo, porque cuando el master envia datos, todos los nodos lo reciben, y por lo tanto estan en la rutina de interrupcion, pero aun asi el parpadeo del led que esta conectado al pin RB0  se nota.
sabe alguien a que se debe ese parpadeo?
 o como puedo implementar un protocolo de comunicaciones para el bus rs485?

muchas gracias por su ayuda

 

hay que usar el buscador

Aqui hay un link donde ya se hablo de ello

http://www.todopic.com.ar/foros/index.php?topic=21300.msg217915#msg217915

si creo que ahi esta algo de lo que necesitas si no es asi comenta las dudas que tengas

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: protocolo de comunicaciones rs485
« Respuesta #2 en: 24 de Julio de 2009, 16:32:30 »
Hola.

A que te refieres con parpadeo? a que te refieres con "salida del 16F"?

Las veces que he usado RS485 no he notado reinicios ni nada por el estilo.

Saludos
El papel lo aguanta todo

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: protocolo de comunicaciones rs485
« Respuesta #3 en: 24 de Julio de 2009, 16:35:30 »

No te explicas bien.

Deberías también subir tu diagrama electrónico.

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: protocolo de comunicaciones rs485
« Respuesta #4 en: 24 de Julio de 2009, 17:37:04 »
si, creo que mi explicacion no ha sido claro, disculpen amigos, bueno mas tarde estare subiendo un diagrama.
el parpadeo me refiero a lo siguiente

en una red rs485 un master que es la pc y  tengo dos nodos,  cada nodo tiene como controlador al pic 16f628, este nodo tiene la funcion de controlar un sensor, en cada nodo tengo un led conectado al pin RB0 del PIC, cuando, por ejemplo envio informacion al nodo1, todo trabaja normal, pero se nota un pequeñisimo  parpadeo en el led que nada tiene que ver con la recepcion de datos, esto ocurre cuando el programa se encuentra en la rutina de interrupcion RDA.

todo trabaja normal, el unico problema es cuando el master envia informacion, forzozamente todos los pics de los nodos entran en la rutina de recepcion de datos(rda), viendo si la informacion que llega les corresponde o no, y ahi se nota el parpadeo, pero no afecta en nada al proceso
 esa era mi duda amigos, como mejorar eso,

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: protocolo de comunicaciones rs485
« Respuesta #5 en: 24 de Julio de 2009, 23:06:13 »
En la rutina de interrupcion, tienes algun delay_ms()?  O de pronto la funcion de decodificacion de los mensajes esta en la rutina de interrupcion? Normalmente, y para que no halla problemas, las rutinas de interrupcion deben tomar el minimo tiempo posible y todas las acciones de manejo del proceso deben estar en el programa principal.

De todas maneras, seria mejor que subas el codigo de los receptores y un diagramilla para ver y estar seguro de lo que te decimos ok?

Saludos
El papel lo aguanta todo

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: protocolo de comunicaciones rs485
« Respuesta #6 en: 25 de Julio de 2009, 18:38:00 »
hola esta es la rutina de recepcion de datos desde la pc.
como veran todos los esclavos recepcionan los datos en la rutina de recepcion de datos en sendas variables, despues en el bucle principal evaluo si acepto o no los datos recepcionados.
yo envio varios datos, desde una aplicacion, como todos los esclavos recepcionan los datos es en ese momento, cuando estan recepcionando los datos donde se nota el parpadeo de un led.
todo esto en una red rs485, como veran mi protocolo de comunicaciones es medio anticuado, si ustedes conocen alguna forma mejor por favor, con gusto y un agradecimiento


//rutina de recepcion de datos
#int_rda
void serial_isr()
{
char string_modo[20];

   if(kbhit())
   {
 
   fgets(string_modo,pc);
   //el primer datos nos dice que accion va a ejecutar el esclavo
   //en este caso si string_modo nos dice que se va a recepcionar datos para actualizar la hora del esclavo, entonces ejecuta
   //la siguiente condicion
   if(strcmp(string_modo,fecha_rgb)==0)
   {
      fgets(string_dia,pc);
      fgets(string_mes,pc);
      fgets(string_anio,pc);
      fgets(string_hora,pc);
      fgets(string_minuto,pc);
      fgets(string_segundo,pc);
      flag_fecha=true;
   }
//esta es la siguiente opcion, que recepcion el la fecha de encendido y apagado
   else if(strcmp(string_modo,programacion_rgb)==0)
       {
   //primera hora
      fgets(hora_on_1,pc);
      fgets(minuto_on_1,pc);
      fgets(segundo_on_1,pc);
      fgets(hora_off_1,pc);
      fgets(minuto_off_1,pc);
      fgets(segundo_off_1,pc); 
  //segunda hora   
      fgets(hora_on_2,pc);
      fgets(minuto_on_2,pc);
      fgets(segundo_on_2,pc);
      fgets(hora_off_2,pc);
      fgets(minuto_off_2,pc);
      fgets(segundo_off_2,pc);
     
      flag_arranque=true;
     
       }
     //esta es otra opcion que ejecuta un procedimiento determinado en el esclavo 
     else if(strcmp(string_modo,juego)==0)
         {
          flag_game=true;
         }
      }
      }

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: protocolo de comunicaciones rs485
« Respuesta #7 en: 26 de Julio de 2009, 11:09:36 »
Hola.

Primero: La variable char string_modo[] debe estar definida como variable global, ya que si luego realizas algun proceso en el main, al ser variable local, se van a perder los datos que has almacenado en ella.

Segundo: Como te lo mencione en el post anterior, las rutinas de interrupcion deben tomar el minimo tiempo posible.

Tercero: Si vas a llenar un bufer, debes hacerlo de manera secuencial, de esta forma pones un orden a todo y no te confundis y garantizas que el bufer de verdad tiene los datos que necesitas.

Código: [Seleccionar]
string_modo[i++]=getc();
Debes definir un string que indique el final de envio de la trama, por ejemplo: '-', luego de detectar el final de envio, ya puedes hacer todo lo demas.

Saludos
El papel lo aguanta todo

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: protocolo de comunicaciones rs485
« Respuesta #8 en: 26 de Julio de 2009, 12:06:17 »
muchas gracias por responder amigo.
la variable char string_modo[], lo declaro local a la funcion de interrupcion porque solo se utiliza dentro de esta rutina,
y me sirve para indicarle al pic que ruta va a tomar en la recepcion de datos
 no estoy haciendo una recepcion de datos con getc sino que estoy utilizando fgets().
no estoy utilizando buffers.
por ejemplo necesito enviar tres datos desde el master a la pc, en este caso seria asi

char modo_dato[]="recepcion_datos";


 # int_rda
void isr()
{
char string_modo[];
fgets(string_modo,pc) //
if(strcmp(string_modo,modo_dato)==0) // si string_modo es igual a modo_dato entonces recepciona tres datos
{
fgets(dato1,pc); //recepcion del primer dato
fgets(dato2,pc); //recepcion del segundo dato
fgets(dato3,pc); //recepcion del tercer dato
}

}

para ver el fin de la recepcion de datos, o mejor dicho para que no se quede colgado el sistema dentro de la rutina de recepcion de datos , siempre envio una cantidad definida de datos en estes caso cuatro
 el primero me indica que tipo de datos va a recepcionar
el segundo, el tercero y el cuarto son los datos
o sea desde la pc envio cuatro cadenas  con un retorno de carro.

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: protocolo de comunicaciones rs485
« Respuesta #9 en: 28 de Julio de 2009, 01:38:29 »
hola sip creo que me he complicado, una consulta, se puede crear un array de cadenas en ccs por ejemplo:

int array[8][6[];


array[0]="hi";
array[1]="hola1";
array[2]="hola2";
array[3]="hola3";
array[4]="hola4";
array[5]="hola5";

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: protocolo de comunicaciones rs485
« Respuesta #10 en: 28 de Julio de 2009, 11:40:28 »
Hola.

Si, si se puede:

Código: [Seleccionar]
const int8 Labels[][*]={"Label1", "Label2", "Label3"};
Saludos
El papel lo aguanta todo

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: protocolo de comunicaciones rs485
« Respuesta #11 en: 28 de Julio de 2009, 13:13:20 »
ayap MLO, como una constante, si quiera tomarlo como una variable, seria valido,
es decir primer declaro el array de cadenas
esto seria como constante

const char cadena[4][8]={"hola","como","estas","cuando"};

 estos valores no se pueden modificar, por ser constantes,
ahora para crear un array de cadenas  que pueda modificarlo en cualquier parte del programa

char cadena[][];  //declaro la cadena como variable global
 como haria para asignarle valores dentro de una funcion, por almacenar datos que vienen desde la pc