|
我要做个视频监控的程序,开发中发现中断有点问题,特来求助各位大神。
主程序的循环会驱动电击自动转动摄像头,利用外部中断来进行抓拍,抓拍时要保证清晰所以电机要暂停转动,所以按下抓拍按钮要设定延时来保证电机停止图像稳定。那么,问题来了,启动抓拍的时候,电机停止了,但是抓拍动作没有执行。
采用2号口(0号中断)作为抓拍输入,设为上拉电阻模式,低电平有效。
拍照动作输出端有两个,是12、13,高电平有效,程序设定是12号先开启高电平,等待2秒,然后13号开启高电平驱动摄像头抓拍动作。
出现的问题是,输入端按下按钮以后,12号开启了高电平,但不管等多久13号都不会开启高电平。我又修改了程序不用中断,循环调用的方式却可以正常。不知为什么?
源代码如下:
/*
*/
int CPinIn=2;//click
int NPinIn=6;//+
int SPinIn=7;//-
int KPinOut1=12;//1
int KPinOut2=13;//2
int MPinOutA=10;//machine+
int MPinOutV=11;//machine-
int APinInF=A0;//
int APinInT=A1;//dealy time
//=======================================
int vNStatus=0;
int vSStatus=0;
int vCStatus=0;
int vFStatus=0;
int vTStatus=0;
int vK1Status=0;
int vK2Status=0;
int vMAStatus=0;
int vMVStatus=0;
//===============================================
void setup() {
// declare the ledPin as an OUTPUT:
pinMode(CPinIn, INPUT_PULLUP);
pinMode(NPinIn, INPUT_PULLUP);
pinMode(SPinIn, INPUT_PULLUP);
pinMode(KPinOut1, OUTPUT);
pinMode(KPinOut2, OUTPUT);
pinMode(MPinOutA, OUTPUT);
pinMode(MPinOutV, OUTPUT);
digitalWrite(KPinOut1,LOW);
digitalWrite(KPinOut2,LOW);
attachInterrupt(CPinIn-2,sTakePicC,LOW);
}
//===============================================
void loop() {
vCStatus=digitalRead(CPinIn);
vNStatus=digitalRead(NPinIn);
vSStatus=digitalRead(SPinIn);
vFStatus=analogRead(APinInF);
vTStatus=analogRead(APinInT);
if(vNStatus==LOW && vSStatus==LOW)
{
vFStatus=0;//stop
sMachRun(MPinOutA,MPinOutV);
}
else if(vNStatus==LOW)
{
sMachRun(MPinOutA,MPinOutV);//N
}
else if(vSStatus==LOW)
{
sMachRun(MPinOutV,MPinOutA);//S
}
else
{
vFStatus=0;//stop
sMachRun(MPinOutA,MPinOutV);
}
if(vTStatus>=0&&vTStatus<=1000)
{
sTakePicDelay();
}
else
{
digitalWrite(KPinOut1,LOW);
digitalWrite(KPinOut2,LOW);
}
}
//===============================================
void sMachRun(int pinOut1,int pinOut2)
{
analogWrite(pinOut1,vFStatus/4);
analogWrite(pinOut2,0);
}
void sTakePicDelay()
{
delay(vTStatus*10+1);
sTakePic();
}
void sTakePicC()
{
detachInterrupt(CPinIn-2);
sTakePic();
attachInterrupt(CPinIn-2,sTakePic,LOW);
}
void sTakePic()
{
analogWrite(MPinOutA,0);
analogWrite(MPinOutV,0);
digitalWrite(KPinOut1,HIGH);
delay(2000);
digitalWrite(KPinOut2,HIGH);
delay(500);
digitalWrite(KPinOut1,LOW);
digitalWrite(KPinOut2,LOW);
} |
|