Arduino da Timer İnterrupt Durmuyor

Başlatan berkay_91, 30 Mayıs 2021, 19:35:18

berkay_91

#include <avr/io.h>
#include <avr/interrupt.h>

boolean knt = false;

void setup()
{
  pinMode(8, INPUT); // Buton
  pinMode(13, OUTPUT); // LED
  timer_on();
}

ISR(TIMER1_COMPA_vect)
{
  digitalWrite(13, !digitalRead(13));
}

void loop()
{
  if (digitalRead(8) == 1 && knt == false)
  {
    timer_off();
    knt = true;
    delay(500);
  }
  else if (digitalRead(8) == 1 && knt == true)
  {
    timer_on();
    knt = false;
    delay(500);
  }
}

void timer_on() // Timer1 kesmesi saniyede bir çalışacak şekilde ayarlanacaktır (1 Hz)
{
  cli();
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1  = 0;
  OCR1A = 15624;

  TCCR1B |= (1 << WGM12);
  TCCR1B |= (1 << CS12) | (1 << CS10); /* Adımlar arasında geçen süre kristal hızının 1024'e bölümü olarak ayarlandı */
  TIMSK1 |= (1 << OCIE1A);  /* Timer1 kesmesi aktif hale getirildi */
  sei();
}

void timer_off()
{
  cli();
  TCCR1B &=~ (1 << CS10);
  TCCR1B &=~ (1 << CS12);
  digitalWrite(13, 0);
}

bu programı çalıştırdığımda butona kaç kere basarsam basayım kesme durmuyor LED 1 saniyede bir yanıp sönmeye devam ediyor, butonu bağladığım 8.
bacağı 1k dirençle pull down yaptım ve buton arkı için 500 ms gecikme ekledim, yardımcı olabilecek var mı? bu kesmeyi nasıl durdurabilirim?

mg1980

#1
Pull Down direnci az değil mi.. 10k yapmakta fayda var.. loop döngüsünde sanki gariplik var.. İf, İf else durumlarında devamlı butona basma şartı var.. Basıp bırakma durumunu ayarlama şansınız sanki yok gibi..

berkay_91

Alıntı yapılan: mg1980 - 30 Mayıs 2021, 19:59:34Pull Down direnci az değil mi.. 10k yapmakta fayda var.. loop döngüsünde sanki gariplik var.. İf, İf else durumlarında devamlı butona basma şartı var.. Basıp bırakma durumunu ayarlama şansınız sanki yok gibi..

tek buton koyduğum için basıp bırakmayı knt değişkeninin true yada false olma durumu ile sağladım, algoritmada bir hata yok, sadece kesmeyi durduracak kodu bilmiyorum, cli(); fonksiyonu işe yaramıyor

mg1980

#3
Anlayabildiğim kadarıyla bu kesmenin durdurulup tekrar başlaması için butona devamlı basılması gerekir.Butonu bıraktığınızda LED'in konumu değişmez diye düşünüyorum.Eğer butona basılmazken kesme çalışıyor ve LED durum değiştiriyorsa kesmeyi durdurmak istediğiniz yere OCR1A=0 ; yazın  deneyin.

berkay_91

Alıntı yapılan: mg1980 - 30 Mayıs 2021, 20:37:37Anlayabildiğim kadarıyla bu kesmenin durdurulup tekrar başlaması için butona devamlı basılması gerekir.Butonu bıraktığınızda LED'in konumu değişmez diye düşünüyorum.

butona devamlı basılmasına gerek yok, butona ilk basıldığında if içerisindeki iki şart sağlanır ve program if in içine girer, buton serbest bırakıldığında if ve else if deki birinci şart sağlanmadığı için giremez, butona bir daha basıldığında bu sefer else if deki her iki şart sağlandığı için program else if in içine girer... knt değişkeninin durumuna bakınız. Algoritmada hata yok

mg1980

Butona basılmadığında  1 sn.de LED durum değiştiriyor mu ?


mg1980

void setup()'da timer_on fonksiyonuna gidiliyor.Timer ayarları yapılıyor.(1 saniyeye ayarlanıyor) .1 saniyede kesme oluşuyor ve LED durum değiştiriyor.Bundan sonra loop() içinde butona basılsa da if,if else bölümüne giriş olmuyor gibi.Bir gariplik var..if (digitalRead(8) == HIGH ....şeklinde dener misiniz ?

berkay_91

Alıntı yapılan: mg1980 - 30 Mayıs 2021, 21:14:38void setup()'da timer_on fonksiyonuna gidiliyor.Timer ayarları yapılıyor.(1 saniyeye ayarlanıyor) .1 saniyede kesme oluşuyor ve LED durum değiştiriyor.Bundan sonra loop() içinde butona basılsa da if,if else bölümüne giriş olmuyor gibi.Bir gariplik var..if (digitalRead(8) == HIGH ....şeklinde dener misiniz ?

serial monitörde debug yaptım, timer_on() ve timer_off() fonksiyonlarını yorum yapınca normal çalışıyor butona her basıldığında sırayla if ve else if e giriyor fakat timer_on() ve timer_off() fonksiyonlarını if ve else if in içinden çağırınca butona bir kere basmama rağmen if e girdikten sonra bir kerede else if e giriyor sorun burada başlıyor

mg1980



serkan

timer_on() ve timer_off() loop'un üstünde olması gerekmezmi ?

mg1980

knt, nin durumu timer on ve timer off içinde değiştirilip loop içinde butona basıldığında sorgulanır durumuna göre timer on veya off, a gidilebilir..

berkay_91

Alıntı yapılan: serkan - 30 Mayıs 2021, 22:54:22timer_on() ve timer_off() loop'un üstünde olması gerekmezmi ?

üstte olmasına gerek yok bir şey fark etmez

berkay_91

Alıntı yapılan: mg1980 - 30 Mayıs 2021, 23:06:41knt, nin durumu timer on ve timer off içinde değiştirilip loop içinde butona basıldığında sorgulanır durumuna göre timer on veya off, a gidilebilir..

değişen bir şey olmaz hocam