TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: lord_edwin en 24 de Julio de 2005, 00:55:00
-
Estoy realizando un circuito de comunicacion entre PICs a largas distancias,
Alguien sabe como realizar una comunicacion RS 485 entre 2 o mas PICs.
-
Hola, no conozco bien cuales son las diferencias entre el rs232 y el rs485, pero asumo que solo variaran los niveles de voltaje de cada uno... entonces si usabamos el max232 para la comunicacion rs232 entonces usaremos un max485 para la comunicacion rs485 jajajaja
es una broma, pero mas o menos creo q es la idea...
Hasta donde se la cuminicacion RS232 y la RS485 solo son comunicacion punto a punto, es decir de uno a uno, o de pic a pic... se tambien que aca algunos compañeros han llegado a hacer una comunicacion con rs232 entre varios pic"s, seria cuestion de probar... por otro lado hay otro tipo de comunicacion q puedes ver q es el bus i2c que tambien es serial y q sirve para varios perifericos todos comunicandose con las mismas conexiones... o si te parece que necesita mas potencia puedes usar el bus can se parece un poco al i2c pero es mas industrial y soporta un ambiente de trabajo mas duro...
No se si te habre podido aclarar algunas cosas, pero espero que te sirva...
Saludos ....
-
Que tal amigos foristas:
Voy a ampliar un poquito el uso del RS485. El RS485 tiene la caracteristicade que puedes alcanzar hasta 1.2 km de distancia con un baud rate de hasta 115200 bps.
La comunicion en RS485 puede ser utilizada en configuraciones de:
a) PUNTO A PUNTO
b) PUNTO A MULTIPUNTO
Es decir pudes tener varios dispositivos colocados en el mismo par de hilos (como el I2C). Puedes tener hasta 256 elementos o dispositivos colgados en la red RS485. Esto depende del transceiver que se use, es decir existen algunos que tiene solamente 1/8 UL que son los que pudes usar hasta 256. Existen de 1/4 de UL, 1/2 de UL y 1 UL.
Esto lo que equivale es a que se colocan menos dispositivos en la red, es decir; si tu transceiver tiene:
a) 1 UL podras colocar solo 32 elementos
b) 1/2 UL podras colocar 64 elementos
c) 1/4 UL podras colocar 128 elementos
d) 1/8 UL podras colocar 256 elementos
Existen tambien algunos que estan limitados a un baud rate, existen otros que son full-duplex (4 hilos) o bien half-duplex (2 hilos).
Bueno pues ojala les sirva esta info.
Saludos.
El ReyPic.
-
Se sale algo de la tematica pero, ¿quien sabe si al que abrió el hilo no le interesa más para su proyecto?
Ahi va ... ¿Teneis info del bus can? es la primera vez que lo escucho y me gustaria aprender algo sobre el pues parece interesante, agradeceria algunos comentarios y/o enlaces
-
Pues, yo fuí el que abrió el hilo y claro que aun me interesa la informacion para mi proyecto.

Tengo el PDF del MAX485, donde se detalla la informacion tecnica sobre este.
Agradecería informacion sobre como programar el puerto serie, de tal forma que pueda detectar cuando hubo errores en los datos que se enviaron de un punto a otro, puesto que voy a controlar un proceso que es muy critico, y que puede constarle la vida a decenas de personas si la informacion no se transmite correctamente.
-
Esto son palabras mayores.
Si va a depender la vida de las personas de lo que hagas, mejor que escojas otro bus de campo mas fiable y robusto, como es el bus CAN. Hay transceivers de bus CAN a usart y es mucho más fiable (detección de errores) que el 485.
El bus CAN es un bus serie utilizado, entre otras aplicaciones, en los automóviles para la captura de datos en los diversos sensores del motor. Si los fabricantes de automóviles confían nuestras vidas a este bus, será por algo 

-
Tengo un problema relacionado con este tema, tengo un termometro digital y mediante el hyperterminal si le envío una letra mayuscula en particular me envia la temperatura y si le envio la misma letra minuscula es para introducir el set point. El 485 que va conectado al Pic tiene su linea de control conectada al mismo, y la que va junto al max232 a la PC se controla manualmente mediante un interruptor. Cuando le pido la temperatura me funciona bien, pero no me envía bien el retorno de linea y cambio de linea, solo me envía el segundo que escriba de los dos. En cuanto al set point yo mando un mensaje al hyperterminal que dice algo como "Introduzca el set point" pero no me lo envía no se por que. Aqui esta una parte del codigo
INICIO:
call Cond_Iniciales
Principal:
btfss flagi,1
goto sigue
call Convertir
bcf flagi,1
call Mostrar
sigue:
call atencion_int
call comparar_temp_setpoint
goto Principal
;********************************************************************
;--------------------------------------------------------------------
; Subrutinas...
;-------------------------------------------------------------------
INTERRUPCION:
btfss PIR1,RCIF
goto check_tmro_int
banksel PIR1
bcf PIR1,RCIF
bsf flagi,0
movf RCREG,w
movwf Dato_recibido
goto salir_de_interrupcion
check_tmro_int:
btfss INTCON,T0IF
goto salir_de_interrupcion
banksel TMR0
movlw 0x3C
movwf TMR0
banksel INTCON
bcf INTCON,T0IF
incf cuenta_convertir
bcf STATUS,C
movf cuenta_convertir,w
sublw 0x28
btfsc STATUS,C
goto salir_de_interrupcion
clrf cuenta_convertir
bsf flagi,1
goto salir_de_interrupcion
salir_de_interrupcion:
movf pclath_Anterior,w
movwf PCLATH
movf status_Anterior,w
movwf STATUS
movf w_Anterior,w
retfie
;-------------------------------------------------------------------
atencion_int:
btfss flagi,0
goto volver
bcf flagi,0
movlw 0x60
bcf STATUS,C
subwf Dato_recibido,w
movwf ID
movf PORTA,w
andlw b'00111100'
movwf rest
bcf STATUS,C
rrf rest
rrf rest,w
bcf STATUS,Z
subwf ID,w
btfss STATUS,Z
goto check_set_point
call CarryRet_USART
call NextLine_USART
call Enviar_temp
goto volver
check_set_point:
bcf flagi,0
movlw 0x40
bcf STATUS,C
subwf Dato_recibido,w
movwf ID
movf PORTA,w
andlw b'00111100'
movwf rest
bcf STATUS,C
rrf rest
rrf rest,w
bcf STATUS,Z
subwf ID,w
btfss STATUS,Z
goto volver
call CarryRet_USART
call NextLine_USART
clrf puntero
call mensaje_serial
call CarryRet_USART
call NextLine_USART
call tomar_set_point
goto volver
tomar_set_point:
movlw 0x20
movwf FSR
bcf PIE1,RCIE
bcf INTCON,T0IE
ciclo_set:
btfss PIR1,RCIF
goto ciclo_set
bcf PIR1,RCIF
bcf STATUS,C
movf Dato_recibido,w
sublw 0x40
btfss STATUS,C
goto ciclo_set
bcf STATUS,Z
movf Dato_recibido,w
xorlw 0x0D
btfsc STATUS,Z
goto limpiar_flag
bcf STATUS,Z
movf Dato_recibido,w
xorlw 0x2E
btfss STATUS,Z
goto sigue_set1
movf Dato_recibido,w
call DatoUSART_Tx
goto ciclo_set
sigue_set1:
movf Dato_recibido,w
call DatoUSART_Tx
movlw 0x30
bcf STATUS,C
subwf Dato_recibido,w
movwf INDF
incf FSR
movf FSR,w
bcf STATUS,Z
xorlw 0x23
btfsc STATUS,Z
goto limpiar_flag
goto ciclo_set
limpiar_flag:
bcf flagset,0
call CarryRet_USART
call NextLine_USART
bsf PIE1,RCIE
bsf INTCON,T0IE
return
volver: return
Enviar_temp
bsf Control_pin
call Retardo
movlw 0x30
addwf ID,f
movlw 'T'
call DatoUSART_Tx
movlw '#'
call DatoUSART_Tx
movf ID,w
call DatoUSART_Tx
movlw ':'
call DatoUSART_Tx
movlw ' '
call DatoUSART_Tx
movf DIGIT5,w
addlw 0x30
call DatoUSART_Tx
movf DIGIT4,w
addlw 0x30
call DatoUSART_Tx
movlw '.'
call DatoUSART_Tx
movf DIGIT3,w
addlw 0x30
call DatoUSART_Tx
Movlw ' '
call DatoUSART_Tx
Movlw 'C'
call DatoUSART_Tx
bcf Control_pin
return
mensaje_serial:
movlw LOW(Tablaset_point)
movwf Offset_L
movlw HIGH(Tablaset_point)
movwf Offset_H
movf puntero,w
addwf Offset_L,f
btfss STATUS,Z
goto $+3
movlw .1
addwf Offset_H,f
movf Offset_H,w
movwf PCLATH
movf puntero,w
Lcall Tablaset_point
movwf var
movlw 0x00
addwf var
btfsc STATUS,Z
goto salir_mensaje
movf var,w
call DatoUSART_Tx
incf puntero
goto mensaje_serial
salir_mensaje:
return
Tablaset_point:
addwf PCL,f
tablaset: EQU $
DT " Introduzca el set point entre 40 y 90 ",0x00