1. Bu site çerez kullanmaktadır. Siteyi kullanmaya devam etmeniz halinde çerez kullanımı ile ilgili site koşullarını kabul etmiş sayılırsınız. Daha Fazlasını Öğren.
  2. Forum İllegal Uyarısı Forum kuralları gereği forumda video ve illagal paylaşım yapmak yasaktır.Program Arşivimizde ise kısıtlanmış sürüm yada dağıtımı serbest olan (trial - freeware) yazılımlar yayınlayınız..Aksi takdirde mesajlarınız silinecektir..

Multiplex Yöntemi Ve Birleşik Display Kullanımı

Konusu 'Pic Uygulama Ve Devreleri' forumundadır ve guclusat tarafından 6 Mayıs 2016 başlatılmıştır.

  1. guclusat
    Offline

    guclusat Tanınmış Üye Süper Moderatör

    Katılım:
    14 Haziran 2009
    Mesajlar:
    9.756
    Ödül Puanları:
    48
    Display kontrol etmenin iki yöntemi var birincisi tarama yöntemi ikincisi ise shiftregister kullanmaktır ilk önce tarama yöntemini kullanalım. Bu yöntemde ortak katot 2 li birleşik display kullanacağız.birleşik displayın çalışma mantığı şu şekilde

    Bütün segmentler için bir tek data girişi bulunur ve her bir segment için bir katot çıkışı bulunur yukarıdaki örnekte olduğu gibi 2 sayısının bilgisi gönderildiğinde tüm segmentlerde 2, 7 sayısının bilgisi gönderildiğinde tüm segmentlerde 7 görünür bu sayıyı 27 yapmak istediğimizde 2 bilgisi gelince 1 numaralı katot ucunu 0,2 numaralı katot ucunu 1 yaparız bu şekilde yalnızca 1. segmentte 2 görünür. Aynı işi 7 bilgisi gönderildiğinde 2. katoda 0 vererek yaparız, böylece 2. segmentte 7 rakkamı görünür. Bu işlem belirli bir müddet çok hızlı bir şekilde gerçekleşince gözümüz aldanır ve sanki 27 yazıyormuş gibi algılarız bu tarama yöntemidir ve birleşik display bu şekilde kullanılır.

    Şimdi örnek bir 0-99 sayıcı devre yapalım devremiz bir ileri geri tuşu ile birkez basınca ileri tekrar basınca geri sayıyor. Bu sayma işlemi resetle sıfırlanıyor.sayılar 99?a gelince tekrar sıfır olarak saymaya devam ediyor, tersine saymada ise 0 dan sonra 99 olarak tekrar geri sayıyor.

    sayıcı-devre-şeması111.jpg

    Kod:
    include”modedefs.bas”                                  ?seri iletişim dosyalarını dahil et
    
    
    @ DEVICE pic16F628a, INTRC_OSC_NOCLKOUT      ?dahili osilatör devrede
    @ DEVICE pic16F628a, MCLR_OFF                ?mclr pini pasif
    cmcon=7                                      ?komperatör pinleri devre dışı
    TRISA=%00001100                              ?porta.2 ve 3 giriş olarak ayarlandı
    porta=%00001100
    TRISB=%00000000                              ?portb çıkış
    portb=0
    a var WORD                                   ?a değişkeni word olarak tanımlandı
    b var byte                                   ?b değişkeni byte olarak tanımlandı
    i var word                                   ?i değişkeni word olarak tanımlandı
    d var byte                                   ?d değişkeni byte olarak tanımlandı
    k var byte                                   ?k değişkeni byte olarak tanımlandı
    a=0 : b=0 : i=0  :k=0                        ?değişkenlere 0 atandı
    low porta.0:low porta.1                      ?display çıkışları low yapıldı
    '---------------------------------------------------------------------------
    basla:
    if porta.2=0 then yukari                     ?porta.2 ye basılırsa yukari etiketine git
    portb=%00111111                              ?portb den sıfır bilgisini gönder
    porta.0=1                                    ?1. segmentte sıfırı göster
    porta.1=1                                    ?2. segmentte sıfırı göster
    goto basla                                   ?basla etiketine dön
    yukari1:
    pause 300                                    ?porta.2 tuşuna basılıp çekme miktar bekle
    yukari:
    A=A+1                                        ?A yı bir artır
    if a=100 then a=0                            ?A yüze eşit olduğunda A yı sıfırla
    FOR i=0 to 50                                ?50 kez aşağıdaki işlemi yap
    gosub goster                                 ?göster etiketine git
    next i                                       ?i nin bir sonraki değerine git
    if porta.3=0 then basla                      ?porta.3 e basılmış ise basla etiketine git
    if porta.2=0 then asagi1                     ?porta2.0 a basılmış ise asagi1 etiketine git
    goto yukari                                  ?yukari etiketine dön
    asagi1
    pause 300                                    ?el basıp çekme miktarı bekle
    asagi:
    a=a-1                                        ?a?yı bir eksilt
    if a=0 then a=99                             ?eğer a=0 ise a=99 yap
    FOR i=0 to 50                                ?i sıfırdan 50 ye kadar aşağıdaki işlemi yap
    gosub göster                                 ?göstertiketine git geri gel
    next i                                       ?i ye dön ve bir artır
    if porta.3=0 then basla                      ?eğer porta.3 sıfır ise  basla etiketine git
    if porta.2=0 then yukari1                    ?eğer porta.2 sıfır ise yukari1 etiketine git
    goto asagi                                   ?aşağı etiketine git
    goster:
    K=A DIG 0                                    ?a, k sayısının sıfırıncı basamağıdır
    gosub cevir                                  ?çevir etiketine git ve geri gel
    portb=b                                      ?portb yi b sayısına eşitle
    high porta.0: pause 1: low porta.0           ?transistör ile sayıyı göster ve kapat
    K=A DIG 1                                    ?a,k sayısının birinci bitine eşit
    gosub cevir                                  ?çevir etiketine git ve geri gel
    portb=b                                      ?portb yi b sayısına eşitle
    high porta.1: pause 1: low porta.1           ?transistör ile sayıyı göster ve kapat
    return
    cevir:
    porta.0=0                                     ?porta.0 ?ı sıfırla
    porta.1=0                                     ?porta.1 ?i sıfırla
    LOOKUP K, [63,6,91,79,102,109,125,7,127,111],b       ?k nın display değerini b ye yaz
    Return
    @ DEVICE pic16F628a, INTRC_OSC_NOCLKOUT komutu ile 16f628 de bulunan dahili oslatörü aktif hale getiriyoruz, @ DEVICE pic16F628a, MCLR_OFF ile MCLR pinini nor mal bir pin haline getiriyoruz burada söyleyeceğimiz şey MCLR pini sürekli pull-down olarak ayarlanmıştır bu pini kullanmak için bir pull-up direnci bağlayarak kullanmalısınız. Daha önce anlattığımız gibi partlardaki pinleri programımıza uygun bir şekilde giriş veya çıkış olarak ayarlıyoruz, daha sonra değişkenlerimizi belirliyoruz benim buradaki taktiğim bu değişkenleri program yazarken ihtiyaç duydukça tanımlamaktır.

    Porta.2 yi yukarı aşağı sayma tuşu olarak ayarladık ana program başladığında program başla etiketinin altında bu tuşa basmamızı bekler bastığımızda porta.2 pininin 0 olduğunu algılar ve yukarı sayma işlemine yani yukarı etiketine yönlendirir. Burada yukarı1 ve yukarı adı altında iki adet etiket belirlememizin sebebi button komutunu kullanmadan basma gecikme işlemini sağlamaktır. Butona bastığımızda elimizi kaldırana kadar işlemci diğer komutlara geçebilir. basma gecikmesi için bir pause komutu ile 300 milisaniye gecikme koyduk. daha sonra ise goto komutunu yukarı etiketine vererek bu pause komutunu deveden Basla etiketinin ardından portb?yi %00111111 sayısına eşitledik buda segmentlere sıfır sayısının gönderilmesini sağlar. Porta.0 ve porta.1 den 5 volt çıkış gönderiyoruz bu çıkışlar transistörün beyzine bağlı olduğu için transistörlerin ikiside lojik bir olan segmentlerin ortak katot çıkışlarını sıfıra çakarek rakkamların görüntülenmesini sağlar.

    Porta.2 sıfır oldu ve yukarı etiketine ulaştık peki bundan sonra ne olacak yukari etiketi ile goto yukarı komutu arasında şunlar gerçekleşir. A=A+1 f ormülü programlama adına evrensel bir formüldür. Bu A sayısını bir artır ve A nın içine kaydet demektir artık A bir önceki A dan bir fazladır. A sayısının nekadar artacağınıda kontrol edeceğiz bunun için şu komutu kullanıyoruz. ?if a=100 then a=0? A sayısı 100 olunca A sayısını sıfırla bu komut A sayısının 0 ? 99 arası değerler almasını sağlar bu komut şöylede yazılabilir ?if a>100 then a=0? bu komutta aynı işe hizmet eder. GOSUB komutu ile göster etiketine gidiyoruz ve A değişkenimizin içindeki değeri segmentlerde göstermemizi sağlıyor. Ve bu işi tam 50 kez yapıyor peki bu nasıl oluyor bu işlem FOR NEXT komutu kullanılarak yapılıyor FOR NEXT komutu şöyle çalışır.

    FOR i=0 to 50
    İstenen komutlar
    NEXT i

    İ bir değişkendir. Anlamı şu i sıfırdan 50 ye gelene kadar i yi bir bir artır ve NEXT komutu arasındaki işlemi gerçekleştir ve i=50 olunca bir sonaki komuttan devam et. Bu işlem FOR ve NEXT komutları arasındaki işlemi 50 kez tekrarlamayı sağlar. Bu işlemi şunun için yaparız tarama işleminde 57 sayısınında önce 5 sonra 7 görünür demiştik işte bu işlemi sırası ile öyle hızlı yapmalıyız ki gözümüz bunu 57 olarak görsün FOR NEXT döngüsü ile bu işlemi 50 kez yapıyoruz. Buda 57 sayısını belli bir müddet segmentlerde görmemizi sağlıyor birkez yapsaydık daha ne olduğunu anlamadan 0- 99 arası sayılmış olacaktı. Daha sonra ?if porta.3=0 then basla? komutu geliyor bu komut bizi basla etiketine götürür. Basla atiketinde de portb=%00111111 olduğu için segmentteki sayılar sıfıra eşitlenir ve artık sıfır görüntülenir. Bu olay saymayı resetlemek demektir. ?Eğer if porta.2=0 then asagi1? basılmışsa aşağı etiketine gider burada da aynı işlemler gerçekleşir. Sadece A=A-1 ile A sayısı 1 azaltılır ve ?if a=0 then a=99? komutu ile A sayısı sıfır olunca A yı 99 a eşitler. FOR NEXT ile bu değişimi yine 50 kez segmette gösterir. ?if porta.3=0 then basla? komutu başlaya göndererek reset işlemini gerçekleştirir.? if porta.2=0 then yukari1 ?bizi yukarı saymaya yönlendirir. Göster etiketinde gerçekleşenler ise şunlardır.

    K=A DIG 0 demek K değişkenini A sayısının sıfırıncı bitine eşitle demektir DIG komutu DIGIT kelimesinden gelmektedir ve bir sayının herhangi bir dijitini seçmek için kullanılır K=A DIG 0 => Örn A=57, K=7 dir. K= A DIG 1 ise => A=57 için K=5 dir bu K değeri sırası ile gösterilince 57 olur. ? high porta.0: pause 1: low porta.0? komutu rakkamın 1 milisaniye kadar segmentte gösterilmesini sağlar. ?gosub cevir? etiketi ile K nın rakkam değeri segmentte gösterilebilecek formata dönüştürülür. Ve dönüştürülmüş biçimi b değişkeninin içine kaydedilir. Portb=b yapılarak segmentte sayı gösterilir. Çevir etiketinde şu işlem gerçekleşir. Segmentler kapatılır ve lookupt döngüsü şu şekilde çalışır.
     

Sayfayı Paylaş