![PICBasic Dersleri PIC Basic Pro ile PIC Programlama 13](https://320volt.com/wp-content/uploads/2010/04/picbasic-dersleri-pic-basic-pro-ile-pic-programlama-1.jpg)
Multiplex in kelime anlamı kısa bir zaman dilimi içinde birden fazla (çoklu) işlemlerin yerine getirilmesidir. Elektronikle alakasıda daha ziyade gözün görüntü algılama özelliğinin yanıltılarak kullanılan sistemler üzerinedir. Mutlaka başka alakalı konularda mevcut ama bizim konumuzun dışına çıkmaktadr. Örneğin tek kablodan karşılıklı haberleşme de bir multiplex çalışmadır .
Multiplex çalışmada gözün görüntü algılama kabiliyetinden yararlandığımızı söylemiş idik. Insan gözü 16-20 ms den daha kısa sürede görünen nesneleri algılayamaz. Görüntünün algılanıp beyne yollanabilmesi ve o nesneyi görüyor olabilmeniz için nesne 20 ms den daha fazla gözünüzün önünde kalması gerekir. İşte bu özellik kullanılarak çoklu display tarama sistemleri en çok kullanılan yöntemlerden birisidir.
7 segment display sürmenin iki yolu bulunmaktadır. Ya, gösterilecek bilgiyi kendi tampon hafızasında saklayacak olan bir display sürücüsü kullanmak (7447 – 4511 ) gibi. Bunlara ayrıca 74595 gibi shift registerleri de dahil edebiliriz. Yada bir mikro kontrolcü yardımı ile multiplex tarama yaptırıp gerekli bilgiyi zaman paylaşımlı olarak ilgli displaylerde göstermektir.
Display sürücüsü kullanarak bilgi gösterme işine kısaca değindikten sonra esas konumuz olan multiplex tarama sitemlerine geçeceğiz.
7 segment bir displayde 7 adet segment led bulunur. Bu ledlerin birer ortak ucu da bulunmaktadır. Ortak uç Anot ise display ortak anot, katod ise display ortak katod diye anılır.
Ortak Anot sistemlerde ortak uçtan pozitif besleme (+) ve segmentlerede negatif besleme verilir (GND).
Ortak katod displaylerde ise ortak katod ucuna GND , segmentlere ise pozitif besleme tatbik edilir.
Voltaj seviyesi segmentin ihtiva ettiği led adedine göre değişir. Küçük displaylerde her segment de tek led yer alır ve genelde 1,6V-2,0V arasında bir voltaj tatbik edilir.
Büyük displaylerde her segment de birden fazla led yer almaktadır. Bunun bir ksımı seri bir kısmı ise paralel bağlanmıştır. Voltaj seviyesi için displayin data sheetine bakmak en doğrusu olacaktır.
Displayin a – b – c – d – e – f – g şeklinde adlandırılan segmentleri bulunmaktadır.
Hangi harflerin hangi segmentlere denk geldiği yanda gösterilmektedir. Bu gösterimde display de A harfini göstermek için a+b+c+e+f+g segmentlerinin aktif hale getirilmesi gerektiği kolaylıkla anlaşılabilmektedir. Başka bir örnek vermek gerekir ise 2 rakamı için (f+a+b+g+e+d) segmentleri aktif hale getirilmelidir.
Display sürücüleri tam anlamı ile bu işi yaparlar. Bilgi ABCD girişlerinden binary kodlanmış desimal olarak verilir. Sürücü gösterilecek harf yada rakama karşılık gelen segment çıkışlarını aktif ederek ilgili görüntüyü displayde oluşturur. 4 haneli bir sayıcımız olduğunu düşünür isek her bir hane için bir display sürücüsü kullanmamız gerekecektir. Halbuki aynı işi yalnızca 4 adet display ve 1 adet işlemci kullanarak yapabilmek mümkündür. Bu işlem tabiiki multiplex tarama yolu ile yapılabilmektedir.
Diyelimki 1234 rakamlarını 4 adet display de göstereceğiz. Multiplex tarama mantığına göre işlem şu şekilde olmaktadır.
Hemen belirtelim bütün displaylerin segmentleri bir birine bağlıdır. Yani bütün a lar, bütün b ler ve bütün c ler bir birlerine bağlıdır. Dolayısıyla a segmentini aktif yaparsanız normal olarak 4 adet displaydeki bütün a segmentleri aktif olacaktır. Bunun önüne geçmek ve yalnızca bize lazım olan displayin a segmentini aktif yapabilmek için displaylerin ortak anot yada katodları da kontrol altında tutulur. Böylece sisteme 4 rakamı ile ilgili segment bilgisini verdikten sonra yalnızca ilk displayin ortak ucuna gerekli besleme bir transistörle anahtarlanarak verilir. Böylece, rakam o displayde belirir. Bu görüntü burada bir kaç ms ekranda tutulur ve display ortak ucundan kapatılır.
Daha sonra segment hattına 3 bilgisi verilir ve bu seferde sağdan 2. ci displayin ortak ucuna besleme verilir. Böylece sağdan 2. displayde 3 rakamı belirir ve bu görüntü de orada bir kaç ms ekranda tutularak görüntü kapatılır. Bu şekilde diğer displaylerde sırası ile 2 ve 1 bilgisi verilerek bu işlem tekrarlanır. Gözümüz aradaki kesintileri algılayamayacak ve görüntü olarak ve kesiksiz bir şekilde displaylerde 1234 rakamlarını görecektir.
Basit olarak prensibini verdiğimiz bu tarama sistemine ait örneklerimizi inceledikçe konuyu daha iyi kavrayacağınıza inanıyorum.
Bu sistemin uygulamasında en önemli husus gösterim işleminin sürekliliğidir. Süreklilik kesintiye uğrar ise ekranda kırpışmalar başlayacak ve buda izleyenlere rahatsızlık verecektir.
Bir örnek vermek gerekir ise, 4 adet display de gösterilen bilgilerin displaylerde kalma sürelerini 5 ms olarak ayarladığımızı düşünelim. En sondaki bilgi gösterildikten 5 ms sonra yeniden enbaştaki bilgi tekrar ekrana gelmelidir. Burada başka bir iş yaparak gösterimde gecikme yaratırsanız arada kesinti olacak ve displaydeki görüntü kırpışma yapacaktır. Bu nedenlerden dolayı bu sistemi en doğru kullanmanın yollarında birisi kesme kullanmaktır. Yine 4 adet display sürme örneğimize dönersek her 5 ms de bir kesme oluşturup sırası ile displaylere bilgileri verirsek sistem kesintisiz olarak gösterim yapacaktır. Arada programla ilgili diğer işlerde kolaylıkla yapılabilir.
Şimdi gelelim örneklerimize. İlk örneğimiz bir sayıcı devresi olacaktır.
Başlangıç için 9999 sayıcısı yapacağız. Sayıcımız bir anahtarla tetiklenecek ve her tetikte sayac değeri bir artırılacaktır. Sayac değerimizde yine kesme kullanılarak 4 adet displayde gösterilecektir.
‘**************************************************************** ‘* 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
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
Biraz da matrix display üzerinde çalışalım istiyorum. Bildiğiniz gibi sayılar için 7 segment displaylar kullanıyoruz. Ama iş harf göstermeye gelince bu displayler yetersiz kalıyorlar. Her ne kadar 7 segment display şeklinde hazırlanmış harf göstergeleride bulunsa bile bunların sürülme zorluğu insanları başka alternatifler bulmaya itmiş. Sonunda dot matrix yani nokta matriks sitemler bulunmuş. Kısaca açıklamak gerekir ise yatayda yan yana dizilmiş ledlerin birden fazla sıralar halinde yerleştirilmesine dot matrix led display adı veriliyor. Sonuç oalarak bu displayda hem sütünlar hemde satırlar bulunmaktadır.
Aşağıdaki resimde matrix displayin 2 değişik tipi incelenmektedir.
Matrix01.DSN
Matrix led sistemleri 2 şekilde çalıştırılırlar. Birinci metod da haf bilgisi satırlara verilir sütünlar teker teker taranır. Diğer metod da ise harf bilgisi sütundan verilir ve satırlar teker teker taranır.
Sonuçta elde edilen sonuç açısından aralarında fark yoktur ama led parlaklığı açısından daha kısa zamanda taranması nedeni ile satır taramanın daha uygun olduğu kullanıcılar tarafından belirtilmektedir. Yukarıdaki resimde her iki sisteme ait aynı bilginin matrix de nasıl oluşturulduğu gösterilmektedir. Bilgi sütundan verilirse o bilgi hangi satırda oluşturulacak ise yalnızca o satır aktif edilir. Bilgi satırdan verilirse hangi sütunda oluşturulacak ise o sütün aktif edilir. Şekilde kullandığımız örnekde satır aktivasyonu LOW ile sütün aktivasyonu ise HIGH ile yapılmaktadır.
Bu sistemde de yine display de bilgi oluşturulması multiplexx tarama sistemi ile benzer şekilde gözün algılama süresinden daha kısa sürede bilgi satırlara yada sütunlara verilerek tarama yaptırılıp her satır yada sütunun kısa süreli aralıklarla aktif edilerek yine göz aldatma yolu ile şekil displya da oluşturulur. Bu açıkladıklarımızı her iki sistemde örneklerle biraz daha geniş açıklayalım.
Bir terim kargaşasını önlemek için sistemi, tarama yapılacak bölüm ile anıyorum. Yani Satır taranacak (bilgi sütundan verilecek) ise sisteme satır tarama sistemi , sütun taranacak (bilgi satırdan verilecek) ise sisteme sütun tarama sistemi adını veriyorum. Böylece herkes karıştırmadan konuyu kolaylıkla analayacaktır sanırım.
Sütun Tarama Sistemi: Bu sistemde bilgi satırdan verilir ve sütün teker teker taranarak displayda bilgi oluşturulur.
Kolay anlaşılması açısından H harfinin bir display da oluşturulmasını bu yöntemle açıklamaya çalışacağım.
Resime bakarsanız 8 adet satır bilgisi ve 8 adet de sütun bilgisi bulunmaktadır. Şayet harfi satırdan oluşturacak isek her bir satır bilgisini matrix displaye verip en azından 1-2 ms o görüntyüyü ekranda (matrix led de) tutmamız sonra diğerini vermemiz gerekir. Şimdi sütun tarama sistemini incelediğimize göre kullanacağımız bilgiler Sütun bilgileri olacaktır. Satırın tamamı bir Porta bağlı olacak ve sütunda görülen bilgiler teker teker porta verilerek satır bilgisi oluşturulacaktır. Yukarıdaki örneğimize göre
1. Sütunda : 00000000 bilgisini oluşturacak şekilde bu bilgi porta verilir.
2. Sütunda : 01000010 bilgisini oluşturacak şekilde bu bilgi porta verilir.
3. Sütunda : 01000010 bilgisini oluşturacak şekilde bu bilgi porta verilir.
4. Sütunda : 01111110 bilgisini oluşturacak şekilde bu bilgi porta verilir.
5. Sütunda : 01000010 bilgisini oluşturacak şekilde bu bilgi porta verilir.
6. Sütunda : 01000010 bilgisini oluşturacak şekilde bu bilgi porta verilir.
7. Sütunda : 01000010 bilgisini oluşturacak şekilde bu bilgi porta verilir.
8. Sütunda : 00000000 bilgisini oluşturacak şekilde bu bilgi porta verilir.
İlk sütun bilgisi porta verildikten sonra yukarıdan ilk sütun aktif edilir. Böylece ilk sütun bilgisi matrixde görülcektir.
Sonra 2. sütun bilgisi porta verilir ve ikinci sütun aktif edilir. Böylece 2 sütun bilgisi matrix de görülür.
Sonra 3. sütun bilgisi porta verilir ve 3. sütun aktif edilir. Böylece 3. sütun bilgisi matrix de görülür.
Sonra 4. sütun bilgisi porta verilir ve 3. sütun aktif edilir. Böylece 3. sütun bilgisi matrix de görülür.
Bu şekilde sıra ile 8 adet sütun bilgisi (5 x 7 matrix sistemde 5 adet sütun bilgisi olacaktır) porta verilerek o sütun aktif edilir ve gözün de aldanması ile matrix le düzerinde H bilgisi izlenir.
Bunu bir programla deneyelim.
‘**************************************************************** ‘* 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
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
Ş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ı;
Şifre-Pass: 320volt.com
PICBasic Dersleri PIC Basic Pro ile PIC Programlama SON
Yayım tarihi: 2010/04/30 Etiketler: kılavuz ders, pic basic dersleri, PIC programlama, picbasic eğitim, picbasic pro
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.
Emeğinize sağlık. matix03.dsn devre elemanlarını verebilirmisiniz acaba. Burada kullanılan display ne tür 7segmentmi yoksa farklımı ?
Hocam ellerine sağlık çok makbule geçti. Allah razı olsun
teşekkürler
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.
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.
Hocam ellerine sağlık çok faydalı bilgiler.
Anlatımınız ve değindiğiniz konular çok gzel.
Allah razı olsun
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..
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
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
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 ?
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
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
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
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..
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
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
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
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.
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
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.
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
etepic.com