Açıklamalar

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 7

Jalv2

Uygulamaları

12F675 ve LM35 Sensörlü Termometre Devresi


21.12.2011

Sercan TEK
elektro.seco@gmail.com

1
Devrede ısı sensörü olarak LM35DZ kullanılmıştır. Bu sensör 0o ile 100o arası çıkış
verebilmektedir. Mikrodenetleyici olarak 12F675 seçilmesinin sebebi hem jalv2 dilinde
kullanımını göstermek hemde 12F675 gibi pin sayısı yetersiz olan bir denetleyici ile nasıl
display kullanıldığını göstermektir.

Devre gerçekte yapılacağı zaman, sağ tarafta bulunan kırmızı çerçeve içerisindeki 3
adet direnç, Simülasyonun daha sağlıklı çalışmasını sağlamak için kullanıldığından dolayı
kullanılmayacaktır.

Devrenin Çalışma Mantığı :

0 ile 99 derece arası ölçüm yapan devremizde display’ler tarama yöntemi ile
kullanılmıştır. 12F675 gibi pin sayısı az olan işlemciler için Display kullanmak imkânsızdır.
Bu nedenle sadece 2 pin kullanarak 74HC164 ile port çoklama işlemi gerçekleştirilmiştir.
74HC164 entegresinin seçimindeki temel nokta işlemcinin 2 pinini kullanmasıdır. Bu sayede
display seçmek için bize 2 adet pin geriye kalmıştır.

Devre şemasında 3 adet display gözükmektedir. Ama 12F675 okunan dereceyi


göstermek için sadece 2 display’i kullanmaktadır. En sondaki Display Sadece derece
sembolünü göstermektedir.

Her Display’in çıkışında sadece 1 adet 330 ohm direnç kullanılmıştır. Eğer tarama
yöntemi kullanmıyor olsaydık bu dirençler aşırı akım çekeceğinden dolayı ısınıp yanacaktı.
Tarama yöntemi sayesinde displayler saniyede yaklaşık olarak 230 Hz frekans ile yanıp
sönmektedir. Bu sayede dirençlerde ısınma olmamaktadır.

2
Devrenin Çalışmasını Kısaca Açıklayacak olursak; 12F675 yaklaşık olarak her 1 sn
aralıklarla ADC kanalını okumaktadır. Ve Sonucun daha stabil olması için 10 kez okuyup
daha sonra ortalamasını almaktadır. Bu sayede salımlar minimuma indirilmiştir.

Okunan ADC değerine karşılık gelen dereceyi hesaplamak programda derece_al alt
programı kullanılmıştır.

1 procedure derece_al(byte out hane_10,byte out hane_1) is


2 var word temp_deger = 0
3 var byte basamaklar[] = {252,96,218,242,102,182,190,224,254,246}
4 for 10 loop
5 temp_deger = temp_deger + adc_read(0)
6 end loop
7 while (ADCON0_NDONE == 1) loop end loop
8 temp_deger = ((temp_deger/10) * 100)/204
9
10 if temp_deger > 99 then
11 hane_10 = 2 -- "-"
12 hane_1 = 2 -- "-"
13 else
14 hane_10 = basamaklar[(temp_deger / 10)]
15 hane_1 = basamaklar[(temp_deger % 10)]
16 end if
17 end procedure

Alt Programın Satır Satır İncelenmesi :

1.satır : Alt programın ismi ve 2 adet çıkış parametresi tanımlanmıştır.


2.satır : Geçici hesaplamalar için temp_deger isminde word tipinde değişken tanımlanmıştır.
3.satır : Ortak katot display’ler için her rakam dizi olarak tanımlanmıştır.
4.satır : 10 kez çalışacak for döngüsü oluşturulmuştur.
5.satır : Adc kanalı okunup geçici değişkenimize aktarılmıştır.
7.satır : While döngüsü ile ADCON0_NDONE == 1 Adc Çevrim Bayrağı 0 olana kadar
bekleme yapılmıştır. Bu sayede olası adc çevrimi bitmeden formül işletilmeyecek ve daima
doğru sonuç alınacaktır. Adc Çevrimi Başlatıldığında ADCON0_NDONE bayrağı, Çevrim
Bitene Kadar 1 Olmaktadır. Bu sayede Çevrimin Bitip Bitmediği, bayrağın durumundan takip
edilebilmektedir.
8.satır : Geçici değişkenine, okunan adc sayısının derece karşılığı aktarılmıştır.
10.satır : Eğer derece 99’dan fazla ise birler ve onlar hanesine “-“ sembolü aktarılmaktadır.
Bu sayede sıcaklığın 99’dan büyük olduğu anlaşılmaktadır.
14.satırda : hesaplanan derecenin onlar hanesi çıkış parametresine aktarılmıştır.
15.satırda : hesaplanan derecenin birler hanesi çıkış parametresine aktarılmıştır.

Okunan ADC değerine Karşılık gelen Derecenin Hesaplanması :

LM35DZ sensörü maksimum 100 derece ölçmektedir ve 100 derecede çıkışı 1 Volt
olmaktadır. 1 Volt ise Dijital olarak ~204 sayısına denk gelmektedir.(1023/5 = 204,6)

Formülümüz; 100 derecede 204 sayısı okunuyor ise okunan_adc değerinde X derecesi
okunur, orantısından yola çıkarak ;

Derece = (okunan_Adc*100)/204 Olmaktadır.

Okunan_Adc değerimiz burada temp_deger değişkeninin 10’a bölünmüş sonucudur.


Sonuç olarak Formülümüz 8.satırdaki Halini almıştır. Formülün sonucu normalde word
tipinde çıktığı için byte() fonksiyonu ile byte tipine dönüştürülmüştür.

3
12F675 Konfigürasyon

1 include 12f675
2 pragma target clock 4_000_000
3 pragma target OSC INTOSC_NOCLKOUT
4 pragma target WDT disabled
5 pragma target MCLR INTERNAL

6 enable_digital_io()

7 pin_A0_direction = input
8 pin_A1_direction = output
9 pin_A2_direction = output
10 pin_A3_direction = output
11 pin_A4_direction = output
12 pin_A5_direction = output

Devrenin çalışması için 12F675 işlemcisine ait adreslerin programa dahil edilmesi
gerekmektedir. Bu adresleri tek tek yazılıma dahil etmek zor olacağından kütüphaneleri
kullanarak bu adresleri dahil edebiliriz. Bunun için 1. satırda olduğu gibi include 12f675
komutu kullanılmaktadır.

Gerekli adresler programa dâhil edildikten sonra sigorta ayarlarının da belirtilmesi


gerekmektedir. İlgili sigorta ayarları dâhil edilen kütüphane dosyasında yer almaktadır. Bizim
devremiz için gerekli sigorta ayarları aşağıdaki gibidir.

2.Satırda İşlemcinin Clock Frekansı 4Mhz olarak belirtilmiştir.


3.Satırda Clock Kaynağı olarak işlemcinin dahili kristali kullanılacağı belirtilmiştir.
4.Satırda WatchDog Timer’ın kapalı olduğu belirtilmiştir.
5.Satırda MCLR pininin kullanılmayacağı belirtilmiştir.

6.satırda ise tüm pinlerin dijital giriş çıkış olacağı hakkında işlemciye bilgi verilmiştir.
Diğer Satırlarda ise işlemcinin pinlerinin giriş veya çıkış olup olmayacağı ayarlanmıştır.

Programda sonsuz döngü oluşturularak yaklaşık olarak 1 sn’de bir kez derece
hesaplanıp display’lerde saniyede 230 kez gösterilmektedir. Bu sayede gözümüz sürekli
olarak ekranlarda rakamları görmektedir.

Malzeme Listesi:

1 x 12F675 3 x Bc547 Transistör


1 x LM35 3 x 330 Ohm Direnç
1 x 74HC164 veya 74LS164 4 x 1K Direnç
3 x 7 segmentli display(Ortak Katot) 2 x 100 nf Seramik Kondansatör

7 Segmentli Display pinleri :

4
Devrenin Gerçekleştirilmiş Baskı Devresi

Gerçekleştirilen Devrenin Başka Bir Termometre ile Çekilmiş Fotoğrafı

5
Jalv2 Kaynak Kodu :
---------------------------------------------------------------
-- Programın Adı : 1' hassasiyetli LM35 Termometre Devresi
-- (0..99) arası Ölçüm
-- Yazan : Sercan TEK - Turkey/Tekirdağ
-- Tarih : 21.12.2011
-- chip : 12F675 ve 74hc164
-- Derleyici : jal 2.4p-alpha
---------------------------------------------------------------
-- ------------------------------------------------------------
include 12f675
pragma target clock 4_000_000 -- kristal 4 Mhz
pragma target OSC INTOSC_NOCLKOUT -- dahili OSC
pragma target WDT disabled -- watchdog Kapalı
pragma target MCLR INTERNAL -- mclr kullanılmıyor

enable_digital_io()

pin_A0_direction = input
pin_A1_direction = output
pin_A2_direction = output
pin_A3_direction = output
pin_A4_direction = output
pin_A5_direction = output

alias birler is pin_a5 -- birler hanesi pin_a5


alias onlar is pin_a4 -- onlar hanesi pin_a4

----------------------------- ADC İşlemleri ---------------------------


const byte ADC_NVREF = ADC_NO_EXT_VREF -- Harici Referans Yok
const ADC_HIGH_RESOLUTION = true -- Çözünürlük 10 bit
include adc -- adc kütüphanesi Dahil
adc_init() -- adc hazırlanıyor

const byte ADC_CHANNEL = 0 -- 1 adet kanal kullanılacak (AN0)


set_analog_pin(ADC_CHANNEL) -- AN0 analog pin yap

-------------------- 74HC164 için pin tanımlamaları -------------------


var volatile bit clock_pin is pin_a1
var volatile bit data_pin is pin_a2

procedure display_yolla(byte in giris_bilgi) is


var bit veri_biti at giris_bilgi : 0
for 8 loop
data_pin = veri_biti
giris_bilgi = giris_bilgi >> 1
clock_pin = high
clock_pin = low
end loop
end procedure
-----------------------------------------------------------------------

procedure derece_al(byte out hane_10,byte out hane_1) is


var word temp_deger = 0
var byte basamaklar[] = {252,96,218,242,102,182,190,224,254,246}
for 10 loop
temp_deger = temp_deger + adc_read(0)
end loop
while (ADCON0_NDONE == 1) loop end loop
temp_deger = ((temp_deger/10) * 100)/204

if temp_deger > 99 then


hane_10 = 2 -- "-"
hane_1 = 2 -- "-"
else
hane_10 = basamaklar[(temp_deger / 10)]
hane_1 = basamaklar[(temp_deger % 10)]
end if
end procedure

6
var byte onlar_hanesi,birler_hanesi

forever loop

derece_al(onlar_hanesi,birler_hanesi)

for 5 loop
for 50 loop
onlar = false birler = false
display_yolla(onlar_hanesi)
onlar = true
_usec_delay(2000)
onlar = false
display_yolla(birler_hanesi)
birler = true
_usec_delay(2000)
end loop
end loop

end loop

You might also like