Ynt: Arduino'da Kesme Nasıl yapılıyor?

Başlatan veliusta, 28 Haziran 2014, 22:53:02

veliusta

Basit bir kod yazdım aşağıya;
Buton'a bastığında Led geçişlerinde Bekleme Sürelerini değiştirecek.
Kesme ile Türkçe bir kaynak bulamadım. İngilizcesi olan anlatabilir mi?
http://arduino.cc/en/Reference/AttachInterrupt



mesaj birleştirme:: 29 Haziran 2014, 14:35:21

const int ledPin[11] = {3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
int ButonBasilmaSayisi = 0;
int x=0;
long bekle=3000;

void setup(){
for(x=0; x<11; x++){
  pinMode(ledPin[x], OUTPUT);
}
  attachInterrupt(0, KESME, FALLING);
  Serial.begin(9600);
  Serial.println("Program BASLADI!");
}

void loop(){
for(x=0; x<11; x++){
  digitalWrite(ledPin[x], HIGH);
  delay(bekle);
}
for(x=0; x<11; x++){
  digitalWrite(ledPin[x], LOW);
}
  delay(bekle);
}

void KESME(){
  if(ButonBasilmaSayisi == 5){
  ButonBasilmaSayisi=0;
  }
  else{
   ButonBasilmaSayisi++;
   }
  if(ButonBasilmaSayisi == 0){
  bekle=3000;
  }
  if(ButonBasilmaSayisi == 1){
  bekle=500;
  }
  if(ButonBasilmaSayisi == 2){
  bekle=300;
  }
  if(ButonBasilmaSayisi == 3){
  bekle=100;
  }
  if(ButonBasilmaSayisi == 4){
  bekle=50;
  }
  if(ButonBasilmaSayisi == 5){
  bekle=25;
  }
  Serial.print("Butona Basilma Sayisi: ");
  Serial.println(ButonBasilmaSayisi);
  Serial.print("Bekleme Suresi: ");
  Serial.println(bekle);
  }


BÖYLE Birşey yaptım. Bekleme Süresi 3 Sn iken, Bu süre bitmeden hızlandırma yapamıyorum.. Bunu nasıl yaparım???

gumush

Istedigniz bir pine'e interrupt'i atayabilirsiniz. Bu pinin degeri degistiriginde yukselen yada dusen kenarinda ise istediniz bir fonksiyonu calisirabilirsiniz. Ancak fonksiyon bir parametre alamaz yada bir parametre donduremez.
Sizin kodda buton pini 2 oldugundan attachInterrupt(2 , KESME, FALLING); seklinde olacak.
Hikmet Gumus  izmir

veliusta

#2
hayır öyle olmayacak.
attachInterrupt(0, KESME, FALLING);   2.pin
attachInterrupt(1, KESME, FALLING);   3.pin

mesaj birleştirme:: 29 Haziran 2014, 11:58:23

Aklıma birşey geldi.
Delay yerine bir for döngüsü yapar. int q 10000 e kadar döndürürüm.
butona basınca 10000 yaparım. geri geldiğinde diğerine geçer. Böyle olabilir.
Başka nasıl yapılabilir?

mehmet

#3
Kesme içerisindeki beklemeleriniz bitinceye kadar işlem
yapamazsınız.

"ButonBasilmaSayisi" değişkenini loop() içerisinde
if, switch gibi fonksiyonlar içerisinde kontrol ederek
gerekli bekletmeyi sağlayabilirsiniz...

Bir de negatif sayılar kullanılmayacaksa unsigned int.
255' e kadar olan sayılarda da char tanımlamasını kullanma
alışkanlığı edininiz. Mcu fazladan işler yapmasın, hafızada
gereksiz şeyler saklanmasın...

Sanırım ATMega328 kullanıyorsunuz değil mi? Zira
Mega8 de her pin için kesme ayarlayamazsınız...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

veliusta

#4
Teşekkürler veri tiplerini kafama göre yapmıştım.

byte ButonBasilmaSayisi = 0;
byte x=0;
unsigned int bekle=3000;

mesaj birleştirme:: 30 Haziran 2014, 04:21:16

const int ledPin[11] = {3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
int ButonBasilmaSayisi = 0;
int x=0;
int t=3000;
int i=0;


void setup(){
for(x=0; x<11; x++){
  pinMode(ledPin[x], OUTPUT);
}
  attachInterrupt(0, KESME, FALLING);
  Serial.begin(9600);
  Serial.println("Program BASLADI!");
}

void loop(){
for(x=0; x<11; x++){
  digitalWrite(ledPin[x], HIGH);
  for(i=0; i<t; i++){
  delay(1);
}
}

for(x=0; x<11; x++){
  digitalWrite(ledPin[x], LOW);
}
   delay(1);
   }

void KESME(){
  if(ButonBasilmaSayisi == 5){
  ButonBasilmaSayisi=0;
  }
  else{
   ButonBasilmaSayisi++;
   }
  if(ButonBasilmaSayisi == 0){
  t=3000;
  }
  if(ButonBasilmaSayisi == 1){
  t=500;
  }
  if(ButonBasilmaSayisi == 2){
  t=250;
  }
  if(ButonBasilmaSayisi == 3){
  t=100;
  }
  if(ButonBasilmaSayisi == 4){
  t=50;
  }
  if(ButonBasilmaSayisi == 5){
  t=25;
  }
  Serial.print("Butona Basilma Sayisi: ");
  Serial.println(ButonBasilmaSayisi);
  Serial.print("Bekleme Suresi: ");
  Serial.println(t);
  }


Böyle birşey yaptım(Salladım). İstediğim gibi çalışıyor. Daha iyi bir mantık ile nasıl yapılır.??

gumush

Alıntı yapılan: veliusta - 29 Haziran 2014, 11:51:57
hayır öyle olmayacak.
attachInterrupt(0, KESME, FALLING);   2.pin
attachInterrupt(1, KESME, FALLING);   3.pin

mesaj birleştirme:: 30 Haziran 2014, 11:58:23

Aklıma birşey geldi.
Delay yerine bir for döngüsü yapar. int q 10000 e kadar döndürürüm.
butona basınca 10000 yaparım. geri geldiğinde diğerine geçer. Böyle olabilir.
Başka nasıl yapılabilir?

Haklisiniz ben atlamisim.
Hikmet Gumus  izmir

elektronart

#6
interruptin içinde print kullanmak 10 kusurlu hareketten birisidir, ayrıca buton basılma sayısı 5 ise sıfırlıyorsun sonra da 5 mi diye kontrol ediyorsun, asla o sayının 5 olduğunu yakalayamazsın. Şuna ne dersin

interrupt içinde basılma sayısı 1 artacak, buna uygun t hesaplanacak
loop içinde buton basılma sayısına bağlı olarak bekleme zamanı belirlenecek bunun için de millis ve micros u kullanabilirsin. Aşağıda pseudo olarak yazmaya çalıştım.
önce kodu yanlış anlamışım eşit aralıkla yakıp söndürüyor gibi algılamıştım, sonra sırasıyla yakıp hepsini söndürdüğünü farkettim, düzeltme o yüzden yapıldı.

#define YAK         1
#define SONDUR  0

unsigned char state = YAK;
unsigned char x = 0;
unsigned int offset = 0;

void loop(){

  if((millis() == ofset + t) && state == YAK ){
    ofset = millis();
    digitalWrite(ledPin[x++], HIGH);
    if (x==10) state = SONDUR
  }
  if(state == SONDUR){
    for(x=0; x<11; x++) digitalWrite(ledPin[x], LOW);
    x = 0;
    state = YAK;
  }
}

void KESME(){
  ButonBasilmaSayisi++;
  switch(ButonBasilmaSayisi%5){
    case 0:
      t = 300;
      break;
     .....
  }
}
Açık Elektronik