desktop

Utilizar segundo puerto serie PIC con CCS

Necesito utilizar simultaneamente dos puertos serie en un PIC18F452.
Estoy utilizando el compilador CCS (escribo en C), integrado al MPLAB.
He utilizado un solo puerto serie sin problemas con las directiva:
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7)
y la funcion printf()

Alguien sabe como utilizar simultaneamente dos puertos serie?
 
Saludos Ad34.

Para implementar mas de un puerto serial debes de utilizar los streams.

Ejemplo para declarar 2 puertos.

#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7, stream=COM1)
#use rs232(baud=19200, xmit=PIN_B1, rcv=PIN_B0, stream=COM2)

void main()
{
printf( COM1, "Hola COM1\n" ); // Envia mensaje por serial COM1
printf( COM2, "Hola COM2\n" ); // Envia mensaje por serial COM2
}



NOTA.
El COM1 por ser C6 y C7 es un puerto Hardware con interrupcion.
El COM2 es un puerto software, si quieres interrupcion al recibir un caracter, debes de utilizar la interrupcion Externa en B0 (INT0) para detectar el start_bit de un caracter entrante.

Suerte..
 
Tengo un pic conectado por usb al Pc y necesito conectarme tambien via 232.
No consigo que transmita por 232

#include <18F2550.h> // Definición de registros internos.
#DEVICE ADC=10 // CAD con 10 bits de resolución , justificación a la derecha.
#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48000000) // Frecuencia máxima de trabajo 48 Mhz.
short estado_usb; // boolean global, se debe declarar antes de llamar a usb_cdc.h
#define USB_CON_SENSE_PIN PIN_E3 // Definiendo este pin , detectamos si el host está conectado o no por hardware.
#include "usb_cdc.h" // Descripción de funciones del USB.
#include "usb_desc_cdc.h" // Descriptores del dispositivo USB.
//#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)// RS232 Estándar
#use rs232(baud=115200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=COM3)//,enable=PIN_C5)

Alguien sabe el motivo de no transmitir 232??
Gracias
 
Bueno yo estoy tratando de convertir 2 pines del pic(cualquiera) en algo parecido al puerto serie, tengo el problema de que no me funciona bien RTOS, es decir lo que estoy haciendo es montar un hilo para cada puerto que deseo establecer; si alguien me puede echar una mano sera de bastante utilidad.
 
el nombre has intentado definir el stream COM1 para el puerto RS232 lo que veo en tu programa es que no esta esa declaracion y puede ser que de ahi venga el conflicto.

ademas estas usando los mismos pines para Xmit y RCV para las dos transmisiones

//#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)// RS232 Estándar
#use rs232(baud=115200,parity=N,xmit=PIN_C6,rcv=PIN_C7, bits=8,stream=COM3)//,enable=PIN_C5)

saludos y espero sirva
 
Última edición:
hola que tal

apenas empiezo a programar pic en CCS y deseo cambiar los pines de transmisión de un pic16f877a ya que el pin C6 en el tx del pic y el C7 es el rx del pic pero cuando quiero utilizar otros pines como rx y tx no hace ninguna acción cuando lo simulo en proteus,el programa lo que hace es recibir un 1 para encender un led y un 0 todo va bien cuando pongo los pin que el Pic marca como rx y tx pero cuando los cambio ya no realiza nada, por ejemplo si quiero que los datos se reciban y se transmitan por el puerto D declarando xmit=pin_d0 y rcv=pin_d1, dejo el código del programa para ver si me pueden ayudar y ver que se necesita modificar en el codigo, gracias saludos. =)

#include <16F877A.h>
#device adc=10
#fuses XT,WDT,NOPROTECT,NOLVP,NOPUT,NOBROWNOUT,NOCPD,NODE BUG,NOWRT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_d0, rcv=pin_d1, bits=8, parity=N)
#use standard_io(B)

char valor;

#int_rda

void serial_isr()
{
valor=getchar();
}

void main()
{
enable_interrupts(global);
enable_interrupts(int_rda);

for( ;; ) //bucle sin fin
{
if(valor=='1')
output_high(pin_b0);

else
output_low(pin_b0);
}
}
 
Saludos Ad34.

Para implementar mas de un puerto serial debes de utilizar los streams.

Ejemplo para declarar 2 puertos.

#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7, stream=COM1)
#use rs232(baud=19200, xmit=PIN_B1, rcv=PIN_B0, stream=COM2)

void main()
{
printf( COM1, "Hola COM1\n" ); // Envia mensaje por serial COM1
printf( COM2, "Hola COM2\n" ); // Envia mensaje por serial COM2
}



NOTA.
El COM1 por ser C6 y C7 es un puerto Hardware con interrupcion.
El COM2 es un puerto software, si quieres interrupcion al recibir un caracter, debes de utilizar la interrupcion Externa en B0 (INT0) para detectar el start_bit de un caracter entrante.

Suerte..

Hola gracias por este aporte
Yo tengo esta situacion y puedo implementar el COM2 por software pero tengo usado el INT0 de RB0 como SDA con el reloj DS1307 en la comunicacion I2C. La pregunta es ¿que me recomiendan para generar la subrutina de interrupción de los datos que llegan por el COM2?

Saludos !!!
 
Código:
#include <16F18856.h>
#FUSES RSTOSC_HFINTRC_32mhz           //internal clock

#use delay(internal=32000000)
#PIN_SELECT U1RX=PIN_C7
#PIN_SELECT U1TX=PIN_C6
#use rs232(baud=9600,parity=N,UART1,bits=8,stream=PORT1,errors)
//UART2
#define radar_Tx   PIN_C0     
#define radar_Rx   PIN_B0     
#use rs232(baud=9600, xmit=radar_Tx, rcv=radar_Rx, force_SW, stream = radar)
   int1 rxB=false;
char rxChar,rxChar2;

#int_EXT   
void uart2_isr(void)
{
   rxChar2=fgetc(radar);
  
   switch(rxChar2)
   {
      case '$' ://inicio de trama
      break;     
      
      case 0x0d : //final de trama
      break;
      default:
   }
}

#int_RDA
void serial_isr()
{
   rxChar=getchar();
   contRx++;
  
   switch(rxChar)
   {
    case '$' ://inicio de trama
      break;     
      
      case 0x0d : //final de trama
      break;
      default:
}
}

  void main()
  {
     PORTA=0X00;
     PORTB=0X00;
     PORTC=0X00;
     ANSELA=0;
     ANSELB=0;
     set_tris_a(0b00000000);
     set_tris_b(0b00000001);//B0=rx del radar
     set_tris_c(0b10100000);//C5=bluetooth testigo in
    
     enable_interrupts(int_RDA);
     ext_int_edge(h_to_l);//para usar con uart2
     enable_interrupts(int_EXT);
     enable_interrupts(GLOBAL);
while(){


}
}


por si a alguien le sirve
 
Atrás
Arriba