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