gpt4 book ai didi

c - atmega16 串行通信不工作(uart_send 和 uart_receive)

转载 作者:太空宇宙 更新时间:2023-11-04 00:02:26 25 4
gpt4 key购买 nike

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

我可以在 BLE 与 arduino 和应用程序之间传输数据,但是当我使用 atmega16 微 Controller 时它不工作。当我尝试发送一个字符并接收它时,一些字符准确地返回 (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 振荡器,我们需要相应地设置熔丝位。这fuse bit calculator会有帮助。

blog 中解释了如何设置熔丝位.

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

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

谢谢大家

关于c - atmega16 串行通信不工作(uart_send 和 uart_receive),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37538553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com