Bu yazımızda PIC 16F628A kullanarak sırayla 8 ledi
yakacağız, yani her bir butona basışımızda 1. ledden başlamak üzere bir yana
kayarak ledler yanacaktır.
Kullanılacak
Malzemeler
- 1xPIC16F628A
- 1x4
Mhz kristal
- 2x22pf
seramik kondansatör
- 1x100nF
seramik kondansatör
- 8xKırmızı
Led(Sarı, yeşil,beyaz veya diğer renkler de olabilir)
- 2xButon
- 8x330
ohm direnç
- 2x100 ohm direnç
- 2x4.7k direnç
- 5 V
DC kaynak(Batarya, pil, adaptör veya güç kaynağı)
Not: Eğer 9-12 V luk bir kaynak kullanacaksanız bu gerilimi
5 V a düşürebilmek için regülatör(düzenleyici) devresi kullanmanız gerekmektedir.
Regülatör Devresi
Bu devre 7-20 V arasındaki
gerilimi 5 V gerilime dönüştürür.
Kullanılacak Malzemeler(Regülatör İçin)
>>1x7805
>>1x330uF
elektrolitik kondansatör
>>1x100nF
seramik kondansatör
Şekil 1-Regülatör Devresi Şekil 2-LM7805 Şekil 3-PIC16F628A Pin Diyagramı
PIC Devresi
Şekil 4-PIC
Devresi
PIC Assembly Kodu
;PIC 16F628A kullanarak Buton ile LED Yakma
;Bu
kod Tuna Bulut tarafından yazılmıştır.
LIST P=16F628A
INCLUDE "P16F628A.INC"
__CONFIG _XT_OSC & _WDT_OFF
& _PWRTE_ON & _MCLRE_ON & _BODEN_OFF & _LVP_OFF &
_DATA_CP_OFF & _CP_OFF
;-------------DEĞİŞKENLERİ BİR ADRESE ATA----------------
CBLOCK H'20'
MEM ;MEM DEĞİŞKENİNİ BİR ADRESE ATA
SAYAC1
SAYAC2
ENDC
;------------------------------------------------------------------------
MOVLW H'07'
MOVWF CMCON ;COMPARATOR
ÖZELLİĞİ KAPALI VE PORTA I/O İÇİN AKTİF MODDA
CLRF PORTB ;PORTB Yİ
SIFIRLA
;GİRİŞ-ÇIKIŞ TANIMLAMALARI
BANKSEL TRISA ;BANK1 E GEÇİŞ YAP
MOVLW H'FF'
MOVWF TRISA ;PORTA NIN
BÜTÜN PİNLERİNİ GİRİŞ YAP
CLRF TRISB ;PORTB NİN
BÜTÜN PİNLERİNİ ÇIKIŞ YAP
BANKSEL PORTB ;TEKRAR
BANK0 A GEÇ
CLRF PORTB ;PORTB Yİ SIFIRLA
MOVLW H'01'
MOVWF MEM ;MEM DEĞİŞKENİNE H'01' DEĞERİNİ YÜKLE
;ANA PROGRAM
KONTROL
BTFSC PORTA,0 ;BUTONA BASILIYORSA YAK A GİT
GOTO KONTROL
YAK
MOVF MEM,W ;MEM DEĞİŞKENİNDEKİ DEĞERİ W YAZMACINA KAYDET
MOVWF PORTB ;W YAZMACINDAKİ DEĞERİ PORTB YE YÜKLE
KAYDIR
RLF MEM,1 ;MEM DEĞİŞKENİNİN DEĞERİNİ 1 SOLA KAYDIR VE MEM ÜZERİNE
KAYDET
CALL GECIKME ;GECIKME Yİ ÇAĞIR
GOTO KONTROL ;KONTROL
A GİT
;-------------------195 MS LİK
GECİKME(DELAY)----------------------------
GECIKME
MOVLW H'FF'
MOVWF SAYAC1 ;SAYAC1 E H'FF' DEĞERİNİ YÜKLE
DONGU1
MOVLW H'FF'
MOVWF SAYAC2 ;SAYAC2 YE H'FF' DEĞERİNİ YÜKLE
DONGU2
DECFSZ SAYAC2,1 ;SAYAC2 İ 1 AZALT VE SAYAC2 ÜZERİNE KAYDET 0 SA BİR SONRAKİ
KOMUTU ATLA
GOTO DONGU2
DECFSZ SAYAC1,1 ;SAYAC1 İ 1 AZALT VE SAYAC1 ÜZERİNE KAYDET 0 SA BİR SONRAKİ
KOMUTU ATLA
GOTO DONGU1
RETURN
;------------------------------------------------------------------------
END ;KODUN BİTİMİ
Not: Eğer RA6 ve RA7 pinlerini Giriş/Çıkış(I/O) olarak
kullanmak istiyorsanız. Harici osilatör kullanmak yerine PIC16F628A'nın
içinde bulunan 4 MHz dahili osilatörü kullanabilirsiniz. Bunun için
devrede ve kodda birtakım değişiklik yapmanız gerekir: Devrede RA6 ve
RA7 pinlerine bağlı bulunan elemanların yani kristal ve
kapasitörlerin bağlantısını kesin ve kodda _XT_OSC yerine _INTRC_OSC_NOCLKOUT yazın.
Ayrıca Reset opsiyonunu kullanmak istemiyor ve bu pini giriş olarak
kullanmak istiyorsanız. RA5/MCLR pinine bağlı tüm elemanların ve
yolların bağlantısını kesin kısacası bu pini açıkta bırakın ve kodda _MCLRE_ON yerine _MCLRE_OFF yazın. Şunu unutmayın ki RA5 pinini giriş olarak kullanabilirsiniz ama çıkış olarak kullanamazsınız.
Yeni Komutlar
Bu kodda birkaç yeni komutumuz var: CBLOCK
komutunu değişken
tanımlamak için kullanıyoruz. Değişkenler H'20' adresinden başlayarak
sırayla H'21', H'22' adreslerine atanır. Değişkenler bittikten sonra
da ENDC komutuyla
da tanımlama işini bitiriyoruz. RLF komutuyla da bir değişkenin içeriğini sola
bir bit kaydırıyoruz. Örneğin içindeki değer b’10011100’ olan MEM adında bir
değişkenimiz olsun. Biz RLF MEM
komutunu kullanırsak MEM içindeki değer 1 bit sola kayarak b’00111001’ olacak
yani en soldaki değer en sağa geçecek. RRF komutuyla da bu işlemin tersini
yapabiliriz. Bu koddaki bir diğer yenilikse GECIKME rutini. Burada çift döngülü
bir gecikme yapıyoruz. Belli bir süre işlemci GECIKME rutini içinde
döneceğinden bu süre içinde işlemci başka bir işlem yapmayacak ve çıkış
değerlerimiz aynen korunacaktır. Bu süreyi ise bu gecikme şekli için yaklaşık
olarak şu şekilde hesaplayabiliriz :
Gecikme(us)=3*SAYAC1*SAYAC2
Biz burada 3*255*255 ten yaklaşık 195000 us=195 ms lik bir
gecikme oluşturuyoruz.
Kodun Çalışma
Mantığı
Butona bastığımız zaman ilk olarak PORTB ye b’00000001’
çıkışı verilir ve b’00000001’ sayısı sola 1 bit kaydırılarak yeni sayı
b’00000010’ yapılır ancak ardından bir gecikme uygulanır ki butona basmamızla
çekmemiz arasında geçecek süre içinde işlemci diğer komutlara geçmesin ve LED
lerin hepsini yanar vaziyette görmeyelim. Gecikmeden sonra tekrar buton kontrol
edilir ve basılı durumdaysa PORTB ye yeni sayımız olan b’00000010’ çıkışı
verilerek bir yandaki led yakılmış olur ve böyle devam eder.
Not: Eğer butona ilk basışınızda LED lerin hepsini
yanar vaziyette görüyorsanız gecikme sürenizi artırın. Bunun için de KAYDIR
etiketi altındaki CALL GECIKME komutunun altına bir kez daha aynı komuttan
yazarsanız gecikme süresini 2 katına çıkarmış olursunuz. Bu şekilde istediğiniz
kadar gecikme oluşturabilirsiniz.
|
Ders çok güzel olmuş ama
Yazan:: Yakup GÖVLER (Misafir ) Tarih: 14-03-2008 08:39
» Yorumu cevapla...
» Tüm cevap(ları) 1 gör