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.
Karanlıkta LED yakan LDR devresi için, aşağıda sırasıyla
bulabilirsiniz.
PIC 16F628A | 1 Adet Kırmızı LED | 150Ω Direnç | 39kΩ Direnç |
---|---|---|---|
![]() |
![]() |
![]() |
![]() |
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.
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.
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.
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.
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
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.
Karşılaştırıcı iki girişi ve bir çıkışı olan bir entegre devredir.
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.
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.
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.
16F628A'nın kayıt dosyalarını (register) kullanarak,
Yapılandırma kodlarında, çipe programı yazarken
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.
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:
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.
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.
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) 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.
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.