Soy bastante nuevo en PIC y MCU. Mi placa tiene PIC24FJ256GA410 MCU con cristal externo de 3.6864 MHz. Me gustaría usar UART1 para fines de depuración. A continuación se muestra mi main()
que solo inicializa UART1. Sin embargo, una vez que programo el MCU con un código que llama a InitUART()
, mi placa se convierte en no programable . Cada intento de programación me da el error Error al programar el dispositivo . Además, a veces, escribe algo como esto en la consola:
Address: 278 Expected Value: eb0000 Received Value: a90000
o
The programmer could not be started: Could not connect to tool hardware: ICD3PlatformTool, com.microchip.mplab.mdbcore.ICD3Tool.ICD3DbgToolManager
Estoy usando Microchip ICD3 y MPLAB X IDE para la programación. Si comento la llamada InitUART()
, puedo programar el tablero nuevamente. ¿Cuál es el problema con mi código? Es casi idéntico al código de la hoja de datos de dsPIC33-PIC24 FRM - UART , excepto que no escribo los valores predeterminados. Además, he visto otros ejemplos en Internet y mi es bastante similar. Configuré solo el pin de salida.
EDITAR: Después de comentar la asignación a _RP11R
en la función InitUART()
, puedo programar con éxito el tablero cada vez. AFAIK, necesito seleccionar pin para el perferial UART1 también. Pero una vez que configuro el _RP11R
, la placa se convierte en no programable (y UART1 no funciona de todos modos). Estoy bastante seguro de que RP11
es el pin de salida de UART correcto.
#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;
}