Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

24/06/2012 #1


Duda sobre PIC's y puertos seriales
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
24/06/2012 #2

Avatar de Daniel Meza

¿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
24/06/2012 #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?
24/06/2012 #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.
24/06/2012 #5

Avatar de arrivaellobo

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
24/06/2012 #6

Avatar de Daniel Meza

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.
24/06/2012 #7


arrivaellobo, ya intente con la funcion output_float(), la pongo al entrar en void_main(), aun asi el pin Tx sigue transmitiendo 5V.
24/06/2012 #8

Avatar de arrivaellobo

Entonces prueba, cuando quieras ponerlo en alta impedancia, configura ese pin como entrada.
24/06/2012 #9


Requiero que el pin este siempre en alta impedancia, que solo se active cuando deba transmitir.
24/06/2012 #10

Avatar de Daniel Meza

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
24/06/2012 #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.
24/06/2012 #12

Avatar de Daniel Meza

Y si en lugar de eso intentas con TRISC=X1XXXXXX; o no se la sintaxis en C para configurar como entrada ese pin cuando no se utilice
24/06/2012 #13


Lo acabo de intentar, set_tris_c(0b11111111); para que ponga todas las entradas del puerto c como entradas, las habilita todas como entradas, excepto el Tx.
24/06/2012 #14

Avatar de Daniel Meza

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
24/06/2012 #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?
24/06/2012 #16

Avatar de Daniel Meza

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
24/06/2012 #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.
24/06/2012 #18

Avatar de Daniel Meza

Desventajas de programar en lenguajes de alto nivel... intenta eso y haber que pasa... si no, siempre está la opción de incluir porciónes de ASM en C
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.