C - Atmega16 串行通信不工作(uart_send和uart_receive)



我正在尝试使用 android 应用程序Atmega16在 BLE 之间进行通信(只是为了发送一个字符并将其接收回来)。

我能够使用 arduino 和应用程序在 BLE 之间传输数据,但是当我使用 atmega16 微控制器时,它不起作用。当我尝试发送一个字符并将其接收回来时,有些字符正在准确返回(0 to 9,q,w,r,t,y,u,p,z,s,x,v,:,^,=,?,;),但其他字符则没有。

我认为问题出在我的波特率和 CPU 频率上。我尝试了许多组合,但没有一个能准确地返回整个字符。这些是我的 uart 初始化和中断函数

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

#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;
}

任何帮助!!

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

本博客介绍了如何设置保险丝位。

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

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

谢谢大家。

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

如果您没有使用 Atmel 工作室,请打开一些终端并聆听即将发生的事情。如果您正在获取虚拟数据,则意味着您尚未正确配置保险丝位,如上文所述。

如果您使用的是 Atmel 工作室

,我建议您使用一些类似 STK500 的程序员并将其集成到 Atmel 工作室中。从那里对设备进行编程。它更舒适,保险丝位设置从那里很容易。

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

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

相关内容

  • 没有找到相关文章

最新更新