Autor Tema: Usando dos puertos RS232 con el Pic18F25K80 (CCS)  (Leído 9088 veces)

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

Desconectado dogflu66

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3549
Usando dos puertos RS232 con el Pic18F25K80 (CCS)
« en: 10 de Julio de 2014, 05:58:35 »
He montado dos puertos RS232 con el Pic18F25K80, el uart1 me funciona correctamente pero el dos me está dando problemas, si le envío datos por el teclado va OK,  si le envío un archivo pierde datos. También me están dando problema la interrupción de este ultimo modulo.

Si alguien tiene experiencia con el tema le agradecería algún consejo.

Cuando llegue a casa pego el pequeño código de configuración que he realizado en CCS.
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
« Respuesta #1 en: 10 de Julio de 2014, 10:22:03 »
El código:

Código: [Seleccionar]
//PIC18F25K80
#include <main.h>

void main()
{
setup_oscillator(OSC_16MHZ);

   _SetUpPic18F25k80();
   #use rs232(uart1, baud=4800, TIMEOUT=1, XMIT = PIN_C6, RCV = PIN_C7, STREAM = PORT1)
   #use rs232(uart2, baud=4800, TIMEOUT=1, XMIT = PIN_B6, RCV= PIN_B7, STREAM = PORT2)

   //Establece las interrupciones
   //Enable_interrupts(GLOBAL);  //'Permite las interrupciones generales y las de perifericos
   //Enable_interrupts(INT_TIMER1);  //'Permite las interrupciones del TMR1  
   //Enable_interrupts(INT_RDA);
   //Enable_interrupts(INT_RDA2);
   //PIE3_RCIE = 1; // Interrupcion Uart

   while(TRUE)
   {
      If (KBHIT(PORT1)) Fputc(fgetc(port1), PORT1);
      If (KBHIT(PORT2)) Fputc(fgetc(port2), PORT2);
   }

}
//*****************************************************************************
#int_RDA //Interrupción Uart
   Void uart_interrupcion(Void){
      //_RingBuffer(0);
   }
//*****************************************************************************
#int_RDA2 //Interrupción Uart
   Void uart_interrupcion2(Void){
   //_RingBuffer2(0);
   }
//*****************************************************************************
« Última modificación: 10 de Julio de 2014, 21:32:41 por dogflu66 »
Saludos desde Granada, España.

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
« Respuesta #2 en: 10 de Julio de 2014, 11:59:28 »
hola dogflu a mi tampoco me funcionaba bien   las dos uart pero en un pic24, resulto siendo un tema en el orden de las sentencias de código, que hay en main.h y en la funcion setup
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
« Respuesta #3 en: 10 de Julio de 2014, 13:41:44 »
Al usar UART1 y UART2 dentro del Use-RS232() no necesitas declarar que pines utilizas, ya que toma los de hardware, alli hay una posible causa para que o funcione OK.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado dogflu66

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
« Respuesta #4 en: 10 de Julio de 2014, 14:15:00 »
Creo que probé sin declarar los pin, de todas formas lo probare de nuevo, pero no es que no funcionen, la UART1 funciona perfecto con y sin interrupciones, el problema lo tengo en la UART2, funciona pero no va como la otra, va lenta y me fallan las interrupciones. Por eso es lo de peguntar, porque ya he padecido algún bug del CCS.
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
« Respuesta #5 en: 10 de Julio de 2014, 19:47:31 »
No hay manera, el usar1 funciona el usar2 no funciona.
He programado los registros a mano de los modulos y uno funciona y el otro no.

Código: [Seleccionar]
//Practicas con dos puertos RS232
//PIC18F25K80
#include <main.h>
//Registros usart1
#BYTE SPBRG1 = 0xFAF
#BYTE BAUDCON1 = 0xFA7
#BYTE TXSTA1 = 0xFAC
#BYTE RCSTA1 = 0xFAB

#BYTE TXREG1 = 0xFAD
#BYTE RCREG1 = 0XFAE
#BYTE PIR1 = 0xF9E
#BIT PIR1_RC1IF = PIR1.5
//Registros usart2
#BYTE SPBRG2 = 0xF7B
#BYTE BAUDCON2 = 0xFB9
#BYTE TXSTA2 = 0xFBA
#BYTE RCSTA2 = 0xFA6

#BYTE TXREG2 = 0xF79
#BYTE RCREG2 = 0XF7A
#BYTE PIR3 = 0xFA4
#BIT PIR3_RC2IF = PIR3.5

//Registros estado pin
#Byte TRISB = 0xF93
#Byte TRISC = 0xF94
#Byte PORTB = 0xF81
#Byte PORTc = 0xF82
#BIT RB6 = PORTB.6
#BIT RB7 = PORTB.7

void main()
{
   setup_oscillator(OSC_16MHZ);
   _SetUpPic18F25k80();

   //Configura usart1 a 4800
   SPBRG1 = 0x33;
   TRISC = 0b10111111;
   BAUDCON1 = 0x00;
   TXSTA1 = 0x20;
   RCSTA1 = 0x90;
  
   //Configura usart2 a 4800
   SPBRG2 = 0x33;
   TRISB = 0b10111111;
   BAUDCON2 = 0x00;
   TXSTA2 = 0x20;
   RCSTA2 = 0x90;
  
   //TRISB = 0b00111111;
  
   //#use rs232(uart1, baud=4800, TIMEOUT=1, XMIT=PIN_C6, RCV=PIN_C7, STREAM = PORT1)
   //#use rs232(uart2, baud=4800, TIMEOUT=1, XMIT= PIN_B6, RCV= PIN_B7, STREAM = PORT2)
   //_SetUpRbf2();

   //Establece las interrupciones
   //Enable_interrupts(GLOBAL);  //'Permite las interrupciones generales y las de perifericos
   //Enable_interrupts(INT_TIMER1);  //'Permite las interrupciones del TMR1  
   //Enable_interrupts(INT_RDA);
   //Enable_interrupts(INT_RDA2);
   //PIE3_RCIE = 1; // Interrupcion Uart

   while(TRUE)
   {
      //If (KBHIT(PORT1)) Fputc(fgetc(port1), PORT1);
      //If (KBHIT(PORT2)) Fputc(fgetc(port2), PORT2);

      If (PIR1_RC1IF) TXREG1 = RCREG1;
      If (PIR3_RC2IF) TXREG2 = RCREG2;

      //RB6 = 0;
      //RB7 = 1;
      //delay_ms(500);
      //RB6 = 1;
      //RB7 = 0;
      //delay_ms(500);

   }
}
//*****************************************************************************
//#int_RDA //Interrupción Uart
//   Void uart_interrupcion(Void){
      //_RingBuffer(0);
//   }
//*****************************************************************************
//#int_RDA2 //Interrupción Uart
//   Void uart_interrupcion2(Void){
   //_RingBuffer2(0);
//   }
//*****************************************************************************
« Última modificación: 13 de Julio de 2014, 08:50:25 por dogflu66 »
Saludos desde Granada, España.

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
« Respuesta #6 en: 10 de Julio de 2014, 20:19:34 »
te comento lo que me sucedió a mi, usaba dos uart hardware usando los peripherical pin select, cuando situaba la configuracion de los pines uart antes o despues del #use RS232 funcionaba en simulacion o en real, pero nunca ambos me funcionaron a la vez, hasta el dia de hoy para simular situo la configuraciones de pines en un lado, y para probar en real lo situo  en otro.
Siendo asi no esta demas probar cambiando de sitio el codigo, podrias poner los #USE RS232 fuera del main y despues de la configuracion del oscilador, por lo general seria la sentencia #Use delay
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
« Respuesta #7 en: 10 de Julio de 2014, 23:07:31 »
Hola Dogflu y Jhozate

dogflu, acá esta el link del problema que menciona jhozate, espero te sirva de algo

http://www.todopic.com.ar/foros/index.php?topic=42727.0

Saludos
"Nada es imposible, no si puedes imaginarlo"

Desconectado dogflu66

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
« Respuesta #8 en: 11 de Julio de 2014, 11:47:30 »
Hoy no he podido hacer nada, pero este finde lo retomo.
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
« Respuesta #9 en: 13 de Julio de 2014, 08:59:59 »
Aparte que el prototipo me da muchos problemas, parece que funciona. En uno de los post anterior donde configure las usart a mano, cometí un error en la dirección de un registro,  #BYTE TXSTA2 = 0xFBA, al corregirlo ambas usart funcionan.
El problema está en que la placa de prototipos me toma muchas interferencias, cuando le coloco el max el micro falla, así que he parcheado con un inversor a transistores. Cuando tenga un prototipo aceptable continuare con el tema.
Saludos desde Granada, España.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2062
Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
« Respuesta #10 en: 13 de Julio de 2014, 09:43:13 »
Hola dogflux66!
Amigo yo realice las pruebas que te comente ayer y lo tengo funcionando al puro estilo del CCS, cuando llegue a mi casa coloco la solucion para que la pruebes  :mrgreen: :-/

Saludos

Desconectado dogflu66

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
« Respuesta #11 en: 13 de Julio de 2014, 18:27:19 »
Estoy intentando parchear el prototipo para salir del paso, pero esperando los resultados de tu investigación pana.
Saludos desde Granada, España.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2062
Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
« Respuesta #12 en: 14 de Julio de 2014, 11:07:12 »
Ok alli va!  :D
Solo te agradezco que no le digas a nadie lo que hice  :D ;-)

Código: [Seleccionar]
#include <18F26K80.h>
#device adc=12
                                
#FUSES VREGSLEEP                //Ultra low-power regulator is disabled
#FUSES INTRC_LP                 //LF-INTOSC in Low-Power mode during Sleep
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PLLEN                    //PLL habilitado, multiplica por 4 el cristal externo
#FUSES HSM                      //High speed Osc, medium power 4MHz-16MHz, solo para cristal externo          
#FUSES SOSC_DIG                 //Digital mode, I/O port functionality of RC0 and RC1
#FUSES PUT                      //Power Up Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES WDT_NOSLEEP              //Watch Dog Timer, disabled during SLEEP

#use delay(clock= 32000000)     //Ajusta las rutinas de retardo para operar a 32Mhz( 4 x 8Mhz), con el pll activado

#use rs232(UART2, baud= 9600,STREAM= USART2)
#use rs232(UART1, baud= 9600,STREAM= USART1)

#INT_RDA2
void Recepcion_Usart2()
{
   char cRx2;
  
   if(kbhit(USART2))
     cRx2= fgetc(USART2);
   fprintf(USART2,"%c",cRx2);
  
}


#INT_RDA
void Recepcion_Usart1()
{
   char cRx1;
  
   if(kbhit(USART1))
     cRx1= fgetc(USART1);
   fprintf(USART1,"%c",cRx1);
}  


void main()
{
   set_tris_b(0x80);       //configuro el usart2 tx2 como salida, rx2 como entrada el resto salidas.
   set_tris_c(0x80);       //configuro el usart1 tx1 como salida, rx1 como entrada el resto salidas.

   enable_interrupts(INT_RDA);
   enable_interrupts(INT_RDA2);
   enable_interrupts(global);
  
   fprintf(USART1,"En espera de mansaje USART1...\r");
   fprintf(USART2,"En espera de mansaje USART2...\r");
  
   While(true);  
}



En el ejemplo envio datos simultaneamente a el usart1 y USART2, desde el terminal de la derecha, y recibo de manera independiente por cada terminal los datos.

« Última modificación: 14 de Julio de 2014, 12:00:12 por RALF2 »

Desconectado dogflu66

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
« Respuesta #13 en: 14 de Julio de 2014, 18:47:09 »
Ok, cuando tenga una placa de pruebas fiable lo pruebo.  :-/ :-/ :-/ :-/ :-/ :-/
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
« Respuesta #14 en: 15 de Julio de 2014, 12:35:56 »
Bueno; ya tengo un nuevo prototipo funcionando. Por el momento solo he podido probar las usar en modo Tx. También he encontrado el fallo de hardware que tenia, el problema estaba en la fuente de alimentación, está derivada y es lo que me estaba fastidiando todas la pruebas, a parte que me ha averiado el puerto RS232 del Pc en modo Rx. En fin, son gajes del oficio. Cuando encuentre un rato libre probaré a realizar la configuración de la usart con las funciones del CCS a ver que pasa.
Saludos desde Granada, España.