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);
}
}