Autor Tema: Probema de comunicacion Rs485, solo en el arranque.  (Leído 1536 veces)

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

Desconectado juancho056

  • PIC10
  • *
  • Mensajes: 35
Probema de comunicacion Rs485, solo en el arranque.
« en: 22 de Mayo de 2015, 02:17:02 »
Hola a todos.

Estoy implementando una red Rs485 para comunicar un maestro con 6 esclavos, siendo el pc el maestro.

El sistema lo simule en proteus y funciona perfectamente, realice la pruba con 3 esclavos y todo muy bien. Lo que pasa es que a la hora de realizar las pruebas con las PCB, intento hacer la comunicacion del masetro solo con 2 esclavos pero presenta deficultades.

La conexion la estoy haciendo Half-Duplex, dicho esto realizo un enable de un pin del pic para la comunicacion a rs485 cuando voy a transmitir y los deshabilito una vez he transmitido, el pic es un 16f1936 que es lo mismo que un 16f886 con mas capacidad y funciones.

El error si conecto solo un pic por 485 funciona correctamente, cuando conecto los dos pic no responde ninguno, tengo que quitar el alambre que habilita la pata C5(enable 485) de uno de los dos pic para que el otro me responda, vuelvo y conecto la pata que quite a C5(enable) y responden los dos pic  :shock:. Intente colocando el Enable de uno de los dos a una patita diferente C4 y pasa exactamente los mismo.

Es como si para poder funcionar primero tenga que entrar en funcionamiento uno de los dos pic, volver a conectar el enable del otro y desde el maestro volver a empezar el proceso de enviar las tramas para cada esclavo y asi funcionen correctamente.

No se que hacer,  por favor si alguien a tenido este tipo de experiencia o sabe que puede estar pasando le agradeceria mucho que los compartiera sus comentarios.



Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Probema de comunicacion Rs485, solo en el arranque.
« Respuesta #1 en: 22 de Mayo de 2015, 02:36:34 »
Me parece que están colisionando los datos.

Los esclavos ponlos en modo escucha ,la salida en alta impedancia.
Asegúrate de direccionar bien a cada micro en el bus para que solo responda ese.

Como direccionas con cada exclavo ?

Saludos!

Desconectado juancho056

  • PIC10
  • *
  • Mensajes: 35
Re: Probema de comunicacion Rs485, solo en el arranque.
« Respuesta #2 en: 22 de Mayo de 2015, 03:10:48 »
Hola AKENAFAB Gracias por responder.

Para comunicarme con cada esclavo realizo la interrupcion por serial en CCS, cada dato que recibo aumenta un contador y se va a una funcion donde tengo un select CASE

Resumire el codigo en CCS

Funcion de interrupcion, donde recibo cada dato:
#int_rda
                            //SERVICIO DE INTERRUPCIÓN POR RS232
void rda_isr()
{
   char charrcv=0x00;    // Ultimo caracter recibido
   if(kbhit()){// Si hay algo pendiente de recibir ...
   charrcv=getc();        // lo descargo y ...
   add_modbus(charrcv);  // lo añado al buffer
  }
}


void add_modbus(char c){
int x;
   dat=dat+1;
 if(dat<=10) // La trama tiene 10 datos
 {
   switch (puntero)
   {
   x = aschex2int(c); //En esta funcion paso de ASCII(0x31==0x01) a Hexa para preguntar por el esclavo, ya que el dato llega en ASCII
   case 0:// recibo el esclavo a quien va dirigido
   if (c==0x01 && dat==1) //si el comando es para mi y es el inicio de trama
   {
   modbus.trama[0]= x;
   puntero+=1;   // Aumento el case
   prote+=1; // Garantizo una proteccion para que siga las intucciones paso a paso
   }
   else
   {
   puntero =0;  
   dat=0;                // Si no es inicio de trama y nos es 0x01 inmediatamente vuelve a esperar caracteres, para poder continuar
   //pausa_rx=true;
   }
  break;

   case 1:// recibo el comando
 x = aschex2int(c); En esta funcion paso de ASCII a Hexa para preguntar por la funciona realizar, ya que el dato llega en ASCII
   if (c == 0X04 && dat==2) //si es un comando conocido, este tiene que ser el segundo dato de la trama para entrar
      {
         modbus.trama[1]= x;
         puntero+=1;
         prote+=1;        
      }
    else
    {
    pausa_rx=true;
   OUTPUT_HIGH(PIN_C2); // Led que indica error
    init_cbuff();       // Si en la trama entra al CASE 0 pero no se cumple el CASE 1, el pic no responde y sigue a la espera..
    }
   break;


Una vez se cumplieron los dos pre-requisitos entra toda la trama y se va para la funcion donde transmite.

    if (prote==2){
    OUTPUT_LOW(PIN_C3) // Habilito un led para que se vea si entra
     flagcommand=1; // Bandera para llamar la funcion donde se transmite
    }

void commad_process(void){

 OUTPUT_HIGH(PIN_C5);  // habilito el pin C5 para transmicion por 485
if(pausa_rx!=1){ // Si no fallo ninguno de los pre_requisitos de SELECT CASE entra.
 printf("%x%x%x%x%x%x%x%x%x%x%x\r\n",modbus.trama[0],modbus.trama[1],....)  // Trama de respuesta del pic
}
 OUTPUT_LOW(PIN_C5); // DesHabilito el enable para 485

  init_cbuff();// Funcion donde Borro buffer,  he inicializo todas las variables para volvera  esperar la trama correcta para el esclavo
}

Funcion donde inicializo todo de nuevo, una vez se transmita o se presenten que no es la trama, para que siga esperando

void init_cbuff(void){
  int i;
  OUTPUT_LOW(PIN_C5); //
  for(i=0;i<lenbuff;i++){// Bucle que pone a 0 todos los
     modbus.trama=0x00;      // caracteres en el buffer
  }
  puntero=0;     // Indice de Selcte CASE      
  pausa_rx=0;
  dat=0;
   prote=0;
}

El codigo es mucho mas largo pero en resumidas cuentas es lo que realizo para transmitir Y recibir los datos, no se que pueda estar hacuendo mal  :oops:

Para enviar cada trama a los diferentes esclavos, envio la trama a un esclavo y no envio la siguiente para otro hasta que el primero responda.
« Última modificación: 22 de Mayo de 2015, 03:35:29 por juancho056 »