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..
PLLFBD = 62; // M = 64
_PLLPOST = 0; // N1 = 2
_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
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.pdfya que ese dsPIC se ve que fue reemplazado por el dsPIC33FJ256GP710
AEl unico ue me preocupa es:
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.
#if defined (__dsPIC33F__)
#undef BAUDRATEREG
//#define UDB_BAUD(x) ((int16_t)((FREQOSC / CLK_PHASES) / ((int32_t)4 * x) - 1))
#define BAUDRATEREG ((int16_t)((FREQOSC / CLK_PHASES) / ((int32_t)4 * BAUDRATEX) - 1))
#endif
#define _INIT(x, y) \
void Init(void) \
{ \
U##x##BRG = BAUDRATEREG; \
U##x##MODE = 0; \
U##x##MODEbits.BRGH = BRGHX; \
U##x##STA = 0; \
U##x##MODEbits.UARTEN = 1; \
U##x##STAbits.UTXEN = 1; \
IFS##y##bits.U##x##RXIF = 0; \
}