Başlangıç > Dökümanlar > Sayıcılı alarm devresi & jal program kodları

Sayıcılı alarm devresi & jal program kodları

Bu devre, daha önce hazırladığım “Jal ile Programlı Pic 16F628’li LCD Göstergeli 0-999999 İleri Sayıcı” başlıklı yazının geliştirilmiş halidir. 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.

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.

———————————————————————-

Devre için JAL ile hazırlanan program kodları:
— ============================== =================
— 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 ===


gogo969 teşekkürler

Reklamlar
  1. Henüz yorum yapılmamış.
  1. No trackbacks yet.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s

%d blogcu bunu beğendi: