Gönderen Konu: buton uygulaması  (Okunma sayısı 342 defa)

Çevrimdışı vulture

  • Yeni Üye
  • *
  • İleti: 5
buton uygulaması
« : 12 Ekim 2017, 14:47:03 »
Herkese iyi günler dilerim, iyi çalışmalar. Program yazma konusunda yeniyim ama aklıma bir proje geldi ve sizden yardım almak istiyorum. Yardımcı olursanız sevinirim.
Elimde bir buton var ve bu butona 5 sn içerisinde kaç defa bastığımı lcd de gösterecek program yazacağım.
Bu 5 sn'lik periyot; butona ilk basışımda başlayıp 5 sn sonra sistemin kendini sıfırlamasını istiyorum.
Burada ne kullanmam gerekiyor? Mesela o 5 sn yi saydırıp resetleme işlemi için timer0  kesmesi mi kullanmam lazım?

Çevrimdışı vitruvius

  • Emektar
  • *****
  • İleti: 842
Ynt: buton uygulaması
« Yanıtla #1 : 13 Ekim 2017, 01:18:15 »
Timer kesmesi olur evet. Butona bastiginda timer'i ve bir flag'i aktif edersin. Sonra da int bir degisken tanimlarsin ilk degeri sifir olacak sekilde. Tanimladigin flag aktifse butona her bastiginda bu degiskeni bir arttirirsin. 5 sn olunca basta aktif ettigin flag'i false yapip degiskenin en son durumuna bakarsin.

Tabi buton icin debounce olayini da dusunmen lazim yoksa istedigin sonuclari alamazsin.

Kolay gelsin.

Çevrimdışı pwm.c

  • Emektar
  • *****
  • İleti: 551
  • pwmccs
    • pwmccs.wordpress.com
Ynt: buton uygulaması
« Yanıtla #2 : 13 Ekim 2017, 11:50:16 »
butonu okumak için timer1 sayacını harici giriş olarak ayarlayabilirsin.
setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);
bu durumda T1CKL girişine bağladığın butona her basmada timer1 değer bir artar.  bu değeri okumak için get_timer1(); fonksiyonunu kullanacaksın. örneğin:
Kod: [Seç]
sonuc=get_timer1();
lcd_gotoxy(1,1);
printf(lcd_putc," saniye=%d       \n sayac=%lu   ",saniye,sonuc);

zamanlama için timer0 kesmesi uygun olur. 4mhz osilatör için 16,3mslik taşma zamanı ayarlayabilirsin.
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64|RTCC_8_BIT);
kesme içinde tuttuğun sayaç 61 olduğunda 1 saniye süre elde etmiş olursun.
Kod: [Seç]
#INT_TIMER0
void  TIMER0_kesme(void) {
if(++sayac == 61)  // timer0 61 kez taştıysa
 {                 // 61 x 16.3 ms = 1 sn süre geçmiştir
   sayac = 0;
      if(++saniye == 5)  // 5 saniye zaman geçmiş ise
      {               
      set_timer1(0);  // buton sayacını sıfırlar
      }
 }
}

buradaki gibi donanım sayıcılarını kullanırsan birbirinden bağımsız çalışan iki ayrı sayaç elde edebilirsin. gerisi senin program yazma becerine kalmış.
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-