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