PICBasic Dersleri PIC Basic Pro ile PIC Programlama 13

| Mayıs 31, 2023 Tarihinde güncellendi
PICBasic Dersleri PIC Basic Pro ile PIC Programlama 13

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 proteus simülasyon dosyaları;

picbasic-dersleri-pic-basic-pro-ile-pic-programlama-13

Şifre-Pass: 320volt.com

PICBasic Dersleri PIC Basic Pro ile PIC Programlama SON

Yayım tarihi: 2010/04/30 Etiketler: , , , ,



23 Yorum “PICBasic Dersleri PIC Basic Pro ile PIC Programlama 13

  1. ömerö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.

    CEVAPLA
  2. rainnmanrainnman

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

    CEVAPLA
  3. HasanHasan

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

    CEVAPLA
  4. ozgurozgur

    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.

    CEVAPLA
  5. erdenerden

    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.

    CEVAPLA
  6. Mr CobanMr Coban

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

    CEVAPLA
  7. HakanHakan

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

    CEVAPLA
  8. sinansinan

    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

    CEVAPLA
  9. eteete

    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

    CEVAPLA
  10. SİNANSİ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 ?

    CEVAPLA
  11. eteete

    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

    CEVAPLA
  12. SİNANSİ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

    CEVAPLA
  13. eteete

    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

    CEVAPLA
  14. SİNANSİ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..

    CEVAPLA
  15. eteete

    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

    CEVAPLA
  16. sinansinan

    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

    CEVAPLA
  17. eteete

    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

    CEVAPLA
  18. FATİHFATİ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.

    CEVAPLA
  19. eteete

    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

    CEVAPLA
  20. fatihfatih

    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.

    CEVAPLA
  21. selamiselami

    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

    CEVAPLA

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir