Tengo un problema cuando envío algún carácter desde un hiperterminal a través de un marco uart, recibo el carácter incorrecto. Yo uso un PIC 18F46K80. En alguna prueba que hice, obtuve estos resultados:
Prueba 1:
Carácter enviado: 'A' (=1000001)
Carácter recibido: '_' (=01011111)
Prueba 2:
Carácter enviado: 'B' (=1000010)
Carácter recibido: '/' (=101111)
Prueba 3:
Carácter enviado: 'C' (=1000011)
Carácter recibido: '^' (=1011110)
No sé cuál es la lógica de la transmisión. Usted puede encontrar debajo de mi código:
#include <stdio.h>
#include <stdlib.h>
#include <usart.h>
#include <math.h>
#include <p18f46k80.h>
//CPU Configuration
#pragma config FOSC = INTIO1 // internal oscillitor
//#pragma config BOREN = ON // Enable Brown-out Reset
#pragma config WDTEN = OFF // Watchdog timer is disabled
#pragma config XINST = OFF // CPU Extended mode is disabled
typedef unsigned char bool;
#define true 1
#define false 0
unsigned char msgData[100];
unsigned char cTemp;
unsigned char cTemp_0;
int i=0;
void ports_IO_init();
void init_UART();
void FOSC_Config();
void start_UART();
void main()
{
bool b=0;
int J=0;
unsigned char len=0;
start_UART();
while(1)
{
if (PIR1bits.RC1IF==1)
{
cTemp = RCREG;
}
}
}
void ports_IO_init()
{
TRISCbits.TRISC6 = 0; //Le port RC6 en sortie TX1
TRISCbits.TRISC7 = 1; //Le port RC7 en entrée RX1
}
void init_UART()
{
//Configuration of TX
TXSTA1bits.TX9 = 0; //8-Bit Transmit Enable
TXSTA1bits.TXEN = 1; //Transmit is enabled
TXSTA1bits.SYNC = 0; // Asynchronous mode
TXSTA1bits.SENDB = 1; //Sends Sync Break on next transmission
TXSTA1bits.BRGH = 0; //Baud rate selected at high speed
//Configuration of RX
RCSTA1bits.SPEN = 1; //Serial port is enabled
RCSTA1bits.RX9 = 0; // 8 bits reception
RCSTA1bits.CREN = 1; //Enable receiving
//Configuration du bauderate
//For a FOSC of 8 MHz, a desired baud rate of 9600, in Asynchronous mode, and 8-bit BRG
// SBRG1 = ((FOSC/Desired Baude Rate)/64)-1 ((8000000/9600)/64)-1 = 12
SPBRG1 = 12; // 12 = 0xC in Hex
}
void FOSC_Config()
{
// Configuration for a frequency of 8Mhz
OSCCONbits.IRCF = 110;
OSCCONbits.SCS1 = 1;
OSCCON2bits.SOSCRUN=1;
OSCCON2bits.SOSCDRV=1;
OSCCON2bits.SOSCGO=1;
OSCTUNEbits.INTSRC= 1;
OSCTUNEbits.PLLEN = 1;
}
void start_UART(void)
{
FOSC_Config();
ports_IO_init();
init_UART();
}