我正在尝试使用Atmega16
与android应用程序在一个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
我尝试在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;
}
任何帮助!!
最佳答案
我们不仅需要在使用外部晶体/谐振器时改变熔丝位,而且在使用内部RC振荡器时也必须改变熔丝位保险丝位的默认配置是频率为1Mhz对于不同频率的内部RC振荡器,我们需要相应地设置保险丝位这个fuse bit calculator会有帮助。
如何设置保险丝位在本blog中进行了说明。
我之前不知道,我们还必须为不同的内部频率设置不同的保险丝位配置。
我终于在你的支持下解决了我的问题下一步我要转移字符串和更多。
谢谢大家。
关于c - atmega16串行通信不起作用(uart_send和uart_receive都),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37538553/