通过掩膜选项,可以选择石英晶体振荡器或RC振荡器,两者都可作为系统时钟。不管用哪种振荡器,其信号都支持系统时钟。HALT模式会停止系统振荡器并忽略任何外部信号,由此来节省电能。
如果采用RC振荡器,那么在VDD与OSC1之间要接一个外接电阻,其阻值范围为51k—1MΩ。在OSC2端可获得系统时钟的4分频信号,它可以用来同步系统外部逻辑。RC振荡器是一种低成本方案,但是振荡器频率由于VDD、温度及芯片自身参量的漂移而产生误差。因此对计时敏感的场合,要求精确度高的振荡器频率,RC振荡器是不适用的。 |
如果选用石英晶体振荡器,在OSC1和OSC2之间连接一个石英晶体,用来提供石英振荡器所要的反馈(Feedback)和相位位移(Phase Shift),除此之外,不再需要其它外部元件。另外,在OSC1与OSC2之间接一个谐振器(Resonator)来取代石英振荡器用来得到参考频率,但是需要在OSC1和OSC2外接两个电容器(如果振荡频率1MHz)。 WDT看门狗振荡器是一个芯片内部自由振荡的RC振荡器,不需连接外部元件,甚至系统进入省电模式时,系统时钟停止了,但WDT振荡器仍然依大约65us/5V的周期工作。由掩膜选项确定,WDT振荡器能停振来达到省电目的。 看门狗定时器 WDT的时钟源是一个专用的RC振荡器(WDT振荡器)或是由指令周期(系统时钟4分频)来实现的,由掩膜选项决定。WDT是用于防止程序不正常运行或是跳到未知或不希望去的地址,而导致不可预见的结果。WDT可以被掩膜选项禁止,如果WDT定时器被禁止,所有与WDT有关的操作都是空操作。 |
如果设置了内部WDT振荡器(以65us/5V为周期的RC振荡器)的话,WDT的值会先除以256(8级)来产生大约16.6ms的溢出时间,这个溢出时间会因温度、VDD、以及芯片参数的变化而变化。如果启动WDT的前置分频器,则可实现更长的溢出时间。写数据到WS2、WS1、WS0(WDTS的2、1、0位)会产生不同的溢出时间,举例说明:如果WS2、WS1、WS0的值都为1,其分频因子最大,为1:128,溢出时间最长约为2.2us/5V。如果WDT被禁止,那么WDT的时钟来源可来自指令时钟,其运作与WDT振荡器一样。但当在HALT状态时,来源于指令时钟的WDT会在暂停模式时停止计数并失去保护功能。在这种情况下,只能由外部逻辑来重新启动系统。WDTS的高4位及其第3位保留给用户定义标志使用的,程序员可以利用这些标志来指示某些特殊的状态。 如果单片机工作在于干扰很大的环境中,那么强烈建议使用片内RC振荡器(WDT OSC),因为HALT模式会使系统时钟终止运作。 在正常运作下,WDT溢出会使系统复位并设置TO状态,但在HALT模式下,溢出只产生一个“热复位”,只能使PC程序计数器和堆栈SP复位到零,要清除WDT的值(包括WDT前置分频器)可以有三种方式:外部复位(低电平输入到RES端),用软件指令和HALT指令三种。软件指令由CLR WDT和另一组CLR WDT1及CLR WDT2组成。这两组指令中,只能选取一种,选择的方式由掩膜选项的CLR WDT的次数决定。如果“CLR WDT”被选择(即CLR WDT次数为1),那么只要执行CLR WDT指令就会清除WDT。在CLR WDT1和CLR WDT2被选择的情况下(即CLR WDT的次数为2),要执行两条指令才会清除WDT,否则WDT会由于溢出而使系统复位。 |
HT48R05A-1 WDT前置分频器 | |||
WS2 | WS1 | WS0 | 分频率 |
0 | 0 | 0 | 1:1 |
0 | 0 | 1 | 1:2 |
0 | 1 | 0 | 1:4 |
0 | 1 | 1 | 1:8 |
1 | 0 | 0 | 1:16 |
1 | 0 | 1 | 1:32 |
1 | 1 | 0 | 1:64 |
1 | 1 | 1 | 1:128 |
暂停模式(HALT) 暂停模式是由HALT指令来实现的,产生如下结果: · 关闭系统振荡器,但WDT振荡器继续工作(选WDT振荡器时) · RAM及寄存器的内容保持不变。 · WDT和WDT前置分频器被清除并再次重新计数(选WDT振荡器)。 · 所有的I/O端口都保持其原来的状态。 · PD标志位被置位,TO标志位被清除。 由于外部复位、中断、外部输入一个下降沿信号到PA口或WDT溢出,可使系统脱离暂停状态,外部复位能使系统初始化而WDT溢出使系统“热复位”。测试TO和PD状态后,系统复位的原因就可被确定,PD标志位是由系统上电复位和执行CLR WDT指令被清除,而它的置位是由于执行了HALT指令。如果WDT产生溢出,会使TO标志位置位,还能产生唤醒使得程序计数的PC和堆栈指针SP复位,其它都保持原状态。 PA端口的唤醒和中断方式被看成正常状态,PA口的每一位都可以通过掩膜选项来单独设定为对系统的唤醒,如果唤醒是来自于I/O口的信号变化,程序会重新继续执行下一条指令。如果唤醒是来自于中断,那么有两种情况可能发生:如果相关的中断被禁止或中断是允许的,但堆栈已满,那么程序将继续执行下一条指令,如果中断允许且堆栈未满,那么这个中断响应就发生了。如果在进入HALT模式以前,中断请求标志位被置“1”,那么相关的中断唤醒功能被禁止。一旦唤醒事件发生,要花1024tsys(系统时钟周期)系统才重新正常工作。也即在唤醒后被插入了一个等待时间。如果唤醒来自于中断响应,那么实际的中断程序执行就延迟了一个或一个以上的周期。但是如果唤醒导致下一条指令执行,那么在一个等待周期结束后指令就立即被执行。 为了省电,在进入HALT模式前必须小心处理I/O端口状态。 |