⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pic16cxxx-1-9.htm

📁 PIC单片机C语言教程!绝对经典
💻 HTM
📖 第 1 页 / 共 2 页
字号:
            <p align="center"><img src="image/a149.gif" width="570" height="355"></p>
            <p align="center">图1.67 INT中断时序</p>
            <p>注意,不管各种中断使能位或所有中断使能位GIE是什么状态(开或关),中断条件满足时都会发中断请求,相应的中断标志位亦会被置成1,但CPU是否响应则根据其使能位状态而定。另一点要注意的是,如果用户程序中要关闭所有中断位,请用以下推荐的程序以确保关闭:</p>
            <p><img src="image/a150.gif" width="327" height="81" hspace="30"></p>
            <p>一、各类中断功能<br>
              &nbsp;&nbsp;&nbsp;&nbsp;RB0/INT脚上的中断信号是边沿触发的,其极性(上升或下降)由INTEDG(OPTION&lt;6&gt;)决定。其标志位是INTF(INTCON&lt;1&gt;),使能位是INTE(INTCON&lt;4&gt;)。如果芯片进入睡眠前INTE=0,则INT中断会唤醒睡眠中的CPU,请参见§1.13.5有关Sleep 
              的描述。<br>
              RB&lt;7:4&gt;中断标志位是RBIF(INTCON&lt;0&gt;),使能位是RBIE(INTCON&lt;4&gt;),详见§1.8.2描述。<br>
              &nbsp;&nbsp;&nbsp;&nbsp;其他各种中断请参阅有关章节,不再赘述。<br>
              <br>
              二、中断现场保存<br>
              &nbsp;&nbsp;&nbsp;&nbsp;中断现场保存是中断技术一个很重要的部分,由于在PIC16CXX指令系统中没有PUSH(入栈)和POP(出栈)指令,所以要用一段软件来实现。因为是用一段程序来实现现场保存,而程序操作是会可能影响W寄存器和STATUS寄存器,所以要首先把这二个寄存器保护起来,然后再保存其他用户认为应保留的寄存器。并且在PIC16CXX中,中断现场数据不是保留到芯片堆栈中,而是保留在一些用户自己选择的寄存器中,一般应选择通用寄存器来保留现场。下面是二段例程,分别是PIC16C61和其他PIC16C6X的中断现场保护例程。<br>
            </p>
            <p align="center"><img src="image/a151.gif" width="439" height="509"></p>
            &nbsp;&nbsp;&nbsp;&nbsp; <p>上面这二段例程的区别在于PIC16C61寄存器组的Bank1是完全映像到Bank0的,即物理上是完全相同的,RP0位(STATUS&lt;7&gt;)未用。而其他的PIC16C6X 
              寄存器体由于有Bank0和Bank1的区别,所以在其例程中有二点要注意:一是W_TEMP必须同时定义在Bank0和Bank1,例如W_TEMP定义在0X20,则0XA0 
              也必须分配给它。二是STATUS_TEMP必须定义在Bank0。<br>
              &nbsp;&nbsp;&nbsp;&nbsp;以上这二段例程只保存了W和STATUS,如果用户程序中另有一些寄存器需要保存,可以自己加上去。<br>
              <br>
              §1.13.5 看门狗(WDT)<br>
              <br>
              &nbsp;&nbsp;&nbsp;&nbsp;看门狗计时器(Watch Dog Timer)是一个片内自振式的RC振荡计时器,无需任何的外接元件。这意味着即使芯片OSC1/OSC2上振荡停止了(例如执行指令SLEEP后),WDT照样保持计时。在正常运行下,WDT计时溢出将产生复位,而如果芯片是处在睡眠下,WDT溢出将唤醒CPU并沿着原来的路线继续执行。在PIC16CXX芯片内的&quot;系统定义字&quot;(Configuration 
              EPROM)中的一个位是用于控制WDT的。可以将其置&quot;0&quot;来抑制WDT使之永远不起作用。这将在烧写器介绍部分详细说明。</p>
            <p align="center"><img src="image/a152.gif" width="584" height="329"></p>
            <p align="center">图1.68 看门狗电路结构图</p>
            <p>1.WDT周期<br>
              &nbsp;&nbsp;&nbsp;&nbsp;WDT有一个基本的溢出周期18ms(当无预分频倍数时),如果需要更长的WDT周期,可以把预分频倍数分配给WDT,最大分频比可达1:128,这时的WDT溢出周期约为2.5S。WDT溢出周期和环境温度、VDD等参数有关系,请参阅附录的图表。<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&quot;CLRWDT&quot;和&quot;SLEEP&quot;指令将清除WDT计时器以及预分频器(当预分频器分配给WDT时)。WDT一般用来防止系统失控或者说防止单片机程序&quot;失控&quot;。在正常情况下,WDT应在计时溢出前被CLRWDT指令清零,以防止产生复位。如果程序由于某种干扰而失控,那么不能在WDT溢出前执行一条CLRWDT指令,就会使WDT溢出而产生复位,使系统重新启动运行而不至失去控制。若WDT溢出产生复位, 
              则状态寄存器F3的&quot;TO&quot;位会被清零,用户可藉此判断复位是否由WDT溢时所造成。<br>
              2.WDT编程注意事项<br>
              &nbsp;&nbsp;&nbsp;&nbsp;如果使用WDT,一定要仔细在程序中的某些地方放一条&quot;CLRWDT&quot;指令,以保证在WDT溢出前能被清零。否则会造成芯片不停地产生复位,使系统无法正常工作。<br>
              &nbsp;&nbsp;&nbsp;&nbsp;在噪声工作环境下,OPTION寄存器可能会因受干扰而改变,所以最好每隔一段时间就将其重新设置一下。</p>
            <p><img src="image/a153.gif" width="615" height="132"></p>
            <p>§1.13.6 睡 眠(SLEEP)<br>
              <br>
              一、进入睡眠<br>
              &nbsp;&nbsp;&nbsp;&nbsp;执行一条&quot;SLEEP&quot;指令即可进入低功耗模式。当进入SLEEP后,WDT被清零,然后重新开始计数。状态寄存器STASTUS中的PD位被置成&quot;0&quot;,TO位置成&quot;1&quot;,同时振荡停止(指OSC1端的振荡电路)。所有的I/O口保持原来的状态。这种工作模式功耗最低。<br>
              &nbsp;&nbsp;&nbsp;&nbsp;为使耗电流最小,进入SLEEP前,应使所有的I/O口处于高电平VDD或低电平VSS,而不应使其处于高阻态,以免产生开关电流损耗。可以在I/O口加上拉或下拉电阻,或者把I/O 
              口都置成输出态来避免其处于高阻态(浮态)。<br>
              &nbsp;&nbsp;&nbsp;&nbsp;RTCC端亦应置为VDD或VSS(通过上拉或下拉)。<br>
              &nbsp;&nbsp;&nbsp;&nbsp;MCLR必须处于高电平状态。 <br>
              <br>
              二、唤醒睡眠<br>
              PIC16C6X可通过以下事件唤醒处于睡眠状态下的CPU:<br>
              &nbsp;&nbsp;&nbsp;&nbsp;1. MCLR端加低电平;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;2. 看门狗超时溢出;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;3. 外部中断(INT);<br>
              &nbsp;&nbsp;&nbsp;&nbsp;4. RB口电平变化中断;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;5. TMR1中断(条件是TMR1必须工作在同步计数器方式);<br>
              &nbsp;&nbsp;&nbsp;&nbsp;6. SSP中断(检测到超始位/停止位);<br>
              &nbsp;&nbsp;&nbsp;&nbsp;7. CCP捕捉模式中断;<br>
              &nbsp;&nbsp;&nbsp;&nbsp;8. 并行口读写操作中断。<br>
              &nbsp;&nbsp;&nbsp;&nbsp;细心的读者会发现还有一些中断这里未提到,那是因为那些中断部件在睡眠状态下会关闭不工作,即它们需要单片机在运行状态下才会发生中断请求,所以不能用来唤醒睡眠下的单片机。<br>
              &nbsp;&nbsp;&nbsp;&nbsp;注意,PIC16C6X看门狗超时溢出可唤醒处于睡眠中的芯片,但不会引起芯片复位,而是PC+1沿着Sleep指令后面的指令继续运行下去。这点和PIC16C5X截然不同,在PIC16C5X中,WDT溢出是通过使芯片复位来唤醒原本处于睡眠状态下的CPU。其他的PIC16C7X/8X/62X皆和PIC16C6X相同。<br>
              &nbsp;&nbsp;&nbsp;&nbsp;如果以上提到的各种中断要用来唤醒睡眠中的单片机,则在进入睡眠之前该中断使能位必须置为1(开启),至于全部中断使能位GIE的状态则不会影响中断唤醒这个功能,但却会影响中断唤醒后单片机的动作走向:<br>
              &nbsp;&nbsp;&nbsp;&nbsp;1.GIE=0 ─ 单片机被中断唤醒后,沿原来的&quot;Sleep&quot;指令后继续执行下去。<br>
              &nbsp;&nbsp;&nbsp;&nbsp;2.GIE=1 ─ 单片机被中断唤醒后,执行完&quot;Sleep&quot;后的下一条指令,然后就跳到中断向量入口处(0004H)去执行中断服务程序。<br>
              &nbsp;&nbsp;&nbsp;&nbsp;还有一点,无论何种中断唤醒单片机后,看门狗计数器都会被清零重新计数。注意,只是计数器内容复位清零,而其分频倍率和分配对象并不会改变。<br>
            <p align="center"><img src="image/a154.gif" width="574" height="283"></p>
            <p align="center">图1.69 中断唤醒睡眠时序</p>
            <div align="center"></div>
            <p align="right"> <a href="PIC16Cxxx-1-8.htm">上一页</a> <a href="PIC16Cxxx-1-10.htm"> 
              下一页</a><br>
            </p>
            <p><a href="PIC16Cxxx-1.htm">第一章</a> <a href="PIC16Cxxx-2.htm">第二章</a> 
              <a href="PIC16Cxxx-3.htm">第三章</a> <a href="PIC16Cxxx-4.htm">第四章</a> 
              <a href="PIC16Cxxx-5.htm">第五章</a> <a href="PIC16Cxxx-6.htm">第六章</a> 
              <a href="PIC16Cxxx-7.htm">第七章</a> <a href="PIC16Cxxx-8.htm">第八章</a> 
              <a href="PIC16Cxxx-9.htm">第九章</a> <a href="PIC16Cxxx-10.htm">第十章</a></p></td>
        </tr>
      </table>
      <table width="700" border="0" cellspacing="0" cellpadding="0">
        <tr> 
          <td width="20">&nbsp;</td>
          <td>&nbsp;</td>
        </tr>
      </table>
      <table width="700" border="0" cellspacing="0" cellpadding="0">
        <tr bgcolor="#990000"> 
          <td height="1" width="634"></td>
        </tr>
        <tr align="right"> 
          <td height="6"></td>
        </tr>
        <tr align="right"> 
          <td><font color="#990000" size="2">[ <a href="index.htm">返回</a> ]</font> 
          </td>
        </tr>
        <tr>
          <td>&nbsp;</td>
        </tr>
        <tr> 
          <td>&nbsp;</td>
        </tr>
      </table></td>
  </tr>
</table> 
 
</body> 
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -