搜索
bottom↓
回复: 8

寄存器TIFR的问题

[复制链接]

出0入0汤圆

发表于 2006-9-21 11:33:02 | 显示全部楼层 |阅读模式
在设计一个程序的时候,同时使用到了TIFR中的TOV1与TOV0,当我向TOV1写清零的时候,TOV0怎么也清零了?而且其它标志位都同时消失?

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

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

出0入0汤圆

 楼主| 发表于 2006-9-21 11:48:11 | 显示全部楼层
如果存在向TOV0(或TOV1)中写1存在同时清零的问题,那么其中一个利用中断(如定时器0),在进入中断入口后,OCF0自动清零的时候,会不也影响其它标志位,使其它标志位也清零呢?(假定其它标志位此时也置位的情况下)

出0入0汤圆

发表于 2006-9-24 00:03:55 | 显示全部楼层
在设计一个程序的时候,同时使用到了TIFR中的TOV1与TOV0,当我向TOV1写清零的时候,TOV0怎么也清零了?而且其它标志位都同时消失?



你如何得到的这个结论?

出0入0汤圆

 楼主| 发表于 2006-9-24 18:46:39 | 显示全部楼层
在我写的一个程式中,我同时用到了TOV0和TOV1位,在进行软件仿真时,我观察到,在清TOV1的时候,TOV0,OCF0,OCF1A的置位标志同时消失.并且,以TOV0标志位作为条件的语句同时不能执行.由此得出结论.

出0入0汤圆

发表于 2010-8-21 19:24:39 | 显示全部楼层
很老的帖子,可是问题没有解决~~~


我现在也碰到了,ATMEGA8L,TIMER2 CTC 模式匹配后清OCF2,结果是TIFR全清,仿真也是这样,实际运行效果也是这样,各位有解否?

出0入0汤圆

发表于 2010-8-22 12:31:29 | 显示全部楼层
看到4年前的帖子被翻了上来,有些感慨。

当然,首先是我没有第一时间给出确定的回答。当时主要是想通过提问了解情况,并引导大家认真仔细,踏踏实实的学习技术。

其实LZ kegaank在后面的帖子中已经提到了问题所在。关键是没有认真看器件手册或不能真正理解它的描述。

可惜的是,4年的时间,竟没有人,包括LZ本人,以及还有那么多的说自己已经掌握单片机的人,要玩32位的朋友,能给出一个完整的解释。

很好的一面镜子,折射出现在大学生和电子工程师普遍的能力和心态了。

============================================================================

Bit 0 – TOV0: Timer/Counter0 Overflow Flag

The bit TOV0 is set (one) when an overflow occurs in Timer/Counter0.
(也就是说该标志位不能够软件置“1”的)

TOV0 is cleared by hardware when executing the corresponding interrupt handling vector.
(这个是硬件自动清零,不会影响寄存器的其它位)

Alternatively,TOV0 is cleared by writing a logic one to the flag.
(软件清零不是写“0”,而是写“1”。如果写“0”对该标志位不起作用----后面这层意思在手册中没有明确说明)

When the SREG I-bit, TOIE0 (Timer/Counter0 Overflow Interrupt Enable), and TOV0 are set (one), the Timer/Counter0 Overflow interrupt is executed. In phase correct PWM mode, this bit is set when Timer/Counter0 changes counting direction at $00.

--------------------------------------------------------------------------------------------------------------
寄存器TIFR的8个位都是中断标志位,是个比较特别的寄存器,其中每个位都是采用写1清零的。因此如果要清除TOV0(最低位),置TOV0为零,那么正确的写法是:

TIFR = 0x01;   这样其它位不受影响,而处在最低位的TOV0置零。

如果这样写:TIFR = 0xFE;肯定就出现问题了,TOV0没有变化,而其它位则清掉了。

有人这样写 TIFR = TIFR | 0x01;或 TIFR = TIFR & 0xfe; 也都是错误的。

出0入0汤圆

发表于 2010-8-25 18:43:37 | 显示全部楼层
回machao 老师,

您说的意思是,清标志要写1。


LZ没有说清零是写零,


我清零的操作是TIFR|=1<<OCF2;(ICC)

这和您的写法没什么区别吧,

我用过的型号不多,48,88,16都是如此操作,都没有发现过这问题,

实在没法,ATMEGA8L换了几片也是这样,我现在定义了一个变量保存标志,还请machao 老师指点

出0入0汤圆

发表于 2010-8-26 18:06:40 | 显示全部楼层
当T/C0 溢出时, TOV0 置位。执行相应的中断例程时此位硬件清零。此外, TOV0 也可
以通过写1 来清零。当SREG 中的位I、TOIE0 和TOV0 都置位时,中断例程得到执行。
在PWM 模式中,当T/C0 在$00 改变记数方向时, TOV0 置位。

这是M128 的数据手册,说的很明白,如果你在前面的中断允许位设置了允许中断,那么在执行中断的时候就会硬件自动清零,要么就是手动写1清零。
也就是

LDI R16, 0B00000001
OUT TIFR, R16

你想清0那个,就修改那个位为1,不想清零的就用0,是个反的。

出0入0汤圆

发表于 2010-8-27 09:19:38 | 显示全部楼层
回LS

我和LZ问的问题是:TIFR寄存器清一位标志时为什么其他位也被清。(前面说了,48,88,16都没有遇见此类情况,是ATMEGA8L)。

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

本版积分规则

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

GMT+8, 2024-5-17 08:34

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

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