Kategoriler
Son Konular
İnternetten Seçmeler
Rastgele Konu
» Basit Ton Kontrol Devre ...
» A.C 220 Volt ile Led Fl ...
» Film Böyle İzlenir! 7. ...
» ASELSAN Navigasyonlu Te ...
» Özel Veya (Exor) Lojik ...
» 12 Volt -> 15Volt,30 Vo ...
» Televizyonunuzun Kumand ...
» Pic Basic Pro ile Pic P ...
» İnsan Gücü ile Çalışan ...
» Pic16F628 ve DS1302 ile ...
» A.C 220 Volt ile Led Fl ...
» Film Böyle İzlenir! 7. ...
» ASELSAN Navigasyonlu Te ...
» Özel Veya (Exor) Lojik ...
» 12 Volt -> 15Volt,30 Vo ...
» Televizyonunuzun Kumand ...
» Pic Basic Pro ile Pic P ...
» İnsan Gücü ile Çalışan ...
» Pic16F628 ve DS1302 ile ...
Toplist ve Sayaç
|
|||
![]() Multiplex in kelime anlamı kısa bir zaman dilimi içinde birden fazla (çoklu) işlemlerin yerine getirilmesidir. Elektronikle alakasıda daha ziyade gözün görüntü algılama özelliğinin yanıltılarak kullanılan sistemler üzerinedir. Mutlaka başka alakalı konularda mevcut ama bizim konumuzun dışına çıkmaktadr. Örneğin tek kablodan karşılıklı haberleşme de bir multiplex çalışmadır . Multiplex çalışmada gözün görüntü algılama kabiliyetinden yararlandığımızı söylemiş idik. Insan gözü 16-20 ms den daha kısa sürede görünen nesneleri algılayamaz. Görüntünün algılanıp beyne yollanabilmesi ve o nesneyi görüyor olabilmeniz için nesne 20 ms den daha fazla gözünüzün önünde kalması gerekir. İşte bu özellik kullanılarak çoklu display tarama sistemleri en çok kullanılan yöntemlerden birisidir. 7 segment display sürmenin iki yolu bulunmaktadır. Ya, gösterilecek bilgiyi kendi tampon hafızasında saklayacak olan bir display sürücüsü kullanmak (7447 – 4511 ) gibi. Bunlara ayrıca 74595 gibi shift registerleri de dahil edebiliriz. Yada bir mikro kontrolcü yardımı ile multiplex tarama yaptırıp gerekli bilgiyi zaman paylaşımlı olarak ilgli displaylerde göstermektir. Display sürücüsü kullanarak bilgi gösterme işine kısaca değindikten sonra esas konumuz olan multiplex tarama sitemlerine geçeceğiz. 7 segment bir displayde 7 adet segment led bulunur. Bu ledlerin birer ortak ucu da bulunmaktadır. Ortak uç Anot ise display ortak anot, katod ise display ortak katod diye anılır. Ortak Anot sistemlerde ortak uçtan pozitif besleme (+) ve segmentlerede negatif besleme verilir (GND). Ortak katod displaylerde ise ortak katod ucuna GND , segmentlere ise pozitif besleme tatbik edilir. Voltaj seviyesi segmentin ihtiva ettiği led adedine göre değişir. Küçük displaylerde her segment de tek led yer alır ve genelde 1,6V-2,0V arasında bir voltaj tatbik edilir. Büyük displaylerde her segment de birden fazla led yer almaktadır. Bunun bir ksımı seri bir kısmı ise paralel bağlanmıştır. Voltaj seviyesi için displayin data sheetine bakmak en doğrusu olacaktır. Displayin a – b – c – d – e – f – g şeklinde adlandırılan segmentleri bulunmaktadır. ![]() Hangi harflerin hangi segmentlere denk geldiği yanda gösterilmektedir. Bu gösterimde display de A harfini göstermek için a+b+c+e+f+g segmentlerinin aktif hale getirilmesi gerektiği kolaylıkla anlaşılabilmektedir. Başka bir örnek vermek gerekir ise 2 rakamı için (f+a+b+g+e+d) segmentleri aktif hale getirilmelidir. Display sürücüleri tam anlamı ile bu işi yaparlar. Bilgi ABCD girişlerinden binary kodlanmış desimal olarak verilir. Sürücü gösterilecek harf yada rakama karşılık gelen segment çıkışlarını aktif ederek ilgili görüntüyü displayde oluşturur. 4 haneli bir sayıcımız olduğunu düşünür isek her bir hane için bir display sürücüsü kullanmamız gerekecektir. Halbuki aynı işi yalnızca 4 adet display ve 1 adet işlemci kullanarak yapabilmek mümkündür. Bu işlem tabiiki multiplex tarama yolu ile yapılabilmektedir. Diyelimki 1234 rakamlarını 4 adet display de göstereceğiz. Multiplex tarama mantığına göre işlem şu şekilde olmaktadır. Hemen belirtelim bütün displaylerin segmentleri bir birine bağlıdır. Yani bütün a lar, bütün b ler ve bütün c ler bir birlerine bağlıdır. Dolayısıyla a segmentini aktif yaparsanız normal olarak 4 adet displaydeki bütün a segmentleri aktif olacaktır. Bunun önüne geçmek ve yalnızca bize lazım olan displayin a segmentini aktif yapabilmek için displaylerin ortak anot yada katodları da kontrol altında tutulur. Böylece sisteme 4 rakamı ile ilgili segment bilgisini verdikten sonra yalnızca ilk displayin ortak ucuna gerekli besleme bir transistörle anahtarlanarak verilir. Böylece, rakam o displayde belirir. Bu görüntü burada bir kaç ms ekranda tutulur ve display ortak ucundan kapatılır. Daha sonra segment hattına 3 bilgisi verilir ve bu seferde sağdan 2. ci displayin ortak ucuna besleme verilir. Böylece sağdan 2. displayde 3 rakamı belirir ve bu görüntü de orada bir kaç ms ekranda tutularak görüntü kapatılır. Bu şekilde diğer displaylerde sırası ile 2 ve 1 bilgisi verilerek bu işlem tekrarlanır. Gözümüz aradaki kesintileri algılayamayacak ve görüntü olarak ve kesiksiz bir şekilde displaylerde 1234 rakamlarını görecektir. Basit olarak prensibini verdiğimiz bu tarama sistemine ait örneklerimizi inceledikçe konuyu daha iyi kavrayacağınıza inanıyorum. Bu sistemin uygulamasında en önemli husus gösterim işleminin sürekliliğidir. Süreklilik kesintiye uğrar ise ekranda kırpışmalar başlayacak ve buda izleyenlere rahatsızlık verecektir. Bir örnek vermek gerekir ise, 4 adet display de gösterilen bilgilerin displaylerde kalma sürelerini 5 ms olarak ayarladığımızı düşünelim. En sondaki bilgi gösterildikten 5 ms sonra yeniden enbaştaki bilgi tekrar ekrana gelmelidir. Burada başka bir iş yaparak gösterimde gecikme yaratırsanız arada kesinti olacak ve displaydeki görüntü kırpışma yapacaktır. Bu nedenlerden dolayı bu sistemi en doğru kullanmanın yollarında birisi kesme kullanmaktır. Yine 4 adet display sürme örneğimize dönersek her 5 ms de bir kesme oluşturup sırası ile displaylere bilgileri verirsek sistem kesintisiz olarak gösterim yapacaktır. Arada programla ilgili diğer işlerde kolaylıkla yapılabilir. Şimdi gelelim örneklerimize. İlk örneğimiz bir sayıcı devresi olacaktır. Başlangıç için 9999 sayıcısı yapacağız. Sayıcımız bir anahtarla tetiklenecek ve her tetikte sayac değeri bir artırılacaktır. Sayac değerimizde yine kesme kullanılarak 4 adet displayde gösterilecektir. PORTA=0:TRISA=%00010000 PORTB=0:TRISB=%10000000 CMCON=7 OPTION_REG=%00000100 ‘Pull up dirençleri AÇIK (PORTB.7 için) – Bölme oranı 1/32. ‘bölücü ayarlaması 000=1/2, 001=1/4 , 010=1/8 , 011=1/16 , 100=1/32 , 101=1/64 , 110=1/128, 111=1/256 INTCON=%00100000 ‘Kesmeler aktif ve TMR0 kesmesi aktif ‘—————————————————————– @ DEVICE pic16F628 ‘işlemci 16F628 @ DEVICE pic16F628, WDT_ON ‘Watch Dog timer açık @ DEVICE pic16F628, PWRT_ON ‘Power on timer açık @ DEVICE pic16F628, PROTECT_OFF ‘Kod Protek kapalı @ DEVICE pic16F628, MCLR_off ‘MCLR pini kullanılMIYOR. @ DEVICE pic16F628, INTRC_OSC_NOCLKOUT ‘Dahili osilatör kullanılacak ‘—————————————————————– DEFINE OSC 4 ‘————————————————————————- SAYAC var WORD ‘Sayılacak değerleri tutacak olan değişkenimiz SIRA var BYTE ‘display gösterim sırası BIRLER var BYTE ’sayımızın birler hanesi ONLAR VAR BYTE ’sayımızın onlar hanesi YUZLER VAR BYTE ’sayımızın yüzler hanesi BINLER VAR BYTE ’sayımızın binler hanesi I VAR BYTE ‘döngü değişkenimiz SAYI VAR BYTE‘çevirme değişkeni X VAR BYTE ‘ara değişken SYMBOL Disp0=PORTA.0 ‘ birler hanesi ortak uç SYMBOL Disp1=PORTA.1 ‘ onlar hensie ortak uç SYMBOL Disp2=PORTA.2 ‘ yüzler hanesi ortak uç SYMBOL Disp3=PORTA.3 ‘ binler hanesi ortak uç SYMBOL TUS =PORTB.7 ‘Buton SYMBOL RESET=PORTA.4 PAUSE 100 INTCON.7=1 ‘tüm kesmeler açık TMR0=99 ON INTERRUPT GoTo KESME ‘kesme oluşursa KESME adlı etikete git. BASLA: IF TUS=0 then GOSUB DELAY SAYAC=SAYAC+1 IF SAYAC>9999 then SAYAC=0 while tus=0:wend ENDIF IF RESET=0 then SAYAC=0 X=SAYAC DIG 0 :GOSUB AL:BIRLER=SAYI X=SAYAC DIG 1 :GOSUB AL:ONLAR=SAYI X=SAYAC DIG 2 :GOSUB AL:YUZLER=SAYI X=SAYAC DIG 3 :GOSUB AL:BINLER=SAYI GOTO BASLA AL: LOOKUP X,[63,6,91,79,102,109,125,7,127,111,99,57],SAYI :RETURN DELAY: for I=0 to 35000 PAUSEUS 5 Next RETURN DISABLE KESME: SIRA=SIRA+1:IF SIRA>3 then SIRA=0 ‘hangi hanenin ekrana verileceğini belirliyor IF SIRA=0 then ‘ilk hane yani birler hanesi ise DISP3=0 ‘önce bir önceki gösterime ait display kapatılıyor PORTB=BIRLER ‘Haneye ait bilgi porta (segmentlere) veriliyor DISP0=1 ‘Display açılıyor. ENDIF IF SIRA=1 THEN DISP0=0 PORTB=ONLAR DISP1=1 ENDIF IF SIRA=2 THEN DISP1=0 PORTB=YUZLER DISP2=1 ENDIF IF SIRA=3 THEN DISP2=0 PORTB=BINLER DISP3=1 ENDIF TMR0=99 ‘5 ms lik süreyi yaratacak olan TMR0 değeri registere yükleniyor. INTCON.2=0 ‘TMR0 Kesme bayrağı sıfırlanıyor RESUME ENABLE END ![]() Programa saydırılan sayının sıfırlanması için bir RESET butonuda ilave edilmiştir. Sizler bu programa (PORTA.6 ya) bir tuş daha ilave ederek sayılan değerin azaltılmasını sağlayabilirsiniz. Böylece sistem aşağı ve yukarı sayabilecek hala gelebilir. B portunda dahili pullup kullanılmış ancak PortA.4 pinine dışarıdan pullup direnci bağlanmıştır. Benzer bir sistem kullanarak saat devresi yapamaya çalışacağız. Önce biraz teorik bilgi verelim. Yapacağımız saat devresinde yine kesmeden yaralanarak hem bilgileri displaylere vereceğiz hemde saniye pulslarını elde edeceğiz. Bilindiği üzere 1 sn=1000 ms. Dir. Şayet alimizde 5 ms lik bir kesme süremiz var ise; 1000/5= 200 kesmede bir saniye sayacımızı bir artırırsak saniye sayacımızı elde etmiş olacağız. Ancak gerçekte bu sayı kesme kısmında kullandığımız komutların yarattığı gecikmeler nedeni ile biraz daha uzun olur. Bu nedenle kesme sayısında bir ayarlama yapacağız. Tabiiki sonucu gördükten sonra bu işlemi gerçekleştireceğiz. İşin temelinde her kesme oluştuğunda bir başka sayacı sn artırımı için kullanmamız gerekecektir. Bunun dışında normal saat işlemlerini yerine getireceğiz. Bu programda bazı teknikler kullandım. Onları açıklamak isterim. Birinci teknik ,saat ve dakika göstergelerinin arasında 2 adet led yerleştirdik ve bunları PortB.7 den sürüyoruz. Biliyorsunuz 1 sn=1000 ms dir. O halde ledleri ilk 500 ms de yanar hale getirmek sonraki 500 ms de ise sonük durumda tutmak güzel olur diye düşündüm. Böylece Led ler bir saniyenin yarısında yanık diğer yarısında ise sönük gözükeceklerdir. Bunu sağlama için yine Zaman sayacını kullandım. Bu sayacın 200 değerine ulaşması yaklaşık 1 sn idi. O halde zaman sayacı 100 den küçük ise ledler yanık, 100 den büyük ise ledler sönük olacaktır. Diğer bir teknik de saat ayarı esnasında işe görsellik katmak için kullanıldı. Sec tuşuna bastığımız zaman gerek sec tuşuna basıldığı anlaşılsın diye gerekse hangi konumda ayar yapıldığı belli olsun diye ayar yapılan kısımda bir flash imajı yaratmaya çalıştım. Bunu ayar yapılan displayleri yakıp söndürerek yapıyoruz elbette. Sec tuşuna ilk defa basılınca ayar sistemi devreye giriyor ve önce dakika kısmında ayar yapılıyor. Burada Artır tuşu dakika değerini artırıyor azalt tuşu ise dakika değerini azaltıyor. Programa bakarsanız orada Y=1-Y gibi bir komut kullandım. Bu komut Y değişkenini Toogle eden yani bir sıfır bir yapan komuttur. Y nin “0 “ yada “1” olması durumuna görede Z değişkeni konuma göre değer almaktadır. Sonuç olarak Z=0 ise display de gerçek değerler gözükmekte Z değişkeni sıfırdan büyük ise display kapatılmaktadır. Dolayısıyla bir açılıp bir kapatılması displayin Flash etmesini sağlamaktadır. Bu arada artır yada azalt tuşlarına basılması durumunda gerek dakika ve gerekse saat hanesinde değer değişimleri display kapalı iken yapılmakta ve ekrana bilgiler geldiğinde yeni değerler gösterilmektedir. Bu saat devresi ve programı simulasyonda işlemciye epeyce yükleme yaptığı için yavaş çalışmakta ve hassas bir ayar yapılamamaktadır. Bu nedenle gerçek devrede hassas saat ayarı için ZAMAN değişkeni değerleri ile oynanması gerekebilir. Programda bu değer 200 olarak alınmıştır. Ancak 195-205 arası değerler gerçek devrede denenerek uygun bir değer yakalanmalıdır. İşte Programımız; PORTA=0:TRISA=%11100000 PORTB=0:TRISB=%00000000 CMCON=7 OPTION_REG=%00000100 ‘Pull up dirençleri AÇIK (PORTB.7 için) – Bölme oranı 1/32. ‘bölücü ayarlaması 000=1/2, 001=1/4 , 010=1/8 , 011=1/16 , 100=1/32 , 101=1/64 , 110=1/128, 111=1/256 INTCON=%00100000 ‘Kesmeler aktif ve TMR0 kesmesi aktif ‘—————————————————————– @ DEVICE pic16F628 ‘işlemci 16F628 @ DEVICE pic16F628, WDT_ON ‘Watch Dog timer açık @ DEVICE pic16F628, PWRT_ON ‘Power on timer açık @ DEVICE pic16F628, PROTECT_OFF ‘Kod Protek kapalı @ DEVICE pic16F628, MCLR_off ‘MCLR pini kullanılMIYOR. @ DEVICE pic16F628, INTRC_OSC_NOCLKOUT ‘Dahili osilatör kullanılacak ‘—————————————————————– DEFINE OSC 4 ‘————————————————————————- ZAMAN VAR BYTE 60 ’saniye sayacı SIRA var BYTE 61 ‘display gösterim sırası SN VAR BYTE 62 DAK VAR BYTE 63 SAAT VAR BYTE 64 SAYI VAR BYTE ‘çevirme değişkeni X VAR BYTE ‘ara değişken BIRLER VAR BYTE ONLAR VAR BYTE YUZLER VAR BYTE BINLER VAR BYTE I VAR word ‘döngü değişkenimiz POZ VAR byte 75 Z var byte Y VAR BIT SYMBOL Disp0=PORTA.0 ‘ birler hanesi ortak uç SYMBOL Disp1=PORTA.1 ‘ onlar hensie ortak uç SYMBOL Disp2=PORTA.2 ‘ yüzler hanesi ortak uç SYMBOL Disp3=PORTA.3 ‘ binler hanesi ortak uç SYMBOL SEC =PORTA.7 SYMBOL ARTIR=PORTA.6 ‘Buton SYMBOL AZALT=PORTA.5 SYMBOL LED=PORTB.7 PAUSE 100 INTCON.7=1 ‘tüm kesmeler açık TMR0=99 ON INTERRUPT GoTo KESME ‘kesme oluşursa KESME adlı etikete git. DAK=15:saat=18 BASLA: IF SEC=0 then AYAR IF zaman4 then SIRA=0 IF SIRA=0 then Disp3=0 PORTB=(PORTB & 128 )+BIRLER ‘Ledlerin konumunu(PortB.7) bozmadan segment bilgisi DISP0=1 ‘PortB ye veriliyor. PortB & 128 led konumunu alıyor ENDIF ‘bu konuma + BIRLER eklenerek porta bilgi olarak yollanıyor. IF SIRA=1 THEN DISP0=0 PORTB=(PORTB & 128 )+ONLAR DISP1=1 ENDIF IF SIRA=2 THEN DISP1=0 PORTB=(PORTB & 128 )+YUZLER DISP2=1 ENDIF IF SIRA=3 THEN DISP2=0 PORTB=(PORTB & 128 )+BINLER DISP3=1 ENDIF ZAMAN=ZAMAN+1 IF ZAMAN=200 then zaman=0 SN=SN+1 IF SN=60 then SN=0 DAK=DAK+1 IF DAK=60 THEN DAK=0 SAAT=SAAT+1 IF SAAT=24 then SAAT=0 ENDIF ENDIF ENDIF TMR0=99 INTCON.2=0 ‘TMR0 Kesme bayrağı sıfırlanıyor RESUME ENABLE END Multi02.DSN ![]() Biraz da matrix display üzerinde çalışalım istiyorum. Bildiğiniz gibi sayılar için 7 segment displaylar kullanıyoruz. Ama iş harf göstermeye gelince bu displayler yetersiz kalıyorlar. Her ne kadar 7 segment display şeklinde hazırlanmış harf göstergeleride bulunsa bile bunların sürülme zorluğu insanları başka alternatifler bulmaya itmiş. Sonunda dot matrix yani nokta matriks sitemler bulunmuş. Kısaca açıklamak gerekir ise yatayda yan yana dizilmiş ledlerin birden fazla sıralar halinde yerleştirilmesine dot matrix led display adı veriliyor. Sonuç oalarak bu displayda hem sütünlar hemde satırlar bulunmaktadır. Aşağıdaki resimde matrix displayin 2 değişik tipi incelenmektedir. Matrix01.DSN ![]() Matrix led sistemleri 2 şekilde çalıştırılırlar. Birinci metod da haf bilgisi satırlara verilir sütünlar teker teker taranır. Diğer metod da ise harf bilgisi sütundan verilir ve satırlar teker teker taranır. Sonuçta elde edilen sonuç açısından aralarında fark yoktur ama led parlaklığı açısından daha kısa zamanda taranması nedeni ile satır taramanın daha uygun olduğu kullanıcılar tarafından belirtilmektedir. Yukarıdaki resimde her iki sisteme ait aynı bilginin matrix de nasıl oluşturulduğu gösterilmektedir. Bilgi sütundan verilirse o bilgi hangi satırda oluşturulacak ise yalnızca o satır aktif edilir. Bilgi satırdan verilirse hangi sütunda oluşturulacak ise o sütün aktif edilir. Şekilde kullandığımız örnekde satır aktivasyonu LOW ile sütün aktivasyonu ise HIGH ile yapılmaktadır. Bu sistemde de yine display de bilgi oluşturulması multiplexx tarama sistemi ile benzer şekilde gözün algılama süresinden daha kısa sürede bilgi satırlara yada sütunlara verilerek tarama yaptırılıp her satır yada sütunun kısa süreli aralıklarla aktif edilerek yine göz aldatma yolu ile şekil displya da oluşturulur. Bu açıkladıklarımızı her iki sistemde örneklerle biraz daha geniş açıklayalım. Bir terim kargaşasını önlemek için sistemi, tarama yapılacak bölüm ile anıyorum. Yani Satır taranacak (bilgi sütundan verilecek) ise sisteme satır tarama sistemi , sütun taranacak (bilgi satırdan verilecek) ise sisteme sütun tarama sistemi adını veriyorum. Böylece herkes karıştırmadan konuyu kolaylıkla analayacaktır sanırım. Sütun Tarama Sistemi: Bu sistemde bilgi satırdan verilir ve sütün teker teker taranarak displayda bilgi oluşturulur. Kolay anlaşılması açısından H harfinin bir display da oluşturulmasını bu yöntemle açıklamaya çalışacağım. ![]() Resime bakarsanız 8 adet satır bilgisi ve 8 adet de sütun bilgisi bulunmaktadır. Şayet harfi satırdan oluşturacak isek her bir satır bilgisini matrix displaye verip en azından 1-2 ms o görüntyüyü ekranda (matrix led de) tutmamız sonra diğerini vermemiz gerekir. Şimdi sütun tarama sistemini incelediğimize göre kullanacağımız bilgiler Sütun bilgileri olacaktır. Satırın tamamı bir Porta bağlı olacak ve sütunda görülen bilgiler teker teker porta verilerek satır bilgisi oluşturulacaktır. Yukarıdaki örneğimize göre 1. Sütunda : 00000000 bilgisini oluşturacak şekilde bu bilgi porta verilir. 2. Sütunda : 01000010 bilgisini oluşturacak şekilde bu bilgi porta verilir. 3. Sütunda : 01000010 bilgisini oluşturacak şekilde bu bilgi porta verilir. 4. Sütunda : 01111110 bilgisini oluşturacak şekilde bu bilgi porta verilir. 5. Sütunda : 01000010 bilgisini oluşturacak şekilde bu bilgi porta verilir. 6. Sütunda : 01000010 bilgisini oluşturacak şekilde bu bilgi porta verilir. 7. Sütunda : 01000010 bilgisini oluşturacak şekilde bu bilgi porta verilir. 8. Sütunda : 00000000 bilgisini oluşturacak şekilde bu bilgi porta verilir. İlk sütun bilgisi porta verildikten sonra yukarıdan ilk sütun aktif edilir. Böylece ilk sütun bilgisi matrixde görülcektir. Sonra 2. sütun bilgisi porta verilir ve ikinci sütun aktif edilir. Böylece 2 sütun bilgisi matrix de görülür. Sonra 3. sütun bilgisi porta verilir ve 3. sütun aktif edilir. Böylece 3. sütun bilgisi matrix de görülür. Sonra 4. sütun bilgisi porta verilir ve 3. sütun aktif edilir. Böylece 3. sütun bilgisi matrix de görülür. Bu şekilde sıra ile 8 adet sütun bilgisi (5 x 7 matrix sistemde 5 adet sütun bilgisi olacaktır) porta verilerek o sütun aktif edilir ve gözün de aldanması ile matrix le düzerinde H bilgisi izlenir. Bunu bir programla deneyelim. OPTION_REG=1 ADCON1=7 PORTA=0:TRISA=0 PORTB=0:TRISB=%00000000 PORTC=0:TRISC=%00000000 PORTD=0:TRISD=%00000000 PORTE=0:TRISE=%00000000 ‘—————————————————————– @ DEVICE PIC16F876, WDT_ON ‘Watch Dog timer @ DEVICE PIC16F876, PWRT_ON ‘Power on timer açık @ DEVICE PIC16F876, PROTECT_OFF ‘Kod Koruma kapalı @ DEVICE PIC16F876, BOD_OFF @ DEVICE PIC16F876, XT_OSC ‘—————————————————————– DEFINE OSC4 SUTUN VAR BYTE [8] I VAR BYTE X VAR BYTE ’satır bilgisi sütun taramalı sistem SUTUN[0]=%11111111 SUTUN[1]=%10000000 SUTUN[2]=%11110111 SUTUN[3]=%11110111 SUTUN[4]=%11110111 SUTUN[5]=%11110111 SUTUN[6]=%10000000 SUTUN[7]=%11111111 BASLA: X=128 FOR I=0 TO 7 PORTB=x PORTC=SUTUN[I] X=X/2 PAUSE 5 NEXT GOTO BASLA Programda harfi oluşturan satır bilgileri C portundan verilmiş ve B portundan da hangi sütun bilgisi verilmiş ise o sütuna High verilerek sütun aktif edilmiştir. Matrix02.DSN ![]() Aynı devreyi satır taramalı olarak da çalıştırabiliriz. Bu sefer harfe ait bilgilerin satır karşılıklarını kullanmamız gerekecek. OPTION_REG=1 ADCON1=7 PORTA=0:TRISA=0 PORTB=0:TRISB=%00000000 PORTC=0:TRISC=%00000000 PORTD=0:TRISD=%00000000 PORTE=0:TRISE=%00000000 ‘—————————————————————– @ DEVICE PIC16F876, WDT_ON ‘Watch Dog timer @ DEVICE PIC16F876, PWRT_ON ‘Power on timer açık @ DEVICE PIC16F876, PROTECT_OFF ‘Kod Koruma kapalı @ DEVICE PIC16F876, BOD_OFF @ DEVICE PIC16F876, XT_OSC ‘—————————————————————– DEFINE OSC4 SUTUN VAR BYTE [8] I VAR BYTE X VAR BYTE ’sütün bilgisi , satır taramalı sistem SUTUN[0]=%01000010 SUTUN[1]=%01000010 SUTUN[2]=%01000010 SUTUN[3]=%01111110 SUTUN[4]=%01000010 SUTUN[5]=%01000010 SUTUN[6]=%01000010 SUTUN[7]=%00000000 BASLA: X=1 FOR I=0 TO 7 PORTC=255-x PORTB=SUTUN[I] X=X*2 PAUSE 50 NEXT GOTO BASLA Bu programda Harf’e ait satır bilgileri PortB den (sütun portundan) sırası ile verilmekte ve satırlar sırası ile aktif edilerek (LOW vererek) harfin displayde oluşması sağlanmaktadır. Program aynı devre ile çalışabildiğinden ayrıca devre şeması verilmemiştir. Tabiiki bu işle ilgili olarak kullanılacak devreler tek displayden oluşmaz. Birden fazla display için port çoğullaması kullanmak gerekir. Port çoğullama işlemi genellikle tarama yapılan port için kullanılır. Dikkat ederseniz satır taramalı sistemde bilgi sütundan veriliyor idi. Bu duurmda birden fazla display için port çoğullamak için shift registerlerden yararlanmak en iyi yollardan birisidir. Buna örnek olarak 74HC595 entegresini verebiliriz. Bu entegrenin kullanımına ait örneklerimizi önceki derslerimizde vermiş idik. Şayet sütun taraması için port çoğullamak gerekir ise yine 74HC595 kullanılabilir. Ancak bunun yanısıra 74154 de iyi bir alternatif tir. Bu alternatifleri dahada çoğaltmak mümkündür. Diğer bir konuda led lerin yeterince parlaklığını sağlama konusudur. Bunun için matrix lerin ortak uçları (anot yada katod) için ULN2800 serisi entegrelerden birini kullanmak uygun olacaktır. Şimdi hem port çoğullamak hemde birden fazla display kullanabilmek için bir devre geliştireceğiz. Matrix displaylar ile çalışan bir saat yapmaya çalışacağız. Önce devremizi verelim; Devre satır taramalı bir sistemdir. Bilgi sütunlarda yer alan 74HC595 ler yardımı ile sütunlara verilir ve satır taranarak istene bilgi istenen sütunda oluşturulur. Sistemin pratik çalışma açıklaması böyledir. Matrix03.DSN ![]() Şimdi de programı verelim; @ DEVICE pic16F628 @ DEVICE pic16F628, WDT_ON @ DEVICE pic16F628, PWRT_ON @ DEVICE pic16F628, BOD_ON @ DEVICE pic16F628, PROTECT_OFF @ DEVICE pic16F628, LVP_OFF @ DEVICE pic16F628, CPD_OFF @ DEVICE pic16F628, MCLR_OFF @ DEVICE pic16F628, INTRC_OSC_NOCLKOUT CMCON=7 TRISA=%11100000 TRISB=%00000000 PORTA=0 PORTB=255 DEFINE OSC 4 ESN VAR BYTE SN VAR BYTE 60 DAK VAR BYTE 61 SAAT VAR BYTE 62 TEMP VAR BYTE 63 YIL VAR BYTE 64 AY VAR BYTE 65 GUN VAR BYTE 66 HAFGUN VAR BYTE 67 YERI VAR BYTE 68 VERI VAR BYTE 69 HARF VAR BYTE 70 SAYI VAR BYTE 71 I VAR BYTE72 X VAR BYTE 73 W VAR BYTE 74 FLASH VAR BYTE 75 SON VAR BYTE Z VAR BYTE SUT1 VAR BYTE[8]80 SUT2 VAR BYTE[8]88 SUT3 VAR BYTE[8]96 SUT4 VAR BYTE[8]104 SUT5 VAR BYTE[8]112 SUT6 VAR BYTE[8]120 SUT7 VAR BYTE[8]160 SUT8 VAR BYTE[8]168 SYMBOL CLK=PORTA.0 SYMBOL DTA=PORTA.1 SYMBOL STL=PORTA.2 SYMBOL SLC=PORTA.3 SYMBOL SDA=PORTA.4 SYMBOL SEC=PORTA.5 SYMBOL ART=PORTA.6 SYMBOL AZL=PORTA.7 harf=”:” gosub NOKTA BASLA: IF SEC=0 THEN AYAR ‘SEC tuşuna basılmış ise ayar kısmına git GOSUB ZAMANOKU ‘RTC den zamanı oku GOSUB SAATAL ‘Saat bilgisini displayde gösterecek hale çevir GOSUB DAKAL ‘Dakika bilgisini displayde gösterilecek hale çevir GOSUB SNAL ‘Saniye bilgisini displayde gösterilecek hale çevir. [/color] SON=29 ‘gösterim süresini tekrar yaparak ayarlıyor yaklaşık 1 sn den daha az sürmeli GOSUB GOSTER GOTO BASLA GOSTER: FLASH=0 FOR X= 1 TO SON IF X>(SON/2) THEN FLASH=Z ‘Z=3 , Z=24 , Z=192 FLASH SAYILARI FOR I=0 to 7 SAYI=SUT8[I] ‘…..SN bilgisi bir ler hanesi yüklendi IF FLASH.BIT7=1 THEN SAYI=0 GOSUB AKTAR ‘ birler hanesi matrix displayi süren 74HC595′e yüklendi SAYI=SUT7[I] ‘SN onlar hanesi yüklendi IF FLASH.BIT6=1 THEN SAYI=0 GOSUB AKTAR ‘Onlar hanesi bilgisi 74HC595′e yüklendi. SAYI=SUT6[I] ‘ “:” işareti bilgileri yüklendi IF X>=15 THEN SAYI=0 GOSUB AKTAR ‘işaret bilgileri 74HC595′e yüklendi SAYI=SUT5[I] ‘Dakika birler hanesi yüklendi IF FLASH.BIT4=1 THEN SAYI=0 GOSUB AKTAR ‘Dakika birler hanesi 74HC595′e yüklendi SAYI=SUT4[I] ‘Dakika onlar hanesi yüklendi IF FLASH.BIT3=1 THEN SAYI=0 GOSUB AKTAR ‘dakika onlar hanesi 74HC595′e yüklendi SAYI=SUT3[I] ‘ “:” işareti bilgileri yüklendi IF X=>15 THEN SAYI=0 GOSUB AKTAR ‘işaret bilgileri 74HC595′e yüklendi SAYI=SUT2[I] ’saat birler hanesi bilgileri yüklendi IF FLASH.BIT1=1 THEN SAYI=0 GOSUB AKTAR ’saat birler hanesi 74HC595′e yüklendi SAYI=SUT1[I] ’saat onlar hanesi yüklendi IF FLASH.BIT0=1 THEN SAYI=0 GOSUB AKTAR ’saat onlar hanesi 74HC595′e yüklendi STL=1:PAUSEUS 2:STL=0 PORTB.BIT0[I]=0 ’satır taraması yapılıyor önce ilgili bit LOW yapıldı PAUSEus 1600 ’sonra 1600 us beklendi PORTB.BIT0[I]=1 ’sonra ilgili bit HIGH yapıldı NEXT NEXT RETURN SAATAL: HARF=SAAT DIG 1 ’saat bilgisi onlar hanesini al GOSUB ARA ‘karekter koduna göre yer bilgisini al TEMP=YERI FOR I=0 to 7 YERI=TEMP+I GOSUB DATAAL ’sıra ile sütun bilgilerini oku ve değişkenlere yerleştir SUT1[I]=VERI NEXT HARF=SAAT DIG 0 ‘aynı işlemi birler hanesi içinde yap GOSUB ARA TEMP=YERI FOR I=0 to 7 YERI=TEMP+I GOSUB DATAAL SUT2[I]=VERI NEXT RETURN DAKAL: HARF=dak DIG 1 GOSUB ARA TEMP=YERI FOR I=0 to 7 YERI=TEMP+I GOSUB DATAAL SUT4[I]=VERI NEXT HARF=DAK DIG 0 GOSUB ARA TEMP=YERI FOR I=0 to 7 YERI=TEMP+I GOSUB DATAAL SUT5[I]=VERI NEXT RETURN SNAL: HARF=sn DIG 1 GOSUB ARA TEMP=YERI FOR I=0 to 7 YERI=TEMP+I GOSUB DATAAL SUT7[I]=VERI NEXT HARF=sn DIG 0 GOSUB ARA TEMP=YERI FOR I=0 to 7 YERI=TEMP+I GOSUB DATAAL SUT8[I]=VERI NEXT RETURN AKTAR: SHIFTOUT DTA,CLK,1,[SAYI] RETURN NOKTA: ‘ : işaretine ait sütun bilgilerini değişkenlere yerleştir. gosub ARA TEMP=YERI FOR I=0 to 7 YERI=TEMP+I GOSUB DATAAL SUT3[I]=VERI sut6[I]=VERI NEXT RETURN ARA: select case HARF case ” “:YERI=0:return case “.”:YERI=8:return CASE “/”:YERI=16:RETURN case 0:YERI=24:return case 1:YERI=32:return case 2:YERI=40:return case 3:YERI=48:return case 4:YERI=56:return case 5:YERI=64:return case 6:YERI=72:return case 7:YERI=80:return case 8:YERI=88:return case 9:YERI=96:return case “:”:YERI=104:return end select RETURN DATAAL: lookup YERI,[$00,$00,$00,$00,$00,$00,$00,$00_ ;boşluk ,$00,$00,$00,$00,$00,$18,$18,$00_ ;nokta ,$06,$0C,$18,$30,$60,$C0,$80,$00_ ;/ ,$3C,$66,$6E,$7E,$76,$66,$3C,$00_ ;0 ,$18,$38,$18,$18,$18,$18,$7E,$00_ ;1 ,$3C,$66,$06,$1E,$30,$66,$7E,$00_ ;2 ,$3C,$66,$06,$1C,$06,$66,$3C,$00_ ;3 ,$1C,$3C,$6C,$6C,$7E,$0C,$1E,$00_ ;4 ,$7E,$60,$7C,$06,$06,$66,$3C,$00_ ;5 ,$1C,$30,$60,$7C,$66,$66,$3C,$00_ ;6 ,$7E,$66,$06,$0C,$18,$18,$18,$00_ ;7 ,$3C,$66,$66,$3C,$66,$66,$3C,$00_ ;8 ,$3C,$66,$66,$3E,$06,$0C,$38,$00_ ;9 ,$00,$18,$18,$00,$00,$18,$18,$00],VERI ;: return ‘ ,$7C,$CE,$DE,$F6,$E6,$C6,$7C,$00_ ;0 ‘ ,$30,$70,$30,$30,$30,$30,$FC,$00_ ;1 ‘ ,$78,$CC,$0C,$38,$60,$CC,$FC,$00_ ;2 ‘ ,$78,$CC,$0C,$38,$0C,$CC,$78,$00_ ;3 ‘ ,$1C,$3C,$6C,$CC,$FE,$0C,$1E,$00_ ;4 ‘ ,$FC,$C0,$F8,$0C,$0C,$CC,$78,$00_ ;5 ‘ ,$38,$60,$C0,$F8,$CC,$CC,$78,$00_ ;6 ‘ ,$FC,$CC,$0C,$18,$30,$30,$30,$00_ ;7 ‘ ,$78,$CC,$CC,$78,$CC,$CC,$78,$00_ ;8 ‘ ,$78,$CC,$CC,$7C,$0C,$18,$70,$00_ ;9 ZAMANOKU: I2CRead SDA,SLC,$D0,$00,[SN,DAK,SAAT]‘,HAFGUN,GUN,AY,YIL,TEMP] temp=saat SAAT=(temp>>4) & $03 saat=saat*10+(temp & $0F) dak=((dak>>4) & $0F)*10+(dak & $0F) sn=((sn>>4) & $0F)*10+(sn & $0F) RETURN AYAR: Z=3:SON=16:SN=0 GOSUB SNAL gosub GOSTER WHILE SEC=0:WEND HOUR: IF SEC=0 THEN MINBIR IF ART=0 THEN SAAT=SAAT+1 IF SAAT=24 THEN SAAT=0 IF AZL=0 THEN SAAT=SAAT-1 IF SAAT=255 THEN SAAT=23 GOSUB SAATAL GOSUB GOSTER GOTO HOUR MINBIR: Z=24 GOSUB GOSTER WHILE SEC=0:WEND MINUTE: IF SEC=0 THEN KAYIT IF ART=0 THEN DAK=DAK+1 IF DAK=60 THEN DAK=0 IF AZL=0 THEN DAK=DAK-1 IF DAK=255 THEN DAK=59 GOSUB DAKAL GOSUB GOSTER GOTO MINUTE KAYIT: Z=0:sn=0 SAAT=(SAAT DIG 1)<<4+SAAT DIG 0 DAK =(DAK DIG 1)<<4+DAK DIG 0 I2CWrite SDA,SLC,$D0,$00,[SN,DAK,SAAT] PAUSE 10 WHILE SEC=0:WEND GOTO BASLA END Programla ilgili çok fazla şey açıklama gereği duymuyorum. Gerekli açıklamaları programın satırlarına yerleştirdim. Ancak satır taramasında taranan satır her bir displayde aynı anda aktif edildiğine dikkat ediniz. Yani bütün displaylerin satırları aynı anda taranmaktadır. Port dan 1 nolu satıra ait tarama bilgisi çıkınca bu bütün displaylere tatbik edilmektedir. Burada size enteresan gelebilecek bir diğer uygulamada satır taramasında kullanılan sistemdir. O konuda biraz açıklama vermekte yarar var. Önce bu işle ilgili 3 satırı tekrar yazalım . PORTB.BIT0[I]=0 ’satır taraması yapılıyor önce ilgili bit LOW yapıldı PAUSEus 1600 ’sonra 1600 us beklendi PORTB.BIT0[I]=1 ’sonra ilgili bit HIGH yapıldı PORTB.BIT0[I]=0 komutunda I=0 ise PORTB.0=0 olacak I=1 ise PORTB.1=0 olacak I=2 ise PORTB.2=0 olacak … I=7 ise PortB.7=0 olacaktır. Bu sistem bir bayt değişkenine ait bitleri bir döngü vasıtası ile değiştirme yada test edebilme imkanı sağlayan yöntemdir. Komutun kullanım şekli biraz enteresan PORTB.BIT0[I]=0 şeklinde verildiği zaman çoğu kişi sıfır nolu bitin değiştirileceğini düşünüyor. Ama öyle değil. Yalnızca yazım şekli bu şekildedir. Dolayısıyla harici bir değişkene bağlı bir byte bitini değiştirmek için yazım formatı; Degisken.BIT0[I] şeklindedir. Örnek vermek gerekir ise SAYI isimli değişkenin bitlerini sırası ile önce 0 sonra 1 yapalım. For I=0 to 7 SAYI.Bit0[I]=0 Pause 100 SAYI.Bit[I]=1 Next şeklinde yazıldımı istediğimizi kolaylıkla yapabiliriz. Son olarak birazda yazıların kaydırılması konusuna değineceğiz. Bir matriks display dizisine yerleştirilmiş olan görüntü yada yazıların bir yerden diğer yana doğru kaydırılması işi sütun yada satır tarama tekniklerine göre şöyle yapılmaktadır. Önce sütun tarama sistemine bakalım, displaylere verilen bilgileri sütun bazında önce değişkenlerine yerleştirdiğimizi ve sonra bunları sütun bilgisi olarak portun birinden çıkardığımızı biliyorsun. Önce 1. sütun bilgisini veriyor ve 1. sütunu aktif hale getiriyor idik. Sonra 2 sütun bilgisini port dan veriyor ve aynı anda da 2. sütunu aktif hale gitiryor ve bunu bütün sütunları displaylere verinceye kadar devam ettiriyor idik. Şimdi 1. sütunda yer alması gereken bilgiyi ben 2 sütundan verirsem ne olur? Devamında 2. sütunda yer alacak bilgiyi 3 sütunda versem ve bu işi son sütuna kadar birer kaydırarak versem ne olur. Tabiiki normalde yerinde gösterilen bilgi bu kaydırma sonucunda bir bit yana kaymış olacaktır. Bu işleme devam dersem gösterilecek bilgi bit bazında birer birer kayarak gösterilecektir. İşte yazı kaydırma devrelerinin prensibi budur. İşin tekniğinde sistemi açtığınız zaman kaydırılacak yazının ilk sütundan başlaması sağlanır. Diyelimki soldan sağa doğru kaydırma yapacağız. En soldaki sütun 1. sütun olsun. İlk gösterilecek sütun bilgisini bu sütuna verir ve sütunu aktif edersek orada yalnızca 1 sıra ledin yandığını göreceksiniz. Taramayı sonuna kadar yapıp bitirdikten sonra ilk sütunda gösterdiğimiz bilgiyi bu sefer 2. sütuna aktarıp 1. süyunada peşinden sırası gelen sütun bilgisini verirsek ve bu işleme bu şekilde devam edersek gösterilecek bilgi soldan girerek yavaş yavaş sağa doğru kayacak ve en sonunda da sağdan çıkacak ve gözden kaybolacaktır. İşin temeli bu şekildedir. Aşağıda daha önce vermiş olduğum Matrix01.bas programını H harfini kaydıracak şekilde düzenledim. Devrenin simulasyonu için yine aynı devre kullanılacaktır (Matrix02.Dsn). OPTION_REG=1 ADCON1=7 PORTA=0:TRISA=0 PORTB=0:TRISB=%00000000 PORTC=0:TRISC=%00000000 PORTD=0:TRISD=%00000000 PORTE=0:TRISE=%00000000 ‘—————————————————————– @ DEVICE PIC16F876, WDT_ON ‘Watch Dog timer @ DEVICE PIC16F876, PWRT_ON ‘Power on timer açık @ DEVICE PIC16F876, PROTECT_OFF ‘Kod Koruma kapalı @ DEVICE PIC16F876, BOD_OFF @ DEVICE PIC16F876, XT_OSC ‘—————————————————————– DEFINE OSC4 SUTUN VAR BYTE [8] temp var byte I VAR BYTE X VAR BYTE W VAR BYTE ’satır bilgisi sütun taramalı sistem SUTUN[0]=%11111111 SUTUN[1]=%10000000 SUTUN[2]=%11110111 SUTUN[3]=%11110111 SUTUN[4]=%11110111 SUTUN[5]=%11110111 SUTUN[6]=%10000000 SUTUN[7]=%11111111 BASLA: BIR: for w=0 to 10 ‘kaydırma hızı döngü sayısı artırılarak ayarlanıyor X=128 FOR I=0 TO 7 PORTB=x PORTC=SUTUN[I] X=X/2 PAUSE 2 NEXT next pause 1 KAYDIR: temp= sutun[0] for w=0 to 6 sutun[w]=SUTUN[W+1] next sutun[7]=temp GOTO BASLA END Şimdi bir adım daha ileri gidelim ve hem satır tarama hemde sütun tarama kaydırması yapalım. Bakalım sonuç ne olacak. Biliyorsunuz birinci tip kaydırmada harfi oluşturan satır bilgisi sütundan verildi ve satır taraması yapıldı,. İkinci tipte ise harfi oluşturan sütunlar satırdan verilecek ve sütun taraması yapılarak kaydırma yapılacaktır. Aradaki farkın görülebilmesi için program önce 1. tip kaydırmayı yapacak ve har soldan sağa doğru kayacaktır. Daha sonra program ikinci kademeye geçecek ve bu aşamada ise harf aşağıdan yukarı doğru kaymaya başlayacaktır. Bu mantık aynı zamanda yazı kaydırma sistemlerinde animasyon yaptırmak iamacı ilede kullanılmaktadır. OPTION_REG=1 ADCON1=7 PORTA=0:TRISA=0 PORTB=0:TRISB=%00000000 PORTC=0:TRISC=%00000000 PORTD=0:TRISD=%00000000 PORTE=0:TRISE=%00000000 ‘—————————————————————– @ DEVICE PIC16F876, WDT_ON ‘Watch Dog timer @ DEVICE PIC16F876, PWRT_ON ‘Power on timer açık @ DEVICE PIC16F876, PROTECT_OFF ‘Kod Koruma kapalı @ DEVICE PIC16F876, BOD_OFF @ DEVICE PIC16F876, XT_OSC ‘—————————————————————– DEFINE OSC4 SUTUN VAR BYTE [8]60 temp var byte I VAR BYTE X VAR BYTE W VAR BYTE M var byte BASLA: SUTUN[0]=%11111111 SUTUN[1]=%10000000 SUTUN[2]=%11110111 SUTUN[3]=%11110111 SUTUN[4]=%11110111 SUTUN[5]=%11110111 SUTUN[6]=%10000000 SUTUN[7]=%11111111 M=0 BIR: for w=0 to 10 ‘kaydırma hızı döngü sayısı artırılarak ayarlanıyor X=128 FOR I=0 TO 7 PORTB=x PORTC=SUTUN[I] X=X/2 PAUSE 3 NEXT next pause 1 gosub kaydIR M=M+1 IF M<15 then BIR SUTUN[0]=%01000010 SUTUN[1]=%01000010 SUTUN[2]=%01000010 SUTUN[3]=%01111110 SUTUN[4]=%01000010 SUTUN[5]=%01000010 SUTUN[6]=%01000010 SUTUN[7]=%00000000 M=0 IKINCI: FOR W=0 to 10 X=1 FOR I=0 TO 7 PORTC=255-x PORTB=SUTUN[I] X=X*2 PAUSE 3 NEXT NEXT PAUSE 1 GOSUB KAYDIR M=M+1 IF M<15 then IKINCI GOTO BASLA KAYDIR: temp= sutun[0] for w=0 to 6 sutun[w]=SUTUN[W+1] next sutun[7]=temp RETURN END Bu program içinde aynı devre şemasını kullanıyoruz. Matrix02.DSN HAZIRLAYAN : Erol Tahir Erdal (ETE) Dersler ile ilgili dosyalara buradan ulaşabilirsiniz... |
|||
Etiketler
Ürün Etiketi
Takvim
| Pt | Sa | Çr | Pr | Cu | Ct | Pz |
|---|---|---|---|---|---|---|
Arşiv
Etiketler
2n3055, 555, 7 segment display, aritmetik işlemler, ayarlı güç kaynağı, basic, baskı devre, bilgisayar, bobin, direnç, eeprom, ete, fm verici devresi, güç amfisi, hoparlör, kondansatör, led, logic gates, Lojik kapılar, osilaskop, osilatör, pc, pcb, pic, pic basic pro, pic basic pro dersleri, pic programlama, pic16f628, pic16f84a, power supply, pwm, teknoloji, ton kontrol, transformatör, transistör, tristör, triyak, türkçe datasheet, ölçü aleti
Tüm etiketler
Tüm etiketler












