Autor Tema: Problema en la recepción UART con pic 18f45k20 y XC8  (Leído 2354 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado RinconR

  • PIC10
  • *
  • Mensajes: 27
Problema en la recepción UART con pic 18f45k20 y XC8
« en: 07 de Marzo de 2016, 06:52:50 »
Estoy intentando enviar un byte a traves del puerto serie. El tranmisor envía correctamente el dato y en el osciloscopio veo que el dato llega al receptor también de forma correcta. El problema es que este, no guarda bien el dato...
Quiero que el dato me aparezca en los leds
Estuve probando varios valores para el baud rate, ya que es algo que no entiendo muy bien. Si pongo un baud rate de 9600, me salen todos los leds encendidos. En este código bajé la velocidad en los leds van variando aleatoriamente, pero no me aparece en dato que envío.
A ver si alguien puede ayudarme...
¡Gracias!

PD: Desactivé la interrupción porque el RCIF salta de todas formas.


Código: C
  1. #include <xc.h>
  2. #include <P18f45k20.h>
  3. #pragma config LVP=OFF, WDTEN=OFF, FOSC=INTIO67, PBADEN = ON
  4.  
  5. void main()
  6. {
  7.         inicializaciones();
  8.         inicializa_EUSART();
  9.         habilita_RECEPTOR();
  10.     //habilita_INTERRUPCION ();
  11.         while(1)
  12.         {
  13.                 if(PIR1bits.RCIF==1)
  14.                 {
  15.                     PORTD=RCREG;
  16.  
  17.                 }
  18.  
  19.         }
  20. }
  21.  
  22. void inicializaciones ()
  23. {
  24.         TRISC=0b11000000;      
  25.         TRISD=0x00;
  26. }
  27.  
  28. void inicializa_EUSART ()
  29. {
  30.         SPBRGH=0x00;  
  31.     SPBRG=0XCF;
  32.         //SPBRG=0x19;// 25
  33.        
  34.         BAUDCONbits.BRG16=0;
  35.         TXSTAbits.BRGH=0;
  36.         TXSTAbits.SYNC=0;
  37. }
  38.  
  39. void habilita_RECEPTOR ()
  40. {
  41. ADCON1=0X0F;
  42. RCSTAbits.SPEN=1;
  43. TXSTAbits.SYNC=0;
  44. RCSTAbits.CREN=1;
  45. }
« Última modificación: 07 de Marzo de 2016, 13:00:19 por RinconR »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema en la recepción UART con pic 18f45k20 y XC8
« Respuesta #1 en: 07 de Marzo de 2016, 12:26:03 »
if(PIR1bits.RCIF==0)

deberia ser

if(PIR1bits.RCIF==1)

Desconectado RinconR

  • PIC10
  • *
  • Mensajes: 27
Re:Problema en la recepción UART con pic 18f45k20 y XC8
« Respuesta #2 en: 07 de Marzo de 2016, 12:57:33 »
if(PIR1bits.RCIF==0)

deberia ser

if(PIR1bits.RCIF==1)

Lo tengo a 1, perdón. Pero tenía puesto un flanco para probar y me equivoqué al pegarlo aquí...
¿Algún fallo más?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema en la recepción UART con pic 18f45k20 y XC8
« Respuesta #3 en: 07 de Marzo de 2016, 13:21:54 »
Que frecuencia estas usando, y que baudrate ?

Con BRGH = 0, y BRG16 = 0, la formula del baudrate es:

Baudrate = \frac{Fosc}{ 64 * (n+1) }
« Última modificación: 07 de Marzo de 2016, 13:31:23 por KILLERJC »

Desconectado RinconR

  • PIC10
  • *
  • Mensajes: 27
Re:Problema en la recepción UART con pic 18f45k20 y XC8
« Respuesta #4 en: 07 de Marzo de 2016, 18:27:43 »
Que frecuencia estas usando, y que baudrate ?

Con BRGH = 0, y BRG16 = 0, la formula del baudrate es:

Baudrate = \frac{Fosc}{ 64 * (n+1) }

La frecuencia pensaba que eran 4MHz, pero acabo de ver el IRCF y está en 100, ¿lo que significa que son 2MHz, no? ¿O la frecuencia viene dada en otro lugar?
¿Tendría que usar un baud rate de 4464?


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema en la recepción UART con pic 18f45k20 y XC8
« Respuesta #5 en: 07 de Marzo de 2016, 18:52:18 »
Fosc es la frecuencia del oscilador, es decir ya sea del oscilador interno o del cristal que tengas puesto.
Tenes que definir un baudrate,tu transmisor al configurarlo le definis un baudrate tambien, y deben coincidir con el receptor. A mi me parecio raro por que usando varios valores comunes de frecuencia de oscilador ( 4,8,10,20,48Mhz en caso de tener PLL) no encontraba un valor de baudrate "comun" con los valores que tenes puesto, por ejemplo un baudrate de 9600 era lo minimo que esperaba, pero aunque pudieras llevarlo a 48Mhz no llegas a ese baudrate y es lo que me llamo la atencion ( a 48Mhz tu baudrate es de 3623.188406 ).

Por eso mismo te pregunte que baudrate estas usando y que frecuencia de oscilador.

Citar
La frecuencia pensaba que eran 4MHz, pero acabo de ver el IRCF y está en 100, ¿lo que significa que son 2MHz, no? ¿O la frecuencia viene dada en otro lugar?

Recien me doy cuenta que estas usando el oscilador interno. IRCF por default en el reset viene con el valor 011 ( Miralo en el datasheet del micro arriba y vas a ver que dice R/W-1 , Lectura/Escritura - 1 en reset ). Ya que en tu programa NO lo cambias, es ese valor y es 1Mhz.

Baudrate = \frac{1Mhz}{64*(207+1)}=75.12019231
207 de 0xCF

Me parece bajisimo. Como te decia 9600 pienso que seria lo minimo a apuntar.. Pero esto tiene que ser igual en tu transmisor, sino no va a funcionar.

Desconectado RinconR

  • PIC10
  • *
  • Mensajes: 27
Re:Problema en la recepción UART con pic 18f45k20 y XC8
« Respuesta #6 en: 07 de Marzo de 2016, 19:13:43 »
Fosc es la frecuencia del oscilador, es decir ya sea del oscilador interno o del cristal que tengas puesto.
Tenes que definir un baudrate,tu transmisor al configurarlo le definis un baudrate tambien, y deben coincidir con el receptor. A mi me parecio raro por que usando varios valores comunes de frecuencia de oscilador ( 4,8,10,20,48Mhz en caso de tener PLL) no encontraba un valor de baudrate "comun" con los valores que tenes puesto, por ejemplo un baudrate de 9600 era lo minimo que esperaba, pero aunque pudieras llevarlo a 48Mhz no llegas a ese baudrate y es lo que me llamo la atencion ( a 48Mhz tu baudrate es de 3623.188406 ).

Por eso mismo te pregunte que baudrate estas usando y que frecuencia de oscilador.

Citar
La frecuencia pensaba que eran 4MHz, pero acabo de ver el IRCF y está en 100, ¿lo que significa que son 2MHz, no? ¿O la frecuencia viene dada en otro lugar?

Recien me doy cuenta que estas usando el oscilador interno. IRCF por default en el reset viene con el valor 011 ( Miralo en el datasheet del micro arriba y vas a ver que dice R/W-1 , Lectura/Escritura - 1 en reset ). Ya que en tu programa NO lo cambias, es ese valor y es 1Mhz.

Baudrate = \frac{1Mhz}{64*(207+1)}=75.12019231
207 de 0xCF

Me parece bajisimo. Como te decia 9600 pienso que seria lo minimo a apuntar.. Pero esto tiene que ser igual en tu transmisor, sino no va a funcionar.

¿Entonces tengo que poner 27 en el SPBRG del transmisor y receptor para tener un baud rate de 9600, no?

Probando el código en modo debugger, en el IRCF me sale 100, y nunca varío ese valor...
« Última modificación: 08 de Marzo de 2016, 18:41:28 por RinconR »

Desconectado RinconR

  • PIC10
  • *
  • Mensajes: 27
Re:Problema en la recepción UART con pic 18f45k20 y XC8
« Respuesta #7 en: 08 de Marzo de 2016, 18:43:40 »
La anterior respuesta está mal. Al final puse el reloj de 4 MHz y un baud rate de 2404, ya que con 9600 los leds del receptor se ponían todo el tiempo a 1.

El problema viene que el receptor sigue sin guardar bien el dato. ¿Tengo que hacer algo más que PORTD=RCREG cuando llegué el flag?

¡Gracias de antemano!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema en la recepción UART con pic 18f45k20 y XC8
« Respuesta #8 en: 08 de Marzo de 2016, 20:15:41 »
Para evitar mas problemas y no seguir con esto te voy a pedir un par de cosas:

- Frecuencia de oscilador de tu transmisor ( sea interno/externo+PLL/etc)
- Configuracion de la UART del transmisor

- Frecuencia de oscilador de tu receptor
- Configuracion de la UART del receptor

Una ves que me pases esos datos vamos a poder hacer algo.

Citar
ya que con 9600 los leds del receptor se ponían todo el tiempo a 1.

Es por que el programa ( del transmisor o receptor ) no es correcto, en realidad supongo que estas enviando a mas no poder datos por la UART.

Desconectado RinconR

  • PIC10
  • *
  • Mensajes: 27
Re:Problema en la recepción UART con pic 18f45k20 y XC8
« Respuesta #9 en: 09 de Marzo de 2016, 11:43:49 »
Para evitar mas problemas y no seguir con esto te voy a pedir un par de cosas:

- Frecuencia de oscilador de tu transmisor ( sea interno/externo+PLL/etc)
- Configuracion de la UART del transmisor

- Frecuencia de oscilador de tu receptor
- Configuracion de la UART del receptor

Una ves que me pases esos datos vamos a poder hacer algo.

Citar
ya que con 9600 los leds del receptor se ponían todo el tiempo a 1.

Es por que el programa ( del transmisor o receptor ) no es correcto, en realidad supongo que estas enviando a mas no poder datos por la UART.

Los 2 osciladores son internos y los configuré a 4MHz.
La configuración del UART del transmisor es:
Código: C
  1. void inicializa_EUSART ()
  2. {
  3.         SPBRGH=0x00;  
  4.         SPBRG=0X19;
  5.        
  6.         BAUDCONbits.BRG16=0;
  7.         TXSTAbits.BRGH=0;
  8.         TXSTAbits.SYNC=0;
  9. }
  10.  
  11. void habilita_TRANSMISOR ()
  12. {
  13.     RCSTAbits.SPEN=1;
  14.     TXSTAbits.SYNC=0;
  15.     TXSTAbits.TXEN=1;
  16. }

La configuración del receptor:
Código: C
  1. void inicializa_EUSART ()
  2. {
  3.         SPBRGH=0x00;  
  4.         SPBRG=0X19;
  5.        
  6.         BAUDCONbits.BRG16=0;
  7.         TXSTAbits.BRGH=0;
  8.         TXSTAbits.SYNC=0;
  9. }
  10.  
  11. void habilita_RECEPTOR ()
  12. {
  13.      ADCON1=0X0F;
  14.      RCSTAbits.SPEN=1;
  15.      TXSTAbits.SYNC=0;
  16.      RCSTAbits.CREN=1;
  17. }

¿Esto es lo que me pedías? Gracias como siempre!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema en la recepción UART con pic 18f45k20 y XC8
« Respuesta #10 en: 09 de Marzo de 2016, 19:04:30 »
Si esta bien. No importa la velocidad de transmision, todo depende de tu programa. Si por ejemplo tenes una velocidad tal que enviar el byte tarda 10ms, y el receptor lo tenes para que apenas lo reciba cambie el estado del led, entonces verias variar el led a 10ms.

Pero si tu transmisor envia cada 1 segundo, un dato, supongamos que lo hace 100us. El receptor asi como lo tenes va a recibir ese dato cada 1 segundo.

Aunque no quede muy claro, la idea no es disminuir la velocidad de transmision para que cambie de estado mas lento, sino de enviar mas lento las cosas, medio segundo enviar un dato, medio segundo enviar otro.

Ejemplo esto enviaria cada medio segundo un dato ( presupongo que la velocidad es alta ):

Código: C
  1. while(1)
  2. {
  3.         TXREG = 0x10;
  4.         for(i=0;i<50;++i)
  5.         {
  6.                 __delay_ms(10);
  7.         }
  8. }

Y el receptor lo podes dejar como esta

Desconectado RinconR

  • PIC10
  • *
  • Mensajes: 27
Re:Problema en la recepción UART con pic 18f45k20 y XC8
« Respuesta #11 en: 09 de Marzo de 2016, 21:15:49 »
Si esta bien. No importa la velocidad de transmision, todo depende de tu programa. Si por ejemplo tenes una velocidad tal que enviar el byte tarda 10ms, y el receptor lo tenes para que apenas lo reciba cambie el estado del led, entonces verias variar el led a 10ms.

Pero si tu transmisor envia cada 1 segundo, un dato, supongamos que lo hace 100us. El receptor asi como lo tenes va a recibir ese dato cada 1 segundo.

Aunque no quede muy claro, la idea no es disminuir la velocidad de transmision para que cambie de estado mas lento, sino de enviar mas lento las cosas, medio segundo enviar un dato, medio segundo enviar otro.

Ejemplo esto enviaria cada medio segundo un dato ( presupongo que la velocidad es alta ):

Código: C
  1. while(1)
  2. {
  3.         TXREG = 0x10;
  4.         for(i=0;i<50;++i)
  5.         {
  6.                 __delay_ms(10);
  7.         }
  8. }

Y el receptor lo podes dejar como esta

Con esto me funcionó. El receptor así si que recibe y procesa los datos.
Solo me falta solucionar 1 problema: el ruido. Hay algo de ruido en los datos enviados y a veces el dato llega mal. Al principio fallaba un 50% de las veces, le metí un condensador de 10nF y ahora falla el 30%.
¿Alguna solución?

¡Muchísimas gracias!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema en la recepción UART con pic 18f45k20 y XC8
« Respuesta #12 en: 09 de Marzo de 2016, 21:43:03 »
No entiendo como podes tener ruido, imagino que lo estas probando en algunas placas y no en un ambiente "insdustrial" como para que tengas esos problemas.
Ponerle un capacitor para mi significa volverlo peor.

Lo que puede ser que falle es por alguna desviacion de la frecuencia del oscilador interno, proba ponerle cristales externos de 4Mhz a cada PIC, aunque sea para probar y ahi fijate si es que realmente falla.


 

anything