Autor Tema: Cómo puedo hacer para activar un bit solo mientras envío datos por Tx (serial)?  (Leído 2048 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado jkcobain

  • PIC10
  • *
  • Mensajes: 18
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!!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
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



Desconectado jkcobain

  • PIC10
  • *
  • Mensajes: 18
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.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
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"

Desconectado jkcobain

  • PIC10
  • *
  • Mensajes: 18
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!!!

Desconectado jkcobain

  • PIC10
  • *
  • Mensajes: 18
Ya descargué el manual, sí es INT_TBE. Te agradezco mucho!

Desconectado jkcobain

  • PIC10
  • *
  • Mensajes: 18
No sé si pasé algo por alto, pero no me funcionó. Este es el código:

Código: [Seleccionar]
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:



¿Hice algo mal?

Desconectado jkcobain

  • PIC10
  • *
  • Mensajes: 18
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:

Código: [Seleccionar]
#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í:

Código: [Seleccionar]
#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:


(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 :(


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
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)

Desconectado jkcobain

  • PIC10
  • *
  • Mensajes: 18
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!!  ((:-))

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re:Cómo puedo hacer para activar un bit solo mientras envío datos por Tx (serial)?
« Respuesta #10 en: 08 de Abril de 2016, 15:22:08 »
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. ((:-)) ((:-))
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Cómo puedo hacer para activar un bit solo mientras envío datos por Tx (serial)?
« Respuesta #11 en: 08 de Abril de 2016, 20:05:20 »
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.