Ich bin ziemlich neu in PIC und MCUs. Mein Board hat eine PIC24FJ256GA410 MCU mit externem 3,6864-MHz-Quarz. Ich möchte UART1 für Debugging-Zwecke verwenden. Unten ist meine main()
, die nur UART1 initialisiert. Sobald ich jedoch die MCU mit Code programmiere, der aufruft InitUART()
, wird mein Board unprogrammierbar . Bei jedem Programmierversuch kommt es zu einem Fehler beim Programmieren des Geräts . Manchmal schreibt es auch so etwas in die Konsole:
Address: 278 Expected Value: eb0000 Received Value: a90000
oder
The programmer could not be started: Could not connect to tool hardware: ICD3PlatformTool, com.microchip.mplab.mdbcore.ICD3Tool.ICD3DbgToolManager
Ich verwende Microchip ICD3 und MPLAB X IDE zum Programmieren. Wenn ich den Aufruf auskommentiere InitUART()
, kann ich das Board neu programmieren. Was ist das Problem mit meinem Code? Es ist größtenteils identisch mit dem Code aus dem dsPIC33-PIC24 FRM - UART- Datenblatt, außer dass ich keine Standardwerte schreibe. Außerdem habe ich andere Beispiele im Internet gesehen und meine ist ziemlich ähnlich. Ich habe nur den Ausgangspin konfiguriert.
EDIT: Nachdem ich die Zuweisung zu _RP11R
in InitUART()
Funktion kommentiert habe, kann ich das Board jedes Mal erfolgreich programmieren. AFAIK, ich muss auch den Pin für das UART1-Peripheriegerät auswählen. Aber sobald ich das setze _RP11R
, wird das Board unprogrammierbar (und UART1 funktioniert sowieso nicht). Ich bin mir ziemlich sicher, dass dies RP11
der richtige UART-Ausgangspin ist.
#include <xc.h>
#define FOSC 3686400
#define FCY (FOSC/2)
#include <libpic30.h>
#pragma config JTAGEN = OFF
#pragma config GWRP = OFF
#pragma config FWDTEN = OFF
#pragma config ICS = PGx3
#pragma config FWPSA = PR128
#pragma config WDTPS = PS2048
#pragma config FCKSM = CSECMD
#pragma config OSCIOFCN = OFF
#pragma config POSCMOD = XT
#pragma config FNOSC = PRI
#define BAUDRATE 115200
static void InitUART(void)
{
__builtin_write_OSCCONL(OSCCON & 0xbf);
_RP11R = _RPOUT_U1TX;
__builtin_write_OSCCONL(OSCCON | 0x40);
U1BRG = (int) (FCY/(16 * BAUDRATE) - 1);
_U1TXIE = 1;
U1MODEbits.UARTEN = 1;
U1STAbits.UTXEN = 1;
}
void __attribute__((__interrupt__, auto_psv)) _U1TXInterrupt(void)
{
_U1TXIF = 0;
}
int main(void)
{
TRISBbits.TRISB3 = 0;
LATBbits.LATB3 = 0;
InitUART();
int i = 0;
while (1) {
LATBbits.LATB3 = i;
i = !i;
__delay_ms(500);
}
return 0;
}
Ich hatte schlechte Kabelverbindungen. Der TX-Pin wurde mit Masse verbunden.
Mein Kollege sagt: Wenn es nicht funktioniert, Kabel überprüfen. Wenn die Kabel in Ordnung sind und es immer noch nicht funktioniert, überprüfen Sie die Kabel erneut.
ammar.cma
wackelig
wackelig