Teknikim

Üye Girişi

Önemli! Foruma yazılmayan sorulara cevap verilmeyecektir. Lütfen sorularınızı foruma yazın!
PIC Uygulamaları 3-Sıralı Led Yakma
 

Yazan: Tuna BULUT, Tarih: 06-02-2008 18:25

Okunma Sayısı : 1568

Beğenilme : 21

Yayınlama yeri : Dersler, PIC Dersleri


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

regulator.jpg     7805.gif      16F628A_Pin_Diagram.jpg
Şekil 1-Regülatör Devresi       Şekil 2-LM7805               Şekil 3-PIC16F628A Pin Diyagramı

PIC Devresi

sirali_led.jpg
                                           Ş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.


   
Beğenilme
E-mail olarak gönder
İlgili makaleler
Teknikim'e kaydet

Okuyucu yorumları  RSS feed Yorum
 

Ortalama Üye Değerlendirmesi

   (0 Oylama)

 

Yorum Sayısı: 1 / 1

Ders çok güzel olmuş ama

Yazan:: Yakup GÖVLER (Misafir ) Tarih: 14-03-2008 08:39

Ders çok güzel olmuş ama 16f628'i harici osilatör yerine dahili osilatör kullanarak anlatsanız daha güzel olurdu. En azından alternatif olarak bunu da sunabilirseniz sevinirim.

 

» Yorumu cevapla...

» Tüm cevap(ları) 1 gör

Yorum Sayısı: 1 / 1



Yorumunuzu ekleyin
Sadece kayitli kullanicilar bir Makaleyi yorumlayabilir. Lütfen ücretsiz üye olun veya giriş yapın.


mXcomment 1.0.8 © 2007-2009 - visualclinic.fr
License Creative Commons - Some rights reserved