寄存器TIFR的问题
在设计一个程序的时候,同时使用到了TIFR中的TOV1与TOV0,当我向TOV1写清零的时候,TOV0怎么也清零了?而且其它标志位都同时消失? 如果存在向TOV0(或TOV1)中写1存在同时清零的问题,那么其中一个利用中断(如定时器0),在进入中断入口后,OCF0自动清零的时候,会不也影响其它标志位,使其它标志位也清零呢?(假定其它标志位此时也置位的情况下) 在设计一个程序的时候,同时使用到了TIFR中的TOV1与TOV0,当我向TOV1写清零的时候,TOV0怎么也清零了?而且其它标志位都同时消失?你如何得到的这个结论? 在我写的一个程式中,我同时用到了TOV0和TOV1位,在进行软件仿真时,我观察到,在清TOV1的时候,TOV0,OCF0,OCF1A的置位标志同时消失.并且,以TOV0标志位作为条件的语句同时不能执行.由此得出结论. 很老的帖子,可是问题没有解决~~~
我现在也碰到了,ATMEGA8L,TIMER2 CTC 模式匹配后清OCF2,结果是TIFR全清,仿真也是这样,实际运行效果也是这样,各位有解否? 看到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; 也都是错误的。 回machao 老师,
您说的意思是,清标志要写1。
LZ没有说清零是写零,
我清零的操作是TIFR|=1<<OCF2;(ICC)
这和您的写法没什么区别吧,
我用过的型号不多,48,88,16都是如此操作,都没有发现过这问题,
实在没法,ATMEGA8L换了几片也是这样,我现在定义了一个变量保存标志,还请machao 老师指点 当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,是个反的。 回LS
我和LZ问的问题是:TIFR寄存器清一位标志时为什么其他位也被清。(前面说了,48,88,16都没有遇见此类情况,是ATMEGA8L)。
清标志的方法machao老师说的很详细,6楼也说明了具体的操作,谢谢你的回答
页:
[1]