我正在尝试使用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;
}
任何帮助!!
答案 0 :(得分:0)
我们不仅需要在使用外部晶体/谐振器时更改熔丝位,而且在使用内部RC振荡器时我们还必须更改熔丝位。熔丝位的默认配置是频率1Mhz。对于不同频率的内部RC振荡器,我们需要相应地设置熔丝位。这fuse bit calculator会有所帮助。
此blog中说明了如何设置熔丝位。
我之前不知道我们必须为不同的内部频率设置不同的保险丝位配置。
最后,我的支持解决了我的问题。接下来我必须传输字符串等等。
谢谢大家。
答案 1 :(得分:0)
如果你是在Atmel工作室写的。它有终端窗口exstension(它工作在6.0版本,在7.0我现在不知道)。
如果您没有使用Atmel工作室,请打开一些终端并听取即将发生的事情。如果您正在获取虚拟数据,则表示您没有正确配置保险丝位,因为已经回答了上限。
如果你正在使用Atmel工作室,我建议使用一些像程序员一样的STK500并将其集成到Atmel工作室。从那里编程设备。它更舒适,保险丝位设置很容易。
我看到你正在使用14745600赫兹振荡器。您必须为外部高频振荡器设置保险丝位。
如果要禁用JTAG,可以从保险丝位禁用它。