El problema que tengo es con mi PIC24FJ64GA002 y los módulos UART. El 24F que tengo está en un paquete SPDIP28 y es un nuevo chip B5 (solo uno con la última revisión B8) de Microchip Direct. Revisé los problemas de errata que me afectaron la última vez con el módulo I2C.
De todos modos, estoy configurando el módulo UART1 como un simple transmisor. Estoy usando el pin PPS RP8 como RX, RP9 como TX y RP11 como pin CTS. Por ahora he conectado a tierra RX y CTS ya que no los necesito. Establecí el BRG en 115 200 (tasa real ~ 114 285,7, pero está lo suficientemente cerca). Estoy usando el siguiente código. Espero ver una serie de bytes saliendo en RP9, pero no es así. RB15 es una salida de depuración: pulsa en cada byte que se envía. En RB15 obtengo un reloj realmente lento, alrededor de 700 Hz, que es muy bajo para un enlace de 115 200 baudios; Esperaría unos 14 kHz.
#include <p24fj64ga002.h>
#include <uart.h>
#include <pps.h>
void init_osc()
{
// Must be programmed for FRCPLL mode.
//UNLOCK_OSC();
CLKDIVbits.RCDIV = 0;
//LOCK_OSC();
}
void main()
{
int i = 0x55;
PPSUnLock;
// Initialize oscillator (set FRC to 8 MHz.)
init_osc();
// Initialize UART1 PPS.
iPPSInput(IN_FN_PPS_U1RX, IN_PIN_PPS_RP8);
iPPSInput(IN_FN_PPS_U1CTS, IN_PIN_PPS_RP11);
iPPSOutput(OUT_PIN_PPS_RP9, OUT_FN_PPS_U1TX);
PPSLock;
// Interrupts disabled for now.
//ConfigIntUART1(UART_RX_INT_EN | UART_RX_INT_PR6 | UART_TX_INT_EN | UART_TX_INT_PR6);
OpenUART1(UART_EN & UART_BRGH_SIXTEEN & UART_NO_PAR_8BIT & UART_1STOPBIT, UART_TX_ENABLE, 34);
TRISBbits.TRISB15 = 0;
while(1)
{
LATBbits.RB15 = 1;
LATBbits.RB15 = 0;
while(BusyUART1());
WriteUART1(i);
i++;
}
CloseUART1();
}
Siento que me he perdido algo obvio, pero no puedo entender qué es. Si alguien ha tenido experiencia previa con el módulo UART en dispositivos de la serie 24F, ¡hágamelo saber! He tenido poca suerte con los foros de Microchip.
Consulte la página 110 de la hoja de datos.
Además, debe deshabilitar las entradas analógicas en los pines que está utilizando.
tiblu
Tomas O.
tiblu
UUUU...
, lo que se traduce en1010101010*...
, dando una onda cuadrada de baudios/2. (0*
es un bit de parada, y debe ser un poco más largo que otros0
s.)Tomas O.