atmega16 串行通信不工作(uart_send 和 uart_receive)
atmega16 serial communication not working (both uart_send and uart_receive)
我正在尝试使用 Atmega16
与 android 应用程序在 BLE 之间进行通信(只是为了发送一个字符并接收它)。
我可以在 BLE 与 arduino 和应用程序之间传输数据,但是当我使用 atmega16 微控制器时它不工作。当我试图发送一个字符并接收它时,一些字符准确地返回 (0 to 9,q,w,r,t,y,u,p,z,s,x,v,:,^,=,?,;
),但其他的则没有。
我认为问题出在我的波特率和 CPU 频率上。我尝试了很多组合,但其中 none 完全返回了整个字符。
这些是我的 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;
}
任何帮助!!
不仅在使用外部crystal/resonator时需要更改熔丝位,在使用内部RC振荡器时也需要更改熔丝位。熔丝位的默认配置是针对频率 1Mhz。对于不同频率的内部 RC 振荡器,我们需要相应地设置熔丝位。这 fuse bit calculator 会有所帮助。
如何设置熔丝位在这个blog中有说明。
我之前不知道我们还必须为不同的内部频率设置不同的熔丝位配置。
终于在大家的支持下解决了我的问题。接下来我必须传输字符串等等。
谢谢大家
如果您是在 Atmel studio 中编写的。它有终端 window 扩展(它在 6.0 版本上工作,在 7.0 上我现在不知道)。
如果您没有使用 Atmel studio,请打开一些终端并听听接下来会发生什么。如果你得到的是虚拟数据,这意味着你没有像上面回答的那样正确配置熔丝位。
如果您使用的是Atmel studio,我建议使用一些STK500之类的编程器并将其集成到Atmel studio中。从那里编程设备。它更舒适,保险丝位设置也很容易。
我看到您使用的是 14745600 赫兹振荡器。您必须为外部高频振荡器就绪设置熔丝位。
如果您想禁用 JTAG,可以通过熔丝位禁用它。
我正在尝试使用 Atmega16
与 android 应用程序在 BLE 之间进行通信(只是为了发送一个字符并接收它)。
我可以在 BLE 与 arduino 和应用程序之间传输数据,但是当我使用 atmega16 微控制器时它不工作。当我试图发送一个字符并接收它时,一些字符准确地返回 (0 to 9,q,w,r,t,y,u,p,z,s,x,v,:,^,=,?,;
),但其他的则没有。
我认为问题出在我的波特率和 CPU 频率上。我尝试了很多组合,但其中 none 完全返回了整个字符。 这些是我的 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;
}
任何帮助!!
不仅在使用外部crystal/resonator时需要更改熔丝位,在使用内部RC振荡器时也需要更改熔丝位。熔丝位的默认配置是针对频率 1Mhz。对于不同频率的内部 RC 振荡器,我们需要相应地设置熔丝位。这 fuse bit calculator 会有所帮助。
如何设置熔丝位在这个blog中有说明。
我之前不知道我们还必须为不同的内部频率设置不同的熔丝位配置。
终于在大家的支持下解决了我的问题。接下来我必须传输字符串等等。
谢谢大家
如果您是在 Atmel studio 中编写的。它有终端 window 扩展(它在 6.0 版本上工作,在 7.0 上我现在不知道)。
如果您没有使用 Atmel studio,请打开一些终端并听听接下来会发生什么。如果你得到的是虚拟数据,这意味着你没有像上面回答的那样正确配置熔丝位。
如果您使用的是Atmel studio,我建议使用一些STK500之类的编程器并将其集成到Atmel studio中。从那里编程设备。它更舒适,保险丝位设置也很容易。
我看到您使用的是 14745600 赫兹振荡器。您必须为外部高频振荡器就绪设置熔丝位。
如果您想禁用 JTAG,可以通过熔丝位禁用它。