Autor Tema: Problemas con bus 485  (Leído 3265 veces)

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

Desconectado kruskal

  • PIC16
  • ***
  • Mensajes: 108
Problemas con bus 485
« en: 14 de Julio de 2004, 14:20:00 »
Amigos del Foro:

Realice un programa para acoplar un sensor de tarjeta de proximidad de tarjeta magnetica. Este sensor entrega un string unico para cada tarjeta
de 10 caracteres mas un caracter de inico 0x02 y uno de fin de cadena 0x03 a 9600 baudios RS232.
El codigo toma este string y le agrega dos caracteres al final de la cadena como forma de direccionar y envia por un bus 485 a un PC utilizando el driver SN75176B.
Ademas tiene un sensor magnetico en la puerta por la eventualidad que se abra sin permiso de acceso y avise al PC y tambien un sensor de presencia para indicar si la
persona va entrando o saliendo.

Cuando conecto un dispositivo funciona todo bien pero conecto un segundo y no llega nada
al PC he hecho muchas pruebas entre las cuales es colocar dos SN75176 para separar el envio de la recepcion.
No se que pasa no puedo conectar mas de uno al bus.
Alguien me podria ayudar?. Aqui va el codigo para que lo miren.

// El siguiente codigo realiza el acople de un sensor RFID de control de
// acceso a una red 485.
#include <16F84A.h>
#include <math.h>
#fuses XT,NOWDT,NOPROTECT
#use delay(clock=4000000)
#define car1 "A"
#define car2 "A"
#define Tx PIN_B5          // PIN Transmision al PC
#define Rx1 PIN_B4        // PIN Recepcion string sensor de puerta
#define Rx2 PIN_B3         // PIN Recepcion del PC orden apertura de puerta
#use rs232(baud=9600, xmit=Tx, rcv=Rx1, Invert) // habilita recepcion del sensor RFID


char c[12];
int i=0;
int16 reloj;
char r[3];
int16 tiempo;

// definir prototipos de funciones

void enviar_recibir (void);
void alarma (void);


// fin de protopipos de funciones

// Programa Principal
void main (void)
{
  set_Tris_A(0b00001100);  // Pulso apertura puerta A1 entrada sensor magnetico A2
                            // A3 sensor de ubicacion de personas (pasivo bajo)
  set_Tris_B(0b00011111);  // B3 y B4 entradas Rx, B5 Salida Tx, ademas
                           // B6 y B7 control 485 DE y RE respectivamente
                           // BO, B1, B2 entrada de tiempo para apertura puerta
   output_low(PIN_A1);
   output_low(PIN_B6);     // Coloca el driver 485 en modo recibir
   output_low(PIN_B7);    // B6=DE=low, y B7=RE=low
   delay_ms(50);

   while(input(PIN_A2));    // Espera a que la puerta este cerrada para comenzar

   while(1)
   {
      if(input(PIN_A2))     // Detecta apertura de puerta sin autorización
         alarma();
      if(kbhit())          // Detecta comienzo de transmisión de string
         enviar_recibir();
   }

}


// Funciones
// 1. Agregar direccion
void enviar_recibir (void)
{
   // recepcion de todo el string del sensor RFID
   for(i=0;i<=11;i++)
   {
         c=getc();
   }

   // Envio de de String direccionado, se habilita transmision hacia PC
   // y pin de recepcion del PC y aumenta la frecuencia de comunicacion
#use rs232(baud=19200, xmit=Tx, rcv=Rx2, Invert)
   delay_ms(50);
   output_high(PIN_B6);     // Coloca el driver 485 en modo transmitir
   output_high(PIN_B7);    // B7=DE=high, y B6=RE=high

   r[0]="Z";               // Se pone a valor conocido la respuesta del PC
   r[1]="Z";               // por la eventualidad que no haya respuesta
   r[2]="Z";

   for(i=0;i<=10;i++)
   {
      putc(c);
   }

   putc(0x2A);
   putc(car1);           // Direccion AB
   putc(car2);
   if(input(PIN_A3))    // Detecta posicion de personas en E: Entrada o S: Salida
   {
   putc("E");
   }
   else
   {
   putc("S");
   }
   putc(0x03);

   // Recepcion de Direccion y Orden de apertura de puerta
   // se espera 50ms por respuesta del PC si no ocurre se regresa
   //set_rtcc(0);         // se inicializa el reloj para el tiempo a esperar por
   //reloj=get_rtcc();    // la respuesta del PC

   output_low(PIN_B7);     // Coloca el driver 485 en modo recibir
   output_low(PIN_B6);    // B0=DE=low, y B1=RE=low
   // la temporizacion la voy a hacer de esta manera
   for(reloj=0;reloj<=6500;reloj++)
      {
         if(KBHIT())
      {
         r[0]=getc();
         r[1]=getc();
         r[2]=getc();
         reloj=7000;
      }

   }

   if(r[0]==car1 && r[1]==car2 && r[2]=="O")
   {
      output_high(PIN_A1);
      // Asigna tiempo de apertura de puerta
// dip swtich conectado a B0,B1,B2 alto activo

  tiempo=10;
  if(input(PIN_B0))
  delay_ms(1000);
  if(input(PIN_B1))
  delay_ms(2000);
  if(input(PIN_B2))
  delay_ms(3000);


      output_low(PIN_A1);
   }
      output_low(PIN_A1);

   // Se prepara la vuelta
#use rs232(baud=9600, xmit=Tx,rcv=Rx1,Invert) // habilita recepcion del sensor RFID

   output_low(PIN_B7);     // Coloca el driver 485 en modo recibir
   output_low(PIN_B6);    // B0=DE=low, y B1=RE=low                                           // nuevamente

   while(input(PIN_A2));    // Espera a que la puerta este cerrada para volver
   delay_ms(50);
}

// 2. Alarma
void alarma (void)
{
#use rs232(baud=19200, xmit=Tx, rcv=Rx2, Invert)
   delay_ms(50);
   output_high(PIN_B7);     // Coloca el driver 485 en modo transmitir
   output_high(PIN_B6);    // B0=DE=high, y B1=RE=high

   puts("alarma";
   putc("*");
   putc(car1);
   Putc(car2);

   // Se prepara la vuelta
#use rs232(baud=9600, xmit=Tx, rcv=Rx1,Invert) // habilita recepcion del sensor RFID
   delay_ms(50);
   output_low(PIN_B7);     // Coloca el driver 485 en modo recibir
   output_low(PIN_B6);    // B0=DE=low, y B1=RE=low                                             // nuevamente

   while(input(PIN_A2));    // Espera a que la puerta este cerrada para volver
}

Salu2
Kruskal

Desconectado pikman

  • Moderador Local
  • PIC24F
  • *****
  • Mensajes: 679
RE: Problemas con bus 485
« Respuesta #1 en: 14 de Julio de 2004, 22:51:00 »
Bueno, he bajado el programa para analizarlo, pero porque no usa el driver para 485 de CCS, esta todo resuelto ahi., una consulta, yo estoy trabajando en un desarrollo similar es un sistema para control de acceso y horario, por ahora sera con tarjetas de banda magnetica pero la intencion es una version con tarjeta wireless, me puedes apuntar donde hay informacion en la web, que marca y tipo es la que tu usas.

saludos

Ariel
saludos
PikMan

Desconectado kruskal

  • PIC16
  • ***
  • Mensajes: 108
RE: Problemas con bus 485
« Respuesta #2 en: 14 de Julio de 2004, 23:16:00 »
El programa funciona el problema que tengo es que al conectar mas de un dispositivo al bus 485 no llega nada. He usado unas simples compuertas OR para conectar en cascada 5 puertas y funciona bien. El problema sigue siendo que quiero realizarlo bajo un bus 485 real.
El sistema de control de acceso esta basado en el integrado GP8 de PROMAG con este dato es facil buscar en internet. Este integrado se encuentra funcionando en productos comerciales RS-232 y se  usa tanto para acceso como para control horario, existe un sofware en Visual Basic desarrollado que almacena las tarjetas y da la orden de apertura de puerta y genera los reportes.

Eso de un control de acceso inalarmbico es muy interesante prodrias darme una guia.

Espero que nos sigamos comunicando

Salud2

Kruskal



Desconectado kruskal

  • PIC16
  • ***
  • Mensajes: 108
RE: Problemas con bus 485
« Respuesta #3 en: 14 de Julio de 2004, 23:20:00 »
Se me olvidaba.............

Que es eso del Driver 485 de CCS, ten en cuenta que lo estoy realizando con un modesto pic16F84 que con lenguaje C adquiere una potencia tremenda...........


Desconectado pacalaconcurso

  • PIC24F
  • *****
  • Mensajes: 718
RE: Problemas con bus 485
« Respuesta #4 en: 15 de Julio de 2004, 13:04:00 »
como tienes montado el bus???
hay resistencias de cierre de linea???
tienes una resistencia entre A y GND y otra entre B y positivo???

he usado equipos similares sin problemas, pero si la distancia es grande es necesario las resistencias.

quizas puedas optimizar algo tu codigo para que no se quede tieso si recibe menos caracteres de los esperados....

si puedes cambia al 16f628 y usa el modulo hardware.

el consejo de Ariel es interesante, usa la libreria de CCS y evitas colisiones...

saludos

Desconectado pacalaconcurso

  • PIC24F
  • *****
  • Mensajes: 718
RE: Problemas con bus 485
« Respuesta #5 en: 15 de Julio de 2004, 13:07:00 »
ahh, se me olvidaba...
recuerda al hacer tu programa que la longitud del mensaje no es fija, creo que es el mismo protocolo que use yo por que si hubiera un caracter  10 (HEX) este se envia dos veces.

Desconectado mirazulado

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 142
RE: Problemas con bus 485
« Respuesta #6 en: 15 de Julio de 2004, 14:05:00 »
Parece interesante el driver 485 del ccs, la verdad es que no lo vi nunca.. Alguien sabe como se usa ?
  Saludos a todos Mariano ..

Desconectado gauchosuizo

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 457
RE: Problemas con bus 485
« Respuesta #7 en: 15 de Julio de 2004, 14:14:00 »
hola gente

yo estoy trabajando en un projecto que usa el bus 485 y el protocolo de Modbus. Para conectar el Master con el Slave es necesario tener unas resistencias de cierre de linea para evitar las reflexiones de la señal sobre el cable. Normalmente se usa una resistencia entre A y B de 120 Ohmios. Si tienes hasta 4 Slave, no es necesario conectar las resistencias de A a + y de B a GND como dijo Pacala...
Para la comunicacion uso el MAX485 y funciona de maravillas. Viendo la datasheet del SN75176B, pienso que tiene que andar sin problemas. Es similar al MAX485.
Si necesitas mas informacion, escribe.

Saludos desde Suiza, Pablo
Saludos desde Suiza, Pablo.

Desconectado kruskal

  • PIC16
  • ***
  • Mensajes: 108
RE: Problemas con bus 485
« Respuesta #8 en: 23 de Julio de 2004, 12:40:00 »
Estimados Amigos

Utilizo el esquema de conexion que aparece aqui
http://www.mikroelektronika.co.yu/english/product/books/picbasicbook/07.htm#7.5%20RS-485

claro que quito el driver Max232 por que, como ustedes saben mejor que yo, los PC actuales estan adaptados a una comunicacion serial con niveles TTL.

Las resistencias de cierre; pull-up, pull-down y de cierre se colocan de acuerdo a los numeros de dispositivos que se instale sobre el bus, he probado de todas las maneras.

gauchosuizo tu proyecto como va tienes funcionando la red 485 con el protocolo ModBus podrias darme algunas indicaciones de que estoy haciendo mal

Salud2
Kruskal

Desconectado gauchosuizo

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 457
RE: Problemas con bus 485
« Respuesta #9 en: 24 de Julio de 2004, 10:20:00 »
hola

yo hice un circuito muy similar al que pacala... tiene en su pagina web. Tendrias que ver ahi. Igualmente el protocolo MODBUS. Viendo el circuito que tu has puesto, el mio tiene algunas diferencias:
- La pata RE la pongo a masa, esto quiere decir que la recepcion de mensajes esta siempre abierta.
- Yo trabajo con un PIC18F252. Con este se puede definir el HW para la rs485, definiendo el pin enable para transmitir, sin tener que escribir un programa especial.
#use rs232(baud=9600, xmit=Tx, rcv=Rx1, enable=pin_c0)
- Las resistencias estan bien: rT=120Ohm, rB=470....680Ohm
Lo demas parece estar en orden.

Una pregunta: mas arriba escribes que trabajas con el GP8. Viendo los datos de este, me di cuenta que trabaja con el RS232. Como has adaptado el GP8 al RS485?? Pone el circuito para verlo.

Saludos desde Suiza, Pablo
Saludos desde Suiza, Pablo.