Autor Tema: Error grande en USART pic32mx360l512  (Leído 2976 veces)

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

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Error grande en USART pic32mx360l512
« en: 23 de Febrero de 2019, 14:20:12 »
Buenas, a ver si alguien me ayuda por que me tiene esto un poco mosca..

  El problema es que un simple "eco" usart se envian bien algunas letras, pero otras son desastrozas.

Por ejemplo, las letras "HIJKLMOPYU" se envían muy bien, aunque si envías muchas seguidas algunas salen mal también.

 Pero otras como la "DFGERXCV" no salen ni de broma, llegan a la terminal corruptas.

 La "F" por ejemplo me devuelve una "v" minúscula
 LA "A" me devuelve una "q".

  Si intento enviar una string entonces ya Coolterm me tumba un "Frame error" y fuera conexión.


    Y así llevo toda la tarde peleándome con el UxBRG y según hoja de datos, teniendo un clock a 80 Mhz y una frecuencia de PBCLK de la mitad (40 Mhz) debería conseguir un baudrate de 9600 al 0,16% de error dando un valor UxBRG de 259.

    Pero no hay manera.

 ¿ Alguna sugerencia??

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Error grande en USART pic32mx360l512
« Respuesta #1 en: 24 de Febrero de 2019, 17:44:11 »
Bueno. De momento he solucionado habilitando el AutoBaudRate, enviándole el 0x55 y entonces ya a partir de ahí el micro “lo clava” va de lujo.

 Luego leo el registro UxBRG y anoto el valor que le ha asignado el auto.

  Ahora lo que tengo que trabajar es el por que la cifra que da para que vaya bien no tiene nada que ver con lo que dan las tablas ni los cálculos.

   Así que, solucionado parcialmente.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Error grande en USART pic32mx360l512
« Respuesta #2 en: 24 de Febrero de 2019, 18:07:48 »
Podes pasar todos los parametros ( bits de configuracion que tengan que ver con los baudios) como los tenes y tambien la Frecuencia del oscilador ?

Asi como el nuevo valor que te da el UxBRG ?

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Error grande en USART pic32mx360l512
« Respuesta #3 en: 25 de Febrero de 2019, 03:33:23 »
Si. Luego cuando esté en casa lo pongo todo.

  De todas formas ayer ya en la cama haciendo cálculos con el móvil por encima y viendo lo que me da el AutoBaude me sale que da justo el doble de lo calculado.

 Es decir, si a mi me da 250 de BRG, el autobaude da 500.

 Creo que la clave está en el PBCLK ( frecuencia clock de los perisfericos) debe ir a la mitad que el clock pero no es así.

 Luego pongo todo los datos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Error grande en USART pic32mx360l512
« Respuesta #4 en: 26 de Febrero de 2019, 15:36:44 »
Creo que la clave está en el PBCLK ( frecuencia clock de los perisfericos) debe ir a la mitad que el clock pero no es así.

Es configurable... Es decir podes elegir un preescaler en 1,2,4 y 8, siendo el 8 el default.

Desconectado AccioRw

  • PIC16
  • ***
  • Mensajes: 165
Re:Error grande en USART pic32mx360l512
« Respuesta #5 en: 27 de Febrero de 2019, 06:54:39 »
Debe ser algún problema de configuración donde te hayas equivocado con algún parámetro, prueba con velocidades muy bajas si tienes la posibilidad y queda activo solo lo básico para que funcione si te empiezas a desesperar mucho ;)

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Error grande en USART pic32mx360l512
« Respuesta #6 en: 27 de Febrero de 2019, 13:42:51 »
Mira, adjunto codigo completo. Aqui está activado el autobaud por lo que este programa al final funciona bien, pero si elimino el autobaud, con lo que calcula la formula que hay definida no funciona el UART. Funcionar, funciona, simplemente a otro baudrate que parece ser la mitad del esperado.

 Un saludo.


Código: C
  1. #include <p32xxxx.h>
  2. #define _SUPPRESS_PLIB_WARNING         // Elimina los warning de aviso de que estas librerias dejarán de estar disponible en futuras versiones.
  3. #include <plib.h>                      //Librería de periféricos
  4. #include <stdio.h>
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12. #pragma config FNOSC = PRIPLL, POSCMOD = HS, FPLLMUL = MUL_18, FPLLIDIV = DIV_2, FPBDIV = DIV_2, FPLLODIV = DIV_1
  13. #pragma config FWDTEN = OFF
  14.  
  15.  
  16. #define SYSCLK         (72000000)
  17. #define PBCLK          (SYSCLK/2)
  18.  
  19. #define DESIRED_BAUDRATE       (115200)      //The desired BaudRate
  20.  
  21. // calculate actual BAUD generate value.
  22. #define BAUD_VALUE    ((PBCLK/16/DESIRED_BAUDRATE)-1)
  23.  
  24.  
  25.  
  26. void spi_ini();   // INICIALIZA EL MODULO SPI
  27. void delay_ms(unsigned long);   // implementa función de retardo.
  28. void lcdprint(char texto[]);     // imprime texto via puerto SPI.
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35. int main(void)
  36. {
  37.    unsigned char data = 0;
  38.    SYSTEMConfigPerformance(72000000L);
  39.    OpenUART2(UART_EN, UART_RX_ENABLE | UART_TX_ENABLE, BAUD_VALUE );
  40.    U2MODE = 0b00000000000000001110100000100001;      // AutoBaudRate Habilitado.
  41.  
  42.    spi_ini();
  43.    
  44.    int a = 0;
  45.  
  46.    while(a <=10)        // Recibe diez caracteres y los repite  ( Función Eco para probar el modulo y la comunicación UART))
  47.    {
  48.       while(!DataRdyUART2());   // Espera a que haya un caracter en el buffer de recepción.
  49.       data = (char)ReadUART2(); // lee y carga el caracter en variable.
  50.      
  51.       while(BusyUART2()); /* Wait till the UART transmitter is free. */
  52.       putcUART2(data); /* Write data into Tx. */
  53.       a++;
  54.    }
  55.      
  56.    
  57.    lcdprint("IMPRIME ESTE TEXTO VIA SPI\0");
  58.    
  59.    while(1);
  60.    
  61.    
  62.  
  63.    return 0;
  64. }
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73. void spi_ini() {
  74.     unsigned int config=SPI_CON_MODE8|SPI_CON_SMP|SPI_CON_ON|SPI_OPEN_MSTEN;  // SPI configuration word
  75.     SpiChnOpen(1, config, 128);    // Canal SPI, configuración y velocidad (Divisor de PBCLC)
  76. }
  77.  
  78.  
  79.  
  80. void delay_ms(unsigned long retardo) {
  81.     unsigned long i = 0;
  82.     for (i=0;i<=retardo;i++);
  83.    
  84.    
  85.    
  86. }
  87.  
  88.  
  89.  
  90.  
  91. void lcdprint(char texto[]) {                                     // Esta función  debería terminar cuando [i] apunte al caracter NULL, pero no lo hace, simplemente no se detiene, la frase sale entera, incluido el NULL
  92.                                                                    // Pero luego sigue enviando 0xFF,0xFF sucesivamente de forma infinita,
  93.     int i;
  94.    
  95.     while(texto[i] != '\0') SpiChnPutC(1,texto[i++]) ;
  96.                              
  97.                                                      
  98.                    
  99. }
  100.    
  101.  /*  
  102.  void lcdprint(char texto[]) {            // Esta función si que funciona perfectamente. El IF vé perfectamente el NULL y se cumple el break;
  103.    
  104.     int i;
  105.   for (i=0;i<1000;i++) {
  106.                         SpiChnPutC(1,texto[i++]) ;
  107.                         if (texto[i] == '\0') break;
  108.                        }                                              
  109.                    
  110. }
  111. */


 

anything