TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: kruskal 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
-
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
-
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
-
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...........
-
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
-
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.
-
Parece interesante el driver 485 del ccs, la verdad es que no lo vi nunca.. Alguien sabe como se usa ?
Saludos a todos Mariano ..
-
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
-
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
-
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