PIC16F887接收错误的UART数据

PIC16F887接收错误的UART数据,c,pic,uart,C,Pic,Uart,我正在用C(XC8)制作一个清洁机器人,我在UART上遇到了一些问题。让我解释一下: 该项目在PIC16F887和HC06之间实现了UART通信。在此之前,该项目有一个PIC16F1455,工作得很好。但我需要更多,并改变了微观。 使用基于Android的应用程序(我从不更改,我知道它工作正常),我通过蓝牙向HC06发送一个字符。通过UART,HC06将字符发送到pic,我根据数据更改了一个名为“Pressed”的变量 所以。。。我配置了所有东西,更改了新pic的寄存器,放置了一个LED,以知道

我正在用C(XC8)制作一个清洁机器人,我在UART上遇到了一些问题。让我解释一下:

该项目在PIC16F887和HC06之间实现了UART通信。在此之前,该项目有一个PIC16F1455,工作得很好。但我需要更多,并改变了微观。 使用基于Android的应用程序(我从不更改,我知道它工作正常),我通过蓝牙向HC06发送一个字符。通过UART,HC06将字符发送到pic,我根据数据更改了一个名为“Pressed”的变量

所以。。。我配置了所有东西,更改了新pic的寄存器,放置了一个LED,以知道我是否在每次接收中断中接收到了一些东西(我这样做),但变量从未更改(我想我正在接收垃圾数据),我使用了一个简单的“data==data”函数来更改变量。我猜:问题是波特率。HC06需要9600,而我的就不一样了

波特率需要pic频率和一些寄存器更改,对吗

我需要找出为什么我的波特率不是9600,你能帮我吗?

下面是我的一些代码,从配置位开始。我将使用内部振荡器和8MHz:

 PIC16F887 Configuration Bit Settings

// CONFIG1
#pragma config FOSC = INTRC_NOCLKOUT // Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // RE3/MCLR pin function select bit (RE3/MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = OFF      // Brown Out Reset Selection bits (BOR disabled)
#pragma config IESO = OFF       // Internal External Switchover bit (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
#pragma config LVP = OFF         // Low Voltage Programming Enable bit

// CONFIG2
#pragma config BOR4V = BOR21V   // Brown-out Reset Selection bit (Brown-out Reset set to 2.1V)
#pragma config WRT = OFF        // Flash Program Memory Self Write Enable bits (Write protection off)
下面是主要功能

void main(void){

    GeneralConfig(); //Configuración general.
    BrushStart = 1; //Activamos el cepillo.
    TRISBbits.TRISB0 = 0; //TEST LED
    RB0 = 0; //TEST LED

    while(1){

        //THIS IS ANOTHER TEST
        if(Pressed==1){RB0 = 1;}
        else if(Pressed==2){RB0 = 0;}

    } //Bucle infinito.

    return;
}
这里的要点是:按下时为1,LED亮起;按下时为0,LED熄灭。现在,根据数据表,我要把OSCCON换成8MHz的内部振荡器

//Oscilador
OSCCON = 0b01110101; //Internal 8MHz
现在,使用我的频率,我正在配置USART:

void USARTConfig(void){ //USART Configuration

    //BAUDRATE (9600) = Fosc/(64*(SPBRG+1))

    BAUDCTL = 0b00000000;
    BRGH = 0;
    SPBRG = 12; 
    TXSTA = 0b10100110;
    RCSTA = 0b10010110; 

}
这应该给我9600波特率。数据表第12.3节中甚至有一个表(表12-5):8MHz,BRGH=0,BRG16=0,SPBRG=12-->波特=9600

以防万一,这是我的接待代码:

int USARTRead(char *Rxdata){

    int j=0;

    while(PIR1bits.RCIF){

            if(RCSTAbits.OERR == 1) //Overrun error           
               {RCSTAbits.CREN = 0; //Clear overrun error (disable receiver)                              
                RCSTAbits.CREN = 1;} //Enable receiver       
            if(RCSTAbits.FERR == 1) //Framing error bit
               {RCSTAbits.SPEN = 0; //Serial Port Disable
                RCSTAbits.SPEN = 1;}

            Rxdata[j]=RCREG; 
            j++;

        }

    return j;

}
以下是我如何处理接收到的数据:

void ReceiveControl(char *Rxdata){

    if(DataCompare(Rxdata, "M",1)){
        ManualMode = 1;
        //BrushStart = 0;
        //Stop();
    }
    else if(DataCompare(Rxdata, "A",1)){       
        ManualMode = 0;
    }

    else if(DataCompare(Rxdata, "U",1)){Pressed = 1;} //Forward
    else if(DataCompare(Rxdata, "D",1)){Pressed = 2;} //Backward
    else if(DataCompare(Rxdata, "L",1)){Pressed = 3;} //Left
    else if(DataCompare(Rxdata, "R",1)){Pressed = 4;} //Right
    else if(DataCompare(Rxdata, "S",1)){Pressed = 0;} //Stop
    else if(DataCompare(Rxdata, "B",1)){BrushStart = 1;} //Brush Start
    else if(DataCompare(Rxdata, "X",1)){BrushStart = 0;} //Brush Stop


}
最后,我如何比较收到的数据:

int DataCompare(unsigned char Buffer[], unsigned char Data[], unsigned int length){

    int i = 0;

    while(i<length){
        if(Buffer[i] == Data[i]){

            i++;
            if(i==length){

                return 1;
            }   
        }
        if(Buffer[i] != Data[i]){

            i=length;
            return 0;
        }           
    }
}
int-DataCompare(无符号字符缓冲区[],无符号字符数据[],无符号整数长度){
int i=0;

虽然(i我可能错了,但我认为你设置BRGH是错误的

根据报告,我有:

因此,如果您设置了
BRGH=0
,然后执行
TXSTA=0b10100110
,则您将BRGH(位2)重写为1,这意味着您需要除以16来计算波特率

如果将12加载到SPBRG(等式中的
n
),则可能以38.4k的速度运行,而不是以9.6kbaud的速度运行

在调试UART时,我发现绝对有必要在手边放一个示波器来查看信号


你问题的第一句话为你赢得了一票。

你是对的。我在TXSTA中再次设置BRGH,但我没有看到。我可能会迷失在其中。现在一切都很好。我的感谢。是的,发生了……但这就是我们在这里的目的。祝你的机器人好运。