Elektronik Devreler Projeler Elektronik ve biraz daha fazlası İletişim - Araçlar - Dikkat - Topluluk
Elektronik / Elektronik Kaynakları/

PICBasic Dersleri PIC Basic Pro ile PIC Programlama 13

Sponsorlu Bağlantılar

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.

display

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.


‘****************************************************************

‘*  Name    : MULTI01.BAS                                       	*

‘*  Author  : [select VIEW...EDITOR OPTIONS]                    	*

‘*  Notice  : Copyright (c) 2008 [select VIEW...EDITOR OPTIONS] 	*

‘*          : All Rights Reserved                               	*

‘*  Date    : 02.05.2009                                        	*

‘*  Version : 1.0                                               	*

‘*  Notes   : MULTIPLEX SAYDIRMA SİSTEMİ                        	*

‘*          :                                                   	*

‘****************************************************************

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

Multiplex-lcd-sayici

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;


‘****************************************************************

‘*  Name    : MULTI02.BAS                                       *

‘*  Author  : [select VIEW...EDITOR OPTIONS]                    *

‘*  Notice  : Copyright (c) 2008 [select VIEW...EDITOR OPTIONS] *

‘*          : All Rights Reserved                               *

‘*  Date    : 02.05.2009                                        *

‘*  Version : 1.0                                               *

‘*  Notes   : MULTIPLEX SAAT                                    *

‘*          :                                                   *

‘****************************************************************

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 zaman<100 then ‘orta  ledleri yakıp söndüren komutlar

led=1

else

led=0

endif



GOSUB BAK



GOTO BASLA



AL:    LOOKUP X,[63,6,91,79,102,109,125,7,127,111,99,57],SAYI  :RETURN



DELAY: POZ=0

for I=0 to 5000

IF SEC=0 then

POZ=1

return

endif

PAUSEUS 5

Next

RETURN

AYAR:

WHILE SEC=0:WEND

Z=1

AYARBIR:

gosub delay:IF POZ=1 THEN AYARIKI

if sec=0 then AYARIKI

if z=1 then

if artir=0 then

dak=dak+1

if dak=60 then dak=0

endif



if azalt=0 then

dak=dak-1

if dak=255 then dak=59

endif

endif

Y=1-Y

IF y=0 then

Z=0

else

z=1

ENDIF

gosub bak

goto ayarbir

AYARIKI:

WHILE SEC=0 :WEND

Z=2

AYARUC:

gosub delay :IF POZ=1 then CIK

if sec=0 then CIK

IF Z=2 then  ‘şayet ekran kapalı  durumda ise değer artır yada azalt

if artir=0 then

SAAT=SAAT+1

if SAAT=24 then SAAT=0

endif



if azalt=0 then

SAAT=SAAT-1

if SAAT=255 then SAAT=23

endif

endif

Y=1-Y

IF y=0 then

Z=0

else

z=2

ENDIF

gosub Bak

goto AYARUC



CIK:

WHILE SEC=0:WEND

gosub delay

poz=0

GOTO BASLA



BAK:

X=DAK DIG 0 :GOSUB AL:BIRLER=SAYI :IF Z=1 then BIRLER=0 ‘z=1 ise ekran kapalı

X=DAK DIG 1 :GOSUB AL:ONLAR=SAYI  :IF Z=1 THEN ONLAR =0

X=SAAT DIG 0 :GOSUB AL:YUZLER=SAYI:IF Z=2 THEN YUZLER=0 ‘z=2 ise ekran kapalı

X=SAAT DIG 1 :GOSUB AL:BINLER=SAYI:IF Z=2 THEN BINLER=0

return



DISABLE

KESME:

SIRA=SIRA+1:IF SIRA>4 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

Multi02

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

Matrix01

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.

Matrix-led-sistemleri

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.




 ‘****************************************************************

‘*  Name    : Matrix01.BAS                                      	*

‘*  Author  : [select VIEW...EDITOR OPTIONS]                    	*

‘*  Notice  : Copyright (c) 2009 [select VIEW...EDITOR OPTIONS] 	*

‘*          : All Rights Reserved                               	*

‘*  Date    : 06.05.2009                                        	*

‘*  Version : 1.0                                               	*

‘*  Notes   : Sütun taramalı satırdan bilgi verilen sistem      	*

‘*          :  Harfin sütun bilgileri satır olarak veriliyor                                        	*

‘****************************************************************

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

Matrix02

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


‘****************************************************************

‘*  Name    : Matrix02.BAS                                      *

‘*  Author  : [select VIEW...EDITOR OPTIONS]                    *

‘*  Notice  : Copyright (c) 2009 [select VIEW...EDITOR OPTIONS] *

‘*          : All Rights Reserved                               *

‘*  Date    : 06.05.2009                                        *

‘*  Version : 1.0                                               *

‘*  Notes   : Satır taramalı sütundan bilgi verilen sistem      *

‘*          :                                                   *

‘****************************************************************

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

Matrix03 picbasic

Şimdi de programı verelim;


‘****************************************************************

‘*  Name    : Matrix03.BAS                                      	*

‘*  Author  : [                   E.T.E.                      ] 	*

‘*  Notice  : Copyright (c) 2008  İzinsiz kullanılamaz )        	*

‘*          : All Rights Reserved                               	*

‘*  Date    : 12.12.2008                                        	*

‘*  Version : 1.0                                               	*

‘*  Notes   :                                                   	*

‘*          :                                                   	*

‘****************************************************************

@ 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. 



 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).


‘****************************************************************

‘*  Name    : Matrix04.BAS                                      	*

‘*  Author  : [select VIEW...EDITOR OPTIONS]                    	*

‘*  Notice  : Copyright (c) 2009 [select VIEW...EDITOR OPTIONS] 	*

‘*          : All Rights Reserved                               	*

‘*  Date    : 06.05.2009                                        	*

‘*  Version : 1.0                                               	*

‘*  Notes   : Sütun taramalı satırdan bilgi verilen sistem      	*

‘*          : KAYDIRMA örneği                                                   	*

‘****************************************************************

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.


‘****************************************************************

‘*  Name    : Matrix05.BAS                                      	*

‘*  Author  : [select VIEW...EDITOR OPTIONS]                    	*

‘*  Notice  : Copyright (c) 2009 [select VIEW...EDITOR OPTIONS] 	*

‘*          : All Rights Reserved                               	*

‘*  Date    : 06.05.2009                                        	*

‘*  Version : 1.0                                               	*

‘*  Notes   : Sütun taramalı satırdan bilgi verilen sistem      	*

‘*          : KAYDIRMA örneği                                                   	*

‘****************************************************************

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

Hazırlayan: Erol Tahir Erdal (ETE) PICBasic Dersleri PIC Basic Pro ile PIC Programlama 13 Kod ve isis simülasyon dosyaları: pic-basic-pro-ile-pic-programlama-ders-13.zipSON

  • ömer

    Erol Tahir Erdal bey sizinle PİC yazılımıyla ilgili bir konuda görüşmem gereken bir konu var.Size ulaşabileceğim bir Eposta adresi verebilirmisiniz bana.

  • rainnman

    Emeğinize sağlık. matix03.dsn devre elemanlarını verebilirmisiniz acaba. Burada kullanılan display ne tür 7segmentmi yoksa farklımı ?

  • Hasan

    Hocam ellerine sağlık çok makbule geçti. Allah razı olsun

  • mavi-bilgi

    teşekkürler

  • ozgur

    Hocam bu mükemmel bilgileri bizlerle paylaştığın için çok çok sağ ol. Emeğine eline sağlık. Çok teşekkürler.

  • erden

    Hocam 2001’den beri bu sektörü bırakmıştım. Öcelikle siteyi gördüm çölde su bulmuş gibi faydalandım sağ olsunlar. Benim zamanlarımda özellikle böyle spesifik konularda kimse kimseye bir şey söylemez,sitelerde seminer,ders notları deklare edilmezdi. İnternette dimmer devreleri ayarında basit devreler bulunur o da biri yapar herkes kaynak belirtmeden çalardı. Sevindim açıkcası. ETE hocamıza da site yöneticilerine de çoook teşekkür ediyorum.

  • Mr Coban

    Hocam ellerine sağlık çok faydalı bilgiler.
    Anlatımınız ve değindiğiniz konular çok gzel.
    Allah razı olsun

  • Hakan

    Müthiş bir anlatım olmuş.. Gecenin 2 sinde satır sütun derken kafam karıştı ama yarın anlarım heralde.. Saygılar..

  • sinan

    merhaba

    MATRIX03 DİJİTAL SAAT uygulamasındaki değişken tanımlarının yanındaki
    sayılar ne anlama geliyor. SAAT VAR BYTE[8] 60. 60 ne için yazıldı.
    Teşekkürler,iyi çalışmalar

  • ete

    Değişkenlerin yanında yer alan sayılar o değişkenin pic hafızasında hangi hafızaya kayıt edileceğini belirler. Bu sayıyı koymaz isen pic kendisi bir sayı verir. Koyarsan sen belirlemiş olursun. Bu sayede isis de program çalışırken değişkenlerin hangi değerleri aldığını izleme imkanın olur. Bunun için watch window (debug menüsünden) açılır. Açılan pencere üzerinde sağ tıklanırsa bir menü açılır “Add Item by Address” seçeneği seçilir. Name kısmına değiken adı, Adress kısmına veridğiniz adres değeri verilir ve alt tarafta değişken tipi seçilir. Format olarak da unsigned Integer seçilir.
    Bu işlem için isis pause moduna geçirilmelidir.
    Dikkat etmeniz gereken nokta Byte tipi değişkenler bir adres değeri alırlar. Word tipi değişkenler 2 adres alırlar. Adres değerlerini verirken buna dikkat edilmesi gerekir.

    Ete

  • SİNAN

    teşekkürler.
    çoklu shift register kullanımını biraz açarmısınız. CLK ve AKTAR pinleri aynı olmasına rağmen, hangi dotmatrix`e hangi değerin yükleneceği nasıl seçiliyor ?

  • ete

    Sinan,

    Bu soruyu bir devreyi esas alarakmı soruyorsun yoksa öylesine havadan mı yada bir yerde gördüğün kullanım şekli ile ilgili olarakmı soruyorsun. Aslında cevabı verebilmem için devreyi görmem gerekir. Zira Shift Registerler farklı şekillerde bağlanabiliyorlar. Bahsi geçen shift register 74HC595 ise, hangi registere hangi bilginin verileceği register adedi kadar byte bilgisi verilmesi ile ayarlanır.
    5 adet register kullanıyorsanız bilgi yollarken 5 byte yollamanız gerekir. Böylece her bir byte bir registerde kalır. Seri bağlanmış Shift registerlerde ilk verilen 8 bitlik (1 byte) bilgi ilk data girişinin yapıldığı shift registerde kalır. İkinciyi verirsen Birincideki ilk verilen bilgi ikinciye otomatik olarak ötelenir ve ikinci ilk registere yerleşirken ilk bilgi ikinciye yerleşir. Bu mantık ile kaç register var ise o kadar bilgi verilerek istenilen bilginin istenilen registere yerleşmesi sağlanır.

    Ete

  • SİNAN

    teşekkürler Erol bey,

    çoklu dotmatrıx e karakter yazdırdım fakat,proteus üzerinde çalışma sırasında
    alakasız yerlerdeki led lerde yanıp sönmeler oluyor.bunu nasıl önlerim.
    iyi günler

  • ete

    Dosyaları görmeden bir şey söylemem mümkün değil maalesef.
    Benim yapıklarımı isis biraz yavaşda olsa kusursuz gösterebiliyor. O halde zamanlama konusunda bir sıkıntınız olabilir.

    Ete

  • SİNAN

    sorun galiba,dotmatrix lerin data uçlarının aynı olması.seri data geçişi sırasında

    ilgili dotmat. e giderken aradakilerden de geçtiği için, ledlerde flash oluyor.

    birde acaba,küçük bir kayan yazı örneği verirmisiniz.dotmatrıx sayısı 1 den fazla olursa daha iyi olur.
    teşekkürler..

  • ete

    Shift registerlerin çalışma prensibi konusunda ufak bir bilgi vereyim.
    CLK ve DATA ucundan seri yolla bir shift registere (74HC595) bilgi yolladığın zaman o bilgi normal şartlarda iç registerde tutulur. Hemen çıkış pinlerine o bilgi aktarılmaz. Ancak latch bacağına bir puls uygular isen bilgi çıkışa aktarılır. Dolayısıyla yapman gereken şey,
    – bilgi aktarımları bittikten sonra aktarılan bilgileri çıkışlara verilmesi için latch uçların tek bir puls uygula. Böylece düşündüğün olay gerçekleşmez. Yani en sonda puls verirsen aktarım esnasında çıkıtaki bilgiler değişmeyeceği için flash olayıda meydana gelmemiş olur.

    Ete

  • sinan

    merhaba Erol bey,

    5 dotmatrıx lı bir kayan yazı denememde,
    program birkaç saniye normal çalışıyor fakat daha sonra,

    “STACK OVERFLOW EXECUTING
    CALL INSTRUCTION PC=0X000A VE “STACK UNDERFLOW EXECUTING RETURN INSTRUCTION PC=0X0077”

    hataları geliyor

    HEX DOSYA 536 WORD.

    bu konuda yorumunuz nedir ? teşekkürler

  • ete

    Yorum istiyorsanız, programınızda kusur olduğunu hemen belirteyim.
    Ya Gosub ile gidilen bir alt programdan GOTO ile dönüyorsunuz yada tersi GOTO ile gidilen bir alt programdan RETURN ile dönüyorsunuzdur.
    He rikiside yanlış. GOSUB ile gidilen yerden mutlaka RETURN ile dönülmelidir.

    Bir başka olası sebep ise iç içe yada ard arda 4 veya 5 adetten fazla Gosub kullanmış olmanızdır.
    Bunları kontrol edip düzeltin.

    Ete

  • FATİH

    Hocam merhaba ,

    Verdiginiz bilgiler çok aydılatıcı bunun için ne kadar teşekkür etsek azdır bu yüzden sonsuz teşekkür ediyorum size.
    Bir sorum olacak hocam.
    Displayda sabit H harfi olan çalışmada ben istiyorumki H harfi belirli bi zaman dursun sonra başka bir harf göstereyim bu böyle ardı sıra gitsin.yani A 1 saniye yansın sonra B 1 saniye yansın sonra C yansın ………….. nereye kadar giderse artık.aradaki zamanıda ayarlayabileyim.16f877 de kaç adet sırası ile animasyon yapabilirim.
    beni üstün bilgileriniz ile aydınlatır iseniz çok sevinirim.
    saygılar.

  • ete

    Aslında çok basit yapmak istediğin. Şöyle,

    For I=0 to 28 ‘alfabe karekter adedi kadar döngü kurulur
    LCDOUT $fe,$c0,(65+I) ’65 ilk harfimiz olan “A” harfidir. Buna her yapılan I ilavesi başka bir harfi ekrana getirir.
    pause 1000 ‘1000ms=1sn bekle
    Next ‘bir sonraki harfi göster.

    Ete

  • fatih

    hocam teşekkürler.

    bu uygulamayı LCD de degilde ben 8×8 dotmatrix displayda yapmak istiyorum.Sabit H harfinin yazdıgı programa ilave şekiller eklemek istiyorum.

  • selami

    Allah sizden binlerce defa razi olsun..Bu kadar emek verip , insanlik icin faydali $eyler yaptiginiz icin ne kadar te$ekkür etsem azdir..Daha bakma imkanim olmadi ama inaniyorum ki bu yazilarinizdan cok $ey ögrenecegim..
    Bir de günlerden beri kafam takilipta , bir adim bile ilerleyemedigim konu hakkinda soru sorma imkanim varsa , daha da sevinirdim ama yoksa da yinede caniniz sagolsun.
    Saglik, mutluluk, huzur dolu günler sizin olsun..bu iyiliginizin kar$iligini muhakkak göreceginze inaniyorum..
    selam, saygi ve sevgiler
    almanya-köln