Turkcell | Geleceği Yazanlar

Timer durdumak ve değer okumak

Herkese merhaba, Arduino da bir butona basılınca arka tarafta bir timer koşturmak istiyotum. Bu timerın çıkışına göre yani butona kaç saniye basıldıysa karar yapısı içerisidne led yanıp sönümü değişicek. Bir timer butona bağlı nasıl çalışır ? PİC de set_timer(),get_timer() fonk kullanarak ledi yakıp söndürdüm fakat butondan elimi çekince sanki hep butona basılıyormuş gibi sistem kendisini tekrarlıyor. Öte yandan Uno modeli var elimde- 2tane 8 bit 1tane 16 bit zamanlayıcı bulunuyor. 8 bitlik bir sayıcıya 2sn nasıl saydırılır ? delay() fonk. kullanamam sürekli -----buton okunucak.Millis() fonk ile denedim. debounce süresi çalışıyor fakat sonrasında 3sn gibi değer alamıyorum.

Bu sorunlarıma çözüm bulabilirseniz çok mutlu olurum. İyi çalışmalar.

 

----------kullandığım komutlar---------------


int sayac=0,durum=0,durum1;
bool reading;
unsigned long Debouncetime=100;
unsigned long lastTime;
long Reeltime;
cont int led 8;
const int button 5;
void setup(){
pinMode(8,OUTPUT);
pinMode(5,INPUT);
}
void loop(){
reading=digitalRead(5);
if(reading==true) {    //buton a basılmış mı ?
lastTime=millis(); //ms cinsinden değer döndür 
if((millis()-lastTime)>Debouncetime && reading==true){  //butona 100ms basıldır ve hala butona basılıyrsa timer çağırılır.
cli(); //kesmeler durduruluyor.
    TCCR1A = 0;// TCCR1A register 0'lanıyor
    TCCR1B = 0;// TCCR1B register 0'lanıyor
    TCNT1  = 0;//sayac değeri  0'la
    OCR1A = 5208;// = (16*10^6) / (1*1024) - 1 (değer 65536 dan küçük)-(timer 3sn ye ayarlanıyor.)
    TCCR1B |= (1 << WGM12);
    TCCR1B |= (1 << CS12) | (1 << CS10);  
    TIMSK1 |= (1 << OCIE1A);
  sei(); //interreuptlar aktif
}
}
}
ISR(TIMER1_COMPA_vect) {   //timer1 interrupt ı 3Hz de tetikleniyor.(3sn olunca timer bu fonksiyonu çağırır.) 
// Diyelim 3sn basmadık fakat tiemr 3sn ye ayarlandı sorunu burda yaşıyorum.Timer ı durduramıyorm.
void uzun(); // kısa mod fonk. çağırılıyor.
durum=1; //mod değiştiğini unutmamak için kullanıyorum.
}
void uzun(){
while(1){
if(durum=1 && reading==0 ){ //butondan elimizi çektiğimizde devreye girecek ve ledi yakıp söndürmek için kullanacağımız timer 1 ve 2 ye ayarlamak gerekiyor.
cli();
    TCCR3A = 0;// TCCR3A register 0'lanıyor
    TCCR3B = 0;// TCCR3B register 0'lanıyor
    TCNT3  = 0;//sayac değeri  0'la
    OCR3A = 15624;// = (16*10^6) / (0.5*1024) - 1 
//burada if(sayac==4) OCR3A = 15624;= (16*10^6) / (0.5*1024) - 1 codunu kullanmak istedim beceremedim o yüzden aşağıda sayac koşunu kontrol edip timer saniyesini 
// değiştirdim.
    TCCR3B |= (1 << WGM32);
    TCCR3B |= (1 << CS32) | (1 << CS30);  
    TIMSK3 |= (1 << OCIE3A);
  sei();
if(sayac==4){  //sayaç 4 olduktan sonra timer 2 sn ye ayarlanıyor.
cli();
  TCCR2A = 0;// TCCR2A register 0'lanıyor
    TCCR2B = 0;// TCCR2B register 0'lanıyor
    TCNT2  = 0;//sayac değeri  0'la
    OCR2A =7812 ;
    TCCR2B |= (1 << WGM22);
    TCCR2B |= (1 << CS22) | (1 << CS20);  
    TIMSK2 |= (1 << OCIE2A);
  sei();
} //if-sayac parantez
} //ilk if parantez
} //while parantez
} //uzun parantez
 
ISR(TIMER2_COMPA_vect){  //ledleri yakıp söndüren timer 
 
  if (durum1){ //ledleri her saniye başında bir yakıp söndürmek için
    digitalWrite(LED2,HIGH);
    durum1 = 0;
  }
  else{
    digitalWrite(LED2,LOW);
}

}

taahaagul

Cum, 15/11/2019 - 10:29
Hocam zamanlama timer'ı kullanırsan (CTC) ayarladığın herz (saniye) sıklığında düzenli olarak çalışacaktır. Senin External Timer kullanman gerekekmektedir. CTC ve External Kavramlarını araştırman gerekli bilgiiyi sağlar. Dilersen External Timer'a bir örnek vereyim. void setup() { pinMode(2,OUTPUT); pinMode(3,OUTPUT); pinMode(4,INPUT); attachInterrupt(0,ledyak,RISING); } void loop() { for(int x; x<30000; x++) { digitalWrite(2,HIGH); delay(1000); digitalWrite(2,LOW); delay(1000); } } void ledyak() { if(digitalRead(4) == HIGH) digitalWrite(3,HIGH); else digitalWrite(3,LOW); } Yukarıda 1 saniyedi bir led yakıp söndürüp , aynı zamandada buton kontrollü led yakıp söndürme konusu interruptlar ile yapılmıştır.

    +1

    Ertan Kocakoç

    09 Kasım 2019

    Merhaba, http://www.elektrobot.net/arduino-ile-timer-kullanimi/ bu makale yardımcı olacaktır.

    Bu soruya cevap vermek için üye olmanız veya giriş yapmanız gerekmektedir.