Autor Tema: 4 puertos UART en un solo PIC, es posible?  (Leído 3988 veces)

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

Desconectado rafaelrg06

  • PIC12
  • **
  • Mensajes: 54
4 puertos UART en un solo PIC, es posible?
« en: 15 de Diciembre de 2015, 19:28:45 »
Hola amigos del foro:
Necesito conectar 4 dispositivos con comunicación serie que trabajen de manera simultánea usando la comunicación serie. ¿Es posible conectar físicamente a los 4 y ponerlos a funcionar, digamos por software (usando los comandos ordinarios de la librería “USE RS232” y “USE DELAY”)?
El PIC que tengo es un 18f4523, y que yo sepa tiene un módulo UART por hardware, pero en realidad necesito conectar 3 “canales” más para controlar un total de 4 dispositivos, y según he leído, la comunicación serie se puede lograr también por software. Por lo que en total necesitaría 8 líneas de este PIC (que tiene 40 pines en total, lo que no es un problema), el asunto es ¿se puede hacer esto?, y una idea de cómo hacerlo.
Por favor, si alguien conoce algo de esto, por favor, ayuda.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:4 puertos UART en un solo PIC, es posible?
« Respuesta #1 en: 15 de Diciembre de 2015, 20:14:32 »
Depende... antes de SI o SI elegir la UART.. fijate los demas.

La UART podes usarla con un transceiver para RS485 para cada PIC, lo que te queda es implementar un "protocolo" para poder enviar y recibir mensajes sin que colisionen los datos., el bus seria de 2 cables

SPI, podes hacer lo mismo , es decir implmentar este protocolo, y ademas usar 1 pin para habilitar o decir a quien te comunicas. tendrias data clock y 1 cable para cada uno de los micros. es decir 5 "lineas"

I2C, el protocolo esta realizado, y seleccionas a los demas PICs con una direccion. Permite comunicarse con todos con 2 cables ( caminitos etc. )

Creo que va a depender mas que nada de la velocidad que necesites, distancia, ruido que exista. Si haces lo que pienso vas a tener 3 UART por software, que van a servir para "transmitir" pero no para recibir. Al menos no creo que CCS lo implmente con timers/interrupciones en los puertos para una UART por soft.
Si usas I2C creo que seria lo mejor, si es que te da la velocidad, por que de esa forma dejas libre el micro.

Obviamente vas a tener que buscar ejemplos, no uso CCS

Desconectado rafaelrg06

  • PIC12
  • **
  • Mensajes: 54
Re:4 puertos UART en un solo PIC, es posible?
« Respuesta #2 en: 16 de Diciembre de 2015, 16:04:55 »
Hola:
Uso CCS, se me olvidó anteriormente.
Por lo que veo tengo que usar UART por software. el asunto es que no consigo hacer funcionar el uart por software ¿alguien podría ayudarme?

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:4 puertos UART en un solo PIC, es posible?
« Respuesta #3 en: 16 de Diciembre de 2015, 17:05:22 »
Que tal rafael,

Sube tu código para echarle un vistazo, de lo contrario estamos a ciegas.

elreypic.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5552
    • Picmania by Redraven
Re:4 puertos UART en un solo PIC, es posible?
« Respuesta #4 en: 16 de Diciembre de 2015, 17:06:03 »
Deberías ponernos lo que has hecho hasta ahora, cómo has configurado los distintos #USE RS232 y así podremos ver qué puede estar mal  :mrgreen:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado rafaelrg06

  • PIC12
  • **
  • Mensajes: 54
Re:4 puertos UART en un solo PIC, es posible?
« Respuesta #5 en: 16 de Diciembre de 2015, 18:55:12 »
Muy bien, este es el código, y es para mover 4 drivers de motores series de la marca pololu:
lo que hice fue una función que tuviera las configuraciones de los distintos canales, con la idea de que, cuando vaya a trabajar sobre un canal específico, llamar a la función, configurar adecuadamente el rs232 (1 canal por hardware y los otros 3 por software) e inmediatamente enviar los datos necesarios. Pero eso no me funciona al menos en el proteus y temo hacerlo en realidad sea que dañe el micro.

#include <18f4523.h>

#fuses INTRC_IO //Oscilador interno, sin CLKOUT
#fuses NOFCMEN //Desabilitado el modo de fallo de reloj
#fuses NOIESO   //Modo de conmutacion interna - externa desabilitado
#fuses PUT //Power Up Timer habilitado
#fuses BROWNOUT_NOSL //Brownout habilitado normal
#fuses BROWNOUT   //Brownout habilitado
#fuses BORV21   //Brownout con 2.1 V
#fuses NOPBADEN
//#fuses NOLPT10OSC   //Timer 1 funcionando en modo normal
#fuses MCLR //Pin Master Clear usado como Master Clear
#fuses NOSTVREN //El Stack no causa reset
#fuses NOLVP //Programación con alto voltaje
#fuses NOXINST //Modo legacy - de compatibilidad
#fuses NODEBUG //Modo debug desabilitado
#fuses NOPROTECT //Memoria de programa desprotegida
#fuses NOCPB //Memoria de arranque (boot) desprotegida
#fuses NOCPD // Memoria EEPROM desprotegida
#fuses NOWRT   //Memoria de programa desprotegida
#fuses NOWRTC   //Memoria de programa desprotegida (registros de configuración)
#fuses NOWRTB   //Memoria de programa desprotegida (boot)
#fuses NOWRTD   //Memoria de programa desprotegida (eeprom)
#fuses NOEBTR   //Memoria de programa desprotegida
#fuses NOEBTRB   //Memoria de programa desprotegida (boot)
#fuses NOWDT //Watchdog desconectado

//#use delay (clock=4000000)
#use delay (clock=4000000)
//#use RS232(baud=9600, xmit=PIN_C6, rcv=PIN_C5, bits=8)
//#use RS232(baud=9600, xmit=PIN_C5, rcv=PIN_C4, bits=8, force_sw)

//BLOQUE DE DECLARACIÓN DE FUNCIONES
void config_rs232(int canal)
{
   switch(canal)
   {
   case(1):
      #use RS232(baud=9600, xmit=PIN_C7, rcv=PIN_C6, bits=8)
      break;
   case(2):
      #use RS232(baud=9600, xmit=PIN_C5, rcv=PIN_C4, bits=8, force_sw)
      break;
   case(3):
      #use RS232(baud=9600, xmit=PIN_C3, rcv=PIN_C2, bits=8, force_sw)
      break;
   case(4):
      #use RS232(baud=9600, xmit=PIN_C1, rcv=PIN_C0, bits=8, force_sw)
      break;
   }//Cierre del switch
}


void main()
{
config_rs232(1);//configuraci'on para que funcione el canal 1
//#use RS232(baud=9600, xmit=PIN_C5, rcv=PIN_C4, bits=8, force_sw)

delay_ms(5); //espera de 5 ms para que el controlador "despierte"

   while(true)
   {
   //Arrancar e ir adelante
   puts("131");//exitsafestart
   puts("3200");//
   delay_ms(1000); //Espera de 1 segundo
   puts("131");//exitsafestart
   puts("0");//
   delay_ms(1000); //Espera de 1 segundo
   puts("131");//exitsafestart
   puts("-3200");//Dirección del motor
   delay_ms(1000); //Espera de 1 segundo
   puts("131");//exitsafestart
   puts("0");//
   delay_ms(1000); //Espera de 1 segundo
   }//Cierre del while
}//Cierre del main

Desconectado allennet

  • PIC16
  • ***
  • Mensajes: 112
Re:4 puertos UART en un solo PIC, es posible?
« Respuesta #6 en: 16 de Diciembre de 2015, 21:07:38 »
hola
creo que lo implementas mal deberia ser asi

Código: [Seleccionar]
#USE RS232 (BAUD=9600, XMIT=PIN_B0,RCV=PIN_B1, STREAM=COM_A)
#USE RS232 (BAUD=9600, XMIT=PIN_B2,RCV=PIN_B3, STREAM=COM_B)
void main(void)
{   
char c;   
fprintf(COM_A, "Online\n\r");   
fprintf(COM_B, "Online\n\r");   
while(TRUE)
{       
c = fgetc(COM_A);
fputc(c, COM_A);       
fputc(c, COM_B);   
}
}


ese pic tiene dos por hadware el que usas agregas force_sw
https://www.ccsinfo.com/faq.php?page=multiple_rs232
« Última modificación: 16 de Diciembre de 2015, 21:18:02 por allennet »
"La curiosidad mato al gato, pero murio sabiendo"

Desconectado rafaelrg06

  • PIC12
  • **
  • Mensajes: 54
Re:4 puertos UART en un solo PIC, es posible?
« Respuesta #7 en: 17 de Diciembre de 2015, 16:19:40 »
Bueno amigos del foro:
Ya funcionan perfectamente los 4 UART en un solo PIC. Muchas gracias a todos los que me ayudaron en este asunto.

AL final les dejo el código que usé (en prueba y funciona perfectamente):

#use delay (clock=4000000)

//BLOQUE DE DECLARACIÓN DE FUNCIONES
#USE RS232 (BAUD=9600, XMIT=PIN_C6,RCV=PIN_C7, bits=8)
void put_to_canal_1(char a) {
   putc(a);
}

#USE RS232 (BAUD=9600, XMIT=PIN_C4,RCV=PIN_C5, bits=8)

void put_to_canal_2(char b) {
   putc(b);
}

#USE RS232 (BAUD=9600, XMIT=PIN_C2,RCV=PIN_C3, bits=8)

void put_to_canal_3(char c) {
   putc(c);
}

#USE RS232 (BAUD=9600, XMIT=PIN_C0,RCV=PIN_C1, bits=8)

void put_to_canal_4(char d) {
   putc(d);
}

void main()
{
 put_to_canal_1("Canal 1\n\r");
 put_to_canal_2("Canal 2\n\r");
 put_to_canal_3("Canal 3\n\r");
 put_to_canal_4("Canal 4\n\r");
}

Desconectado rafaelrg06

  • PIC12
  • **
  • Mensajes: 54
Resuelto:4 puertos UART en un solo PIC, es posible?
« Respuesta #8 en: 17 de Diciembre de 2015, 16:24:36 »
Bueno amigos del foro:
Ya funcionan perfectamente los 4 UART en un solo PIC. Muchas gracias a todos los que me ayudaron en este asunto.

AL final les dejo el código que usé (en prueba y funciona perfectamente):

#use delay (clock=4000000)

//BLOQUE DE DECLARACIÓN DE FUNCIONES
#USE RS232 (BAUD=9600, XMIT=PIN_C6,RCV=PIN_C7, bits=8)
void put_to_canal_1(char a) {
   putc(a);
}

#USE RS232 (BAUD=9600, XMIT=PIN_C4,RCV=PIN_C5, bits=8)

void put_to_canal_2(char b) {
   putc(b);
}

#USE RS232 (BAUD=9600, XMIT=PIN_C2,RCV=PIN_C3, bits=8)

void put_to_canal_3(char c) {
   putc(c);
}

#USE RS232 (BAUD=9600, XMIT=PIN_C0,RCV=PIN_C1, bits=8)

void put_to_canal_4(char d) {
   putc(d);
}

void main()
{
 put_to_canal_1("Canal 1\n\r");
 put_to_canal_2("Canal 2\n\r");
 put_to_canal_3("Canal 3\n\r");
 put_to_canal_4("Canal 4\n\r");
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:4 puertos UART en un solo PIC, es posible?
« Respuesta #9 en: 17 de Diciembre de 2015, 18:32:26 »
El tema es que "funciona" para transmitir, pero para recibir con 2 UART por soft.. seguro que vas a tener problemas. Asi que si solo transmitis no hagas caso a esta advertencia.