Problema con PIC24F UART

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.

Acabo de hacer esto en el 24FJ, ayer también :) .. Y para su configuración verá un tono de 115200/(8+1+1)=11.5kHz.
@tyblu Ah, sí... porque tienes 8 bits de datos, 1 bit de inicio y 1 bit de parada.
Me gusta depurar los UART enviando UUUU..., lo que se traduce en 1010101010*..., dando una onda cuadrada de baudios/2. ( 0*es un bit de parada, y debe ser un poco más largo que otros 0s.)
@tyblu, Buena idea. Yo también hice eso. Sin embargo, debe tener en cuenta que cuando trabaja a altas frecuencias, la latencia del procesador entre la carga del siguiente byte puede convertirse en un factor decisivo. Por ejemplo, descubrí que a 115 200 baudios, mi MCU podía producir adecuadamente una onda cuadrada con solo una pequeña fluctuación. A 2 Mbaudios, tenía un retraso considerable entre cada byte y ya no se parecía a una onda cuadrada.

Respuestas (1)

Consulte la página 110 de la hoja de datos.

Además, debe deshabilitar las entradas analógicas en los pines que está utilizando.

¿Qué hoja de datos? ¿El FRM para UART, la propia hoja de datos PIC24F o algo más? La hoja de datos de PIC24F tiene alguna documentación del temporizador en 129, y el FRM solo tiene 38 páginas, ¿me estoy perdiendo algo? Además, pensé que todas las entradas eran digitales por defecto, pero intentaré apagarlas de todos modos, gracias por la sugerencia.
Hoja de datos para el PIC24FJ64GA002 (39881D.PDF) Debe ser la página 110. La función analógica se menciona allí.
Ah, resulta que el problema no eran las entradas analógicas, sino que JTAG en los pines estaba habilitado (lo mismo que para I2C). Pero me hizo pensar en que se trataba de un conflicto periférico. ¡Gracias! :)