Problem mit PIC24F-UART

Das Problem, das ich habe, ist mit meinem PIC24FJ64GA002 und dem/den UART-Modul(en). Der 24F, den ich habe, ist in einem SPDIP28-Gehäuse und es ist ein neuer B5-Chip (nur einer unter der neuesten B8-Revision) von Microchip Direct. Ich habe nach Errata-Problemen gesucht, die mich beim letzten Mal mit dem I2C-Modul geplagt haben.

Wie auch immer, ich richte das UART1-Modul als einfachen Sender ein. Ich verwende PPS-Pin RP8 als RX, RP9 als TX und RP11 als CTS-Pin. Im Moment habe ich RX und CTS geerdet, da ich sie nicht benötige. Ich habe das BRG auf 115.200 gesetzt (tatsächlicher Kurs ~114.285,7, aber es ist nah genug.) Ich verwende den folgenden Code. Ich erwarte, dass eine Reihe von Bytes auf RP9 ausströmen, aber das tue ich nicht. RB15 ist ein Debug-Ausgang: Er pulsiert bei jedem gesendeten Byte. Auf RB15 bekomme ich einen wirklich langsamen Takt, etwa 700 Hz, was für eine 115.200-Baud-Verbindung sehr niedrig ist; Ich würde etwa 14 kHz erwarten.

#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();
}

Ich habe das Gefühl, etwas Offensichtliches übersehen zu haben, kann aber nicht herausfinden, was es ist. Wenn jemand bereits Erfahrungen mit dem UART-Modul auf Geräten der 24F-Serie gemacht hat, lassen Sie es mich bitte wissen! Ich hatte wenig Glück mit den Microchip-Foren.

Ich habe das gerade gestern auch auf dem 24FJ gemacht :) .. Und für Ihr Setup sehen Sie einen 115200/(8+1+1)=11,5kHz Ton.
@tyblu Ah ja ... weil Sie 8 Datenbits haben, 1 Startbit und 1 Stoppbit.
Ich debugge gerne UARTs, indem ich sende UUUU..., was übersetzt bedeutet 1010101010*..., und eine Baud/2-Rechteckwelle ausgibt. ( 0*ist Stoppbit und sollte etwas länger sein als andere 0s.)
@tyblu, gute Idee. Das habe ich auch gemacht. Sie müssen sich jedoch bewusst sein, wenn Sie mit hohen Frequenzen arbeiten, da die Prozessorlatenz zwischen dem Laden des nächsten Bytes zu einem entscheidenden Faktor werden kann. Zum Beispiel fand ich heraus, dass meine MCU bei 115.200 Baud eine Rechteckwelle mit nur einem winzigen Jitter angemessen erzeugen konnte. Bei 2 MBaud hatte es eine beträchtliche Verzögerung zwischen jedem Byte und ähnelte nicht mehr einer Rechteckwelle.

Antworten (1)

Siehe Seite 110 des Datenblatts.

Außerdem müssen Sie die analogen Eingänge an den verwendeten Pins deaktivieren.

Welches Datenblatt? Das FRM für UART, das PIC24F-Datenblatt selbst oder etwas anderes? Das PIC24F-Datenblatt enthält eine Timer-Dokumentation zu 129, und das FRM hat nur 38 Seiten. Vermisse ich etwas? Außerdem dachte ich, dass alle Eingänge standardmäßig digital sind, aber ich werde versuchen, sie trotzdem auszuschalten, danke für den Vorschlag.
Datenblatt für den PIC24FJ64GA002 (39881D.PDF) Sollte Seite 110 sein. Dort wird die analoge Funktion erwähnt.
Ah, es stellte sich heraus, dass das Problem nicht die analogen Eingänge waren, sondern JTAG an den aktivierten Pins (das gleiche wie für I2C). Aber es brachte mich dazu, darüber nachzudenken, ob es sich um einen peripheren Konflikt handelte. Danke! :)