Autor Tema: programa para testear 2 uart en DSPIC33FJ256GP710-I/PF  (Leído 6184 veces)

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

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
programa para testear 2 uart en DSPIC33FJ256GP710-I/PF
« en: 17 de Abril de 2016, 22:37:24 »
Hola, estoy colabornado en un proyecto open source con ese dsPIC y la verdad que no tengo idea sobre la programacion del mismo. Estaba trabajando en portar el firmware a stm32...
El tema es que hice una placa con ese dsp y necesito probar las 2 uart a 57600. digamos enviar y recibir una serie de datos pero a esa velocidad.
hay algun template de configuracion de oscillador e inicializacion de las uarts? librerías?

gracias
-
Leonardo Garberoglio

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:programa para testear 2 uart en DSPIC33FJ256GP710-I/PF
« Respuesta #1 en: 18 de Abril de 2016, 05:55:04 »
MM no se, pero tenes las librerias de los perifericos ?, Ahora hay que bajarlos aparte a los mismos

http://www.microchip.com/mplab/compilers

Y tambien tenes ahi el MPLAB Code Configurator que imagino que es una especie de CubeMX para ST
Mas info del MCC

http://microchip.wikidot.com/mplabx:mcc
« Última modificación: 18 de Abril de 2016, 05:57:26 por KILLERJC »

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:programa para testear 2 uart en DSPIC33FJ256GP710-I/PF
« Respuesta #2 en: 18 de Abril de 2016, 08:25:04 »
el MCC no soporta los dsPIC!! jaja

tendría que ver aunque sea como configurar el reloj para arrancar.
ya estoy investigando un poco el tema, pero viene muyyy lentoooo

sds!
-
Leonardo Garberoglio

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:programa para testear 2 uart en DSPIC33FJ256GP710-I/PF
« Respuesta #3 en: 18 de Abril de 2016, 08:44:24 »
No me di cuenta que solo decia 24F, Bueno al menos tenes la libreria :P te va a ser mas facil... creo..

Si podes decir un poco mas sobre que frecuencia de entrada tenes, que frecuencia de salida , los baudios ya lo dijiste, solo quedaria eso nomas :P

EDIT: Acabo de ver la libreria y nada sobre el oscilador , ahi te paso un codigo para configurar el oscilador que tengo de otro dsPIC (en el comentario esta como se calcula )


Código: C
  1. void Configuracion_Oscilador(void)
  2. {
  3.     /*
  4.      *  Hay limites de frecuencias a cumplir en cada paso.
  5.      *  7.37Mhz Frc interno , entrada de frecuencia se cumple 0.8Mhz 8.0Mhz
  6.      *  Fin * M/N1 = Fvco = 158Mhz tambien se cumple , 120 a 340 Mhz
  7.      *  Fsalida = Fvco / N2 = 79.22Mhz  cumple con lo establecido, 15 a 120Mhz
  8.      */
  9.    
  10.     PLLFBD = 41;                // M = 43 , observa que se le suma 2 a cada registro para generar los valores M,N1 y N2
  11.     _PLLPOST = 0;     // N1 = 2
  12.     _PLLPRE = 0;      // N2 = 2
  13.    
  14.     __builtin_write_OSCCONH(0x01);              // Nuevo oscilador en FRC con PLL, Aca cambiar segun se necesite al nuevo tipo de oscilador en caso de ser necesario.
  15.     __builtin_write_OSCCONL(OSCCON | 0x01);     // Activo el bit para el cambio de oscilador
  16.    
  17.     // Esperamos el cambio de clock, es decir cuando el oscilador actual pase a ser de FRC a  FRC con PLL, el cual el valor es 001 para FRC con PLL
  18.     while (_COSC != 0b001);
  19.    
  20.     // Esperamos al PLL que se enganche
  21.     while (_LOCK != 1);
  22. }

Recorda que el PIC ese tiene 40MIPS, es decir a 80Mhz maximo puede ir.

Respecto a la UART, como te decia pasame la frecuencia que vas a trabajarlo + pines y te intento pasar el codigo. Ademas si es necesario interrupcion cuando el buffer esta lleno o apenas recibis un caracter. entre otras verduras mas :P

falta el include uart.h que viene con las librerias obviamente y configurar correctamente los baudios.

Código: C
  1. void Configuracion_UARTs(void)
  2. {
  3.    
  4.     uint16_t baudvalue;  
  5.     uint16_t UMODEvalue;
  6.     uint16_t USTAvalue;
  7.    
  8.     CloseUART1();       // Solo por si acaso fue un reset
  9.     CloseUART2();
  10.    
  11.     /*
  12.      * Configuracion de las interrupciones, habilitadas/deshabilitadas
  13.      * y prioridades de las mismas
  14.      */
  15.    
  16.     ConfigIntUART1(UART_RX_INT_EN & UART_RX_INT_PR6 &
  17.                    UART_TX_INT_EN & UART_TX_INT_PR6);
  18.     ConfigIntUART2(UART_RX_INT_EN & UART_RX_INT_PR6 &
  19.                    UART_TX_INT_EN & UART_TX_INT_PR6);        
  20.    
  21.     /*
  22.      * Configuracion de la UART,
  23.      *
  24.      * UxMODE Register:
  25.      * UART_EN : UART habilitada
  26.      * UART_IDLE_CON : Modo de operacion continua en Idle
  27.      * UART_DIS_WAKE : Deshabilitado el Wake-Up por medio de la UART
  28.      * UART_DIS_LOOPBACK: Deshabilito el Loopback, bueno para test, cambiar DIS por EN
  29.      * UART_DIS_ABAUD : Deshabilitado el Auto-Baud
  30.      * UART_NO_PAR_8bit : Sin paridad y 8 bits
  31.      * UART_1STOPBIT : 1 bit de stop
  32.      * UART_IrDA_DISABLE: Desativa la codificacion IrDA
  33.      * UART_UEN_00 : Pines RX y TX usados por el modulo, los demas ( CTS,RTS por el usuario )
  34.      * UART_BRGH_FOUR : High Baud Rate Generator activado
  35.      * UART_MODE_SIMPLEX : Modo Simple sin control de Flujo
  36.      *
  37.      * UxSTA Register:
  38.      * UART_INT_TX_BUF_EMPTY : Interrupcion generado cuando se vacia el buffer
  39.      * UART_IrDA_POL_INV_ZERO : Idle state la salida esta en 0 (al no estar habilitado IrDA se refiere a UxTX )
  40.      * UART_TX_ENABLE : Activamos el Transmisor
  41.      * UART_INT_RX_CHAR : Definimos que el flag se ponga a 1 por cada char que entre, otras opciones 3/4 o full
  42.      * UART_ADR_DETECT_DIS: Deshabilitamos la deteccion de direccion ( aunque con 8 bits no funciona )
  43.      * UART_RX_OVERRUN_CLEAR : Limpiamos el bit de Overrun por si las dudas
  44.      */
  45.    
  46.     UMODEvalue = UART_EN & UART_IDLE_CON &
  47.                   UART_DIS_WAKE & UART_EN_LOOPBACK  &
  48.                   UART_EN_ABAUD & UART_NO_PAR_8BIT  &
  49.                   UART_1STOPBIT & UART_IrDA_DISABLE &
  50.                   UART_UEN_00 & UART_BRGH_FOUR &
  51.                   UART_MODE_SIMPLEX;
  52.    
  53.     USTAvalue  = UART_INT_TX_BUF_EMPTY  & UART_IrDA_POL_INV_ZERO &
  54.                   UART_TX_ENABLE & UART_INT_RX_CHAR &
  55.                   UART_ADR_DETECT_DIS & UART_RX_OVERRUN_CLEAR;
  56.    
  57.     baudvalue = 5;
  58.    
  59.     OpenUART1(UMODEvalue,USTAvalue,baudvalue);
  60.     OpenUART2(UMODEvalue,USTAvalue,baudvalue);
  61. }

Calculo del baudrate:

BRGH alta velocidad:

Baudios = \frac{F_p}{4 * (UxBRG + 1)}

BRGH velocidad standard:

Baudios = \frac{F_p}{16 * (UxBRG + 1)}

Fp es la señal de reloj que entra, es decir Fosc / 2 , en estos PIC ( los de 16 bits ) el Clock es dividido por 2 y no 4 como en sus antecesores.
« Última modificación: 18 de Abril de 2016, 10:03:13 por KILLERJC »

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:programa para testear 2 uart en DSPIC33FJ256GP710-I/PF
« Respuesta #4 en: 18 de Abril de 2016, 10:01:32 »
uuuu, me ahorraste 1 año de estudio mas o menos  :D

Tengo un cristal de 8MHz y el proyecto original trabaja a 16MIPS, podes sacar de ahí las configuraciones?

gracias!
-
Leonardo Garberoglio

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:programa para testear 2 uart en DSPIC33FJ256GP710-I/PF
« Respuesta #5 en: 18 de Abril de 2016, 10:06:25 »
te paso parte del codigo de configuracion en el proyecto original a ver si te sirve:

Código: C
  1. _FOSCSEL(FNOSC_PRIPLL); // pri plus PLL (primary osc  w/ PLL)
  2. _FOSC(FCKSM_CSDCMD &
  3.       OSCIOFNC_OFF &
  4.       POSCMD_XT);
  5. // Clock switching on startup is enabled, starts with fast RC.
  6. // Clock switching after startup is disabled.
  7. // Fail-Safe Clock Monitor is disabled.
  8. // OSC2 pin has clock out function.
  9. // Primary Oscillator XT mode.
  10. _FWDT(FWDTEN_OFF &
  11.       WINDIS_OFF);
  12. _FGS(GSS_OFF &
  13.      GCP_OFF &
  14.      GWRP_OFF);
  15. _FPOR(FPWRT_PWR1);
  16. _FICD(JTAGEN_OFF &
  17.       ICS_PGD2);

Código: C
  1. #if (MIPS == 16)
  2. #warning 16 MIPS selected
  3.         CLKDIVbits.PLLPRE = 0;  // PLL prescaler: N1 = 2 (default)
  4.         CLKDIVbits.PLLPOST = 1; // PLL postscaler: N2 = 4 (default)
  5.         PLLFBDbits.PLLDIV = 30; // FOSC = 32 MHz (XTAL=8MHz, N1=2, N2=4, M = 32)
  6.  
  7. #endif // MIPS
  8.         CLKDIVbits.PLLPOST = 0;     // N1 = 2
  9.         CLKDIVbits.PLLPRE = 0;      // N2 = 2
  10.         OSCTUN = 0;
  11.  
  12.         // Initiate Clock Switch to Primary Oscillator with PLL (NOSC= 0x3)
  13.         __builtin_write_OSCCONH(0x03);
  14.         __builtin_write_OSCCONL(0x01);
  15.         while (OSCCONbits.COSC != 0x3);     // Wait for the Primary PLL to lock
-
Leonardo Garberoglio

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:programa para testear 2 uart en DSPIC33FJ256GP710-I/PF
« Respuesta #6 en: 18 de Abril de 2016, 10:22:43 »
La uart2 esta en los pines 49-50. La uart 1 esta en 51-52.

El tema es que estoy teniendo un problema de comunicacion en mi placa. La uart2 me funciona a 57600 sin problemas, pero la uart1 me funciona a 4800, pero a velocidades mayores no. El tema es que es u proyecto abierto y a todos le funciona bien. Entonces es probable que sea algun problema mío, o de la placa o de las conexiones. Pero para descartar cosas quiero probar con un simple firmware que haga trabajar como sea a las 2 uarts a 57600 a la vez y chequear que la comunicacion no falla. Quizá podría conectar 2 FTDI en las uarts y probar de enviar un archivo por una terminal y recivirlo en la otra y viceverza.... será complicado?
-
Leonardo Garberoglio

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:programa para testear 2 uart en DSPIC33FJ256GP710-I/PF
« Respuesta #7 en: 18 de Abril de 2016, 10:34:45 »
16 MIPS son 32Mhz de salida del oscilador ( siguiendo la politica de 1 Fcy = 1 instruccion )

Elegimos un N2 que para que de entre 120 y 340Mhz, supongamos N2 = 8 y por lo tanto _PLLPRE = 3 ( opciones N2 son 2, 4 y 8, que son valores PPLPRE 0, 1 y 3 respectivamente )

32Mhz * N2 = Fvco = 256Mhz

256Mhz / 8 Mhz = M/N1 = 32

N1 = 2 y M = 64

Rango de N1: 2 a 33
Rango de M: 2 a 513

Por lo tanto..

Código: C
  1. PLLFBD = 62;       // M = 64
  2.     _PLLPOST = 0;     // N1 = 2
  3.     _PLLPRE = 3;      // N2 = 8

Esto te va a dar una Fp de 16Mhz, que si pasara directamente a la CPU serian 16 MIPS, en fin el codigo que posee es correcto igual

  pero.... mas adelante

------------------------------------

Ahora el tema es que la CPU ademas del divido 2 tiene una division mas por adelante. El tema es que no se a ciencia exacta como es para modificarlo. Ya que los bits del DOZE ( el que controla la division ), solo se pueden modificar cuando el bit DOZEN es 0, y para ponerlo en 0 a ese bit hay que activar el bit ROI, este bit solo actua en la interrupcion. Esto solo afecta al nucleo y no a los perifericos!

Sino vas a tener que poner

Código: C
  1. _ROI = 1;

Y apenas entre a la primer interrupcion la CPU va a tener ya los 16Mhz al igual que los puertos. No le encontre otra forma de desactivarlos.


La uart2 esta en los pines 49-50. La uart 1 esta en 51-52.

El tema es que estoy teniendo un problema de comunicacion en mi placa. La uart2 me funciona a 57600 sin problemas, pero la uart1 me funciona a 4800, pero a velocidades mayores no. El tema es que es u proyecto abierto y a todos le funciona bien. Entonces es probable que sea algun problema mío, o de la placa o de las conexiones. Pero para descartar cosas quiero probar con un simple firmware que haga trabajar como sea a las 2 uarts a 57600 a la vez y chequear que la comunicacion no falla. Quizá podría conectar 2 FTDI en las uarts y probar de enviar un archivo por una terminal y recivirlo en la otra y viceverza.... será complicado?

Tal ves sea mejor crear un pequeño firmware simple con el Loopback activo ( es decir RX y TX unidos internamente ) y en la interrupcion contar la cantidad de datos que llegaron, si coinciden o estan proximos ( UART1 y 2) es que van a la misma velocidad, es lo mas simple que se me ocurre. Despues si queres lo sacas hacia afuera por la UART, cuando activas el loopback el pin de RX se desconecta de la UART. Solo queda el pin de TX activo, y ese podrias usar para enviar a la PC por ejemplo.

Si usas la misma configuracion para las 2 UARTs no deberia existir ningun problema y tene en cuenta esto:

http://ww1.microchip.com/downloads/en/DeviceDoc/80446f.pdf

ya que ese dsPIC se ve que fue reemplazado por el dsPIC33FJ256GP710A

El unico ue me preocupa es:

Citar
9. Module: UART
UART receptions may be corrupted if the Baud Rate Generator is set up for 4x mode (BRGH = 1).

Work around

Use the 16x baud rate option (BRGH = 0) and adjust the baud rate accordingly.

Y si lo tuyo es MatrixPilot, observa que usa la formula de alta velocidad BRGH = 1.

Código: C
  1. #if defined (__dsPIC33F__)
  2. #undef BAUDRATEREG
  3. //#define UDB_BAUD(x) ((int16_t)((FREQOSC / CLK_PHASES) / ((int32_t)4 * x) - 1))
  4. #define BAUDRATEREG ((int16_t)((FREQOSC / CLK_PHASES) / ((int32_t)4 * BAUDRATEX) - 1))
  5. #endif
  6.  
  7. #define _INIT(x, y) \
  8. void Init(void) \
  9. { \
  10.         U##x##BRG = BAUDRATEREG; \
  11.         U##x##MODE = 0; \
  12.         U##x##MODEbits.BRGH = BRGHX; \
  13.         U##x##STA = 0; \
  14.         U##x##MODEbits.UARTEN = 1; \
  15.         U##x##STAbits.UTXEN = 1; \
  16.         IFS##y##bits.U##x##RXIF = 0; \
  17. }
« Última modificación: 18 de Abril de 2016, 11:09:22 por KILLERJC »

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:programa para testear 2 uart en DSPIC33FJ256GP710-I/PF
« Respuesta #8 en: 18 de Abril de 2016, 11:16:47 »
ok, voy a probar lo que me pasaste.

El dsPIC original es el A, yo por error compré el que no termina con A.
Por lo que vi en el pdf que pasaste es que no hay error solo de la uart1 (la que me esta fallando) sino que son problemas que aplican a las 2 uarts.

saludos
-
Leonardo Garberoglio

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:programa para testear 2 uart en DSPIC33FJ256GP710-I/PF
« Respuesta #9 en: 18 de Abril de 2016, 12:33:49 »
Por lo que vi en el pdf que pasaste es que no hay error solo de la uart1 (la que me esta fallando) sino que son problemas que aplican a las 2 uarts.

Debo recalcarte el "may" del datasheet, puede que si y puede que no xD. Pero eso no te modificaria la cantidad de baudios, sino posibles problemas en la recepcion.

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:programa para testear 2 uart en DSPIC33FJ256GP710-I/PF
« Respuesta #10 en: 18 de Abril de 2016, 13:38:54 »
me pasarías un main.c con los includes y fuses así pruebo?

gracias!
-
Leonardo Garberoglio

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:programa para testear 2 uart en DSPIC33FJ256GP710-I/PF
« Respuesta #11 en: 18 de Abril de 2016, 14:25:48 »
Dame un tiempo que lo hago.

EDIT:

https://drive.google.com/open?id=0B1v4IhprZLsqOUUzN0VwZzBMSnc

Esta un poco rebuscado... pero bueno, imagino que debe de hacerlo de forma correcta.

Explico un poco el tema. Puse en RB0 una salida cada medio segundo, para indicar su funcionamiento nada mas.
Se configura el oscilador, se configura las UART en LOOPBACK, es decir la recepcion esta "desconectada", procedo a enviar inicialmente 4 valores a cada UART.

La interrupcion se genera cada 3 datos recibidos ( de 4 lugares en el buffer, aunque recien me acuerdo que es necesario borrar el bit de overrun cada tanto segun el errata ), recibe los 3 datos y procedo a enviar otros 3 datos mas. aumentado el indice de lo enviado.

Esto es igual para ambas UART, cualquiera de ellas que llegue primero a los 30000 datos enviados, sea cual sea, procede a deshabilitar todas las interrupciones y salir. De esa forma no se le envia nada mas a las UARTs y no se incrementan los contadores.

Finalmente en el main pregunto si se llego a los 30000 datos y aprovecho la UART1 para empezar a enviar la diferencia entre los 2 contadores. Le puse 10 lugares solo por exagerado ya que deberia detener cuando cualquiera sea mayor a 30000, y no necesitaria mas de 6 lugares. La funcion utoa (unsigned to ascii) fue sacada del source que provee Microchip para xc8. La copie para que no tengas problemas buscandola.

Solo necesitas la libreria de perifericos de dsPIC ( 17Mb ) que te habia pasado antes.
« Última modificación: 18 de Abril de 2016, 16:00:40 por KILLERJC »

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:programa para testear 2 uart en DSPIC33FJ256GP710-I/PF
« Respuesta #12 en: 18 de Abril de 2016, 14:49:14 »
sin apuro, recien comenté la errata sheet y esto me dijeron:

"Leonardo,
Item 19 on the errata sheet applies to mp firmware. It explains why you are having trouble with the uart. We are using the 4x mode, it is the only way to get the baud rates we want with the clock rates that we are using.
Bill"

así que es muy probable que sea por no usar el 710A. de todos modos me gustaría probarlo en algún momento.

gracias!
-
Leonardo Garberoglio

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:programa para testear 2 uart en DSPIC33FJ256GP710-I/PF
« Respuesta #13 en: 18 de Abril de 2016, 16:03:23 »
Citar
"Leonardo,
Item 19 on the errata sheet applies to mp firmware. It explains why you are having trouble with the uart. We are using the 4x mode, it is the only way to get the baud rates we want with the clock rates that we are using.
Bill"

Si pero con 16x se puede lograr un baudrate aproximado... aunque la diferencia es algo asi de 900 baudios (58523 baudios, un error de 0.21% ), esta escrito en main.c

A no ser que modifique el valor del PLL para que la frecuencia de salida del mismo provoque menos error en el mismo. Cualquier cosa me avisas y lo hago, es solo modificar los 3 registros esos, te paso los numeros y listo, o lo calculas vos, como quieras. Eso si, no van a ser 16MIPS tal ves.. pero te vas a sacar las dudas de al menos eso.

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:programa para testear 2 uart en DSPIC33FJ256GP710-I/PF
« Respuesta #14 en: 18 de Abril de 2016, 16:21:48 »
Citar
"Leonardo,
Item 19 on the errata sheet applies to mp firmware. It explains why you are having trouble with the uart. We are using the 4x mode, it is the only way to get the baud rates we want with the clock rates that we are using.
Bill"

Si pero con 16x se puede lograr un baudrate aproximado... aunque la diferencia es algo asi de 900 baudios (58523 baudios, un error de 0.21% ), esta escrito en main.c

A no ser que modifique el valor del PLL para que la frecuencia de salida del mismo provoque menos error en el mismo. Cualquier cosa me avisas y lo hago, es solo modificar los 3 registros esos, te paso los numeros y listo, o lo calculas vos, como quieras. Eso si, no van a ser 16MIPS tal ves.. pero te vas a sacar las dudas de al menos eso.

Pensé que cuando supieran que el error era por haver comprado mal el dsPIC me iban a mandar al demonio, x q hace un tiempo que estamos luchando con este tema, pero no. A la noche me pasan un parche (si es que se puede) para, justamente como vos decis, pasar a 16x pero reviendo el tema de los MIPS y demás. El problema es que hay varias cosas que dependen de los MIPS, entonces creo que tiene que ser 16, 32 o 40 MIPS ya que algunos cálculos y tiempos salen de usar alguno de esos MIPS...
-
Leonardo Garberoglio