741342386 发表于 2015-3-15 16:40:51

AVR168PA GCC下 预设9600波特率但实际是1200波特率(已解决)

本帖最后由 741342386 于 2015-3-15 18:09 编辑

#define F_CPU 8000000UL
#define BAUD_RATE 9600                //9600波特率


void uart_init(void)        //UART初始化 ( 异步通讯 无效验 1停止位 8数据位模式 )
{
        UCSR0B = 0x00;                //
                                                //关闭USART0为后续模式设置排除干扰
        UCSR0A = 0x00;                //
       
        //UBRR0= ( F_CPU/(BAUD_RATE*16L)-1 );        //波特率设置9600为计数器装入初值51
       
        UBRR0L = ( F_CPU/BAUD_RATE/16-1 ) % 256;
        UBRR0H = ( F_CPU/BAUD_RATE/16-1 ) / 256;
       
        UCSR0C = ( 0<<UMSEL00 )|( 0<<UPM00 )|( 0<<USBS0 )|( 3<<UCSZ00 );
                        // 异步通讯       无效验       1停止位      8数据位
       
        UCSR0B = ( 1<<RXEN0 )|(1<<RXCIE0)|( 1<<TXEN0 );
                        // 允许接收    打开接收中断允许发送
}

代码如上

外部晶振8M20P起振电容 波特率9600
实际通讯为1200波特率,寄存器内放的值为9600波特率的参数. 请求各位百忙之中能否帮我看下.

修正后的熔丝位配置    感谢给位指导

yuanbo19870216 发表于 2015-3-15 17:12:27

熔丝位没有配置,默认芯片内部RC振荡器,频率1M,这样刚好就是9600/8=1200了

airbox 发表于 2015-3-15 17:40:03

熔丝位CKDIV8取消,或者将预分频计数器CLKPR设置为不分频(复位初始值由CKDIV8决定)

741342386 发表于 2015-3-15 17:45:55

熔丝位是这样配置的

alias 发表于 2015-3-15 17:54:43

CKDIV8 "0" 是使用,"1" 是不用,正如其它人所说,你使用了时钟除8。

741342386 发表于 2015-3-15 18:07:42

alias 发表于 2015-3-15 17:54
CKDIV8 "0" 是使用,"1" 是不用,正如其它人所说,你使用了时钟除8。

感谢您指点 新手不胜感激

741342386 发表于 2015-3-15 18:08:13

airbox 发表于 2015-3-15 17:40
熔丝位CKDIV8取消,或者将预分频计数器CLKPR设置为不分频(复位初始值由CKDIV8决定) ...

感谢您指点 新手不胜感激

741342386 发表于 2015-3-15 18:08:31

yuanbo19870216 发表于 2015-3-15 17:12
熔丝位没有配置,默认芯片内部RC振荡器,频率1M,这样刚好就是9600/8=1200了
...

感谢您指点 新手不胜感激
页: [1]
查看完整版本: AVR168PA GCC下 预设9600波特率但实际是1200波特率(已解决)