搜索
bottom↓
回复: 4

mega16串口通信 还是mega16的UCSRC 和 UBRRH的问题,总是同时读写,URSEL位竟然没用?!

[复制链接]

出0入0汤圆

发表于 2012-1-13 11:47:09 | 显示全部楼层 |阅读模式
这是初始化,保证没有问题
void usart_init()
{
    UBRRH = 0x00;
    UBRRL = 0x08;
    UCSRA = 0x00;
    UCSRB = ((1<<RXCIE)|(1<<RXEN)|(1<<TXEN));
    UCSRC = 0x86;
}
这样走下来,用AVR studio仿真时发现UBRRH低位也被写成  0110  了??

是不是还和其他的寄存器有关系?

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2012-1-13 11:48:40 | 显示全部楼层

执行UCSRC=0x86这一步前 (原文件名:新建 BMP 图像.JPG)


执行UCSRC=0x86以后 (原文件名:新建 BMP 图像 (2).JPG)

出0入0汤圆

 楼主| 发表于 2012-1-13 11:51:48 | 显示全部楼层
大家帮帮我吧,纠结两天了,UCSRC的SEL位怎么回事呀,怎么不管用呀。竟然用同一个地址真让人蛋疼

出0入0汤圆

发表于 2012-1-13 13:40:35 | 显示全部楼层
器件手册中有详细说明,你应该先仔细看一下,养成习惯,先看手册。
Accessing UBRRH/UCSRC Registers

    The UBRRH Register shares the same I/O location as the UCSRC Register. Therefore some special consideration must be taken when accessing this I/O location.

Write Access
    When doing a write access of this I/O location, the high bit of the value written, the USART Register Select (URSEL) bit, controls which one of the two registers that will be written. If URSEL is zero during a write  operation, the UBRRH value will be updated. If URSEL is one, the UCSRC setting will be updated.

The following code examples show how to access the two registers.
Assembly Code Example(1)
...
; Set UBRRH to 2
ldi r16,0x02
out UBRRH,r16
   ...
; Set the USBS and the UCSZ1 bit to one, and
; the remaining bits to zero.
ldi r16,(1<<URSEL)|(1<<USBS)|(1<<UCSZ1)
out UCSRC,r16
...

C Code Example(1)
...
/* Set UBRRH to 2 */
UBRRH = 0x02;
...
/* Set the USBS and the UCSZ1 bit to one, and */
/* the remaining bits to zero. */
UCSRC = (1<<URSEL)|(1<<USBS)|(1<<UCSZ1);
...

Note: 1. See “About Code Examples” on page 7.
As the code examples illustrate, write accesses of the two registers are relatively unaffected of the sharing of I/O location.

Read Access
  Doing a read access to the UBRRH or the UCSRC Register is a more complex operation. However, in most applications, it is rarely necessary to read any of these registers.
The read access is controlled by a timed sequence. Reading the I/O location once returns the UBRRH Register contents. If the register location was read in previous system clock cycle, reading the register in the current clock cycle will return the UCSRC contents. Note that the timed sequence for reading the UCSRC is an atomic operation.
Interrupts must therefore be controlled (for example by disabling interrupts globally) during the read operation.

The following code example shows how to read the UCSRC Register contents.
Assembly Code Example(1)
USART_ReadUCSRC:
; Read UCSRC
in r16,UBRRH
in r16,UCSRC
ret

C Code Example(1)
unsigned char USART_ReadUCSRC( void )
{
    unsigned char ucsrc;
    /* Read UCSRC */
    ucsrc = UBRRH;
    ucsrc = UCSRC;
    return ucsrc;
}
Note: 1. See “About Code Examples” on page 7.
The assembly code example returns the UCSRC value in r16.
Reading the UBRRH contents is not an atomic operation and therefore it can be read as an ordinary register, as long as the previous instruction did not access the register location.

出0入0汤圆

发表于 2012-1-13 13:44:22 | 显示全部楼层
实时仿真方式下读这个寄存器需要注意时间,否则是读不对的。

为什么要仿真?建议不要依赖仿真器调试。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 22:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表