Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => Atmel => Konuyu başlatan: berkay_91 - 30 Mayıs 2021, 19:35:18

Başlık: Arduino da Timer İnterrupt Durmuyor
Gönderen: berkay_91 - 30 Mayıs 2021, 19:35:18

#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?
Başlık: Ynt: Arduino da Timer İnterrupt Durmuyor
Gönderen: mg1980 - 30 Mayıs 2021, 19:59:34
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..
Başlık: Ynt: Arduino da Timer İnterrupt Durmuyor
Gönderen: berkay_91 - 30 Mayıs 2021, 20:25:09
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
Başlık: Ynt: Arduino da Timer İnterrupt Durmuyor
Gönderen: mg1980 - 30 Mayıs 2021, 20:37:37
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.
Başlık: Ynt: Arduino da Timer İnterrupt Durmuyor
Gönderen: berkay_91 - 30 Mayıs 2021, 20:51:47
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
Başlık: Ynt: Arduino da Timer İnterrupt Durmuyor
Gönderen: mg1980 - 30 Mayıs 2021, 20:54:48
Butona basılmadığında  1 sn.de LED durum değiştiriyor mu ?
Başlık: Ynt: Arduino da Timer İnterrupt Durmuyor
Gönderen: berkay_91 - 30 Mayıs 2021, 21:01:43
Alıntı yapılan: mg1980 - 30 Mayıs 2021, 20:54:48Butona basılmadığında  1 sn.de LED durum değiştiriyor mu ?
evet
Başlık: Ynt: Arduino da Timer İnterrupt Durmuyor
Gönderen: mg1980 - 30 Mayıs 2021, 21:14:38
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 ?
Başlık: Ynt: Arduino da Timer İnterrupt Durmuyor
Gönderen: berkay_91 - 30 Mayıs 2021, 21:44:11
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
Başlık: Ynt: Arduino da Timer İnterrupt Durmuyor
Gönderen: mg1980 - 30 Mayıs 2021, 22:02:01
if yerine  " while " ile olur mu ?
Başlık: Ynt: Arduino da Timer İnterrupt Durmuyor
Gönderen: berkay_91 - 30 Mayıs 2021, 22:32:46
değ
Alıntı yapılan: mg1980 - 30 Mayıs 2021, 22:02:01if yerine  " while " ile olur mu ?

değişen bir şey olmaz
Başlık: Ynt: Arduino da Timer İnterrupt Durmuyor
Gönderen: serkan - 30 Mayıs 2021, 22:54:22
timer_on() ve timer_off() loop'un üstünde olması gerekmezmi ?
Başlık: Ynt: Arduino da Timer İnterrupt Durmuyor
Gönderen: mg1980 - 30 Mayıs 2021, 23:06:41
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..
Başlık: Ynt: Arduino da Timer İnterrupt Durmuyor
Gönderen: berkay_91 - 31 Mayıs 2021, 11:06:25
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
Başlık: Ynt: Arduino da Timer İnterrupt Durmuyor
Gönderen: berkay_91 - 31 Mayıs 2021, 11:07:31
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
Başlık: Ynt: Arduino da Timer İnterrupt Durmuyor
Gönderen: mg1980 - 31 Mayıs 2021, 16:39:11
@berkay_91 ,
Biraz çalışma yaptım da sanırım Arduino'da Timer1 delay fonksiyonlarını çalıştırıyor.Kodunuzdaki delay fonksiyonları aslında çalışmıyor.Bunların yerine 1000'e kadar for döngüsü koyun.Ben biraz farklı kod ile tek butonla çalıştırdım. knt=0 olduğu halde sadece cli() fonksiyonu, knt=1 olduğu durumda da sei() fonksiyonu koydum.timer_on() fonksiyonu sadece setup içinde bir kez çalışıyor.Kodu isterseniz buraya koyarım.
Başlık: Ynt: Arduino da Timer İnterrupt Durmuyor
Gönderen: berkay_91 - 31 Mayıs 2021, 18:59:21
Alıntı yapılan: mg1980 - 31 Mayıs 2021, 16:39:11@berkay_91 ,
Biraz çalışma yaptım da sanırım Arduino'da Timer1 delay fonksiyonlarını çalıştırıyor.Kodunuzdaki delay fonksiyonları aslında çalışmıyor.Bunların yerine 1000'e kadar for döngüsü koyun.Ben biraz farklı kod ile tek butonla çalıştırdım. knt=0 olduğu halde sadece cli() fonksiyonu, knt=1 olduğu durumda da sei() fonksiyonu koydum.timer_on() fonksiyonu sadece setup içinde bir kez çalışıyor.Kodu isterseniz buraya koyarım.
anladım, evet kodunuzu paylaşabilirsiniz
Başlık: Ynt: Arduino da Timer İnterrupt Durmuyor
Gönderen: mg1980 - 31 Mayıs 2021, 19:06:36
//#include <avr/io.h>
//#include <avr/interrupt.h>

volatile int knt =0;

void setup()
{
  pinMode(8, INPUT_PULLUP); // Buton1
  pinMode(9, INPUT_PULLUP); // Buton2
  pinMode(13, OUTPUT); // LED
  timer_on();
}

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



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

  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 loop()
{
  if(digitalRead(8) == LOW && knt==0 )
  {
   
     cli();   //timer_off();
     digitalWrite(13, 0);
     knt=1;
                //delay(1000);
     for(int i=0; i<1000; i++){
     
     }
     
  }
 
  if(digitalRead(8) == LOW && knt==1 )
  {
   sei();
   digitalWrite(13, 0);
                   //delay(1000);
   knt=0;
   for(int y=0; y<1000; y++){
     
     }
  }
}