sinxcosytana 发表于 2013-8-26 22:15:18

深入浅出AVR单片机127页疑问及一个笔误——[非笔误,已解决]

本帖最后由 Gorgon_Meducer 于 2013-8-27 10:16 编辑

各位大哥,帮忙看看以下这句怎么理解
       当预分频器选择的时钟频率较高时,TCNT1L的值在写入后可能会立即被改变,这种重载方式可能“丢失”计数器低半字节的设置信号??这个可以举例说明吗
       另外指出个笔误:127页上的,上面刚写了个错误的例子,重载16位定时器时,应先重载计数器高半字节的,结果下面的保险例子中,还是先在重载低半字节了      

Gorgon_Meducer 发表于 2013-8-27 10:13:07

下面的例子不是笔误,因为已经先通过TCCR0B = 0x00; 把定时器的计数关闭了,所以后面的设置顺序是不重要的。
关于丢失低半字节信息的例子是这样的:
1、首先,由于设置高低半字节之间存在时间差,我们假设有n个系统周期(n>0)
2、假如设置的低半字节值   Low_Byte+(n/预分频系数) 超过了0xFF,也就是发生了进位,则
    在设置高半字节后,实际上进位被覆盖了,而低半字节的信息就丢失了
-------------------------
彻底的安全的设定定时器频率的方式是使用CTC或者其它能够设置TOP值的模式。

sinxcosytana 发表于 2013-8-27 12:53:56

Gorgon_Meducer 发表于 2013-8-27 10:13 static/image/common/back.gif
下面的例子不是笔误,因为已经先通过TCCR0B = 0x00; 把定时器的计数关闭了,所以后面的设置顺序是不重要的 ...

首先感谢老师这么及时的回复与指导,
    1.我想我大概明白了,起初我把资料文档中的“写16位寄存器时,应先写入该寄存器的高位字节”这个概念给混到这个例子中去了,这个是针对汇编代码的
    2.文档中还提到“使用"C"语言时,编译器会自动处理16位操作”,因为文档中给出的例子是:“TCNT1=0x1FF”整个16位来操作的,而老师的书中还是分开8位来操作的,我在ICCAVR中的反汇编lis文件中也看了下,顺序还是没有自动处理过来,在这点上还是有点不太明白,想再次请教下老师,这个该作何理解?

Gorgon_Meducer 发表于 2013-8-27 13:57:47

本帖最后由 Gorgon_Meducer 于 2013-8-27 13:59 编辑

sinxcosytana 发表于 2013-8-27 12:53 static/image/common/back.gif
首先感谢老师这么及时的回复与指导,
    1.我想我大概明白了,起初我把资料文档中的“写16位寄存器时, ...

对于16位操作,那个是编译器版本的问题,不同版本行为可能不一样,对AVR来说,编译器通常会按照小端对齐的字节序来操作。
这也是为什么例子代码示范的方式是先关闭定时器的原因不依赖于编译器。

sinxcosytana 发表于 2013-8-27 15:08:56

Gorgon_Meducer 发表于 2013-8-27 13:57 static/image/common/back.gif
对于16位操作,那个是编译器版本的问题,不同版本行为可能不一样,对AVR来说,编译器通常会按照小端对齐 ...

完全明白了,谢谢了!

miyadai 发表于 2014-3-3 16:04:09

本主题需向作者支付 5 莫元 才能浏览

Gorgon_Meducer 发表于 2014-3-3 17:06:26

miyadai 发表于 2014-3-3 16:04
本主题需向作者支付 5 莫元 才能浏览

没什么特别的,不必好奇
页: [1]
查看完整版本: 深入浅出AVR单片机127页疑问及一个笔误——[非笔误,已解决]