TODOPIC
Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: fonsecapia en 22 de Marzo de 2011, 15:33:07
-
Hola, que tal:
Estoy haciendo un pequeño proyecto, donde es importante adquirir datos de varios PICs. Necesito hacer una red, donde 1 maestro toma la informacion de varios esclavos, 1 a la vez, pero no se como hacerlo. Intente i2c, pero no me funciona. Me comentaron que por medio de rs485 se puede hacer. Podrían ayudarme?
-
Que tal fonseca claro que se puede mediante RS485 y la UART de tu micro puedes utilizar el transceiver SN75176 y también checa en la pagina de www.ti.com puedes bajar notas de aplicación sobre el bus RS485 lo que te dejara mas claro como utilizarlo saludos.
-
Hola, que tal:
Estoy haciendo un pequeño proyecto, donde es importante adquirir datos de varios PICs. Necesito hacer una red, donde 1 maestro toma la informacion de varios esclavos, 1 a la vez, pero no se como hacerlo. Intente i2c, pero no me funciona. Me comentaron que por medio de rs485 se puede hacer. Podrían ayudarme?
hola fonsecapia, si que se puede hacer, yo ahora estoy haciendo una entre varios esclavos, un master y un PC mediante RS-485.
Como lo llevas?!?!?! Que es lo que necesitas?!?!?!
La conexión es muy sencilla mediante MAX485 o como dice Chipon con el SN75176. Has de poner unas resistencias al final del cable de 120 ohms.
Piensa que el que ha de iniciar la comunicación siempre es el maestro, y el esclavo solo puede contestar, de esta forma tendrás controlado que dos dispositivos no puedan enviar datos a la vez.
Yo me he hecho (con la ayuda del foro... :lol: :lol: :lol: ) un protocolo que mas o menos me va bien...
saludos...
-
Hola, tengo un gran problema que no se que puede ser. Paso a explicarlo
Tengo que hacer para la universidad 5 modulos (puerta) que leen tarjetas RFID y que se encuentran comunicados via rs485, la comunicacion es bidirecional, de los modulos a una computadora, en un sentido los modulos envian el codigo de la tarjeta que pasan los profesores para abrir las puertas a la computadora, y en el otro la computadora envia informacion para hacer que cada modulo me envie la letra "X" y asi probar comunicacion a los modulos (como hacer un ping), tambien enviar los horarios de clases, nombre de los profesores, fecha y hora a los modulos y estos se mantengan actualizados, por si las dudas para grabar toda esta informacion, lo hago a traves de pendrives que tiene cada modulo puerta.
Especifico tambien que tengo un sn75176 (rs485) conectado a un 16f877a (modulo base) para que maneje los pines de control del sn75176, y asi controlar la transmision y recepcion, y este pic es simplemente un espejo de lo que manda la computadora.
El problema es:
Tengo 1 modulo puerta armado y el modulo con el sn75176 armado en la misma proto, y me funcionan bien con un solo modulo, pero si le pongo otro modulo que lo tengo armado en otra proto con otra fuente de voltaje en paralelo, ya no me prestan atencion los pic a la computadora pero los numeros que le mando le llegan y solo envian el numero de la tarjeta y solo 1 modulo, el otro ya no pasa la informacion a traves de sn75176.
Cabe recalcar que le puse una resistencia de 120ohm como dice arriba y no funciono para nada, para que funcione unidirecionalmente tiene 2 resistencias de 1Kohm alos pines Ra y Rb del sn75176.
Si tienen alguna duda, me preguntan numas.
David Nunez M
-
Tengo un problema.
No funciona¡¡¡¡
RS485 con varios esclavos.. 2 en este ejemplo:
MASTER:
program RS485_MASTER
dim dat as byte[20]
dim rs485_rxtx_pin as sbit at RC5_bit
dim rs485_rxtx_pin_direction as sbit at TRISC5_bit
sub procedure interrupt()
GIE_bit = 0
RS485Master_Receive(dat)
if dat[6] = 3 then
PORTD = dat[0]
end if
if dat[6] = 2 then
PORTB = dat[0]
end if
RCIF_bit = 0
GIE_bit = 1
end sub
main:
CMCON = 7
ADCON1 = 7
TRISB = 0
PORTB = 0
TRISD = 0
PORTD = 0
UART1_Init(9600)
delay_ms(100)
RS485Master_Init()
RCIE_bit = 1
TXIE_bit = 0
PEIE_bit = 1
GIE_bit = 1
Delay_ms(1)
while TRUE
dat[0] = 0x01
dat[1] = 0x00
dat[2] = 0x00
dat[4] = 0
dat[5] = 0
dat[6] = 0
RS485Master_Send(dat,3,2)
Delay_ms(100)
dat[0] = 0x02
dat[1] = 0x00
dat[2] = 0x00
dat[4] = 0
dat[5] = 0
dat[6] = 0
RS485Master_Send(dat,3,3)
PORTD.6 = not portd.6
wend
end.
1er ESCLAVO:
program RS485_SLAVE_01
dim dat as byte[20]
dim valor as byte[5]
dim rs485_rxtx_pin as sbit at RC2_bit
dim rs485_rxtx_pin_direction as sbit at TRISC2_bit
sub procedure interrupt()
RS485Slave_Receive(dat)
end sub
main:
CMCON = 7
ADCON1 = 7
UART1_Init(9600)
Delay_ms(100)
TRISB = 255
RS485Slave_Init(2)
RCIE_bit = 1
TXIE_bit = 0
PEIE_bit = 1
GIE_bit = 1
while true
if dat[0] = 1 then
dat[0] = 0
valor[0] = PORTB
RS485Slave_Send(valor, 1)
end if
wend
end.
2do Esclavo:
program RS485_SLAVE_02
dim dat as byte[20]
dim valor as byte[3]
dim rs485_rxtx_pin as sbit at RC2_bit
dim rs485_rxtx_pin_direction as sbit at TRISC2_bit
sub procedure interrupt()
RS485Slave_Receive(dat)
end sub
main:
CMCON = 7
ADCON1 = 7
UART1_Init(9600)
Delay_ms(100)
TRISB = 255
TRISD = 0
RS485Slave_Init(3)
RCIE_bit = 1
TXIE_bit = 0
PEIE_bit = 1
GIE_bit = 1
while true
if dat[0] = 2 then
dat[0] = 0
PORTD.0 = not PORTD.0
valor[0] = PORTB
RS485Slave_Send(valor, 1)
end if
wend
end.
-
el rs485 se utiliza mediante el rs232 de un pic por ejemplo, lo unico que hace el rs485 es adaptar los voltajes en modo diferencial para evitar que los ruidos distorsionen los datos.
Para usar el rs485 unicamente debes activar el modo envio o recepcion (mediante los pines del max485) y entonces enviar o recibir, es importante que todos esten en modo recepcion, para que cuando el maestro envie un dato, los esclavos los reciban, y ahora mediante una direccion decir a que esclavo le quiere pedir informacion. Una vez el maestro envia, se pone en modo escucha, el esclavo se pone en modo envio y este envia los datos al maestro.
Con este procedimiento no tendras ningun problema, ya que no tendras problemas de colisiones.
Exactamente no se que hacen las funciones rs485 que pones en el codigo, por eso es algo dificil ayudarte.
-
el rs485 se utiliza mediante el rs232 de un pic por ejemplo, lo unico que hace el rs485 es adaptar los voltajes en modo diferencial para evitar que los ruidos distorsionen los datos.
Para usar el rs485 unicamente debes activar el modo envio o recepcion (mediante los pines del max485) y entonces enviar o recibir, es importante que todos esten en modo recepcion, para que cuando el maestro envie un dato, los esclavos los reciban, y ahora mediante una direccion decir a que esclavo le quiere pedir informacion. Una vez el maestro envia, se pone en modo escucha, el esclavo se pone en modo envio y este envia los datos al maestro.
Con este procedimiento no tendras ningun problema, ya que no tendras problemas de colisiones.
Exactamente no se que hacen las funciones rs485 que pones en el codigo, por eso es algo dificil ayudarte.
Amigo perdon la pregunta
existe algún limite en el numero de dispositivos ?
es decir si tengo los 2 cables d comunicación TX yRX
podría conectar un numero X de integrados ?
por ejemplo 1 pic maestro y 100 esclavos
no he logrado conectar mas de 10 dispositivos :( de alguna forma dejan de funcionar ....
-
100 Esclavo, claro que se puede, pero debe tener muy en cuenta que los micro o pics , tenga las el mismo BAUDRATE, seria mejor usar cristal externo y con 0% de errores, usando esclavos a larga distancia, es recomendable poner un TERMINATOR. osea una resistencia de 120 OHM al ultimos esclavo, eso es para compensar las impedancia del BUS y evitar ruido, ojos el Cable para muchos esclavos debe ser de buenas calidad.
Saludos
-
El numero maximo depende del transceptor.
Lo normal es 32 maximo, pero hay algunos que soportan hasta 128.
Mirate esto:
http://datasheets.maximintegrated.com/en/ds/MAX1487-MAX491.pdf
En el pie de la primera pagina te viene un recuadro con las caracteristicas, ahi puedes ver el numero maximo de receptores. En este caso necesitarias el max487 para 128 receptores