.

   
  ENİS ÖZDEMİR
  ProgramlanabilirLCD Göstergeli Alarmlı Sayıcı
 
Programlanabilir 0-9999 İleri LCD Göstergeli Alarmlı Sayıcı
  Devre 0000-9999 ileri sayıcı olarak düzenlenmiş ve programlama yapılabilir hale getirilerek sayıcı değerleri ile program değerleri aynı olduğu anda alarm çıkışı verebilecek şekilde dizayn edilmiştir.

Programlama:

Devre 2 buton ile ayarlanacak. PIC16F84'ün 17 nolu ucuna bağlı olan “HANE” isimli buton ile ayarlanacak olan hane seçilmektedir. Seçilen hanenin önünde “>” işareti bulunmaktadır. Bu “>” işareti ayar yapılacak olan haneyi işaret etmektedir. PIC16F84'ün 18 nolu ucuna bağlı olan “HANE SAY” isimli ikinci buton ile de seçilen hane 0-9 arası sayım yapılmaktadır. Ayarlanacak olan hane seçilmek istendiğinde hane seçim butonuna basıldığında hane büyük haneye (sola) doğru kaymaktadır. Ayarlanacak alarm değeri göstergede dört hane olarak gösterilmektedir. Bu gösterilen değer içinde ayarlanacak olan hanenin başında ok şeklinde köşeli parantez “>” ile okun bulunduğu hane ayar butonuna basıldıkça birer birer artmaktadır. Programlama yapmak için butonlara basılı tutarak ayarlamak gerekiyor. Yarım saniyede bir sayıyı arttırır veya haneyi değiştirir.

Program “0000” (sıfır) ise alarm yapılmamış sayılacak ve göstergenin sonunda “+” işareti olacak, program yapıldığında bu “+” işareti kalkacaktır.

Sayma İşlemi:

Gösterge olarak 2 satırlık 16 karakterlik LCD ekran kullanılmıştır. Birinci satırda “SAYICI: 0000” şeklinde sayım bölümü gösterilmektedir. Bu haliyle “0000-9999” ileri sayım yapılabilmektedir.

Devrede sayım işlemini yapmak için PIC16F84'ün 3 nolu TIMER-0 ucu kullanılmaktadır. Bu uca dışarıdan saymak amaçlı lojik sinyal girilebileceği gibi devrenin şemasında gösterildiği gibi butonda kullanılabilir. Buton ile devre yapıladığında, “SAY” butonuna bastıkça değeri 1 artarak büyümektedir. Devreye sayma amaçlı lojik sinyal girilirse buton (SW4) ve bağlı direnç (R2 22K) birlikte kullanılabilir.

Sayıcıları (sayılan değeri) sıfırlamak için de buton kullanılmaktadır. “SIFIRLA” adını taşıyan ve PIC16F84'ün 1 nolu ucunda bağlı olan bu butona basınca sayıcılar sıfırlanmakta ve alarm iptal edilmektedir.

Bütün butonlar giriş ve +5 volta bağlanacak, girişten şaseye direnç atılacaktır. Bu direnç 22K değerinde olabilir. Ayrıca bu girişlere ark önleme amaçlı kondansatör bağlanmasında fayda vardır. Alarm çıkısı, 16F84'ün RB7, 13 nolu ucundan yapılmaktadır. Alarm çıkışına sürücü devre yapılarak röle veya diğer alarm devreleri bağlanabilir.

Devrenin Yapısı:

Devredenin PIC16F84 mikro kontrolör yazılımında sayıcı olarak TIMER-0 zamanlayıcı/sayıcı'sı kullanılmıştır. Bu zamanlayıcı/sayıcı özelliklerine kısaca bakacak olursak;

  • 8 bitlik bir zamanlayıcı/sayıcıdır. 0-255 arası sayabilir.
  • TMR0 özel amaçlı saklayıcısı ile bu zamanlayıcının değeri okunabilir veya bu saklayıcıya veri yazılabilir.
  • 8 bitlik ön bölücü kullanılarak zamanlama süresi/sayma miktarı ayarlanabilir.
  • Dahili komut çevrimi veya harici saat işareti ile çalışabilir.
  • TMR0 saklayıcısının değeri 255'ten 0'a geçtiğinde kesme üretir.
  • Harici saat işareti için kenar seçimi yapılabilir.

    TMR0'ın bu özelliklerini kontrol ederek düzenlemek için OPTION saklayıcısı kullanılır. Gerekli bilgiler için PIC16F84 katalog bilgilerinden faydalanılabilir. Programda kullanılan OPTION değeri programın çalışmasını düzenlemek amacıyla 10101000 olarak seçilmiştir. Bit7'den itibaren bit1'e doğru tanımlayacak olursak,

    1 = Port B'deki pull-up dirençleri iptal.
    0 = kesme inen kenarda oluşsun.
    1 = RA4/T0CKI ucundan girilen saat işareti.
    0 = RA4/T0CKI işaretin yükselen kenarından sayma değeri arttırılır.
    1 = Ön bölücü WDT için çalışır.
    000 = TMR0 oranı 1:2

    özelliklerini seçmiş olduk. Burada kullanımda faydalı olacağını düşündüğümüz bir noktayı da izah etmekte yarar var. Bu devremizde, giren palsın yükselen kenarından sayma işlemi yapılmaktadır. Yani butonun basma anında sayım yapılmaktadır. Sayma işlemini düşen kenardan yapmak gerektiğinde OPTION değerindeki bit4'ün 0 olarak atanan değerini 1 olarak atamak gerekmektedir. Bu durumda OPTION değeri 10111000 olacaktır. Böylece butonun bırakıldığı anında sayma işlemi gerçekleşir.

    Devre 5 voltluk besleme ile çalışmaktadır.

    Devrede kullanılan yazılım JAL ile hazırlanmıştır. JAL için gerekli kaynaklar jal.sourceforge.net web sitesinde geliştirilmektedir. Türkçe olarak www.projearsivim.com adresinden faydalanılabilir.

    Devrenin Şeması:

    Programlanabilir 0-9999 İleri LCD Göstergeli Alarmlı Sayıcı

    Şema: Programlı İleri Sayıcı Devre Şeması (13.11.2007 tarihinde güncellendi)

    Malzeme Listesi:

    U1: PIC16F84
    LCD1: 2X16 LCD Ekran
    X1: 4MHz kristal
    D1: LED
    SW1-SW4: Buton
    C1,C2: 22pF
    C3: 220nF
    R1: 1K
    R2-R5: 22K
    R6: 470
    RV1: 10K trimpot
    Ayrıca, şemada gösterilmemesine rağmen, devrenin besleme hattına 100nF değerinde filtre amaçlı kondansatör ilave edilmelidir. Yine devrede bulunan R2-R5 22K dirençlerine paralel olarak 100nF kutupsuz kondansatör butonlarda oluşabilecek arkları önlemeye yönelik olarak ilave edilebilir.

    Ekler:

    Windows kullanıcıları için, devrenin JAL ile hazırlanmış programını sıkıştırılmış zipli dosya olarak indirmek için tıklayınız.

    Windows kullanıcıları için, devrenin HEX dosyasını sıkıştırılmış zipli dosya olarak indirmek için tıklayınız.

    Linux kullanıcıları için, devrenin JAL ile hazırlanmış programını sıkıştırılmış tar.gz dosya olarak indirmek için tıklayınız.

    Linux kullanıcıları için, devrenin HEX dosyasını sıkıştırılmış tar.gz dosya olarak indirmek için tıklayınız.

    Notlar:
  • Devrenin baskıdevresi hazırlanmamıştır. Resimlerde de görüldüğü şekliyle çalıştırılmıştır.

    Devrenin Çalışma Görüntüleri:

    Devrenin ilk çalışma ve programlanmamış görüntüsü:



    Devrenin programlanmış görüntüsü:



    Devrenin alarm çalışmış görüntüsü:



    Devre için JAL ile hazırlanan program kodları:
  • -- ===============================================
    -- mehmet.yilmaz@teknomerkez.net
    -- 20071110
    -- 0-9999 LCD, ileri, programlanabilir sayici.
    -- ===============================================
    include 16f84_4   -- 4MHz osilator
    include jlib
    include hd447804  -- hd447804 kutuphanesi kullanilacak
    -- === PORTLARIN YONLENDIRILMESI ===
    pin_b7_direction = output
    pin_a0_direction = input
    pin_a1_direction = input
    pin_a2_direction = input
    -- === DEGISKENLER ===
    var byte saymaya4 = 0
    var byte saymaya3 = 0
    var byte saymaya2 = 0
    var byte saymaya1 = 0
    var byte ayarla4 = 0
    var byte ayarla3 = 0
    var byte ayarla2 = 0
    var byte ayarla1 = 0
    var byte hane = 0
    var byte ayarla = 0
    var bit alarm_tut = false
    -- === AYARLAMALAR ===
    option = 0b10101000
    tmr0 = 0
    hd44780_clear
    -- === ALT PROGRAMLAR ===
    procedure ayar_isareti is
     hd44780 = ">"
    end procedure
    procedure bosluk is
     hd44780 = " "
    end procedure
    procedure sayici is
     hd44780 = "S"
     hd44780 = "A"
     hd44780 = "Y"
     hd44780 = "I"
     hd44780 = "C"
     hd44780 = "I"
     hd44780 = ":"
     hd44780 = " "
    end procedure
    procedure alarm_ayarla is
     hd44780 = "A"
     hd44780 = "L"
     hd44780 = "A"
     hd44780 = "R"
     hd44780 = "M"
     hd44780 = ":"
     hd44780 = " "
    end procedure
    procedure alarm_ayar is
    -- === ALARM AYAR BASI ===
     if pin_a0 == high then
      hane = ( hane + 1 ) % 4
      delay_500ms
     end if
    if hane == 0 then
     if pin_a1 == high then
      ayarla1 = ( ayarla1 + 1 ) % 10
     end if
      print_hexadecimal_1 ( hd44780, ayarla4, "0" )
      print_hexadecimal_1 ( hd44780, ayarla3, "0" )
      print_hexadecimal_1 ( hd44780, ayarla2, "0" )
      ayar_isareti
      print_hexadecimal_1 ( hd44780, ayarla1, "0" )
      delay_500ms
    end if	
    
    if hane == 1 then
     if pin_a1 == high then
      ayarla2 = ( ayarla2 + 1 ) % 10
     end if
      print_hexadecimal_1 ( hd44780, ayarla4, "0" )
      print_hexadecimal_1 ( hd44780, ayarla3, "0" )
      ayar_isareti
      print_hexadecimal_1 ( hd44780, ayarla2, "0" )
      print_hexadecimal_1 ( hd44780, ayarla1, "0" )
      delay_500ms
    end if
    
    if hane == 2 then
     if pin_a1 == high then
      ayarla3 = ( ayarla3 + 1 ) % 10
     end if
      print_decimal_1 ( hd44780, ayarla4, "0" )
      ayar_isareti
      print_decimal_1 ( hd44780, ayarla3, "0" )
      print_decimal_1 ( hd44780, ayarla2, "0" )
      print_decimal_1 ( hd44780, ayarla1, "0" )
      delay_500ms
    end if
    
    if hane == 3 then
     if pin_a1 == high then
      ayarla4 = ( ayarla4 + 1 ) % 10
     end if
      ayar_isareti	
      print_decimal_1 ( hd44780, ayarla4, "0" )
      print_decimal_1 ( hd44780, ayarla3, "0" )
      print_decimal_1 ( hd44780, ayarla2, "0" )
      print_decimal_1 ( hd44780, ayarla1, "0" )
      delay_500ms
    end if 
    if ayarla4 == 0 & ayarla3 == 0 & ayarla2 == 0 & ayarla1 == 0 Then
     hd44780 = "+"
    else
     hd44780 = " "
    end if
    end procedure
    procedure sifirla is
     if pin_a2 == high then
      saymaya4 = 0
      saymaya3 = 0
      saymaya2 = 0
      saymaya1 = 0
      tmr0 = 0
      alarm_tut = false
     end if
    end procedure
    procedure alarm is
     if saymaya4 == ayarla4 & saymaya3 == ayarla3 & saymaya2 ==
    ayarla2 & saymaya1 == ayarla1 Then
      if ayarla4 == 0 & ayarla3 == 0 & ayarla2 == 0 & ayarla1 == 0 Then
      else
       alarm_tut = true
      end if
     end if
     if alarm_tut == true then
      pin_b7 = high
     elsif alarm_tut == false then
      pin_b7 = low
     end if
    end procedure
    procedure say is
    -- === SAYMA BASI ===
     if tmr0 > 9 then  -- eger tmr0 9'dan buyukse
      saymaya2 = saymaya2 + 1
      if saymaya2 == 10 then
       saymaya2 = 0
       saymaya3 = saymaya3 + 1
       if saymaya3 == 10 then
       saymaya3 = 0
       saymaya4 = saymaya4 + 1
       if saymaya4 == 10 then
        saymaya4 = 0
       end if
      end if
     end if
     tmr0 = 0 -- 0 yap seklinde tmr0 sayicisi kosullandi
     end if
      saymaya1 = tmr0
    end procedure
    -- === PROGRAM BASLANGICI ===
    forever loop
     hd44780_line1
     sayici
     say
     print_decimal_1 ( hd44780, saymaya4, "0" )
     print_decimal_1 ( hd44780, saymaya3, "0" )
     print_decimal_1 ( hd44780, saymaya2, "0" )
     print_decimal_1 ( hd44780, saymaya1, "0" )
     hd44780_line2
     alarm_ayarla
     alarm_ayar
     alarm
     sifirla
    end loop
    -- === PROGRAM SONU ===
     
       
     
    Bu web sitesi ücretsiz olarak Bedava-Sitem.com ile oluşturulmuştur. Siz de kendi web sitenizi kurmak ister misiniz?
    Ücretsiz kaydol