Autor Tema: PIC18F26J50 Problema con USART a 115200 baudios  (Leído 4972 veces)

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

Desconectado nameless fairy

  • PIC10
  • *
  • Mensajes: 4
    • Mi servidor local
PIC18F26J50 Problema con USART a 115200 baudios
« en: 10 de Abril de 2013, 17:10:28 »
Hola,

Tengo un problema, y es que, no puedo hechar a andar la comunicación serial de mi PIC18F a 115200... De hecho no la puedo hechar a andar a más de 19200 baudios. El lenguaje que estoy usando para programar es el C18. Las frecuencias con las que lo he probado han sido: 8MHz, 16 MHz, 24MHz, 48MHz (todas estas configuradas con el oscilador interno del PIC18F26J50), y también llegué a probar con un cristal externo de 22,1184 MHz (con ésta frecuencia los cálculos dan exactos... 0% de error!!) y aún así, no puedo comunicarme a más de 19,2 kbps....

Aquí les dejo fragmentos relevantes del código con el que estoy configurando a mi micro:

Código: Text
  1. /** I N C L U S I O N E S ****************************************************/
  2. #define USE_OR_MASKS // <---- esto es nadamás para el uso de la librería <usart.h> que por cierto no la estoy usando
  3. #include <p18f26j50.h>
  4. #include <usart.h>
  5.  
  6. //Definición de la Frecuencia de oscilacion del CPU (depende del cristal externo, asumido en principio en 12 MHz)
  7. //Posibles valores esperados: FOSC_8MHZ, FOSC_16MHZ, FOSC_24MHZ, FOSC_48MHZ, FOSC_EXT
  8. #define FOSC_8MHZ
  9.  
  10. //******************************************************************************************************************//
  11. //******************************************Configuración del Microprocesador*******************************************//
  12. //*****************************************************************************************************************//
  13.  
  14. #if defined(__18F46J50) || defined(__18F47J53) || defined(__18F26J50)
  15.         #if defined(FOSC_EXT)
  16.                 #pragma config OSC              = HS            //High-Speed Crystal/Resonator mode, PLL disabled, crystal/resonator RA6 - RA7.
  17. //              #pragma config PLLDIV   = 1                     //No divide (8 MHz internal oscillator)
  18. //              #pragma config CPUDIV   = OSC1                  //No CPU system clock divide
  19.         #elif defined(FOSC_8MHZ)
  20.                 #pragma config OSC              = INTOSCPLL     //Internal oscillator, PLL enabled
  21.                 #pragma config PLLDIV   = 1                     //No divide (8 MHz internal oscillator)
  22.                 #pragma config CPUDIV   = OSC1                  //No CPU system clock divide
  23.         #elif defined(FOSC_16MHZ)
  24.                 #pragma config OSC              = INTOSCPLL     //Internal oscillator, PLL enabled
  25.                 #pragma config PLLDIV   = 2                     //Divide by 2 (8 MHz internal oscillator)
  26.                 #pragma config CPUDIV   = OSC3_PLL3             //CPU system clock divide by 3
  27.         #elif defined(FOSC_24MHZ)
  28.                 #pragma config OSC              = INTOSCPLL     //Internal oscillator, PLL enabled
  29.                 #pragma config PLLDIV   = 2                     //Divide by 2 (8 MHz internal oscillator)
  30.                 #pragma config CPUDIV   = OSC2_PLL2             //CPU system clock divide by 2
  31.         #elif defined(FOSC_48MHZ)
  32.                 #pragma config OSC              = INTOSCPLL     //Internal oscillator, PLL enabled
  33.                 #pragma config PLLDIV   = 2                     //Divide by 2 (8 MHz internal oscillator))
  34.                 #pragma config CPUDIV   = OSC1                  //No CPU system clock divide
  35.         #else
  36.                 #error No ha elegido una frecuencia de oscilacion del CPU valida. Por favor revise el archivo "lelnede.h"
  37.         #endif
  38.         #pragma config DEBUG    = OFF                   //Background Debug
  39.         #pragma config WDTEN    = OFF                   //WDT disabled (enabled by SWDTEN bit)
  40.         #pragma config STVREN   = ON                            //stack overflow/underflow reset enabled
  41.         #pragma config XINST    = OFF                   //Extended instruction set disabled
  42.         #pragma config CP0              = OFF                   //Program memory is not code-protected
  43.         #pragma config FCMEN    = OFF                   //Fail-Safe Clock Monitor disabled
  44.         #pragma config IESO             = ON                            //Two-Speed Start-up disabled
  45.         #pragma config WDTPS    = 2048                  // 4 ms * 1024 = 4,096 seg
  46.         #pragma config DSWDTOSC = INTOSCREF             //DSWDT uses INTOSC/INTRC as clock
  47.         #pragma config RTCOSC   = INTOSCREF//T1OSCREF           //RTCC uses T1OSC/T1CKI as clock
  48.         #pragma config DSBOREN  = OFF                   //Zero-Power BOR disabled in Deep Sleep
  49.         #pragma config DSWDTEN  = OFF                   //Disabled
  50.         #pragma config DSWDTPS  = 8192                  //1:8,192 (8.5 seconds)
  51.         #pragma config IOL1WAY  = OFF                   //IOLOCK bit can be set and cleared
  52.         #pragma config MSSP7B_EN= MSK7                  //7 Bit address masking
  53.         #pragma config WPFP             = PAGE_1                        //Write Protect Program Flash Page 0
  54.         #pragma config WPEND    = PAGE_0                        //Start protection at page 0
  55.         #pragma config WPCFG    = OFF                   //Write/Erase last page protect Disabled
  56.         #pragma config WPDIS    = OFF                   //WPFP[5:0], WPEND, and WPCFG bits ignored
  57.         #if defined(__18F47J53)
  58.                 #pragma config CFGPLLEN = OFF
  59.                 #pragma config ADCSEL   = BIT12
  60.         #else
  61.                 #pragma config T1DIG    = OFF//ON               //Sec Osc clock source may be selected
  62.                 #pragma config LPT1OSC  = OFF//ON               //low power Timer1 mode
  63.         #endif
  64. #else
  65.         #error Ha elegido un microprocesador diferente a los modelos PIC18F26J50, PIC18F46J50 y PIC18F47J53! Por favor, vaya a: Menu > Configure > Select Device...
  66. #endif

A través de esta subrutina estoy Configurando el Usart 2 de mi micro (tiene 2 Usart):
Código: [Seleccionar]
void OpenUSART2(unsigned char baudrate)
{
SPBRG2 = 25;//baudrate; // formula: baudrate = FOSC/[16 (spbrg + 1)] spbrg = ( FOSC / [16 * baudrate] ) - 1

TXSTA2 = 0;
RCSTA2 = 0;
TXSTA2bits.SYNC=0; // Asynchronous mode Enabled
RCSTA2bits.SPEN=1; // Serial Port Enabled

TXSTA2bits.TX9=0; // Asynchronous mode Enabled
TXSTA2bits.TXEN=1; // Transmit Enabled
RCSTA2bits.RX9=0; // 8-bit mode
RCSTA2bits.CREN=1; // Enables Receiver
TXSTA2bits.BRGH=1; // High Baud Rate

BAUDCON2bits.BRG16=0;
}

Bueno, el 25 que ven ahí para SPBRG2 es una cifra que estoy variando, dependiendo del baud rate que quiero configurar, y de la frecuencia del oscilador.
He probado todo lo que he podido pero nada, solo 9600 y 19200 baudios es con lo que puedo trabajar hasta ahora. ¿Alguien tiene alguna otra idea de lo que puedo hacer?

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: PIC18F26J50 Problema con USART a 115200 baudios
« Respuesta #1 en: 10 de Abril de 2013, 17:29:45 »
A mi por lo general me funciona la fórmula:

SPBRG = ((FOSC/(8*BAUD))-1)/2


Aunque en una ocasión tuve que poner el valor a mano porque la fórmula daba 10 (20Mhz, 115200 baud) y al final sólo funcionó cuando metí un valor de 12 en SPBRG.


Saludos.

Desconectado nameless fairy

  • PIC10
  • *
  • Mensajes: 4
    • Mi servidor local
Re: PIC18F26J50 Problema con USART a 115200 baudios
« Respuesta #2 en: 10 de Abril de 2013, 19:30:11 »
A mi por lo general me funciona la fórmula:

SPBRG = ((FOSC/(8*BAUD))-1)/2


Aunque en una ocasión tuve que poner el valor a mano porque la fórmula daba 10 (20Mhz, 115200 baud) y al final sólo funcionó cuando metí un valor de 12 en SPBRG.


Saludos.

Te agradesco tu respuesta, pero no me funciona.
Hay frecuencias de oscilador para la que me funcionan los 9600 y los 19200 baudios, pero muchas otras que no.
¿Con qué modelos de pic lo haz trabajado?

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: PIC18F26J50 Problema con USART a 115200 baudios
« Respuesta #3 en: 11 de Abril de 2013, 16:39:40 »
PIC16F883, PIC18F2550, PIC16F88, PIC18F2525, dsPIC30F4012, PIC18F25K80

En todos ellos me ha funcionado la fórmula (FOSC/(8 * BAUD)-1)/2 en ensamblador:

SPBRG_VAL   EQU   (FOSC/(8 * BAUD)-1)/2
    MOVLW   SPBRG_VAL
    MOVWF   SPBRG

Y también me ha funcionado en C, excepto en esa ocasión que te comentaba y no he descubierto todavía porqué.


Saludos.

Desconectado nameless fairy

  • PIC10
  • *
  • Mensajes: 4
    • Mi servidor local
Re: PIC18F26J50 Problema con USART a 115200 baudios
« Respuesta #4 en: 12 de Abril de 2013, 12:36:08 »
Ok, a pesar de que aún no resuelvo el problema, he hecho algunos avances:

1. Realicé una prueba a mi conversor RS232-TTL, cruzando su Rx con su Tx, de modo que los caracteres tecleados desde el PC me los devuelva directamente. De ese modo verifico posibles fallos que no estén asociados al uP. Lo que comprobé es que a 115200 baudios mi conversor falla!! Sin embargo trabaja excelentemente de 57600 baudios para abajo, velocidad a la que falla mi PIC18... Así que podemos estar seguros que entonces si hay fallos a nivel del PIC.

2. Descubrí que los problemas están realmente en la recepción de caracteres del PIC, y no en su transmisión. Verán, el programa anterior lo hice para que todo caracter recibido lo retransmita mediante interrupción. Y en velocidades superiores a 19200 recibo caracteres distintos a los que tecleo desde el PC, pero hice una modificación al programa, haciendo que el PIC me envíe el abecedario a un caracter por segundo (aproximadamente), y ahí pude comprobar que los caracteres llegan al PC en excelente estado a 57600 baudios! Pero cuando tecleo caracteres, lo que recibo es distinto.... Así que mi problema se reduce a una inadecuada recepción.....

3. Ante el hallazgo anterior, se me ocurrió cambiar el bit RXDTP del registro BAUDCON (el cual habla de la Polaridad de la recepción de datos), pero al variarlo de 0 a 1, pues el problema persistía, así que decidí dejarlo en 0...  :(

Les agradesco todas las ideas que puedan sugerir para la solución de mi problema. Saludos.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: PIC18F26J50 Problema con USART a 115200 baudios
« Respuesta #5 en: 14 de Abril de 2013, 17:34:36 »
Puedes utilizar uno de estos:

e-bay PL2303 USB To RS232 TTL Converter Adapter Module

http://www.ebay.es/sch/i.html?LH_PrefLoc=2&rt=nc&LH_BIN=1&_nkw=usb+rs232+ttl&_sc=1&_sop=15&_trksid=p3286.c0.m301



El que tengo funciona sin problemas a 115200 baudios.

Saludos.

Desconectado nameless fairy

  • PIC10
  • *
  • Mensajes: 4
    • Mi servidor local
Re: PIC18F26J50 Problema con USART a 115200 baudios
« Respuesta #6 en: 17 de Abril de 2013, 12:35:05 »
Puedes utilizar uno de estos:

e-bay PL2303 USB To RS232 TTL Converter Adapter Module

http://www.ebay.es/sch/i.html?LH_PrefLoc=2&rt=nc&LH_BIN=1&_nkw=usb+rs232+ttl&_sc=1&_sop=15&_trksid=p3286.c0.m301



El que tengo funciona sin problemas a 115200 baudios.

Saludos.


El problema SI era mi conversor despues de todo!! Nunca un problema del micro o de la programación. Cambié mi conversor basado en optocoplador por un MAX232 y ya me va sin problemas a 115200 baudios.

Solo como detalle adicional: nunca tuve que trabajar con el cristal externo de 22,1184 MHz, ya que con el oscilador interno de 8MHz fue suficiente, lo cual me parece sorprendente, ya que significa que un error de 2,124% es aceptable.
Muchas gracias por tu ayuda hermano!
Saludos.
« Última modificación: 17 de Abril de 2013, 13:10:33 por nameless fairy »


 

anything