سلام خسته نباشید من التراسونیک سه پایه دارم که عبارت هستند از vcc _ gnd_ ,signal اما از اونجایی که تعداد ماژول های من زیاد هست می خواهم بتوانم با استفاده interrupt این کار رو بکنم و از اون جایی که یک پایه برای ارسال و دیافت اطلاعات دارم باید مداوم آن را فعال وغیر فعال کنم و مداوم باید آن را به پایه دیجتال تعریف کنم :
1. ایا این پایه ممی تواند به عنوان خروجی هم تعریف شود ؟
2. در ضمن این کد من هستش اما در زمان اجرا فقط یک بار وارد تابع INTERRUPT می شه تا مقدار بگیره گاهی اوقات هم نمی گیره:
کسی می تونه کمکم کنه ؟
1. ایا این پایه ممی تواند به عنوان خروجی هم تعریف شود ؟
2. در ضمن این کد من هستش اما در زمان اجرا فقط یک بار وارد تابع INTERRUPT می شه تا مقدار بگیره گاهی اوقات هم نمی گیره:

کسی می تونه کمکم کنه ؟
#define SIG 7
volatile bool a=0;
volatile int psl;
unsigned long Time,Resault;
void setup() {
attachInterrupt(SIG,ultra_HIGH,RISING);
Serial.begin(9600);
ultraPing();
}
void loop() {
psl_Update();
Serial.println(Resault);
}
void ultra_HIGH (){
if (a==0){
psl=11;
a=1;
delayMicroseconds(1);
}
}
void ultra_LOW(){
if (a==1){
psl=12;
a=0;
delayMicroseconds(1);
}
}
int ultraRead(int micro){
return micro*34000/1000000/2;
}
int ultraPing(){
// noInterrupts();
detachInterrupt(SIG);
delayMicroseconds(2);
digitalWrite(SIG,HIGH);
delayMicroseconds(10);
digitalWrite(SIG,LOW);
delayMicroseconds(1);
Serial.println ("aaaaaaaaaaaaaaaaa");
//interrupts();
attachInterrupt(SIG,ultra_HIGH,RISING);
}
void psl_Update(){
if (psl==11){
Time=micros();
Serial.println ("good");
detachInterrupt(SIG);
attachInterrupt(SIG,ultra_LOW,FALLING) ;
psl=0;
}
else if (psl==12){
Time =micros()-Time;
Resault=Time*34000/1000000/2;
Serial.println ("hello");
delayMicroseconds(3);
ultraPing();
psl=0;
}
else {return;}
}
volatile bool a=0;
volatile int psl;
unsigned long Time,Resault;
void setup() {
attachInterrupt(SIG,ultra_HIGH,RISING);
Serial.begin(9600);
ultraPing();
}
void loop() {
psl_Update();
Serial.println(Resault);
}
void ultra_HIGH (){
if (a==0){
psl=11;
a=1;
delayMicroseconds(1);
}
}
void ultra_LOW(){
if (a==1){
psl=12;
a=0;
delayMicroseconds(1);
}
}
int ultraRead(int micro){
return micro*34000/1000000/2;
}
int ultraPing(){
// noInterrupts();
detachInterrupt(SIG);
delayMicroseconds(2);
digitalWrite(SIG,HIGH);
delayMicroseconds(10);
digitalWrite(SIG,LOW);
delayMicroseconds(1);
Serial.println ("aaaaaaaaaaaaaaaaa");
//interrupts();
attachInterrupt(SIG,ultra_HIGH,RISING);
}
void psl_Update(){
if (psl==11){
Time=micros();
Serial.println ("good");
detachInterrupt(SIG);
attachInterrupt(SIG,ultra_LOW,FALLING) ;
psl=0;
}
else if (psl==12){
Time =micros()-Time;
Resault=Time*34000/1000000/2;
Serial.println ("hello");
delayMicroseconds(3);
ultraPing();
psl=0;
}
else {return;}
}