اینو همین الان نوشتم تست کن ببین به کارت میاد
کد ها هم کمتر می شن هم بهینه می شنunsigned long timer;
boolean count = false;
boolean show = false;
void setup() {
pinMode(A0,INPUT);
Serial.begin(115200);
}
void loop() {
if (count == true){
if(digitalRead(A0) == 1){count = false;show = false;delay(1000);timer = millis();}
}
if (count == false){
if(digitalRead(A0) == 1){count = true;show = true;delay(1000);timer = millis();}
}
if (show == true){
Serial.println(millis() - timer);
delay(1);
}
}
میتونی اینو بدون اینتراپت هم بنویسیا
کافیه یه flag تعریف کنی به ازای فشار دادن اول flag بشه 1
به ازای فشار دادن دوم flag بشه 0 دوباره
کارش نسبت به اینتراپت بهتره و دردسر و تداخل های اینتراپت رو هم نداره
کد رو تست نکردم ولی چون میکروثانیه میخواد به جای millis بایدmicros استفاده کنه
https://www.arduino.cc/en/Reference/Micros
ممنون من کدتون یکم تغییر دادم شد کد زیر یکم ایراد داره اگه چکش کنید ممنون میشم در ضمن من از پول داون استقاده کردن بخاطر همین شرط برابری رو low قرار دادم ایرادش اینه که کلیدها رو چن بار میشمره و فاصله زمانی برابر 20 میکرو ثانیه ثبت میشه اونم چن بار باوجود اینکه من یه حلقه whileگذاشتم که کلید تغییر حالت داد بره خط بعدی و قاصله دوبار کلیذ زدن من قطعاا بیشتر از 20 میکرو ثانیه هستش
unsigned long timer=0;
boolean count = true;
boolean show = true;
void setup() {
pinMode(16,INPUT);
Serial.begin(9600);
}
void loop() {
if (count ==false){
if(digitalRead(16)==LOW){
while(digitalRead(16)==HIGH);show = false;
}
}
if (count == true){
if( digitalRead(16) == LOW){timer = micros(); while(digitalRead(16)==HIGH);count = false;
}
}
if (show == false){
Serial.println(micros() - timer);
show=true;count = true;
delay(50);
}
}
ویرایش توسط ANOOSHEH : 07-16-2016 در ساعت 11:36 AM
و تجربه ثابت کرده اینکه milisو micros را مدام از مقدار اولیه اش کم کنیم مدام خطا میده و اعداد پرت در ضمن این دوتا دستور مدام در طول برنامه در حال شمردن هستند در صورتی که من فقط در یک زیر بذنامه میخام زمان شروغ به شمارش و و stop
شود این خودش در برنامه اختلال ایجاد میکنه در ضمن هر حدود 70 دقیقه مقدار انها صفر میشه و اگه این پایان 70 دقیقه دقیقا بیفته وسط برنامه من مشکل ایجاد میکنه من توی برنامه code vision این برنامه رو با اینتراپت نوشتم و فقط کدهای اون رو با اردوینو میخام معادل این کدها
#asm
.equ __lcd_port=0x1B ;PORTA
#endasm
و بعد هر جا خواستم تایمر راه بیفته
#asm("sei")
و هر جا تایمر از کار بیفته
#asm("cli")
با یه سری مخلفات دیگه که ازش صرفنظر کردم
ممنون میشم یکم راجع به کتابخونه stopwatch و نحوه درس کردن و کار کردنش توضیح بدید ببینید برنامه من طولانیه من توضیح مختصری راجع بهش دادم که کد اصلی و طریقه نوشتنش دستم بیاد
دقت اندازه گیری در برنامه برای من مهمه و قک میکنم حلقه های تو در تو if دقت برنامه رو پایین میاره (*برنامه اینه که بعد از برقراری یه سری شرط که خودش چنتا if هستش زمان شروع به شمارش کنه و بعد از فشرده شده یه کلید خاص که اونم بستگی به شروط داره و خودش چنتا if داره شمارش زمان متوقف میشه ینی من زمان بین برقراری شروط و فشرده شده یک کلید متناسب با اون رو میخوام )*اینکه بخوام زمان رو هم با if و کم کردنش از زمان اولیه بدست بیارم تجربه ثابت کرده اعداد اونجوری که باید نیست
ویرایش توسط ANOOSHEH : 07-16-2016 در ساعت 12:55 PM
به خاطر اینه که تاخیر های 1 ثانیه ایی رو حذف کردی
سرعت پردازش بخاطر چند if پایین نمیاد.
اینکه خودتو جای پردازنده بزاری و بگی آخی داره کم میاره کاملا اشتباه است. سرعت همین پردازنده ۱۶ مگاهرتزی انقدر زیاد هست که نتونی درکش کنی. ۱۶ مگاهرتز یعنی ۱۶ میلیون بار در هر ثانیه.
میلی ثانیه یعنی ۱۰۰۰ بار در ثانیه.
یعنی شما تقریبا می تونی ۱۰۰۰ دستور if رو در کسری از ثانیه پردازش کنی.
اگر خودت رو جای پردازنده بزاری نمی تونی برنامه نویسی کنی
ینی میخاید بگید دستوری معادل انچه در codevision هست تو واردوینو وجود نداره من دلم میخاد با امکانات اردوینو اشنا شم علاوه بر اینکه کارم راه بیفته علاوه بر این اون ایراد 70 دقیقه رو چیکار کنم ؟