Estoy intentando crear un programa que contenga UART utilizando el dispositivo PIC18f25j50 . He adjuntado mi creación hasta ahora, que es un programa simple que genera un solo carácter repetidamente en la consola de una PC. El problema es que la consola muestra un carácter diferente (~) al seleccionado. Este carácter se mantiene igual a pesar del cambio de carácter seleccionado (por ejemplo, "M" - > "þ ~", "g" - > "þ ~").
Mi idea es que tiene algo que ver con el reloj o la velocidad en baudios, pero no veo ningún error. Tengo un cristal de 8 MHz conectado y los fusibles están configurados para que no haya PLL. La ecuación de la velocidad en baudios es correcta dado que deseo que el periférico sea asíncrono, de 8 bits y de baja velocidad (P.327 de la hoja de datos vinculada).
¿Alguien tiene alguna idea de dónde está el error o tiene ideas para intentar solucionarlo?
#include <xc.h>
#pragma config WDTEN = OFF // Watchdog Timer (Disabled - Controlled by SWDTEN bit)
#pragma config PLLDIV = 2 // PLL Prescaler Selection bits (Divide by 2 (8 MHz oscillator input))
#pragma config STVREN = ON // Stack Overflow/Underflow Reset (Enabled)
#pragma config XINST = OFF // Extended Instruction Set (Disabled)
#pragma config CPUDIV = OSC1 // CPU System Clock Postscaler (No CPU system clock divide)
#pragma config CP0 = OFF // Code Protect (Program memory is not code-protected)
#pragma config OSC = HS // HS
#pragma config T1DIG = ON // T1OSCEN Enforcement (Secondary Oscillator clock source may be selected)
#pragma config LPT1OSC = OFF // Low-Power Timer1 Oscillator (High-power operation)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor (Disabled)
#pragma config IESO = OFF // Internal External Oscillator Switch Over Mode (Disabled)
#pragma config WDTPS = 1 // Watchdog Postscaler (1:1)
#pragma config DSWDTOSC = INTOSCREF// DSWDT Clock Select (DSWDT uses INTRC)
#pragma config RTCOSC = T1OSCREF// RTCC Clock Select (RTCC uses T1OSC/T1CKI)
#pragma config DSBOREN = OFF // Deep Sleep BOR (Disabled)
#pragma config DSWDTEN = OFF // Deep Sleep Watchdog Timer (Disabled)
#pragma config DSWDTPS = G2 // Deep Sleep Watchdog Postscaler (1:2,147,483,648 (25.7 days))
void tx_data(unsigned char);
#define FREQ 8000000 // Frequency = 8MHz
#define baud 9600
#define spbrg_value (((FREQ/64)/baud)-1)
void main()
{
TRISCbits.TRISC6 = 0; // TX pin set as output
TRISCbits.TRISC7 = 1; // RX pin set as input
TXSTAbits.TX9=0;
RCSTAbits.RX9=0;
TXSTAbits.SYNC=0;
TXSTAbits.BRGH=0;
BAUDCONbits.BRG16=0;
SPBRG=spbrg_value; // Fill the SPBRG register to set the Baud Rate
RCSTAbits.SPEN=1; // To activate Serial port (TX and RX pins)
TXSTAbits.TXEN=1; // To enable transmission
RCSTAbits.CREN=1; // To enable continuous reception
while(1)
{
tx_data('m'); // Transmit the same data back to PC
}
}
void tx_data(unsigned char data1)
{
TXREG=data1;
while(TXSTAbits.TRMT==0);
}