16F84A İLE KARANLIKTA/AYDINLIKTA LED YAKAN LDR DEVRESİ

DEVRE ŞEMASI, AÇIKLAMA VE KODLAR


 
 

Daha önce, karanlıkta LED yakan ve aydınlıkta LED yakan devreleri BC547 ve BC557 kullanarak yapmıştık. Bu defa, her iki devre için de PIC 16F84A kullanıyoruz. Bu mini projede sırasıyla,

yapıyoruz.

Arduino-Ders 7’de kurduğumuz sistemin aksine, PIC 16F84A’da sadece dijital portlar olduğu için, bu projede mecburen dijital portları kullanıyoruz.

Her iki devre için de, hem Assembly hem de MikroC kodlarını bu sayfada bulabilirsiniz.

16F84A ile LDR devresi

1) KARANLIKTA LED YAKAN LDR DEVRESİ


Karanlıkta LED yakan LDR devresi için, aşağıda sırasıyla

bulabilirsiniz.

 
 

A) KULLANILAN MALZEMELER


 
PIC 16F84A 2 Adet 22pF Kapasitör 1 Adet 4MHz Kristal 1 Adet Kırmızı LED 150Ω Direnç 39kΩ Direnç
16F84A 22pF kapasitör 4 Mhz Kristal Kırmızı LED 150Ohm Direnç 39kOhm Direnç
 
 
 

B) DEVRE ŞEMASI


PIC 16F84A toplamda 13 portu olan ve tüm portları dijital olan bir mikrodenetleyicidir. 16F84A ile LDR’den veri alabilmek ve LED’i yakıp söndürebilmek için aşağıdaki devreyi kuruyoruz.

PIC16F84A devresi

16F84A’nın kendi iç osilatörü olmadığı için, 2 adet 22 pF kapasitör ve bir kristal kullanarak mikrodenetleyiciye saat (clock) girişi sağlıyoruz. Bu proje için, 4 MHz-20 MHz arasında herhangi bir frekansta kristal kullanabiliriz.

Çipin kendi kendine sürekli reset atmaması için, 4 numaralı pin olan MCLR’yi, PIC’i beslediğimiz 5V’luk kaynağa bağlıyoruz.

LED’i RB0 portuna bağlıyoruz. Eğer isterseniz, programda uygun değişiklikler yaparak farklı bir porta da bağlantı yapabilirsiniz. LED ile port arasındaki 150 Ω’luk direnci, mikrodenetleyicinin çıkış akımını sınırlandırmak için kullanıyoruz.

LDR’nin direncine göre LED’i yakıp söndürebilmek için 39 kΩ dirençle LDR’yi birbirine bağlayıp, bağlantı noktasındaki voltajı RA0 portundan alıyoruz.

C) ÇALIŞMA MANTIĞI


PIC 16F84A’nın sadece dijital portları olduğu için, LDR üzerine düşen voltajı ölçemeyiz. Dijital bir porta gelen voltaj ya 0 ya da 1 olarak algılanır. TTL bir giriş olan RA0’ın gelen voltajı 0 veya 1 olarak algılanması, bu voltajın belli bir eşik değerinin üzerinde olup olmamasına bağlıdır. Yaptığımız testlerde, bu eşik voltajının 1.2 V civarında olduğunu görüyoruz. Bu nedenle, eğer RA0’daki voltaj 1.2 V’un üzerindeyse, mantık-1; eğer 1.2 V’un altındaysa mantık-0 olarak algılanır. Biz de, bu özelliği kullanarak, LDR ile basit bir arayüz devresi kuruyoruz.

Voltaj Bölücü Devre

Bu devrede, RA0 giriş olarak seçileceğinden, iç direnci oldukça yüksek olur. Bu nedenle, RA0’a doğru akan akım ihmal edilecek düzeydedir. Geriye kalan 39 kΩ ve LDR’den oluşan devre bir voltaj bölücü gibi hareket edeceğinden, LDR üzerine düşen voltajı,

...

olarak buluruz. Bu voltaj 1.2 V’un üzerine çıkarsa ( ...), RA0 girişi mantık-1, altına düşerse ( ...) girişi mantık-0 olarak algılar. RA0 girişinden aldığımız mantık seviyesine göre, mikrodenetleyici RB0 çıkışını 0 veya 1 yaparak LED’i yakar veya söndürür.

D) PROGRAM


Programda sadece RA0’ı kontrol edip, eğer RA0 = 0’sa RB0’ı da 0 seviyesine getiriyoruz. Eğer RA0 = 1’se, RB0’ı da 1 yapıp LED’i yakıyoruz. Özetle, RA0’ı RB0’a kopyalıyoruz. Tercihinize göre aşağıda verilen MikroC veya Assembly kodlarını kullanabilirsiniz veya direk olarak hex dosyasını PIC’e atabilirsiniz.

a) MikroC Kodları:

void main() {

TRISB.RB0=0;//RB0'ı çıkış yap

while(1){

PORTB.RB0=PORTA.RA0;//RA0'ı, RB0'a kopyala

}

}

b) Assembly Kodları:

Eğer MPLAB kullanıyorsanız,

LIST P=16F84A

INCLUDE <P16F84A.INC>

__CONFIG _HS_OSC & _WDT_OFF

BSF STATUS, 5 ;BANK1’e gec

BCF TRISB, 0 ;RB0’ı cikis yap

BCF STATUS, 5 ;BANK0’a gec

LOOP

BTFSS PORTA, 0 ;RA0=0 ise

BCF PORTB, 0 ;RB0=0 yap

BTFSC PORTA, 0 ;RA0=1 ise

BSF PORTB, 0 ;RB0=1 yap

GOTO LOOP

END

eğer Online PIC Compiler kullanıyorsanız,

BSF STATUS, 5 ;BANK1’e gec

BCF TRISB, 0 ;RB0’ı cikis yap

BCF STATUS, 5 ;BANK0’a gec

LOOP

BTFSS PORTA, 0 ;RA0=0 ise

BCF PORTB, 0 ;RB0=0 yap

BTFSC PORTA, 0 ;RA0=1 ise

BSF PORTB, 0 ;RB0=1 yap

GOTO LOOP

kodlarını kullanabilirsiniz.

Eğer direk hex kodlarını yüklemek istiyorsanız bu dosyayı indirmek için buraya tıklayabilirsiniz.

2) AYDINLIKTA LED YAKAN LDR DEVRESİ


Aydınlıkta LED yakıp, karanlıkta söndüren bir sistem için önümüzde iki farklı seçenek çıkıyor:

A) YAZILIMI DEĞİŞTİRME


Karanlıkta LED yakan sistem ile aynı devreyi kullanıp yazılımda değişiklik yapmamız oldukça kolay.

a) MikroC Kodları:

void main() {

TRISB.RB0=0;//RB0'ı çıkış yap

while(1){

PORTB.RB0=!PORTA.RA0;//RA0'nın tersini, RB0'a kopyala

}

}

b) Assembly Kodları:

Eğer MPLAB kullanıyorsanız,

LIST P=16F84A

INCLUDE <P16F84A.INC>

__CONFIG _HS_OSC & _WDT_OFF

BSF STATUS, 5 ;BANK1’e gec

BCF TRISB, 0 ;RB0’ı cikis yap

BCF STATUS, 5 ;BANK0’a gec

LOOP

BTFSC PORTA, 0 ;RA0=1 ise

BCF PORTB, 0 ;RB0=0 yap

BTFSS PORTA, 0 ;RA0=0 ise

BSF PORTB, 0 ;RB0=1 yap

GOTO LOOP

END

eğer Online PIC Compiler kullanıyorsanız,

BSF STATUS, 5 ;BANK1’e gec

BCF TRISB, 0 ;RB0’ı cikis yap

BCF STATUS, 5 ;BANK0’a gec

LOOP

BTFSC PORTA, 0 ;RA0=1 ise

BCF PORTB, 0 ;RB0=0 yap

BTFSS PORTA, 0 ;RA0=0 ise

BSF PORTB, 0 ;RB0=1 yap

GOTO LOOP

kodlarını kullanabilirsiniz.

Eğer direk hex kodlarını yüklemek istiyorsanız bu dosyayı indirmek için buraya tıklayabilirsiniz.

B) DEVREYİ DEĞİŞTİRME


Eğer yazılım aynı kalsın, devreyi değiştirmek istiyorum derseniz, bu defa aşağıdaki devreyi kullanabilirsiniz. Bir önceki devrede sadece LDR ile sabit direncin yerini değiştirip, sabit direnci 3.9 kΩ olarak seçiyoruz.

16F84A ile Aydınlıkta LED yakan devre