Duda sobre PIC's y puertos seriales

#1
Hola, mi duda es la siguiente:

Tengo un PIC que se podria considerar el maestro que manda instrucciones por serial a otros PIC's mas pequeños, todas estas instrucciones se mandan solo por medio de un Tx.

Cuando los PIC's esclavos me quieren mandar informacion esta no me llega. ¿Es necesario poner algo asi como un conmutador?

Aclaro que en la programacion de los PIC's esta definido que ninguno puede mandarme informacion al mismo tiempo, por lo que no hay colisiones.

El diagrama que adjunto es basicamente lo que quiero hacer y con lo que tengo problemas. Las simulaciones las estoy haciendo en PROTEUS.

Agradeceria muchisimo que alguien me pudiera ayudar.

Nota: Utilizo el compilador CCS 4.104
 

Adjuntos

Última edición:
#2
¿En que estado se encuentran los pines TX de los PIC's que no intervienen en la comunicación?... estos deben de estar en alta impedancia para que dejen libre el "bus" de lo contrario el PIC que se intente comunicar con el maestro no podrá establecer niveles lógicos adecuados para transmitir.

Otra cosa, ¿porqué no implementas el sistema por medio del bus I2C? esto eliminaría estos problemas.

Saludos
 
#3
Tambien habia pensado I2C, y no lo descarto, pero de ser posible, me gustaria obtener una solucion a este problema por medio de los puertos seriales.

No estan en alta impedancia, efectivamente marcan 5V, aunque no esten transmitiendo nada, ¿como se dejan en alta impedancia?
 
#4
Daniel Meza,

Estoy usando el compilador C CCS, al iniciar el programa esta la sentencia #use rs232(baud = 16600, parity = N, xmit = PIN_C6,rcv = PIN_C7,bits = 8), lo cual me habilita el pin C6 para transmitir, una vez hecho esto, aunque marque el PIN C6 como una entrada sigue marcando 5 volts, señal de que el pin C6 sigue habilitado como transmisor.

Como se habilitaria el pin para dejarlo en alta impedancia?, o es necesario un circuito externo, o se puede hacer gracias a la misma programacion?

Te agradezco mucho tu respuesta.
 
#5
Hay una funcion en CCS llamada Output_float() que deja el pin indicado como parámetro en alta impedancia. Yo nunca la he utilizado, pero en teoría funciona.

Un saludo
 
#6
No estoy muy enterado en CCS como se logra esto, pero en sí la idea es configurar dicho pin como entrada cuando no se use, de esta manera este pin no establece un nivel bajo ni alto en el bus.
 
#10
Requiero que el pin este siempre en alta impedancia, que solo se active cuando deba transmitir
dentro de la rutina ahy q definir ese pin como salida digital para transmitir datos, una vez que termine de transmitirlos, la misma función (rutina) debe de configurar de nuevo ese pin como entrada para q otro transmisor pueda usar el bus
 
#11
Pongo la sentencia output_float(PIN_C6), que es el pin transmisor Tx, aunque lo ponga en todo el programa, desde que inicia y aun sin entrar en la funcion de transmision el pin permanece en 5V.
 
#14
mmm veamos... ¿antes de utilizar "set_tris_c(0b11111111);" haz configurado el UART?, de ser así puede que haya conflictos en el periférico. Antes de configurar el pin RC6 como entrada, desactiva la UART del PIC que se dejará de comunicar.
Tengo entendido que automáticamente estos pines se configuran como RX/TX cuando se habilita la UART; deshabilitándola estos pines quedan como puertos E/S normales
 
#15
Si, justo al principio del programa antes de la funcion void main() esta declarada la sentencia #use rs232(baud = 16600, parity = N, xmit = PIN_C6,rcv = PIN_C7,bits = 8). La he intentado poner cuando se va a iniciar la comunicacion, pero me marca error, me dice que no puedo utilizar la sentencia #use dentro del void main(). ¿Hay alguna otra forma de configurar el puerto serial?
 
#16
intenta configurando los registros que intervienen en la comunicación serial dentro del "void", supongo a de ser semejante a cuando se confguran los puertos:

SSPCON=xxx;
SSPSTAT=xxx;

de tal forma que puedas modificar estos registros dentro del cuerpo del programa
 
#17
Tenia un error al utilizar la sentencia #use RS232, si se puede poner en cualquier parte del programa siempre y cuando vaya despues de #use delay(clock = xxxxx), aun asi, lo ponga donde lo ponga los puertos se inicializan desde el principio como Tx y Rx.

Intentare con los registros propios del PIC como me recomiendas, muchas gracias.
 

Temas similares

Arriba