TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: kapotik en 05 de Octubre de 2016, 05:05:16
-
Buenas, estoy intentando comunicar 4 pic 16F877a por serial, la idea es el 1° recibe el dato desde la PC lo interpreta y si no es para el lo retransmite al 2°, este lo analiza y si no es para el lo retransmite al 3°, este lo analiza y si no es para el lo retransmite al 4°, el problema que tengo es que luego de pasar por el 1° pic los datos del 2° en adelante aveces llegan y otras no, llegando basura, ya chequee cada codigo individualmente con el pic en una placa de prueba y retransmite los datos correctamente, pero cuando los pongo en cadena no funciona.
Es decir si coloco el 1° pic con cualquiera de los otros anda,
(https://image.jimcdn.com/app/cms/image/transf/dimension=1920x400:format=jpg/path/s428e7d2c50f54516/image/i9d9f5d5ab1c10111/version/1475653848/image.jpg)
pero si le agrego otro ya no funciona se pierden los datos.
(https://image.jimcdn.com/app/cms/image/transf/dimension=1920x400:format=jpg/path/s428e7d2c50f54516/image/i2fc1c26428341089/version/1475653871/image.jpg)
este es el codigo de retransmicion del 1° pic, quisiera saber si esta bien hecho o no
interrup
btfss PIR1,RCIF ;Ha sido interrupción en la recepción ??
retfie ;No, falsa interrupción
bcf PIR1,RCIF ;Si, restaurar el flag de interrupción
call recibeRS232 ; sí, hay
movwf dato_serie ; guarda dato (para uso de cualquier rutina)
goto testeanumero ; llama rutina para testear clave
;***********************************************************************************
; CHEQUEA QUE PIC ES
;***********************************************************************************
testeanumero
movf dato_serie,w ; Guarda el contenido de la tecla pulsada.
xorlw digito_1 ; ¿Es el pic 1?
btfsc STATUS,Z
goto pic_1 ; Sí, se procede a chequear el puerto
movf dato_serie,W ; Recupera el contenido de la tecla pulsada.
xorlw digito_2 ; ¿Es el pic 2?
btfsc STATUS,Z
goto pic_2 ; Sí, se reemvian datos al pic 2
movf dato_serie,W ; Recupera el contenido de la tecla pulsada.
xorlw digito_3 ; ¿Es es el pic 3?
btfsc STATUS,Z
goto pic_2 ; Sí, se reemvian datos al pic 3
movf dato_serie,W ; Recupera el contenido de la tecla pulsada.
xorlw digito_4 ; ¿Es tecla del movimiento hacia la derecha?
btfsc STATUS,Z
goto pic_2 ; Sí, se reemvian datos al pic 4
retfie
retransmicion, la cadena que recibe y retransmite es de 4 digitos por ej. 2A0Q
pic_2
movf dato_serie,W ; Recupera el contenido de la tecla pulsada
call enviaRS232 ; Lo retransmite a modo de eco
movf RCREG,W ; Borra el buffer
ler1 btfss PIR1,RCIF ; (5) se fija si hay dato RS232
goto ler1 ; no, no llegó
call recibeRS232 ; sí, hay
movwf dato_serie ; Guarda el contenido de la tecla pulsada.
call enviaRS232 ; Lo retransmite a modo de eco
movf RCREG,W ; Borra el buffer
ler2 btfss PIR1,RCIF ; (5) se fija si hay dato RS232
goto ler2 ; no, no llegó
call recibeRS232 ; sí, hay
movwf dato_serie ; Guarda el contenido de la tecla pulsada.
call enviaRS232 ; Lo retransmite a modo de eco
movf RCREG,W ; Borra el buffer
ler3 btfss PIR1,RCIF ; (5) se fija si hay dato RS232
goto ler3 ; no, no llegó
call recibeRS232 ; sí, hay
movwf dato_serie ; Guarda el contenido de la tecla pulsada.
call enviaRS232 ; Lo retransmite a modo de eco
retfie
y lo mismo para el resto de los pic, la velocidad de transmicion es de 9600 8 bits sin paridad.
Gracias
-
De aca veo ya que a la interrupcion le faltan instrucciones que son las de guardar y luego volver los datos a STATUS, W (y PCLATH si usas).
Mirando el codigo, no se que es recibeRS232. Tampoco por que limpias el flag de esa manera, el flag se limpia solo al quitar el dato de RCREG. El GOTO al final de interrupt no tiene sentido si esta ubicado como lo tenes.
Me parece a mi, o solo verificas un caracter y luego si no corresponde lo envias?, es decir solo estas verificando 1 solo. Y no un comienzo de trama.
Por que preguntas por cada PIC?, todos los PICs deberian tener el mismo codigo. No es del PIC? listo, se va, no le interesa si es del 3ro o 4to. Al menos por lo que comentas.
-
Hola, yo no pondría los PIC a retransmitir, el TX del PC lo llevaría simultáneamente a los 4 PIC y el PC envía una dirección correspondiente al PIC que le quiera transmitir, como funciona un I2C.
Saludos
-
De aca veo ya que a la interrupcion le faltan instrucciones que son las de guardar y luego volver los datos a STATUS, W (y PCLATH si usas).
El GOTO al final de interrupt no tiene sentido si esta ubicado como lo tenes.
Mirando el codigo, no se que es recibeRS232
Solo coloque un fragmento del codigo, a lo que haces mencion si esta hecho en otro lado.
Tampoco por que limpias el flag de esa manera, el flag se limpia solo al quitar el dato de RCREG.
cual seria la manera correcta?
Me parece a mi, o solo verificas un caracter y luego si no corresponde lo envias?, es decir solo estas verificando 1 solo. Y no un comienzo de trama.
Por que preguntas por cada PIC?, todos los PICs deberian tener el mismo codigo. No es del PIC? listo, se va, no le interesa si es del 3ro o 4to. Al menos por lo que comentas.
si tenes razón lo voy a modificar.
Killer, me queda la duda si para retransmitir se puede hacer de otra manera, tal vez una en donde se envie el dato de una sola vez y no como yo lo hago chequeando caracter por caracter.
Saludos
-
Hola, yo no pondría los PIC a retransmitir, el TX del PC lo llevaría simultáneamente a los 4 PIC y el PC envía una dirección correspondiente al PIC que le quiera transmitir, como funciona un I2C.
Saludos
simplemente uno todos lo RX de los PIC? o hay que hacerlo mediante alguna circuiteria?
Saludos
-
Solo coloque un fragmento del codigo, a lo que haces mencion si esta hecho en otro lado.
A lo que hago mencion sobre que falta lo de guardar W y STATUS y luego volverlo a su lugar al momento de salir no esta aplicado. Puedo verlo facilmente al ver RETFIE dentro de tu codigo, donde saldria directamente y no recuperarias W y STATUS.
Pienso tambien que lo que dijo Diego es lo correcto si solo pensas recibir desde los PICs
-
Pienso tambien que lo que dijo Diego es lo correcto si solo pensas recibir desde los PICs
como lo implemento electronicamente
-
La salida TTL conectala a los demas PICs, empeza probando con 2, luego con 3, y si no le da a la salida del conversor RS232-TTL entonces imagino que deberas poner un buffer. Pero no creo que tengas problema en una placa asi. Deberias poder conectarlas directamente, acordate que las entradas son una alta impedancia, lo que mas puede perjudicar es la capacidad de las mismas y que tambien va a depender de la velocidad que se envie, pero eso para cuando la salida ya no pueda manejarlas.