搜索
bottom↓
回复: 1

atmega16的ucsrc的设置

[复制链接]

出0入0汤圆

发表于 2007-1-29 17:15:29 | 显示全部楼层 |阅读模式
马潮老师,我是avr单片机新手,发现atmega16的mcsrc无法设置,请问是怎么回事

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2007-3-9 22:07:43 | 显示全部楼层
见器件手册:



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);

   ...



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;

}



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

本版积分规则

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

GMT+8, 2024-5-18 12:08

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

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