#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?
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..
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
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.
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
Butona basılmadığında 1 sn.de LED durum değiştiriyor mu ?
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
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 ?
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
if yerine " while " ile olur mu ?
değ
Alıntı yapılan: mg1980 - 30 Mayıs 2021, 22:02:01if yerine " while " ile olur mu ?
değişen bir şey olmaz
timer_on() ve timer_off() loop'un üstünde olması gerekmezmi ?
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..
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
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
@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.
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
//#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++){
}
}
}