TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: dogflu66 en 10 de Julio de 2014, 05:58:35

Título: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
Publicado por: dogflu66 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.
Título: Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
Publicado por: dogflu66 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);
   }
//*****************************************************************************
Título: Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
Publicado por: jhozate 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
Título: Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
Publicado por: MGLSOFT 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.
Título: Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
Publicado por: dogflu66 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.
Título: Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
Publicado por: dogflu66 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);
//   }
//*****************************************************************************
Título: Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
Publicado por: jhozate 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
Título: Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
Publicado por: rivale 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 (http://www.todopic.com.ar/foros/index.php?topic=42727.0)

Saludos
Título: Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
Publicado por: dogflu66 en 11 de Julio de 2014, 11:47:30
Hoy no he podido hacer nada, pero este finde lo retomo.
Título: Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
Publicado por: dogflu66 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.
Título: Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
Publicado por: RALF2 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
Título: Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
Publicado por: dogflu66 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.
Título: Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
Publicado por: RALF2 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);  
}

(http://img834.imageshack.us/img834/7778/edrc.png)

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.

Título: Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
Publicado por: dogflu66 en 14 de Julio de 2014, 18:47:09
Ok, cuando tenga una placa de pruebas fiable lo pruebo.  :-/ :-/ :-/ :-/ :-/ :-/
Título: Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
Publicado por: dogflu66 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.
Título: Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
Publicado por: RALF2 en 15 de Julio de 2014, 14:40:13
Ok amigo estare pendiente de tus progresos!   :mrgreen:
Título: Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
Publicado por: dogflu66 en 15 de Julio de 2014, 20:02:45
Ahora funciona de todas las maneras posibles, no hay manera de que falle. Definiendo pin y sin definirlos, del derecho y del revés, funciona perfecto.

Pana, tu programa funciona perfecto en la realidad.
Título: Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
Publicado por: RALF2 en 15 de Julio de 2014, 23:37:43
Ahora funciona de todas las maneras posibles, no hay manera de que falle. Definiendo pin y sin definirlos, del derecho y del revés, funciona perfecto.

Pana, tu programa funciona perfecto en la realidad.


Oh Me alegro que te alla servido de ayuda el programita amigo!  :D
Y con tu prueba en fisico veo que el proteus no me dejo mal   :mrgreen:

Ahora a seguir jugando   :D

Saludos
Título: Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
Publicado por: dogflu66 en 16 de Julio de 2014, 20:04:41
He implementado un buffer distinto para cada puerto y funciona correctamente. La velocidad máxima fiable es de 38400 trabajando a 40Mhz con un cristal de 10Mhz.
Mañana, que ya es hoy, voy a ver si puedo pasar a retirar unos cristales de 16Mhz, para realizar las pruebas a 64Mhz a ver que pasa.
Título: Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
Publicado por: MGLSOFT en 16 de Julio de 2014, 21:19:01
No se el 25K80, pero el 26K80 tiene un oscilador interno que a 64 Mhz funciona de maravilla, yo lo uso sin cristal y logro comunicaciones a 115200 bps sin problemas!!
Título: Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
Publicado por: dogflu66 en 17 de Julio de 2014, 11:51:05
Se supone que la única diferencia está en la cantidad de memoria flash, si tienes la configuración de los fuses a mano me ahorras tiempo.
Título: Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
Publicado por: RALF2 en 17 de Julio de 2014, 14:37:52
Esta configuracion me la paso el amigo MGLSOFT  :mrgreen:
Citar
//Configuracion del pic18F26K80 para oscilador interno

#include <18F26K80.h>
#device adc=12
//#device icd=3 // segun el foro de CCS es para ICD3

#FUSES NOWDT                    //No Watch Dog Timer
#fuses DEBUG                    //Permite debug con ICD
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES PLLEN                    //PLL habilitado
#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
#FUSES CANB                     //CANTX and CANRX pins are located on RB2 and RB3
#fuses PROTECT                  //Code protected from reads

#use delay(clock=64000000, int=64000000, RESTART_WDT)

Y como diria el funciona perfectamente   :D

Título: Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
Publicado por: dogflu66 en 17 de Julio de 2014, 20:23:15
Pues si que está bien calibrado el reloj interno; los dos buffer trabajando de forma independiente a 230400Bd con un reloj de 64Mhz.
Hay que tener en cuenta que el micro solo esta atendiendo a los dos puertos, no esta haciendo otra cosa.

Bueno..., eso de que no esta haciendo otra cosa es relativo, ya que esta moviendo los puertos mediante dos buffer independientes en anillo.
Título: Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
Publicado por: RALF2 en 17 de Julio de 2014, 22:12:06
Citar
Bueno..., eso de que no esta haciendo otra cosa es relativo, ya que esta moviendo los puertos mediante dos buffer independientes en anillo.

buffer de anillo? a que te refieres con eso  :?


Título: Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
Publicado por: dogflu66 en 18 de Julio de 2014, 06:17:30
Mira aqui.:

http://es.m.wikipedia.org/wiki/Buffer_circular

Uso el método de los dos índices y, cuando el buffer está lleno los nuevos datos los destruyo para que no corrompan los antiguos, además también uso un contador que indica cuantos bytes hay en el buffer en todo momento.

No habia leido nunca la descricción de la wikipedia, pero es que es exacta.

Parece que el ccs también tiene funciones para asociar buffer en anillo, pero no me he preocupado de ver su funcionamiento.
Título: Re: Usando dos puertos RS232 con el Pic18F25K80 (CCS)
Publicado por: RALF2 en 18 de Julio de 2014, 18:56:42
Segun veo cuando el puntero de la cola alcanza el final del array, este vuelve al comienso del array y siempre  que el size(el cual indica si el array esta full) se copiaran datos al inicio del array, pero si el size a alcanzado su limite maximo y el puntero de la cola vuelve al inicio del array y se copian nuevos datos estos destruiran los que habian previamente, por eso es que asegurarse que el size no alcance su valor maximo, porque al copiarse nuevos datos estos sobreescribiran los existentes con la consecuente perdida de estos  :?
El otro puntero el de la cabeza se incrementa cada vez que se lea un dato del array decrementando de esta forma el size.
Bueno este trabalenguas es mas o menos lo que entendi del buffer de anillo (Ring buffer), el cual nunca habia utilizado pero ahora lo probare  :D

El ccs trae un ejemplo EX_SISR.C, sino mal recuerdo  :mrgreen:

Saludos