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,可以通过熔丝位禁用它。