经常看到有的同学虽然学完了单片机原理课程(有的还学了不只一种单片机),但是仍然不能独立编程,概念上存在的很多误区。其中错误最多的就是对中断的理解。事实上有很多人在这方面存在错误概念。大家先看一个我在网上看到的《用PIC16F87X单片机实现高分辨率频率计》中的一个错误的流程图(据称该文已刊登在国内某著名高校的学报上)。
这个流程图错在哪里呢?错在对中断执行过程的认识不清楚,把中断服务程序的运行嵌入了主程序的流程中,如果如上图运行程序,就不必使用中断方式,用查询方式就可以了。而且按此流程图,中断程序中的内容只能运行一次,整个程序就结束了。这样,根本不能得到要测量的结果。
什么时候需要使用中断呢?主要有以下几种情况:(1)所要执行任务的条件和发生的时间是不确定的,如果用查询方式会浪费很多时间,这时多采用外部中断方式(如对外部设备的监控,和外部的数据交换等);(2)所执行任务是要定时、反复地进行的;这时应该采用定时器中断方式(如显示器的刷新,电子秒表,周期、频率的测量等),这种方式既准确又节省时间。 从上图中可以看出,该程序是以定时方式来测量频率的。此时,主程序的任务是系统的初始化(包括堆栈指针的确定,各寄存器、存贮器、缓冲区的定义和设置、定时/计数器参数的设置、中断参数的设置等),然后就开中断,有定时任务的要启动定时器,接下来就是等待中断了。关于等待中断的内容,如果没有其他任务,就是一个原地踏步,一般用“标号:SJMP 标号”,简写用“SJMP $”就可以了;但如果有其他任务,显示,键盘扫描等等,此时就可以做这些事,但这些其他任务也要构成一个循环套,即如果没有中断发生时一直在循环执行这些任务。一旦发生中断(这里是定时时间到(定时器溢出中断),其他实例中也可能是外部设备发出请求等),主程序就会立刻停止工作,程序指针就会指向对应的中断入口地址(此时主程序停止工作的位置加以保存),去执行中断服务程序,在执行中断程序时,为避免其他中断的影响,有时要先关中断,等任务完成后再开中断。如果是定时中断,还要向时间寄存器重写时间常数,否则不能继续正确定时中断,最后要有“中断返回”,这样就可以回到中断发生时主程序停止工作的位置继续工作。
由于在主程序运行中什么时候发生中断是不确定的,所以中断服务程序不能画在主程序的流程图中。而是要单独作为一个流程画出。这个流程图最上面是“中断服务程序入口”,最下面以“中断返回”结束。下面是纠正了上面流程图错误后的正确流程图。
文章评论(0条评论)
登录后参与讨论