首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

清除标志的方法?!

清除标志的方法?!

斑竹你好!


关于清除标志的方法下面几种不知是否正确?


1)MOVB  #$80,TFLG1


2) LDAA  #$80


   STAA  TFLG1


3) BCLR  TFLG1,$7F


4) BSET  TFLG1,$80


不知道上面几种方法是否有差别?


我写了一个简单的定时器中断,分别试了一下,没看出差别来。


好像看到一本书上说,是有差别的!可惜忘记哪本书了!


还有,如果没有差别,是不是方法(3)(4)得指令周期最短呢?


谢谢!

生命就是奇迹,永远都不要放弃希望,哪怕光亮渺小如豆,我们都要坚持举着它,即使烛火灼伤了皮肤,我们也不能失手,否则我们将永远在黑暗之中。
应该是3、4最快
可以查看指令运行的周期时间,看S12CPUV2.pdf
除了速度不同以外,前两种会改写整个TFLG1的值,而后两种只改变相应位的值。第二种还会改变累加器A的值。另外,它们对标志位的影响也不同。最后,要注意3和4的结果并不同。
海纳百川  有容乃大
非常感谢两位版主!

我觉得方法(3)也会改变TFLG1其他位的值,它应该是 TFLG1 & ($80)->TFLG1,是不?
那我可以这样理解了:如果我在程序中用到多个定时器中断,那么只能用方法(4)了?


生命就是奇迹,永远都不要放弃希望,哪怕光亮渺小如豆,我们都要坚持举着它,即使烛火灼伤了皮肤,我们也不能失手,否则我们将永远在黑暗之中。
我用的cpu是MC9S12DG128,汇编语言
编写的程序有四个中断,两个定时中断,一个输入捕捉中断,一个spi中断
用于显示的1ms中断优先级最高,然后SPI,然后20ms中断,然后输入捕捉.
而且采用了中断嵌套
结果显示还是有偶尔闪烁的现象,
我怀疑是因为中断嵌套,在优先级低的中断子程序开中断之前,时间太长了
因为我清标志用的是: LDAA TFLG1
ORAA #$80
STAA TFLG1
类似的.
后来改成上面所说的方法(1)后,没有闪烁现象
我又尝试改成方法(4),结果又有闪烁.
经斑竹提醒后,发现,如果用方法(1),清除一个标志的时候,也把优先级比他低的中断标志清除了,执行完高优先级的中断后,也不会产生低优先级的中断了
我这样想,不知道对不对呢?
生命就是奇迹,永远都不要放弃希望,哪怕光亮渺小如豆,我们都要坚持举着它,即使烛火灼伤了皮肤,我们也不能失手,否则我们将永远在黑暗之中。
我现在又怀疑了,因为DATASHEET上说,写0无效啊!
生命就是奇迹,永远都不要放弃希望,哪怕光亮渺小如豆,我们都要坚持举着它,即使烛火灼伤了皮肤,我们也不能失手,否则我们将永远在黑暗之中。
如非确有必要,中断最好不要嵌套。
海纳百川  有容乃大
实在没办法,因为显示的优先级必须最高,否则会出现闪烁的现象阿!
我觉得strongchen说的有错误!
上面的几种方法都不会影响TFLG1的其他标志位!
我看到一本书(嵌入式微控制器/(美) Todd D. Morton著 )上画的CPU12定时器标志功能模型,主要是一个D触发器。Q端输出标志信号
读标志位时,所读出的是标志信号,写标志位时,是将数据写到触发器的清除引脚,而不是写到标志信号上,所以,写1能够清除标志。写0无效!
生命就是奇迹,永远都不要放弃希望,哪怕光亮渺小如豆,我们都要坚持举着它,即使烛火灼伤了皮肤,我们也不能失手,否则我们将永远在黑暗之中。
我前面说的只是针对这几种写指令的通常概念而言。对应TFLG1这个寄存器本身,确实是写1清零,而写0没有影响。
海纳百川  有容乃大

好的!
谢谢斑竹!
生命就是奇迹,永远都不要放弃希望,哪怕光亮渺小如豆,我们都要坚持举着它,即使烛火灼伤了皮肤,我们也不能失手,否则我们将永远在黑暗之中。
返回列表