Teknomerkez
TR EN ES
Konular

JalTurk ile PIC 16F628 Saat

Yazar: Mustafa Topuz
Tarih: 15.05.2008
Türkçe

JALTURK programının son versiyonunu indirmek için jalturk.sourceforge.net adresini tıklayınız.

  Devre şemasını büyük görmek için tıklayınız.

Devreye ait tüm dosyaları indirmek için tıklayınız.

Uygulamaya ait JALTURK programlama Kodu:

INCLUDE 16F628_GENEL
INCLUDE DS1307
INCLUDE itele
INCLUDE ds18b20
;INCLUDE FORMAT
--PIN AYARLARI---------------------------------------
VAR VOLATILE BIT ust IS Pin_A0
VAR VOLATILE BIT mod IS Pin_A2
Port_A_Yon = Hepsi_Giris

VAR VOLATILE BIT ses IS Pin_B6
Port_B_Yon = Hepsi_Cikis
-----------------------------------------------------
-----------------------------------------------------
-----------------------------------------------------
-- DEĞİŞKEN TANIMLAMALARI----------------------------
VAR BYTE saat_,dakika_,saniye_,gun_,ay_,yil_,haf_gun_
VAR BYTE saat22,saat11,dakika22,dakika11
VAR BYTE saat_kontrol,dakika_kontrol
-----------------------------------------------------

-----------------------------------------------------
-----------------------------------------------------
-----------------------------------------------------
CONST BYTE a_ = 0b_1111_1011 ;disp_de a harfi
CONST BYTE y_ = 0b_0111_0111 ;disp_de y harfi
CONST BYTE r_ = 0b_1000_1101 ;disp_de r harfi


-----------------------------------------------------
-----------------------------------------------------
-----------------------------------------------------
PROCEDURE ses_cik ( BYTE IN kere , BYTE IN frekans , BYTE IN ara)IS

WHILE kere>0 LOOP
FOR 100 LOOP
ses=high
Gecikme_10us(frekans)
ses=low
Gecikme_10us(frekans)
END LOOP
kere=kere-1
Gecikme_10ms(ara)
END LOOP

END PROCEDURE


PROCEDURE seg_yaz IS
disari_it(0,0,dakika11)
disari_it(0,0,dakika22)
disari_it(0,0,saat11)
disari_it(0,0,saat22)
END PROCEDURE
-----------------------------------------------------
-----------------------------------------------------
-----------------------------------------------------
PROCEDURE ayir IS
saat11=( saat_ << 4 ) >> 4
saat22= saat_ >> 4
dakika11=( dakika_ << 4 ) >> 4
dakika22= dakika_ >> 4
-----------------------------------------------------
saat11 = Ortak_Katot_Al( saat11, 0 )
saat22 = Ortak_Katot_Al( saat22, 0 )
dakika11 = Ortak_Katot_Al( dakika11, 0 )
dakika22 = Ortak_Katot_Al( dakika22, 0 )
END PROCEDURE


PROCEDURE ayir2(byte IN x1,byte IN x2,byte IN x3 , BYTE IN x4) IS
x3 = Ortak_Katot_Al( x3, 0 )
x4 = Ortak_Katot_Al( x4, 0 )
x1 = Ortak_Katot_Al( x1, 0 )
x2 = Ortak_Katot_Al( x2, 0 )
disari_it(0,0,x3)
disari_it(0,0,x4)
disari_it(0,0,x1)
disari_it(0,0,x2)
END PROCEDURE


-----------------------------------------------------
-----------------------------------------------------
-----------------------------------------------------
PROCEDURE saat_ayar IS --saat ayarlama
VAR BYTE s_a=0,s_u=0,d_a=0,d_u=0
saat_=0
dakika_=0
disari_it(0,1,r_)
disari_it(0,1,a_)
disari_it(0,1,y_)
disari_it(0,1,a_)
Gecikme_1s(2)

ayir
seg_yaz

-----------------------------------------------------
WHILE mod LOOP --saat ayarı
-----------------------------------------------------
IF !ust THEN
saat_=saat_+1
s_a=s_a+1
IF s_a==10 THEN
s_a=0
s_u=s_u+1
END IF
Gecikme_100ms(3)
IF saat_==24 THEN saat_=0 END IF
IF s_a==4 & s_u==2 THEN
s_a=0
s_u=0
END IF
ayir2(s_a,s_u,d_a,d_u)
END IF
-----------------------------------------------------
END LOOP
-----------------------------------------------------
Gecikme_100ms(5)
-----------------------------------------------------
WHILE mod LOOP --dakika ayarı
-----------------------------------------------------
IF !ust THEN
dakika_=dakika_+1
d_a=d_a+1
IF d_a==10 THEN
d_a=0
d_u=d_u+1
END IF
Gecikme_100ms(3)
IF dakika_==60 THEN dakika_=0 END IF
IF d_a==0 & d_u==6 THEN
d_a=0
d_u=0
END IF
ayir2(s_a,s_u,d_a,d_u)
END IF
END LOOP
-----------------------------------------------------
DS1307_Yaz(yil_,ay_,gun_,0,saat_,dakika_,0)
ds1307_oku(yil_,ay_,gun_,haf_gun_,saat_,dakika_,saniye_)
ayir
seg_yaz
Gecikme_100ms(4)
-----------------------------------------------------
END PROCEDURE
-----------------------------------------------------
-----------------------------------------------------
-----------------------------------------------------
PROCEDURE ds_yaz IS
CONST BYTE deg_o = 0b_1100_0111 ;disp_de derecenin noktasi
CONST BYTE deg_c = 0b_1001_1101 ;disp_de C harfi
CONST BYTE tire = 0b_0000_0011 ;disp_de - işareti

VAR BYTE derece , derece_a , derece_u
VAR BIT isaret

ds18B20_oku(derece,isaret)
derece = derece - 1
derece_u = derece / 10
IF derece_a!=0 THEN derece_a = ( derece%10 ) + 1 END IF
IF derece_a==0 THEN derece_a =derece%10 END IF

derece_u = Ortak_Katot_Al( derece_u , 0 )
derece_a = Ortak_Katot_Al( derece_a , 0 )

disari_it(0,1,deg_c)
disari_it(0,1,deg_o)

IF !isaret then
disari_it(0,0,derece_a)
disari_it(0,0,derece_u)
ELSE
disari_it(0,0,derece_a)
disari_it(0,1,tire)
END IF

Gecikme_500ms(10)
-----------------------------------------------------
FOR 10 LOOP
ds1307_oku(yil_,ay_,gun_,haf_gun_,saat_,dakika_,saniye_)
END LOOP
ayir
seg_yaz
END PROCEDURE

-----------------------------------------------------
-----------------------------------------------------
-----------------------------------------------------
;DS1307_Yaz(0,0,0,0,0,0,0)
ds1307_oku(yil_,ay_,gun_,haf_gun_,saat_,dakika_,saniye_)
ayir
seg_yaz
DS1820_COZUNURLUK_DEGISTIR(9) --ds18b20 10 BIT cozunurluk
-----------------------------------------------------
PortA = 0xFF
-----------------------------------------------------
-----------------------------------------------------
-----------------------------------------------------
------------ANA PROGRAM BLOĞU------------------------
-----------------------------------------------------
FOREVER LOOP
-----------------------------------------------------
IF Mod == 0 THEN saat_ayar END IF --Eğer MOD'a basılırsa ayar moduna geç
-----------------------------------------------------
--DS1307 oku
ds1307_oku(yil_,ay_,gun_,haf_gun_,saat_,dakika_,saniye_)

IF saniye_==0x05 THEN ds_yaz END IF --eğer saniye 5 veya 59 ise
IF saniye_==0x35 THEN ds_yaz END IF -- Displeylere sıcaklığı yaz
-----------------------------------------------------
IF dakika_kontrol!=dakika_ THEN --Dakika artarsa yapılacaklar
ayir --Gelen zaman verilerini alt ve üst iki nibble'a ayırdık
seg_yaz --Ayrılan Saat ve Dakika verilerini Displaylere yazar
END IF
dakika_kontrol = dakika_
-----------------------------------------------------
IF saat_kontrol!=saat_ THEN --Saat artarsa yapılacaklar
ses_cik(2,50,10)
END IF

saat_kontrol = saat_
-----------------------------------------------------
END LOOP --Ana program bloğu sonu
-----------------------------------------------------
-----------------------------------------------------