inversión de cuadros UART

1

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

2 respuestas

-1

Parece que tu oscilador no está configurado correctamente. Los bits de OSCCON: IRCF son 110, por lo que le dan un reloj de 8MHz y el cálculo de su velocidad de transmisión se basa en 8MHz. Sin embargo, tienes PLLEN establecido. Esto activa el bucle de bloqueo de fase, produciendo una frecuencia FOSC efectiva de cuatro veces 8MHz = 32MHz.
Intenta

SPBRG1=51
    
respondido por el Kane Anderson
-1

Fue un problema de configuración para la velocidad en baudios, establecí SPBRG1 en 51 y RXDTP (registro BAUDCONx) en 1. En cualquier caso, gracias a todos por su ayuda, les deseo una buena semana :) Aymane

    
respondido por el Bicha_95

Lea otras preguntas en las etiquetas