USART在atmega 328p上给出了未知数值

时间:2017-05-06 20:23:10

标签: embedded avr atmega usart

我无法解决简单的USART发送/接收程序。问题是我过去使用它并且毫不费力地工作但是现在它在我的Linux机器问号和窗口中返回一些盒子和汉字。我不明白改变了什么。我已经尝试了很多不同的东西,比如改变代码和部分,但似乎没有什么能解决它。

我正在使用AVR atmega 328p和pololu usb程序员。我从windows中的atmel工作室和linux中的avrdude中刷过它。

以下是代码:

#define F_CPU 1000000
#define BAUD 9600

#include <avr/io.h>
#include <util/delay.h>
#include <util/setbaud.h>


void init_USART(void);
void transmit_Byte(char data);
char receive_Byte(void);

int main(void)
{
    char TEST;
    init_USART();                               /* Initialize USART */

    while (1) 
    {

        TEST =  receive_Byte();
        transmit_Byte(TEST);

    }
}


void init_USART(void)
{
    UBRR0H = UBRRH_VALUE;                       
    UBRR0L = UBRRL_VALUE;

    #if USE_2x
        UCSR0A |= (1 << U2X0);
    #else
        UCSR0A &= ~(1 << U2X0);
    #endif

    UCSR0B = (1 << TXEN0) | (1 << RXEN0);           /* Enable USART 
                                                    transmitt/receive */
    UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);         /* 8 data bits, 1 stop 
                                                            bit */ 
}

void transmit_Byte(char data)
{
    loop_until_bit_is_set(UCSR0A, UDRE0);           /* Wait for empty 
                                                    transmit buffer */
    UDR0 = data;
}

char receive_Byte(void)
{
    loop_until_bit_is_set(UCSR0A, RXC0);
    return(UDR0);
}

这是我的第一个问题,所以如果我做错了,我会提前道歉。

非常感谢你的时间!

编辑:我尝试过ftdi232和mcp2221

编辑2:After addin UL仍未按预期进行,但未知的字符较少。

解决:但我不明白为什么。我将保险丝CKDIV8更改为1并开始工作。数据表显示出厂时的时钟频率为8 MHz,CKDIV8 = 0,因此设置为1 MHz。那它为什么反转呢?我之前也试过clock_prescale_set(clock_div_8);,因为数据表建议进行预定标,但它也没有用。

设置CLDIV8和avr / power.h函数有什么区别?

0 个答案:

没有答案