中断开关(PIC)
interrupt switch (PIC)
#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输入用于开关。
当某些例程为运行时,开关运行不正常。
如果你使用中断是可能的。但是我不知道如何正确使用它。
您需要了解轮询和中断之间的区别。
通过轮询(您似乎在做什么),您可以定期检查某些 "thing" 的状态并对其采取行动。
对于中断,"thing" 的发生会导致您的主执行线程被挂起,并且中断服务例程 (ISR) 运行。
轮询的缺点是潜在的延迟时间长,从事情发生到您发现它之间的时间。事实上,你甚至可以 丢失 事件,例如,如果事情是一个瞬时开关 - 你将它打开然后关闭,然后当代码检查它时,它就关闭了。
现在,如果您愿意,您可以仍然使用轮询,前提是您了解这些含义。有时最简单的解决方案是更频繁地轮询。
例如,如果您的 //some routines..
作业之一是一个很长的 运行ning 循环,您可以从那里进行轮询:
for (int i = 0; i < numThings; i++) {
doSomethingQuickWitn (thing[i]);
SW(); // Poll here as well
}
// Rather than here.
但是,对于 _minimal 延迟,使用中断通常更好,并且合理地简单,一旦您了解了这个概念。
您的 ISR(将 运行 在给定事件上中断执行的主线程)只需存储事件已经发生的事实并以某种方式将其传达给您的主线程。
在您不关心事件发生了多少次的情况下,标记就可以了。您的 ISR 只需设置标志,您的主执行线程会定期检查它是否已设置,然后清除它(禁用中断以避免竞争条件)。那将类似于(伪代码):
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 流向执行的主线程。
#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输入用于开关。 当某些例程为运行时,开关运行不正常。 如果你使用中断是可能的。但是我不知道如何正确使用它。
您需要了解轮询和中断之间的区别。
通过轮询(您似乎在做什么),您可以定期检查某些 "thing" 的状态并对其采取行动。
对于中断,"thing" 的发生会导致您的主执行线程被挂起,并且中断服务例程 (ISR) 运行。
轮询的缺点是潜在的延迟时间长,从事情发生到您发现它之间的时间。事实上,你甚至可以 丢失 事件,例如,如果事情是一个瞬时开关 - 你将它打开然后关闭,然后当代码检查它时,它就关闭了。
现在,如果您愿意,您可以仍然使用轮询,前提是您了解这些含义。有时最简单的解决方案是更频繁地轮询。
例如,如果您的 //some routines..
作业之一是一个很长的 运行ning 循环,您可以从那里进行轮询:
for (int i = 0; i < numThings; i++) {
doSomethingQuickWitn (thing[i]);
SW(); // Poll here as well
}
// Rather than here.
但是,对于 _minimal 延迟,使用中断通常更好,并且合理地简单,一旦您了解了这个概念。
您的 ISR(将 运行 在给定事件上中断执行的主线程)只需存储事件已经发生的事实并以某种方式将其传达给您的主线程。
在您不关心事件发生了多少次的情况下,标记就可以了。您的 ISR 只需设置标志,您的主执行线程会定期检查它是否已设置,然后清除它(禁用中断以避免竞争条件)。那将类似于(伪代码):
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 流向执行的主线程。