atmega16串口通讯无法正常工作(uart_send和uart_receive)

时间:2016-05-31 06:41:46

标签: c arduino embedded avr uart

我正在尝试使用Atmega16与Android应用程序之间进行通信(只是为了发送一个字符然后再接收它)。

我能够使用arduino和app在BLE之间传输数据,但是当我使用atmega16微控制器时,它无法正常工作。当我试图发送一个角色并收回它时,一些角色正在准确地回来(0 to 9,q,w,r,t,y,u,p,z,s,x,v,:,^,=,?,;),但其他角色则没有。

我认为问题在于我的波特率和CPU频率。我尝试了很多组合,但没有一个完全恢复整个字符。 这些是我的uart初始化和中断函数

我使用了CPU频率14.7456MHz和波特率230.5k。我尝试在9600频率使用波特率8Mhz但是对于这些值,随机垃圾值会回来。

#define F_CPU 14745600UL
#define BAUDRATE 230500UL
#define BAUD_PRESCALE ((F_CPU / (BAUDRATE * 16))) - 1

void uart_init() {
    UBRRL = (unsigned char) (BAUD_PRESCALE);
    UBRRH = (unsigned char) (BAUD_PRESCALE >> 8);

    UCSRB = (1 << RXEN) | (1 << TXEN) | (1 << RXCIE);
    UCSRC = (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);

    // Need to disable JTAG twice. Read spec sheet for details.
    // http://www.avrfreaks.net/comment/618701#comment-618701
    MCUCSR = (1 << JTD);
    MCUCSR = (1 << JTD);
}        

ISR(USART_RXC_vect) {    
    uint8_t c = UDR;        
    UDR = c;
    PORTA = c;
}

任何帮助!!

2 个答案:

答案 0 :(得分:0)

我们不仅需要在使用外部晶体/谐振器时更改熔丝位,而且在使用内部RC振荡器时我们还必须更改熔丝位。熔丝位的默认配置是频率1Mhz。对于不同频率的内部RC振荡器,我们需要相应地设置熔丝位。这fuse bit calculator会有所帮助。

blog中说明了如何设置熔丝位。

我之前不知道我们必须为不同的内部频率设置不同的保险丝位配置。

最后,我的支持解决了我的问题。接下来我必须传输字符串等等。

谢谢大家。

答案 1 :(得分:0)

如果你是在Atmel工作室写的。它有终端窗口exstension(它工作在6.0版本,在7.0我现在不知道)。

如果您没有使用Atmel工作室,请打开一些终端并听取即将发生的事情。如果您正在获取虚拟数据,则表示您没有正确配置保险丝位,因为已经回答了上限。

如果你正在使用Atmel工作室,我建议使用一些像程序员一样的STK500并将其集成到Atmel工作室。从那里编程设备。它更舒适,保险丝位设置很容易。

我看到你正在使用14745600赫兹振荡器。您必须为外部高频振荡器设置保险丝位。

如果要禁用JTAG,可以从保险丝位禁用它。