kegaank 发表于 2006-9-21 11:33:02

寄存器TIFR的问题

在设计一个程序的时候,同时使用到了TIFR中的TOV1与TOV0,当我向TOV1写清零的时候,TOV0怎么也清零了?而且其它标志位都同时消失?

kegaank 发表于 2006-9-21 11:48:11

如果存在向TOV0(或TOV1)中写1存在同时清零的问题,那么其中一个利用中断(如定时器0),在进入中断入口后,OCF0自动清零的时候,会不也影响其它标志位,使其它标志位也清零呢?(假定其它标志位此时也置位的情况下)

machao 发表于 2006-9-24 00:03:55

在设计一个程序的时候,同时使用到了TIFR中的TOV1与TOV0,当我向TOV1写清零的时候,TOV0怎么也清零了?而且其它标志位都同时消失?



你如何得到的这个结论?

kegaank 发表于 2006-9-24 18:46:39

在我写的一个程式中,我同时用到了TOV0和TOV1位,在进行软件仿真时,我观察到,在清TOV1的时候,TOV0,OCF0,OCF1A的置位标志同时消失.并且,以TOV0标志位作为条件的语句同时不能执行.由此得出结论.

idterminator 发表于 2010-8-21 19:24:39

很老的帖子,可是问题没有解决~~~


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

machao 发表于 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; 也都是错误的。

idterminator 发表于 2010-8-25 18:43:37

回machao 老师,

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


LZ没有说清零是写零,


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

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

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

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

god54188 发表于 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,是个反的。

idterminator 发表于 2010-8-27 09:19:38

回LS

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

清标志的方法machao老师说的很详细,6楼也说明了具体的操作,谢谢你的回答
页: [1]
查看完整版本: 寄存器TIFR的问题