www.ELEKTROloji.com
Kategoriler
Son Konular
İnternetten Seçmeler
Rastgele Konu
Toplist ve Sayaç

Webseyir

Pic Basic Pro ile Pic Programlama Dersleri-13 (ETE)



Multiplex in kelime anlamı kısa bir zaman dilimi içinde birden fazla (çoklu) işlemlerin yerine getirilmesidir. Elektronikle alakasıda daha ziyade gözün görüntü algılama özelliğinin yanıltılarak kullanılan sistemler üzerinedir. Mutlaka başka alakalı konularda mevcut ama bizim konumuzun dışına çıkmaktadr. Örneğin tek kablodan karşılıklı haberleşme de bir multiplex çalışmadır .

Multiplex çalışmada gözün görüntü algılama kabiliyetinden yararlandığımızı söylemiş idik. Insan gözü 16-20 ms den daha kısa sürede görünen nesneleri algılayamaz. Görüntünün algılanıp beyne yollanabilmesi ve o nesneyi görüyor olabilmeniz için nesne 20 ms den daha fazla gözünüzün önünde kalması gerekir. İşte bu özellik kullanılarak çoklu display tarama sistemleri en çok kullanılan yöntemlerden birisidir.

7 segment display sürmenin iki yolu bulunmaktadır. Ya, gösterilecek bilgiyi kendi tampon hafızasında saklayacak olan bir display sürücüsü kullanmak (7447 – 4511 ) gibi. Bunlara ayrıca 74595 gibi shift registerleri de dahil edebiliriz. Yada bir mikro kontrolcü yardımı ile multiplex tarama yaptırıp gerekli bilgiyi zaman paylaşımlı olarak ilgli displaylerde göstermektir.

Display sürücüsü kullanarak bilgi gösterme işine kısaca değindikten sonra esas konumuz olan multiplex tarama sitemlerine geçeceğiz.

7 segment bir displayde 7 adet segment led bulunur. Bu ledlerin birer ortak ucu da bulunmaktadır. Ortak uç Anot ise display ortak anot, katod ise display ortak katod diye anılır.

Ortak Anot sistemlerde ortak uçtan pozitif besleme (+) ve segmentlerede negatif besleme verilir (GND).

Ortak katod displaylerde ise ortak katod ucuna GND , segmentlere ise pozitif besleme tatbik edilir.

Voltaj seviyesi segmentin ihtiva ettiği led adedine göre değişir. Küçük displaylerde her segment de tek led yer alır ve genelde 1,6V-2,0V arasında bir voltaj tatbik edilir.

Büyük displaylerde her segment de birden fazla led yer almaktadır. Bunun bir ksımı seri bir kısmı ise paralel bağlanmıştır. Voltaj seviyesi için displayin data sheetine bakmak en doğrusu olacaktır.

Displayin a – b – c – d – e – f – g şeklinde adlandırılan segmentleri bulunmaktadır.



Hangi harflerin hangi segmentlere denk geldiği yanda gösterilmektedir. Bu gösterimde display de A harfini göstermek için a+b+c+e+f+g segmentlerinin aktif hale getirilmesi gerektiği kolaylıkla anlaşılabilmektedir. Başka bir örnek vermek gerekir ise 2 rakamı için (f+a+b+g+e+d) segmentleri aktif hale getirilmelidir.

Display sürücüleri tam anlamı ile bu işi yaparlar. Bilgi ABCD girişlerinden binary kodlanmış desimal olarak verilir. Sürücü gösterilecek harf yada rakama karşılık gelen segment çıkışlarını aktif ederek ilgili görüntüyü displayde oluşturur. 4 haneli bir sayıcımız olduğunu düşünür isek her bir hane için bir display sürücüsü kullanmamız gerekecektir. Halbuki aynı işi yalnızca 4 adet display ve 1 adet işlemci kullanarak yapabilmek mümkündür. Bu işlem tabiiki multiplex tarama yolu ile yapılabilmektedir.

Diyelimki 1234 rakamlarını 4 adet display de göstereceğiz. Multiplex tarama mantığına göre işlem şu şekilde olmaktadır.

Hemen belirtelim bütün displaylerin segmentleri bir birine bağlıdır. Yani bütün a lar, bütün b ler ve bütün c ler bir birlerine bağlıdır. Dolayısıyla a segmentini aktif yaparsanız normal olarak 4 adet displaydeki bütün a segmentleri aktif olacaktır. Bunun önüne geçmek ve yalnızca bize lazım olan displayin a segmentini aktif yapabilmek için displaylerin ortak anot yada katodları da kontrol altında tutulur. Böylece sisteme 4 rakamı ile ilgili segment bilgisini verdikten sonra yalnızca ilk displayin ortak ucuna gerekli besleme bir transistörle anahtarlanarak verilir. Böylece, rakam o displayde belirir. Bu görüntü burada bir kaç ms ekranda tutulur ve display ortak ucundan kapatılır.

Daha sonra segment hattına 3 bilgisi verilir ve bu seferde sağdan 2. ci displayin ortak ucuna besleme verilir. Böylece sağdan 2. displayde 3 rakamı belirir ve bu görüntü de orada bir kaç ms ekranda tutularak görüntü kapatılır. Bu şekilde diğer displaylerde sırası ile 2 ve 1 bilgisi verilerek bu işlem tekrarlanır. Gözümüz aradaki kesintileri algılayamayacak ve görüntü olarak ve kesiksiz bir şekilde displaylerde 1234 rakamlarını görecektir.

Basit olarak prensibini verdiğimiz bu tarama sistemine ait örneklerimizi inceledikçe konuyu daha iyi kavrayacağınıza inanıyorum.

Bu sistemin uygulamasında en önemli husus gösterim işleminin sürekliliğidir. Süreklilik kesintiye uğrar ise ekranda kırpışmalar başlayacak ve buda izleyenlere rahatsızlık verecektir.

Bir örnek vermek gerekir ise, 4 adet display de gösterilen bilgilerin displaylerde kalma sürelerini 5 ms olarak ayarladığımızı düşünelim. En sondaki bilgi gösterildikten 5 ms sonra yeniden enbaştaki bilgi tekrar ekrana gelmelidir. Burada başka bir iş yaparak gösterimde gecikme yaratırsanız arada kesinti olacak ve displaydeki görüntü kırpışma yapacaktır. Bu nedenlerden dolayı bu sistemi en doğru kullanmanın yollarında birisi kesme kullanmaktır. Yine 4 adet display sürme örneğimize dönersek her 5 ms de bir kesme oluşturup sırası ile displaylere bilgileri verirsek sistem kesintisiz olarak gösterim yapacaktır. Arada programla ilgili diğer işlerde kolaylıkla yapılabilir.

Şimdi gelelim örneklerimize. İlk örneğimiz bir sayıcı devresi olacaktır.

Başlangıç için 9999 sayıcısı yapacağız. Sayıcımız bir anahtarla tetiklenecek ve her tetikte sayac değeri bir artırılacaktır. Sayac değerimizde yine kesme kullanılarak 4 adet displayde gösterilecektir.



PORTA=0:TRISA=%00010000
PORTB=0:TRISB=%10000000
CMCON=7
OPTION_REG=%00000100 ‘Pull up dirençleri AÇIK (PORTB.7 için) – Bölme oranı 1/32. ‘bölücü ayarlaması 000=1/2, 001=1/4 , 010=1/8 , 011=1/16 , 100=1/32 , 101=1/64 , 110=1/128, 111=1/256
INTCON=%00100000 ‘Kesmeler aktif ve TMR0 kesmesi aktif

‘—————————————————————–
@ DEVICE pic16F628 ‘işlemci 16F628
@ DEVICE pic16F628, WDT_ON ‘Watch Dog timer açık
@ DEVICE pic16F628, PWRT_ON ‘Power on timer açık
@ DEVICE pic16F628, PROTECT_OFF ‘Kod Protek kapalı
@ DEVICE pic16F628, MCLR_off ‘MCLR pini kullanılMIYOR.
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT ‘Dahili osilatör kullanılacak
‘—————————————————————–
DEFINE OSC 4
‘————————————————————————-
SAYAC var WORD ‘Sayılacak değerleri tutacak olan değişkenimiz
SIRA var BYTE ‘display gösterim sırası
BIRLER var BYTE ’sayımızın birler hanesi
ONLAR VAR BYTE ’sayımızın onlar hanesi
YUZLER VAR BYTE ’sayımızın yüzler hanesi
BINLER VAR BYTE ’sayımızın binler hanesi
I VAR BYTE ‘döngü değişkenimiz
SAYI VAR BYTE‘çevirme değişkeni
X VAR BYTE ‘ara değişken

SYMBOL Disp0=PORTA.0 ‘ birler hanesi ortak uç
SYMBOL Disp1=PORTA.1 ‘ onlar hensie ortak uç
SYMBOL Disp2=PORTA.2 ‘ yüzler hanesi ortak uç
SYMBOL Disp3=PORTA.3 ‘ binler hanesi ortak uç
SYMBOL TUS =PORTB.7 ‘Buton
SYMBOL RESET=PORTA.4

PAUSE 100
INTCON.7=1 ‘tüm kesmeler açık
TMR0=99
ON INTERRUPT GoTo KESME ‘kesme oluşursa KESME adlı etikete git.

BASLA:

IF TUS=0 then
GOSUB DELAY
SAYAC=SAYAC+1
IF SAYAC>9999 then SAYAC=0
while tus=0:wend
ENDIF

IF RESET=0 then SAYAC=0

X=SAYAC DIG 0 :GOSUB AL:BIRLER=SAYI
X=SAYAC DIG 1 :GOSUB AL:ONLAR=SAYI
X=SAYAC DIG 2 :GOSUB AL:YUZLER=SAYI
X=SAYAC DIG 3 :GOSUB AL:BINLER=SAYI
GOTO BASLA

AL: LOOKUP X,[63,6,91,79,102,109,125,7,127,111,99,57],SAYI :RETURN
DELAY:
for I=0 to 35000
PAUSEUS 5
Next
RETURN

DISABLE
KESME:
SIRA=SIRA+1:IF SIRA>3 then SIRA=0 ‘hangi hanenin ekrana verileceğini belirliyor

IF SIRA=0 then ‘ilk hane yani birler hanesi ise
DISP3=0 ‘önce bir önceki gösterime ait display kapatılıyor
PORTB=BIRLER ‘Haneye ait bilgi porta (segmentlere) veriliyor
DISP0=1 ‘Display açılıyor.
ENDIF

IF SIRA=1 THEN
DISP0=0
PORTB=ONLAR
DISP1=1
ENDIF

IF SIRA=2 THEN
DISP1=0
PORTB=YUZLER
DISP2=1
ENDIF

IF SIRA=3 THEN
DISP2=0
PORTB=BINLER
DISP3=1
ENDIF

TMR0=99 ‘5 ms lik süreyi yaratacak olan TMR0 değeri registere yükleniyor.
INTCON.2=0 ‘TMR0 Kesme bayrağı sıfırlanıyor
RESUME
ENABLE

END





Programa saydırılan sayının sıfırlanması için bir RESET butonuda ilave edilmiştir. Sizler bu programa (PORTA.6 ya) bir tuş daha ilave ederek sayılan değerin azaltılmasını sağlayabilirsiniz. Böylece sistem aşağı ve yukarı sayabilecek hala gelebilir. B portunda dahili pullup kullanılmış ancak PortA.4 pinine dışarıdan pullup direnci bağlanmıştır.

Benzer bir sistem kullanarak saat devresi yapamaya çalışacağız.

Önce biraz teorik bilgi verelim. Yapacağımız saat devresinde yine kesmeden yaralanarak hem bilgileri displaylere vereceğiz hemde saniye pulslarını elde edeceğiz. Bilindiği üzere 1 sn=1000 ms. Dir. Şayet alimizde 5 ms lik bir kesme süremiz var ise; 1000/5= 200 kesmede bir saniye sayacımızı bir artırırsak saniye sayacımızı elde etmiş olacağız.

Ancak gerçekte bu sayı kesme kısmında kullandığımız komutların yarattığı gecikmeler nedeni ile biraz daha uzun olur. Bu nedenle kesme sayısında bir ayarlama yapacağız. Tabiiki sonucu gördükten sonra bu işlemi gerçekleştireceğiz. İşin temelinde her kesme oluştuğunda bir başka sayacı sn artırımı için kullanmamız gerekecektir.

Bunun dışında normal saat işlemlerini yerine getireceğiz. Bu programda bazı teknikler kullandım. Onları açıklamak isterim. Birinci teknik ,saat ve dakika göstergelerinin arasında 2 adet led yerleştirdik ve bunları PortB.7 den sürüyoruz. Biliyorsunuz 1 sn=1000 ms dir. O halde ledleri ilk 500 ms de yanar hale getirmek sonraki 500 ms de ise sonük durumda tutmak güzel olur diye düşündüm. Böylece Led ler bir saniyenin yarısında yanık diğer yarısında ise sönük gözükeceklerdir. Bunu sağlama için yine Zaman sayacını kullandım. Bu sayacın 200 değerine ulaşması yaklaşık 1 sn idi. O halde zaman sayacı 100 den küçük ise ledler yanık, 100 den büyük ise ledler sönük olacaktır.

Diğer bir teknik de saat ayarı esnasında işe görsellik katmak için kullanıldı. Sec tuşuna bastığımız zaman gerek sec tuşuna basıldığı anlaşılsın diye gerekse hangi konumda ayar yapıldığı belli olsun diye ayar yapılan kısımda bir flash imajı yaratmaya çalıştım. Bunu ayar yapılan displayleri yakıp söndürerek yapıyoruz elbette. Sec tuşuna ilk defa basılınca ayar sistemi devreye giriyor ve önce dakika kısmında ayar yapılıyor. Burada Artır tuşu dakika değerini artırıyor azalt tuşu ise dakika değerini azaltıyor. Programa bakarsanız orada Y=1-Y gibi bir komut kullandım.

Bu komut Y değişkenini Toogle eden yani bir sıfır bir yapan komuttur. Y nin “0 “ yada “1” olması durumuna görede Z değişkeni konuma göre değer almaktadır. Sonuç olarak Z=0 ise display de gerçek değerler gözükmekte Z değişkeni sıfırdan büyük ise display kapatılmaktadır. Dolayısıyla bir açılıp bir kapatılması displayin Flash etmesini sağlamaktadır. Bu arada artır yada azalt tuşlarına basılması durumunda gerek dakika ve gerekse saat hanesinde değer değişimleri display kapalı iken yapılmakta ve ekrana bilgiler geldiğinde yeni değerler gösterilmektedir.

Bu saat devresi ve programı simulasyonda işlemciye epeyce yükleme yaptığı için yavaş çalışmakta ve hassas bir ayar yapılamamaktadır. Bu nedenle gerçek devrede hassas saat ayarı için ZAMAN değişkeni değerleri ile oynanması gerekebilir. Programda bu değer 200 olarak alınmıştır. Ancak 195-205 arası değerler gerçek devrede denenerek uygun bir değer yakalanmalıdır.

İşte Programımız;



PORTA=0:TRISA=%11100000
PORTB=0:TRISB=%00000000
CMCON=7
OPTION_REG=%00000100 ‘Pull up dirençleri AÇIK (PORTB.7 için) – Bölme oranı 1/32. ‘bölücü ayarlaması 000=1/2, 001=1/4 , 010=1/8 , 011=1/16 , 100=1/32 , 101=1/64 , 110=1/128, 111=1/256
INTCON=%00100000 ‘Kesmeler aktif ve TMR0 kesmesi aktif

‘—————————————————————–
@ DEVICE pic16F628 ‘işlemci 16F628
@ DEVICE pic16F628, WDT_ON ‘Watch Dog timer açık
@ DEVICE pic16F628, PWRT_ON ‘Power on timer açık
@ DEVICE pic16F628, PROTECT_OFF ‘Kod Protek kapalı
@ DEVICE pic16F628, MCLR_off ‘MCLR pini kullanılMIYOR.
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT ‘Dahili osilatör kullanılacak
‘—————————————————————–
DEFINE OSC 4
‘————————————————————————-
ZAMAN VAR BYTE 60 ’saniye sayacı
SIRA var BYTE 61 ‘display gösterim sırası
SN VAR BYTE 62
DAK VAR BYTE 63
SAAT VAR BYTE 64
SAYI VAR BYTE ‘çevirme değişkeni
X VAR BYTE ‘ara değişken
BIRLER VAR BYTE
ONLAR VAR BYTE
YUZLER VAR BYTE
BINLER VAR BYTE
I VAR word ‘döngü değişkenimiz
POZ VAR byte 75
Z var byte
Y VAR BIT
SYMBOL Disp0=PORTA.0 ‘ birler hanesi ortak uç
SYMBOL Disp1=PORTA.1 ‘ onlar hensie ortak uç
SYMBOL Disp2=PORTA.2 ‘ yüzler hanesi ortak uç
SYMBOL Disp3=PORTA.3 ‘ binler hanesi ortak uç
SYMBOL SEC =PORTA.7
SYMBOL ARTIR=PORTA.6 ‘Buton
SYMBOL AZALT=PORTA.5
SYMBOL LED=PORTB.7

PAUSE 100
INTCON.7=1 ‘tüm kesmeler açık
TMR0=99
ON INTERRUPT GoTo KESME ‘kesme oluşursa KESME adlı etikete git.
DAK=15:saat=18

BASLA:

IF SEC=0 then AYAR

IF zaman4 then SIRA=0
IF SIRA=0 then
Disp3=0
PORTB=(PORTB & 128 )+BIRLER ‘Ledlerin konumunu(PortB.7) bozmadan segment bilgisi
DISP0=1 ‘PortB ye veriliyor. PortB & 128 led konumunu alıyor
ENDIF ‘bu konuma + BIRLER eklenerek porta bilgi olarak yollanıyor.

IF SIRA=1 THEN
DISP0=0
PORTB=(PORTB & 128 )+ONLAR
DISP1=1
ENDIF

IF SIRA=2 THEN
DISP1=0
PORTB=(PORTB & 128 )+YUZLER
DISP2=1
ENDIF

IF SIRA=3 THEN
DISP2=0
PORTB=(PORTB & 128 )+BINLER
DISP3=1
ENDIF

ZAMAN=ZAMAN+1
IF ZAMAN=200 then
zaman=0
SN=SN+1
IF SN=60 then
SN=0
DAK=DAK+1
IF DAK=60 THEN
DAK=0
SAAT=SAAT+1
IF SAAT=24 then SAAT=0
ENDIF
ENDIF
ENDIF

TMR0=99
INTCON.2=0 ‘TMR0 Kesme bayrağı sıfırlanıyor
RESUME
ENABLE

END



Multi02.DSN



Biraz da matrix display üzerinde çalışalım istiyorum. Bildiğiniz gibi sayılar için 7 segment displaylar kullanıyoruz. Ama iş harf göstermeye gelince bu displayler yetersiz kalıyorlar. Her ne kadar 7 segment display şeklinde hazırlanmış harf göstergeleride bulunsa bile bunların sürülme zorluğu insanları başka alternatifler bulmaya itmiş. Sonunda dot matrix yani nokta matriks sitemler bulunmuş. Kısaca açıklamak gerekir ise yatayda yan yana dizilmiş ledlerin birden fazla sıralar halinde yerleştirilmesine dot matrix led display adı veriliyor. Sonuç oalarak bu displayda hem sütünlar hemde satırlar bulunmaktadır.

Aşağıdaki resimde matrix displayin 2 değişik tipi incelenmektedir.

Matrix01.DSN



Matrix led sistemleri 2 şekilde çalıştırılırlar. Birinci metod da haf bilgisi satırlara verilir sütünlar teker teker taranır. Diğer metod da ise harf bilgisi sütundan verilir ve satırlar teker teker taranır.

Sonuçta elde edilen sonuç açısından aralarında fark yoktur ama led parlaklığı açısından daha kısa zamanda taranması nedeni ile satır taramanın daha uygun olduğu kullanıcılar tarafından belirtilmektedir. Yukarıdaki resimde her iki sisteme ait aynı bilginin matrix de nasıl oluşturulduğu gösterilmektedir. Bilgi sütundan verilirse o bilgi hangi satırda oluşturulacak ise yalnızca o satır aktif edilir. Bilgi satırdan verilirse hangi sütunda oluşturulacak ise o sütün aktif edilir. Şekilde kullandığımız örnekde satır aktivasyonu LOW ile sütün aktivasyonu ise HIGH ile yapılmaktadır.

Bu sistemde de yine display de bilgi oluşturulması multiplexx tarama sistemi ile benzer şekilde gözün algılama süresinden daha kısa sürede bilgi satırlara yada sütunlara verilerek tarama yaptırılıp her satır yada sütunun kısa süreli aralıklarla aktif edilerek yine göz aldatma yolu ile şekil displya da oluşturulur. Bu açıkladıklarımızı her iki sistemde örneklerle biraz daha geniş açıklayalım.

Bir terim kargaşasını önlemek için sistemi, tarama yapılacak bölüm ile anıyorum. Yani Satır taranacak (bilgi sütundan verilecek) ise sisteme satır tarama sistemi , sütun taranacak (bilgi satırdan verilecek) ise sisteme sütun tarama sistemi adını veriyorum. Böylece herkes karıştırmadan konuyu kolaylıkla analayacaktır sanırım.

Sütun Tarama Sistemi: Bu sistemde bilgi satırdan verilir ve sütün teker teker taranarak displayda bilgi oluşturulur.

Kolay anlaşılması açısından H harfinin bir display da oluşturulmasını bu yöntemle açıklamaya çalışacağım.



Resime bakarsanız 8 adet satır bilgisi ve 8 adet de sütun bilgisi bulunmaktadır. Şayet harfi satırdan oluşturacak isek her bir satır bilgisini matrix displaye verip en azından 1-2 ms o görüntyüyü ekranda (matrix led de) tutmamız sonra diğerini vermemiz gerekir. Şimdi sütun tarama sistemini incelediğimize göre kullanacağımız bilgiler Sütun bilgileri olacaktır. Satırın tamamı bir Porta bağlı olacak ve sütunda görülen bilgiler teker teker porta verilerek satır bilgisi oluşturulacaktır. Yukarıdaki örneğimize göre

1. Sütunda : 00000000 bilgisini oluşturacak şekilde bu bilgi porta verilir.
2. Sütunda : 01000010 bilgisini oluşturacak şekilde bu bilgi porta verilir.
3. Sütunda : 01000010 bilgisini oluşturacak şekilde bu bilgi porta verilir.
4. Sütunda : 01111110 bilgisini oluşturacak şekilde bu bilgi porta verilir.
5. Sütunda : 01000010 bilgisini oluşturacak şekilde bu bilgi porta verilir.
6. Sütunda : 01000010 bilgisini oluşturacak şekilde bu bilgi porta verilir.
7. Sütunda : 01000010 bilgisini oluşturacak şekilde bu bilgi porta verilir.
8. Sütunda : 00000000 bilgisini oluşturacak şekilde bu bilgi porta verilir.


İlk sütun bilgisi porta verildikten sonra yukarıdan ilk sütun aktif edilir. Böylece ilk sütun bilgisi matrixde görülcektir.

Sonra 2. sütun bilgisi porta verilir ve ikinci sütun aktif edilir. Böylece 2 sütun bilgisi matrix de görülür.

Sonra 3. sütun bilgisi porta verilir ve 3. sütun aktif edilir. Böylece 3. sütun bilgisi matrix de görülür.

Sonra 4. sütun bilgisi porta verilir ve 3. sütun aktif edilir. Böylece 3. sütun bilgisi matrix de görülür.

Bu şekilde sıra ile 8 adet sütun bilgisi (5 x 7 matrix sistemde 5 adet sütun bilgisi olacaktır) porta verilerek o sütun aktif edilir ve gözün de aldanması ile matrix le düzerinde H bilgisi izlenir.

Bunu bir programla deneyelim.



OPTION_REG=1
ADCON1=7
PORTA=0:TRISA=0
PORTB=0:TRISB=%00000000
PORTC=0:TRISC=%00000000
PORTD=0:TRISD=%00000000
PORTE=0:TRISE=%00000000
‘—————————————————————–
@ DEVICE PIC16F876, WDT_ON ‘Watch Dog timer
@ DEVICE PIC16F876, PWRT_ON ‘Power on timer açık
@ DEVICE PIC16F876, PROTECT_OFF ‘Kod Koruma kapalı
@ DEVICE PIC16F876, BOD_OFF
@ DEVICE PIC16F876, XT_OSC
‘—————————————————————–
DEFINE OSC4

SUTUN VAR BYTE [8]
I VAR BYTE
X VAR BYTE
’satır bilgisi sütun taramalı sistem
SUTUN[0]=%11111111
SUTUN[1]=%10000000
SUTUN[2]=%11110111
SUTUN[3]=%11110111
SUTUN[4]=%11110111
SUTUN[5]=%11110111
SUTUN[6]=%10000000
SUTUN[7]=%11111111

BASLA:
X=128
FOR I=0 TO 7
PORTB=x
PORTC=SUTUN[I]
X=X/2
PAUSE 5
NEXT
GOTO BASLA



Programda harfi oluşturan satır bilgileri C portundan verilmiş ve B portundan da hangi sütun bilgisi verilmiş ise o sütuna High verilerek sütun aktif edilmiştir.

Matrix02.DSN



Aynı devreyi satır taramalı olarak da çalıştırabiliriz. Bu sefer harfe ait bilgilerin satır karşılıklarını kullanmamız gerekecek.



OPTION_REG=1
ADCON1=7
PORTA=0:TRISA=0
PORTB=0:TRISB=%00000000
PORTC=0:TRISC=%00000000
PORTD=0:TRISD=%00000000
PORTE=0:TRISE=%00000000
‘—————————————————————–
@ DEVICE PIC16F876, WDT_ON ‘Watch Dog timer
@ DEVICE PIC16F876, PWRT_ON ‘Power on timer açık
@ DEVICE PIC16F876, PROTECT_OFF ‘Kod Koruma kapalı
@ DEVICE PIC16F876, BOD_OFF
@ DEVICE PIC16F876, XT_OSC
‘—————————————————————–
DEFINE OSC4

SUTUN VAR BYTE [8]
I VAR BYTE
X VAR BYTE

’sütün bilgisi , satır taramalı sistem
SUTUN[0]=%01000010
SUTUN[1]=%01000010
SUTUN[2]=%01000010
SUTUN[3]=%01111110
SUTUN[4]=%01000010
SUTUN[5]=%01000010
SUTUN[6]=%01000010
SUTUN[7]=%00000000

BASLA:
X=1
FOR I=0 TO 7
PORTC=255-x
PORTB=SUTUN[I]
X=X*2
PAUSE 50
NEXT
GOTO BASLA



Bu programda Harf’e ait satır bilgileri PortB den (sütun portundan) sırası ile verilmekte ve satırlar sırası ile aktif edilerek (LOW vererek) harfin displayde oluşması sağlanmaktadır. Program aynı devre ile çalışabildiğinden ayrıca devre şeması verilmemiştir.

Tabiiki bu işle ilgili olarak kullanılacak devreler tek displayden oluşmaz. Birden fazla display için port çoğullaması kullanmak gerekir. Port çoğullama işlemi genellikle tarama yapılan port için kullanılır. Dikkat ederseniz satır taramalı sistemde bilgi sütundan veriliyor idi. Bu duurmda birden fazla display için port çoğullamak için shift registerlerden yararlanmak en iyi yollardan birisidir. Buna örnek olarak 74HC595 entegresini verebiliriz. Bu entegrenin kullanımına ait örneklerimizi önceki derslerimizde vermiş idik.

Şayet sütun taraması için port çoğullamak gerekir ise yine 74HC595 kullanılabilir. Ancak bunun yanısıra 74154 de iyi bir alternatif tir. Bu alternatifleri dahada çoğaltmak mümkündür. Diğer bir konuda led lerin yeterince parlaklığını sağlama konusudur. Bunun için matrix lerin ortak uçları (anot yada katod) için ULN2800 serisi entegrelerden birini kullanmak uygun olacaktır. Şimdi hem port çoğullamak hemde birden fazla display kullanabilmek için bir devre geliştireceğiz. Matrix displaylar ile çalışan bir saat yapmaya çalışacağız.

Önce devremizi verelim; Devre satır taramalı bir sistemdir. Bilgi sütunlarda yer alan 74HC595 ler yardımı ile sütunlara verilir ve satır taranarak istene bilgi istenen sütunda oluşturulur. Sistemin pratik çalışma açıklaması böyledir.

Matrix03.DSN



Şimdi de programı verelim;



@ DEVICE pic16F628
@ DEVICE pic16F628, WDT_ON
@ DEVICE pic16F628, PWRT_ON
@ DEVICE pic16F628, BOD_ON
@ DEVICE pic16F628, PROTECT_OFF
@ DEVICE pic16F628, LVP_OFF
@ DEVICE pic16F628, CPD_OFF
@ DEVICE pic16F628, MCLR_OFF
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT
CMCON=7
TRISA=%11100000
TRISB=%00000000
PORTA=0
PORTB=255

DEFINE OSC 4
ESN VAR BYTE
SN VAR BYTE 60
DAK VAR BYTE 61
SAAT VAR BYTE 62

TEMP VAR BYTE 63
YIL VAR BYTE 64
AY VAR BYTE 65
GUN VAR BYTE 66
HAFGUN VAR BYTE 67
YERI VAR BYTE 68
VERI VAR BYTE 69
HARF VAR BYTE 70
SAYI VAR BYTE 71
I VAR BYTE72
X VAR BYTE 73
W VAR BYTE 74
FLASH VAR BYTE 75
SON VAR BYTE
Z VAR BYTE

SUT1 VAR BYTE[8]80
SUT2 VAR BYTE[8]88
SUT3 VAR BYTE[8]96
SUT4 VAR BYTE[8]104
SUT5 VAR BYTE[8]112
SUT6 VAR BYTE[8]120
SUT7 VAR BYTE[8]160
SUT8 VAR BYTE[8]168

SYMBOL CLK=PORTA.0
SYMBOL DTA=PORTA.1
SYMBOL STL=PORTA.2
SYMBOL SLC=PORTA.3
SYMBOL SDA=PORTA.4
SYMBOL SEC=PORTA.5
SYMBOL ART=PORTA.6
SYMBOL AZL=PORTA.7

harf=”:”
gosub NOKTA

BASLA:
IF SEC=0 THEN AYAR ‘SEC tuşuna basılmış ise ayar kısmına git
GOSUB ZAMANOKU ‘RTC den zamanı oku

GOSUB SAATAL ‘Saat bilgisini displayde gösterecek hale çevir
GOSUB DAKAL ‘Dakika bilgisini displayde gösterilecek hale çevir
GOSUB SNAL ‘Saniye bilgisini displayde gösterilecek hale çevir. [/color]

SON=29 ‘gösterim süresini tekrar yaparak ayarlıyor yaklaşık 1 sn den daha az sürmeli
GOSUB GOSTER
GOTO BASLA

GOSTER:
FLASH=0
FOR X= 1 TO SON
IF X>(SON/2) THEN FLASH=Z ‘Z=3 , Z=24 , Z=192 FLASH SAYILARI
FOR I=0 to 7
SAYI=SUT8[I] ‘…..SN bilgisi bir ler hanesi yüklendi
IF FLASH.BIT7=1 THEN SAYI=0
GOSUB AKTAR ‘ birler hanesi matrix displayi süren 74HC595′e yüklendi

SAYI=SUT7[I] ‘SN onlar hanesi yüklendi
IF FLASH.BIT6=1 THEN SAYI=0
GOSUB AKTAR ‘Onlar hanesi bilgisi 74HC595′e yüklendi.

SAYI=SUT6[I] ‘ “:” işareti bilgileri yüklendi
IF X>=15 THEN SAYI=0
GOSUB AKTAR ‘işaret bilgileri 74HC595′e yüklendi

SAYI=SUT5[I] ‘Dakika birler hanesi yüklendi
IF FLASH.BIT4=1 THEN SAYI=0
GOSUB AKTAR ‘Dakika birler hanesi 74HC595′e yüklendi

SAYI=SUT4[I] ‘Dakika onlar hanesi yüklendi
IF FLASH.BIT3=1 THEN SAYI=0
GOSUB AKTAR ‘dakika onlar hanesi 74HC595′e yüklendi

SAYI=SUT3[I] ‘ “:” işareti bilgileri yüklendi
IF X=>15 THEN SAYI=0
GOSUB AKTAR ‘işaret bilgileri 74HC595′e yüklendi

SAYI=SUT2[I] ’saat birler hanesi bilgileri yüklendi
IF FLASH.BIT1=1 THEN SAYI=0
GOSUB AKTAR ’saat birler hanesi 74HC595′e yüklendi

SAYI=SUT1[I] ’saat onlar hanesi yüklendi
IF FLASH.BIT0=1 THEN SAYI=0
GOSUB AKTAR ’saat onlar hanesi 74HC595′e yüklendi

STL=1:PAUSEUS 2:STL=0
PORTB.BIT0[I]=0 ’satır taraması yapılıyor önce ilgili bit LOW yapıldı
PAUSEus 1600 ’sonra 1600 us beklendi
PORTB.BIT0[I]=1 ’sonra ilgili bit HIGH yapıldı
NEXT
NEXT
RETURN

SAATAL:
HARF=SAAT DIG 1 ’saat bilgisi onlar hanesini al
GOSUB ARA ‘karekter koduna göre yer bilgisini al
TEMP=YERI
FOR I=0 to 7
YERI=TEMP+I
GOSUB DATAAL ’sıra ile sütun bilgilerini oku ve değişkenlere yerleştir
SUT1[I]=VERI
NEXT

HARF=SAAT DIG 0 ‘aynı işlemi birler hanesi içinde yap
GOSUB ARA
TEMP=YERI
FOR I=0 to 7
YERI=TEMP+I
GOSUB DATAAL
SUT2[I]=VERI
NEXT
RETURN

DAKAL:
HARF=dak DIG 1
GOSUB ARA
TEMP=YERI
FOR I=0 to 7
YERI=TEMP+I
GOSUB DATAAL
SUT4[I]=VERI
NEXT
HARF=DAK DIG 0
GOSUB ARA
TEMP=YERI
FOR I=0 to 7
YERI=TEMP+I
GOSUB DATAAL
SUT5[I]=VERI
NEXT
RETURN
SNAL:
HARF=sn DIG 1
GOSUB ARA
TEMP=YERI
FOR I=0 to 7
YERI=TEMP+I
GOSUB DATAAL
SUT7[I]=VERI
NEXT

HARF=sn DIG 0
GOSUB ARA
TEMP=YERI
FOR I=0 to 7
YERI=TEMP+I
GOSUB DATAAL
SUT8[I]=VERI
NEXT
RETURN
AKTAR:
SHIFTOUT DTA,CLK,1,[SAYI]
RETURN
NOKTA: ‘ : işaretine ait sütun bilgilerini değişkenlere yerleştir.
gosub ARA
TEMP=YERI
FOR I=0 to 7
YERI=TEMP+I
GOSUB DATAAL
SUT3[I]=VERI
sut6[I]=VERI
NEXT
RETURN

ARA:
select case HARF
case ” “:YERI=0:return
case “.”:YERI=8:return
CASE “/”:YERI=16:RETURN
case 0:YERI=24:return
case 1:YERI=32:return
case 2:YERI=40:return
case 3:YERI=48:return
case 4:YERI=56:return
case 5:YERI=64:return
case 6:YERI=72:return
case 7:YERI=80:return
case 8:YERI=88:return
case 9:YERI=96:return
case “:”:YERI=104:return
end select
RETURN

DATAAL:
lookup YERI,[$00,$00,$00,$00,$00,$00,$00,$00_ ;boşluk
,$00,$00,$00,$00,$00,$18,$18,$00_ ;nokta
,$06,$0C,$18,$30,$60,$C0,$80,$00_ ;/
,$3C,$66,$6E,$7E,$76,$66,$3C,$00_ ;0
,$18,$38,$18,$18,$18,$18,$7E,$00_ ;1
,$3C,$66,$06,$1E,$30,$66,$7E,$00_ ;2
,$3C,$66,$06,$1C,$06,$66,$3C,$00_ ;3
,$1C,$3C,$6C,$6C,$7E,$0C,$1E,$00_ ;4
,$7E,$60,$7C,$06,$06,$66,$3C,$00_ ;5
,$1C,$30,$60,$7C,$66,$66,$3C,$00_ ;6
,$7E,$66,$06,$0C,$18,$18,$18,$00_ ;7
,$3C,$66,$66,$3C,$66,$66,$3C,$00_ ;8
,$3C,$66,$66,$3E,$06,$0C,$38,$00_ ;9
,$00,$18,$18,$00,$00,$18,$18,$00],VERI ;:
return
‘ ,$7C,$CE,$DE,$F6,$E6,$C6,$7C,$00_ ;0
‘ ,$30,$70,$30,$30,$30,$30,$FC,$00_ ;1
‘ ,$78,$CC,$0C,$38,$60,$CC,$FC,$00_ ;2
‘ ,$78,$CC,$0C,$38,$0C,$CC,$78,$00_ ;3
‘ ,$1C,$3C,$6C,$CC,$FE,$0C,$1E,$00_ ;4
‘ ,$FC,$C0,$F8,$0C,$0C,$CC,$78,$00_ ;5
‘ ,$38,$60,$C0,$F8,$CC,$CC,$78,$00_ ;6
‘ ,$FC,$CC,$0C,$18,$30,$30,$30,$00_ ;7
‘ ,$78,$CC,$CC,$78,$CC,$CC,$78,$00_ ;8
‘ ,$78,$CC,$CC,$7C,$0C,$18,$70,$00_ ;9

ZAMANOKU:

I2CRead SDA,SLC,$D0,$00,[SN,DAK,SAAT]‘,HAFGUN,GUN,AY,YIL,TEMP]
temp=saat
SAAT=(temp>>4) & $03
saat=saat*10+(temp & $0F)
dak=((dak>>4) & $0F)*10+(dak & $0F)
sn=((sn>>4) & $0F)*10+(sn & $0F)
RETURN

AYAR:
Z=3:SON=16:SN=0
GOSUB SNAL
gosub GOSTER
WHILE SEC=0:WEND
HOUR:
IF SEC=0 THEN MINBIR
IF ART=0 THEN SAAT=SAAT+1
IF SAAT=24 THEN SAAT=0
IF AZL=0 THEN SAAT=SAAT-1
IF SAAT=255 THEN SAAT=23
GOSUB SAATAL
GOSUB GOSTER
GOTO HOUR
MINBIR:
Z=24
GOSUB GOSTER
WHILE SEC=0:WEND
MINUTE:
IF SEC=0 THEN KAYIT
IF ART=0 THEN DAK=DAK+1
IF DAK=60 THEN DAK=0
IF AZL=0 THEN DAK=DAK-1
IF DAK=255 THEN DAK=59
GOSUB DAKAL
GOSUB GOSTER
GOTO MINUTE

KAYIT:

Z=0:sn=0
SAAT=(SAAT DIG 1)<<4+SAAT DIG 0
DAK =(DAK DIG 1)<<4+DAK DIG 0
I2CWrite SDA,SLC,$D0,$00,[SN,DAK,SAAT]
PAUSE 10
WHILE SEC=0:WEND
GOTO BASLA

END



Programla ilgili çok fazla şey açıklama gereği duymuyorum. Gerekli açıklamaları programın satırlarına yerleştirdim. Ancak satır taramasında taranan satır her bir displayde aynı anda aktif edildiğine dikkat ediniz. Yani bütün displaylerin satırları aynı anda taranmaktadır. Port dan 1 nolu satıra ait tarama bilgisi çıkınca bu bütün displaylere tatbik edilmektedir.

Burada size enteresan gelebilecek bir diğer uygulamada satır taramasında kullanılan sistemdir. O konuda biraz açıklama vermekte yarar var.

Önce bu işle ilgili 3 satırı tekrar yazalım .

PORTB.BIT0[I]=0 ’satır taraması yapılıyor önce ilgili bit LOW yapıldı
PAUSEus 1600 ’sonra 1600 us beklendi
PORTB.BIT0[I]=1 ’sonra ilgili bit HIGH yapıldı

PORTB.BIT0[I]=0 komutunda
 I=0 ise PORTB.0=0 olacak
 I=1 ise PORTB.1=0 olacak
 I=2 ise PORTB.2=0 olacak
 …
 I=7 ise PortB.7=0 olacaktır.


Bu sistem bir bayt değişkenine ait bitleri bir döngü vasıtası ile değiştirme yada test edebilme imkanı sağlayan yöntemdir. Komutun kullanım şekli biraz enteresan PORTB.BIT0[I]=0 şeklinde verildiği zaman çoğu kişi sıfır nolu bitin değiştirileceğini düşünüyor. Ama öyle değil. Yalnızca yazım şekli bu şekildedir. Dolayısıyla harici bir değişkene bağlı bir byte bitini değiştirmek için yazım formatı;

Degisken.BIT0[I] şeklindedir. Örnek vermek gerekir ise SAYI isimli değişkenin bitlerini sırası ile önce 0 sonra 1 yapalım.

For I=0 to 7
SAYI.Bit0[I]=0
Pause 100
SAYI.Bit[I]=1
Next


şeklinde yazıldımı istediğimizi kolaylıkla yapabiliriz. Son olarak birazda yazıların kaydırılması konusuna değineceğiz.

Bir matriks display dizisine yerleştirilmiş olan görüntü yada yazıların bir yerden diğer yana doğru kaydırılması işi sütun yada satır tarama tekniklerine göre şöyle yapılmaktadır.

Önce sütun tarama sistemine bakalım, displaylere verilen bilgileri sütun bazında önce değişkenlerine yerleştirdiğimizi ve sonra bunları sütun bilgisi olarak portun birinden çıkardığımızı biliyorsun. Önce 1. sütun bilgisini veriyor ve 1. sütunu aktif hale getiriyor idik. Sonra 2 sütun bilgisini port dan veriyor ve aynı anda da 2. sütunu aktif hale gitiryor ve bunu bütün sütunları displaylere verinceye kadar devam ettiriyor idik.

Şimdi 1. sütunda yer alması gereken bilgiyi ben 2 sütundan verirsem ne olur? Devamında 2. sütunda yer alacak bilgiyi 3 sütunda versem ve bu işi son sütuna kadar birer kaydırarak versem ne olur. Tabiiki normalde yerinde gösterilen bilgi bu kaydırma sonucunda bir bit yana kaymış olacaktır. Bu işleme devam dersem gösterilecek bilgi bit bazında birer birer kayarak gösterilecektir. İşte yazı kaydırma devrelerinin prensibi budur.

İşin tekniğinde sistemi açtığınız zaman kaydırılacak yazının ilk sütundan başlaması sağlanır. Diyelimki soldan sağa doğru kaydırma yapacağız. En soldaki sütun 1. sütun olsun. İlk gösterilecek sütun bilgisini bu sütuna verir ve sütunu aktif edersek orada yalnızca 1 sıra ledin yandığını göreceksiniz. Taramayı sonuna kadar yapıp bitirdikten sonra ilk sütunda gösterdiğimiz bilgiyi bu sefer 2. sütuna aktarıp 1. süyunada peşinden sırası gelen sütun bilgisini verirsek ve bu işleme bu şekilde devam edersek gösterilecek bilgi soldan girerek yavaş yavaş sağa doğru kayacak ve en sonunda da sağdan çıkacak ve gözden kaybolacaktır. İşin temeli bu şekildedir.

Aşağıda daha önce vermiş olduğum Matrix01.bas programını H harfini kaydıracak şekilde düzenledim.

Devrenin simulasyonu için yine aynı devre kullanılacaktır (Matrix02.Dsn).



OPTION_REG=1
ADCON1=7
PORTA=0:TRISA=0
PORTB=0:TRISB=%00000000
PORTC=0:TRISC=%00000000
PORTD=0:TRISD=%00000000
PORTE=0:TRISE=%00000000
‘—————————————————————–
@ DEVICE PIC16F876, WDT_ON ‘Watch Dog timer
@ DEVICE PIC16F876, PWRT_ON ‘Power on timer açık
@ DEVICE PIC16F876, PROTECT_OFF ‘Kod Koruma kapalı
@ DEVICE PIC16F876, BOD_OFF
@ DEVICE PIC16F876, XT_OSC
‘—————————————————————–
DEFINE OSC4

SUTUN VAR BYTE [8]
temp var byte
I VAR BYTE
X VAR BYTE
W VAR BYTE

’satır bilgisi sütun taramalı sistem

SUTUN[0]=%11111111
SUTUN[1]=%10000000
SUTUN[2]=%11110111
SUTUN[3]=%11110111
SUTUN[4]=%11110111
SUTUN[5]=%11110111
SUTUN[6]=%10000000
SUTUN[7]=%11111111

BASLA:
BIR:
for w=0 to 10 ‘kaydırma hızı döngü sayısı artırılarak ayarlanıyor
X=128
FOR I=0 TO 7
PORTB=x
PORTC=SUTUN[I]
X=X/2
PAUSE 2
NEXT
next
pause 1
KAYDIR:
temp= sutun[0]
for w=0 to 6
sutun[w]=SUTUN[W+1]
next
sutun[7]=temp

GOTO BASLA

END



Şimdi bir adım daha ileri gidelim ve hem satır tarama hemde sütun tarama kaydırması yapalım. Bakalım sonuç ne olacak.

Biliyorsunuz birinci tip kaydırmada harfi oluşturan satır bilgisi sütundan verildi ve satır taraması yapıldı,. İkinci tipte ise harfi oluşturan sütunlar satırdan verilecek ve sütun taraması yapılarak kaydırma yapılacaktır.

Aradaki farkın görülebilmesi için program önce 1. tip kaydırmayı yapacak ve har soldan sağa doğru kayacaktır. Daha sonra program ikinci kademeye geçecek ve bu aşamada ise harf aşağıdan yukarı doğru kaymaya başlayacaktır. Bu mantık aynı zamanda yazı kaydırma sistemlerinde animasyon yaptırmak iamacı ilede kullanılmaktadır.



OPTION_REG=1
ADCON1=7
PORTA=0:TRISA=0
PORTB=0:TRISB=%00000000
PORTC=0:TRISC=%00000000
PORTD=0:TRISD=%00000000
PORTE=0:TRISE=%00000000
‘—————————————————————–
@ DEVICE PIC16F876, WDT_ON ‘Watch Dog timer
@ DEVICE PIC16F876, PWRT_ON ‘Power on timer açık
@ DEVICE PIC16F876, PROTECT_OFF ‘Kod Koruma kapalı
@ DEVICE PIC16F876, BOD_OFF
@ DEVICE PIC16F876, XT_OSC
‘—————————————————————–
DEFINE OSC4

SUTUN VAR BYTE [8]60
temp var byte
I VAR BYTE
X VAR BYTE
W VAR BYTE
M var byte

BASLA:
SUTUN[0]=%11111111
SUTUN[1]=%10000000
SUTUN[2]=%11110111
SUTUN[3]=%11110111
SUTUN[4]=%11110111
SUTUN[5]=%11110111
SUTUN[6]=%10000000
SUTUN[7]=%11111111
M=0
BIR:
for w=0 to 10 ‘kaydırma hızı döngü sayısı artırılarak ayarlanıyor
X=128
FOR I=0 TO 7
PORTB=x
PORTC=SUTUN[I]
X=X/2
PAUSE 3
NEXT
next
pause 1
gosub kaydIR
M=M+1
IF M<15 then BIR
SUTUN[0]=%01000010
SUTUN[1]=%01000010
SUTUN[2]=%01000010
SUTUN[3]=%01111110
SUTUN[4]=%01000010
SUTUN[5]=%01000010
SUTUN[6]=%01000010
SUTUN[7]=%00000000
M=0
IKINCI:
FOR W=0 to 10
X=1
FOR I=0 TO 7
PORTC=255-x
PORTB=SUTUN[I]
X=X*2
PAUSE 3
NEXT
NEXT
PAUSE 1
GOSUB KAYDIR
M=M+1
IF M<15 then IKINCI
GOTO BASLA

KAYDIR:
temp= sutun[0]
for w=0 to 6
sutun[w]=SUTUN[W+1]
next
sutun[7]=temp

RETURN

END



Bu program içinde aynı devre şemasını kullanıyoruz. Matrix02.DSN

HAZIRLAYAN : Erol Tahir Erdal (ETE)

Dersler ile ilgili dosyalara buradan ulaşabilirsiniz...




Etiketler
pic basic pro dersler, ete, dotmatris, basic tarama yöntemi, display, kayan yazı, sabit yazı, dotmatris yazı, dotmatris saat
Yorum Ekle