首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >中断开关(PIC)

中断开关(PIC)
EN

Stack Overflow用户
提问于 2015-04-02 02:41:48
回答 1查看 320关注 0票数 0
代码语言:javascript
复制
#define SW1 RB5
int IOFlag = 2; //while in out

void SW(){
    if(!RB5)
        __delay_ms(50);
        while(!RB5);
            __delay_ms(50);
        IOFlag++;
}

void main(){
    SW();
    while(IOFlag % 2 != 0){
        SW();
        //some routines..
    }
}

我用的是pic16f73,RB5输入用在交换机上。当某些例程正在运行时,开关不能正常工作。如果你使用这个中断是有可能的。然而,我不知道如何正确地使用它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-02 02:47:59

您需要理解轮询和中断之间的区别。

通过轮询(您看起来正在做的事情),您定期检查某个“事物”的状态并对其采取行动。

有了中断,“事情”就会导致执行的主线程被挂起,中断服务例程(ISR)就会运行。

轮询的缺点是延迟时间可能很长,事件发生到发现之间的时间很长。事实上,如果这个东西是一个瞬间的开关,你甚至会失去它--你打开它然后关闭,当代码检查它的时候,它就关闭了。

如果您愿意,现在仍然可以使用轮询,前提是您了解这些含义。有时,最简单的解决办法是更频繁地进行投票。

例如,如果您的//some routines..作业之一是一个长时间运行的循环,则可以在其中进行轮询:

代码语言:javascript
复制
for (int i = 0; i < numThings; i++) {
    doSomethingQuickWitn (thing[i]);
    SW(); // Poll here as well
}
// Rather than here.

然而,对于_minimal延迟来说,使用中断通常更好,而且一旦你对这个概念有了深入的了解,就会相当简单。

您的ISR (它将在给定的事件上运行,中断执行的主线程)只需存储事件已经发生的事实,并以某种方式将其传递给主线程。

对于您不关心事件发生多少次的情况,将使用一个标志来完成任务。ISR只需设置标志,执行的主线程就会定期检查它是否已设置,然后清除它(禁用中断以避免竞争条件)。这应该类似于(伪代码):

代码语言:javascript
复制
global val switchHit = false;

main:
    interrupt (7, intFn)       // call intfn() on interrupt 7
    while true:
        disableInts()          // disallow interrupts for a short while
        if switchHit:
            handleSwitch()     // switch was hit, do something (quickly)
            switchHit = false  // mark as not hit
        enableInts()           // and re-allow interrupts

        doLotsOfOtherStuff()

intfn:
    switchHit = true           // notify main

请注意,我并不担心ISR中的竞争条件,中断通常会在那里自动禁用。

更复杂的信息传输可能涉及从ISR到执行的主线程的计数,而不是标志,甚至是某种消息队列。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29404168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档