TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: jkcobain en 07 de Abril de 2016, 21:38:32
-
Hola a todos, por favor necesito de su ayuda. Soy novato programando y no consigo hacer esto. Quiero comunicar por medio de RS485, pero no sé cómo hacer para controlar los bits RE/DE (puenteados), ya que para evitar tener bits perdidos necesito asegurarme de que ya se enviaron todos los bytes, antes de cambiar el estado de transmisor a receptor. ¡Por favor ayuda! :(
Uso PIC16f887, y compilo con CCS. Mi programa está escrito como para RS232. He leído que la librería RS485 que trae el CCS, no funciona para cualquier dispositivo, así que no tengo pensado usarla. Solo tenía pensado dejarlo como RS232 y agregar una salida para el bit RE/DE. ¡Pero no sé cómo hacerlo!
¡¡Agradeceré inmensamente cualquier ayuda!!
-
Depende que pensas hacer. O como lo queres hacer. O como pensas enviar los datos. Si necesitas que sea una funcion bloqueante o no, etc
Activo RE/DE
Envio todo lo que tenga que enviar por UART
Borro Flag de transmision
Espero a Flag de transmision este en 1
Desactivo RE/DE
-
Bueeeno, eso es bastante obvio. El problema no es que no sepa qué hacer, el problema es que no sé como hacer eso en el ccs.
Igual agradezco tu intención.
-
Mirando el manual cada una de las lineas que puse ahi tiene su correspondiente funcion
output_high o low (PIN_RE/DE);
printf("Envio")
clear_interrupt(INT_TX); // Realmente no se como es el flag de transmision, creo que es INT_TBE, Limpio mientras se envia el ultimo caracter
while(!interrupt_active(INT_TX)); // Espero que se vacie el buffer de transmision antes de desactivar RE/DE
output_low o high ( PIN_RE/DE);
Si no tenes el manual, buscalo en google con "CCS Manual"
-
Mirando el manual cada una de las lineas que puse ahi tiene su correspondiente funcion
output_high o low (PIN_RE/DE);
printf("Envio")
clear_interrupt(INT_TX); // Realmente no se como es el flag de transmision, creo que es INT_TBE, Limpio mientras se envia el ultimo caracter
while(!interrupt_active(INT_TX)); // Espero que se vacie el buffer de transmision antes de desactivar RE/DE
output_low o high ( PIN_RE/DE);
Si no tenes el manual, buscalo en google con "CCS Manual"
Ok! Eso es de gran ayuda, lo voy a probar. Muchísimas gracias, de verdad!!!
-
Ya descargué el manual, sí es INT_TBE. Te agradezco mucho!
-
No sé si pasé algo por alto, pero no me funcionó. Este es el código:
DERE=1;
printf("dato");
clear_interrupt(INT_TBE);
while(!interrupt_active(INT_TBE)){ //También probé tu syntaxis de while();
}
DERE=0;
Esta es la simulación:
(http://www.todopic.com.ar/foros/imgtiny/24on50z.png)
¿Hice algo mal?
-
Pasó algo interesante, seguí leyendo el manual, y aparentemente ya quedó solucionado. Pero me preocupa que me pueda dar fallas ya físicamente, ya que no lo solucioné a propósito.
En mi anterior comentario tenía configurado esto:
#USE RS232(baud=9600, parity=N, bits=8, xmit=PIN_C6, rcv=PIN_C7)
Después en el manual vi que está la opción de tener un pin para "ENABLE", y quise probarlo. Así que quedó así:
#USE RS232(baud=9600, parity=N, bits=8, xmit=PIN_C6, rcv=PIN_C7,ENABLE=PIN_C2)
No moví NINGUNA otra cosa, y ahora el resultado fue este:
(http://www.todopic.com.ar/foros/imgtiny/t03j95.png)
(La azul, es del método que tú me dijiste. La rosa es del ENABLE en el #USE RS232)
¿Crees(n) que tenga errores ya instalado?, el problema es que no lo puedo probar, porque no tengo osciloscopio real :(
-
No, no vas a tener errores al menos no para el RS485.
Solo tenes que tenerlo en cuenta en algunos integrados que usan SPI por ejemplo y que podes llegar a tener problemas por eso. Hay veces que debes enviar 2 byte y si el CS se pone en bajo lo toma como si fuera el comienzo. Pero eso es para SPI, para lo que necesitas vos te va a funcionar bien.
Yo no pense que tenia CCS algo asi. Ya que normalmente el unico que tiene manejo de CS por hardware es el SPI, y ese manejo que estas viendo es por software. ( Ya que la UART no posee salida CS por hardware)
-
No, no vas a tener errores al menos no para el RS485.
Solo tenes que tenerlo en cuenta en algunos integrados que usan SPI por ejemplo y que podes llegar a tener problemas por eso. Hay veces que debes enviar 2 byte y si el CS se pone en bajo lo toma como si fuera el comienzo. Pero eso es para SPI, para lo que necesitas vos te va a funcionar bien.
Yo no pense que tenia CCS algo asi. Ya que normalmente el unico que tiene manejo de CS por hardware es el SPI, y ese manejo que estas viendo es por software. ( Ya que la UART no posee salida CS por hardware)
Me basé en tu respuesta y lo monté en protoboard. Funciona perfecto. ¡¡Te agradezco infinitamente!! ((:-))
-
No, no vas a tener errores al menos no para el RS485.
Solo tenes que tenerlo en cuenta en algunos integrados que usan SPI por ejemplo y que podes llegar a tener problemas por eso. Hay veces que debes enviar 2 byte y si el CS se pone en bajo lo toma como si fuera el comienzo. Pero eso es para SPI, para lo que necesitas vos te va a funcionar bien.
Yo no pense que tenia CCS algo asi. Ya que normalmente el unico que tiene manejo de CS por hardware es el SPI, y ese manejo que estas viendo es por software. ( Ya que la UART no posee salida CS por hardware)
Para el SPI, CCS contempla poder enviar mas de 8 bits, usando SPI_XFER.
Buscalo y lee y veras la magia en eso tambien, je..je. ((:-)) ((:-))
-
Para el SPI, CCS contempla poder enviar mas de 8 bits, usando SPI_XFER.
Buscalo y lee y veras la magia en eso tambien, je..je. ((:-)) ((:-))
Es otra que no sabia. Encima en el manual no dice nada de que al CS lo aguanta hasta enviar todo. Y si o si lo debe hacer por software. Bueno una cosa mas aprendida por si alguno pregunta por aca.