为什么在给出正确的输出和具有相同波特率的正常模式时将uart设置为双速模式并不在atmega32中?

时间:2018-02-20 11:49:24

标签: embedded avr atmega avr-gcc atmega16

要获得正确的输出,我必须将U2X位设置为1,当我将其设置为零并更改UBRR寄存器的值时,输出没有意义。 我检查过我是否使用了数据表中的正确值,但它没有在U2X = 0时给出正确的输出。

我的.h文件

#ifndef USRAT_TEST_H_
#define USRAT_TEST_H_

#include <avr/io.h>
void USRAT_INIT(uint16_t bd);
char USRAT_RECIEVE_CHR(void);
void USRAT_SEND_CHR(char c);
#endif /* USRAT_TEST_H_*/

我的.c文件

#include <avr/io.h>
#define F_CPU 2000000UL
#include <util/delay.h>
#include "USRAT_TEST.h"
void USRAT_INIT(uint16_t bd)
{
    UCSRA = (1<<U2X);//when removing this line and edit F_CPU/8 to F_CPU/16 things go wrong
    UCSRB|=(1<<RXEN)|(1<<TXEN);// enable send and receive
    UCSRC|=(1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);//8-bit width 
    UBRRL=(F_CPU/8/bd-1);
    UBRRH=(F_CPU/8/bd-1)>>8;
    }
char USRAT_RECIEVE_CHR()
{
    while((UCSRA&(1<<RXC))==0)
    {

    }
    return UDR;
}
void USRAT_SEND_CHR(char c)
{
while((UCSRA&(1<<UDRE))==0)
{

}
 UDR=c;


}

main.c文件

    #include <avr/io.h>
#define F_CPU 2000000UL
#include <util/delay.h>
#include "USRAT_TEST.h"
#include <stdio.h>
char data;
int main(void)
{
        USRAT_INIT(9600);
    /* Replace with your application code */
    while (1) 
    {
        data = USRAT_RECIEVE_CHR(); 
        USRAT_SEND_CHR(data); 
                    }
}

这是一个简单的模拟我将2个虚拟终端添加到我的AVR ....当我将U2X设置为0并在写入时从数据表中写入值&#34; a&#34;或者其他人中的任何角色,我都会遇到另一个错误的租船人。

我从数据表中直接获取了UBBR的值,您可以在没有公式F_CPU/8/bd-1的情况下尝试将它们直接放在表格中。

你能告诉我U2X对同一波特率的影响是什么? 或何时将U2X设置为1或零??????

enter image description here

1 个答案:

答案 0 :(得分:0)

再看一下数据表中的示例,看看UBRR如何与波特率和时钟相关。你会看到像#define MYUBRR FOSC/16/BAUD-1这样的东西。您的代码计算UBRR将时钟除以8而不是16,因此要使UART正常工作,您必须将时钟加倍。