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.
Karanlıkta LED yakan LDR devresi için, aşağıda sırasıyla
bulabilirsiniz.
PIC 16F84A | 2 Adet 22pF Kapasitör | 1 Adet 4MHz Kristal | 1 Adet Kırmızı LED | 150Ω Direnç | 39kΩ Direnç |
---|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
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.
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.
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.
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.
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.
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=!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.
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.