Interrupt İşleminde Delay() veya Millis() Komutları Çalışmıyor

yusufhaystra

Yeni üye
Katılım
22 Tem 2019
Mesajlar
6
Tepkime puanı
0
Puanları
1
Konum
Türkiye - İstanbul
Merhaba,
AttachInterrupt ile çalışan void (Boş dönüt) fonksiyonun içerisinde herhangi bir yerde delay(); veya millis(); komutlarını kullandığımda çalışmıyor. Eğer bu komutlar olmazsa, sorunsuz bir şekilde çalışıyor. Ancak içerisinde bulunan işlemlerden dolayı bir süre beklemesi gerek. Bu konuda araştırma yaptım ancak sadece birisinin "delay() kullanma" yazısından başka bir şey göremedim. Kullandığım fonksiyon önemli değil, benim için önemli olan şey kodun bir süre ilerlememesi. Bu fonksiyonda kullanabileceğim, bir süre beklemesini sağlayan bir komut var mı veya bu sorunu nasıl düzeltebiliriz ?
Kod:
#define sinyalverport0 18
void setup
{
  digitalWrite(sinyalverport0, LOW);
  attachInterrupt(3, deneme, LOW);
}
void loop
{
// kodlarım
}
void deneme()
{
// kodlarım
delay(500); // bu komutu koyduğumda, deneme fonksiyonu hiç çalışmıyor.

int saniye = millis();
while (millis() - saniye < 2000);
// yukarıdaki 2 satırlı kodu koyduğumda da deneme fonksiyonu hiç çalışmıyor.
}
Aklıma şu da gelmişti tabii;
Kod:
short sayi = 0;

while (sayi < 1000)
    sayi++; // her bir sorgu 1 ms veya altında olduğunu varsayarsak tahminen 1 saniye sonra döngüden çıkacak olur diyebilirdik ama öyle değil çünkü 1 milisaniyenin çok çok altında sürelerde çalışıyor. Bu da bu kontrolü yapamayacağım anlamına geliyor.
 

amenofis

Üye
Katılım
18 Tem 2019
Mesajlar
36
Tepkime puanı
7
Puanları
8
Konum
Bursa
Arduino Reference

Burada açıkça yazıyor delay ve millis kesme içinde çalışmaz diye. delay'a alternatif olarak _delay_ms() kullanabilirsin ama kesme içinde beklemek diğer kesmeleri bloklar. Mesela programın başka bir yerinde delay() kullanmış isen o delay süresi uzar. Kesmeler çok kısa işlemler için kullanılmalıdır.
 

alio1984

Üye
Katılım
9 Ağu 2019
Mesajlar
43
Tepkime puanı
1
Puanları
8
Konum
istanbul
int saniye = millis(); Bu veri tipi hatalı. unsigned long saniye= millis(); olarak ilk değişikliğimizi yapalım. Muhtemelen calisacaktir. Calısmaz ise ayrıntılı bakmaya calisiriz.

Tesekkurler,
Ali
 
Üst