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

DEVRE ŞEMASI, AÇIKLAMA VE KODLAR


 
 

Bu mini projede, karanlıkta LED yakan ve aydınlıkta LED yakan devreleri PIC 16F628A kullanarak yapıyoruz.

Her iki devreyi de iki farklı yöntemle (dijital port veya 16F628A'nın karşılaştırıcısını kullanarak) yapabildiğimiz için, toplamda dört devre kuruyoruz.

16F84A ile LDR devresi

1) DİJİTAL PORT KULLANARAK KARANLIKTA LED YAKAN LDR DEVRESİ


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

bulabilirsiniz.

 
 

A) KULLANILAN MALZEMELER


 
PIC 16F628A 1 Adet Kırmızı LED 150Ω Direnç 39kΩ Direnç
16F628A Kırmızı LED 150Ohm Direnç 39kOhm Direnç
 
 
 

B) DEVRE ŞEMASI


PIC 16F628A toplamda 16 portu olan bir mikrodenetleyicidir. Portlarından 4 tanesi, mikrodenetleyici içerisindeki karşılaştırıcı ünitesi ile beraber analog olarak kullanılabilir. 16F628A ile LDR’den veri alabilmek ve LED’i yakıp söndürebilmek için dijital portları kullanarak aşağıdaki devreyi kuruyoruz.

PIC16F628A devresi

16F84A’nın kendi iç osilatörü olduğu için ekstra bir kristal kullanmıyoruz.

Çipin kendi kendine sürekli reset atmaması için, 4 numaralı pin olan MCLR’yi, PIC’i beslediğimiz 5 V’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ı RB2 portundan alıyoruz. 16F628A için PORTA Schmitt tetiklemeli olduğu için, bu mini projede voltaj değerini PORTA’dan almak çok uygun olmayacaktır.

C) ÇALIŞMA MANTIĞI


Dijital bir port için gelen voltaj sadece 0 veya 1 olarak algılanır. TTL bir giriş olan RB2’nin gelen voltajı 0 veya 1 olarak algılaması, 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 RB2’deki 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, RB2 giriş olarak seçileceğinden, iç direnci oldukça yüksek olur. Bu nedenle, RB2’ye 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 ( ...), RB2 girişi mantık-1, altına düşerse ( ...) girişi mantık-0 olarak algılar. RB2 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.

Bu devrede, 39 kΩ kullanarak LDR'nin direncinin 12.315 kΩ'un üzerine çıkıp çıkmadığını kontrol ediyoruz. Farklı bir ... değerini sınır olarak seçmek istersek, kullanmamız gereken sabit direnci

...

formülüyle bulabiliriz.

D) PROGRAM


Programda sadece RB2’yi kontrol edip, eğer RB2 = 0’sa RB0’ı da 0 seviyesine getiriyoruz. Eğer RB2=1’se, RB2’yi de 1 yapıp LED’i yakıyoruz. Özetle, RB2’yi 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.

Yapılandırma kodlarında, çipe programı yazarken

  • "Watch Dog Timer" seçeneğini "Disabled" yapıp,
  • Oscillator için, "Internal Oscillator" ile ilgili çıkan iki seçenekten birini seçmeliyiz.

a) MikroC Kodları:

void main() {

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

while(1){

PORTB.RB0=PORTB.RB2;//RB2'yi, RB0'a kopyala

}

}

b) Assembly Kodları:

Eğer MPLAB kullanıyorsanız,

LIST P=16F628A

INCLUDE <P16F628A.INC>

__config 0x3ff9

BSF STATUS, 5 ;BANK1’e gec

BCF TRISB, 0 ;RB0’ı cikis yap

BCF STATUS, 5 ;BANK0’a gec

LOOP

BTFSS PORTB, 2 ;RB2=0 ise

BCF PORTB, 0 ;RB0=0 yap

BTFSC PORTB, 2 ;RB2=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 PORTB, 2 ;RB2=0 ise

BCF PORTB, 0 ;RB0=0 yap

BTFSC PORTB, 2 ;RB2=1 ise

BSF PORTB, 0 ;RB0=1 yap

GOTO LOOP

kodlarını kullanabilirsiniz.

Eğer direk hex kodlarını yüklemek istiyorsanız, buraya tıklayabilirsiniz.



2) KARŞILAŞTIRICI KULLANARAK KARANLIKTA LED YAKAN LDR DEVRESİ


Karşılaştırıcı iki girişi ve bir çıkışı olan bir entegre devredir.

Karşılaştırıcı

Pozitif ve negatif girişlerden gelen voltajlar devre içerisinde karşılaştırılır. Eğer pozitif girişten gelen voltaj daha büyükse çıkışımız 5 V; negatif girişten gelen voltaj daha büyükse çıkışımız 0 V olur.

16F628A içerisinde yazılım ile kontrol edilebilen iki adet karşılaştırıcı bulunmaktadır. Bu karşılaştırıcının girişlerini mikrodenetleyicinin analog girişlerine veya çip içerisinde oluşturulan referans voltajına bağlayabiliriz.

Karşılaştırıcı kullanarak yaptığımız, karanlıkta LED yakan LDR devresi için, aşağıda sırasıyla

bulabilirsiniz.

A) DEVRE ŞEMASI


Bu projede, yazılımla 2. karşılaştırıcının pozitif girişini mikrodenetleyicinin içindeki ayarlanabilir referanstan alıyoruz. Negatif girişi (RA1) ise LDR ve bir dirençler oluşturduğumuz voltaj bölücüye bağlıyoruz.

PIC16F628A devresi

Referans voltajı yazılım ile 2.5 V’a ayarladığımız için, daha önceki yöntemlerde olduğu gibi bir hesaplama yapmamıza gerek kalmıyor. LDR hangi dirence ulaştığında LED’in yanmasını istiyorsak, R direnci için de aynı değeri seçiyoruz. Örneğin, LDR 10 kΩ olduğunda LED yansın istiyorsak, R’yi 10 kΩ seçmemiz yeterli.

B) PROGRAM


16F628A'nın kayıt dosyalarını (register) kullanarak,

  • Karşılaştırıcıları aktif hale getirip, pozitif girişlerine mikrodeneytleyici içerisindeki referans voltajını (VREF) veriyoruz; ve
  • Referans voltajını (VREF) 2.5 V olacak şekilde ayarlıyoruz.
Tercihinize göre aşağıda verilen MikroC veya Assembly kodlarını kullanabilirsiniz veya direk olarak hex dosyasını PIC’e atabilirsiniz.

Yapılandırma kodlarında, çipe programı yazarken

  • "Watch Dog Timer" seçeneğini "Disabled" yapıp,
  • Oscillator için, "Internal Oscillator" ile ilgili çıkan iki seçenekten birini seçmeliyiz.

a) MikroC Kodları:

void main() {

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

VRCON=0XAC;//Referans voltajını (VREF) 2.5V'a ayarla

CMCON=0X02;//Karşılaştırıcıların pozitif girişini VREF olarak seç

while(1){

PORTB.RB0=!CMCON.C2OUT;//RB0'ı, 2. Karşılaştırıcının çıkışının tersine eşitle

}

}

b) Assembly Kodları:

Eğer MPLAB kullanıyorsanız,

LIST P=16F84A

INCLUDE <P16F84A.INC>

__config 0x3ff9

BSF STATUS, 5 ;BANK1’e gec

BCF TRISB, 0 ;RB0’ı cikis yap

BCF STATUS, 5 ;BANK0’a gec

MOVLW 0XAC ;W=0XAC

MOVWF VRCON ;Referans voltajini (VREF) 2.5V'a ayarla

MOVLW 0X02 ;W=0X02

MOVWF CMCON ;Karsilastiricinin pozitif girisini VREF'e bagla

LOOP

BTFSC CMCON, 7 ;C2OUT=0 ise

BCF PORTB, 0 ;RB0=0 yap

BTFSS CMCON, 7 ;C2OUT=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

MOVLW 0XAC ;W=0XAC

MOVWF VRCON ;Referans voltajini (VREF) 2.5V'a ayarla

MOVLW 0X02 ;W=0X02

MOVWF CMCON ;Karsilastiricinin pozitif girisini VREF'e bagla

LOOP

BTFSC CMCON, 7 ;C2OUT=0 ise

BCF PORTB, 0 ;RB0=0 yap

BTFSS CMCON, 7 ;C2OUT=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.

3) DİJİTAL PORT KULLANARAK AYDINLIKTA LED YAKAN LDR DEVRESİ


Dijital port kullanarak 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=!PORTB.RB2;//RB2'nin tersini, RB0'a kopyala

}

}

b) Assembly Kodları:

Eğer MPLAB kullanıyorsanız,

LIST P=16F628A

INCLUDE <P16F628A.INC>

__config 0x3ff9

BSF STATUS, 5 ;BANK1’e gec

BCF TRISB, 0 ;RB0’ı cikis yap

BCF STATUS, 5 ;BANK0’a gec

LOOP

BTFSC PORTB, 2 ;RB2=1 ise

BCF PORTB, 0 ;RB0=0 yap

BTFSS PORTB, 2 ;RB2=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 PORTB, 2 ;RB2=1 ise

BCF PORTB, 0 ;RB0=0 yap

BTFSS PORTB, 2 ;RB2=0 ise

BSF PORTB, 0 ;RB0=1 yap

GOTO LOOP

kodlarını kullanabilirsiniz.

Eğer direk hex kodlarını yüklemek istiyorsanız, 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.

16F628A ile Aydınlıkta LED yakan devre

4) KARŞILAŞTIRICI KULLANARAK AYDINLIKTA LED YAKAN LDR DEVRESİ


Karşılaştırıcı kullanarak 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


a) MikroC Kodları:

void main() {

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

VRCON=0XAC;//Referans voltajını (VREF) 2.5V'a ayarla

CMCON=0X02;//Karşılaştırıcıların pozitif girişini VREF olarak seç

while(1){

PORTB.RB0=CMCON.C2OUT;//RB0'ı, 2. Karşılaştırıcının çıkışına eşitle

}

}

b) Assembly Kodları:

Eğer MPLAB kullanıyorsanız,

LIST P=16F84A

INCLUDE <P16F84A.INC>

__config 0x3ff9

BSF STATUS, 5 ;BANK1’e gec

BCF TRISB, 0 ;RB0’ı cikis yap

BCF STATUS, 5 ;BANK0’a gec

MOVLW 0XAC ;W=0XAC

MOVWF VRCON ;Referans voltajini (VREF) 2.5V'a ayarla

MOVLW 0X02 ;W=0X02

MOVWF CMCON ;Karsilastiricinin pozitif girisini VREF'e bagla

LOOP

BTFSS CMCON, 7 ;C2OUT=1 ise

BCF PORTB, 0 ;RB0=0 yap

BTFSC CMCON, 7 ;C2OUT=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

MOVLW 0XAC ;W=0XAC

MOVWF VRCON ;Referans voltajini (VREF) 2.5V'a ayarla

MOVLW 0X02 ;W=0X02

MOVWF CMCON ;Karsilastiricinin pozitif girisini VREF'e bagla

LOOP

BTFSS CMCON, 7 ;C2OUT=1 ise

BCF PORTB, 0 ;RB0=0 yap

BTFSC CMCON, 7 ;C2OUT=0 ise

BSF PORTB, 0 ;RB0=1 yap

GOTO LOOP

kodlarını kullanabilirsiniz.

Eğer direk hex kodlarını yüklemek istiyorsanız, 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. Karanlıkta LED yakan devre ile karşılaştırırsak, burada sadece LDR ile sabit direncin yerini değiştiriyoruz.

16F628A ile Aydınlıkta LED yakan devre