我正在尝试使用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/

10-10 01:03