avatar_ete

PIC Basic Ders-13 (Multiplex Çalışma)

Başlatan ete, 28 Ağustos 2011, 16:25:50

havyar

selam hocam
16*16 satir taramali kayan yazi ile yaklasik bir yildir kafa yoruyorum
bilgileri sutundan giriyorum
ornek
satirlari
portd ye baglayarak tariyorum
sorun yok
ama iki adet 74hc595 satirlari bagliyorum
sutunlar hem 74hc595bagli
sutunlarda sorun yok
ama
satirlari nasil bir kod ile surebilirim
ornek bir kod ile aciklarmisiniz lutfen
tesekur ederim.

ete

Satırları 2 adet 595 ile sürdüğünü söylemişsin ama bunları bağımsızmı çalıştırıyorsun yoksa seri bağlımı çalışıtırıyorsun.?
Seri bağlı olduklarını düşünürsek amaç nedir?
- 595-A nın bit0 pininden HIGH çıkarmak ve geri kalan 15 pini LOW da tutmak ve bu konumda 1 ms beklemek
-595-A nın bit1 pininden HIGH çıkarmak ve geri kalan 15 pini low da tutumak ve bu konumda 1 ms beklemek
-... bu şekilde toplam 16 adet pini sırası ile sürmek.
Bu işi iki şekilde yapmak mümkün. Birinci şekil,
Data giriş pinine HIGH verip 1 clk palsi ver ve peşine kilit pinine bir puls uygulamak. Böylece Bit0 da "1" bilgisi görülecektir. 1ms bekle
Data girişini LOW yap ve clk girişine 1 puls ve kilit pinine 1 puls uygula bu seferde bit1 de "1" bilgisi görülecektir.
Bu sistemi 16 defa yaparsan sonuçta bütün bitler sırası ile "1" olur ve sonuçta yeniden başa dönerek aynı şeyleri tekrarlarsın.

İkinci sistemde ise CIKIS isimli bir WORD değişkeni tanımla. Başlangıç değer 1 olsun.
Bunu shiftout komutu ile [CIKIS.byte0, CIKIS.Byte1] şeklinde 595 lere aktar. Böylece ilk bit HIGH olacaktır. 1ms bekle ve ardından;
CIKIS=CIKIS<<1 yap
IF CIKIS=0 THEN CIKIS=1   komutunuda ekle ki 16 defa yaptıktan sonra cıkıs değeri sıfır olacaktır.
hesaplanan Cıkış değerini yeniden 595 lere yukarıda söylediğim gibi ver. Olsun bitsin.
Bağımsız çalıştırmayı hiç anlatmıyorum çünki mantıklı bir kullanım şekli değil. Bağımsızdan şunu kast ediyorum. Her bir 595 in kendine ait data ve CLK girişi olursa bağımsız çalışabilirler.

Ete



havyar

selam
cikis var word
cikis=1
shiftout clk,dta,1,[cikis.byte0,cikisbyte1]
high strobe: pauses1: low strobe
cikis=cikis>>1
if cikis=0 then cikis=1
shiftout clk,dta,0,[cikis.byte1,cikisbyte0]
high strobe: pauses1: low strobe
cikis=cikis<<1
if cikis=0 then cikis=1
yaptigimda
yazilari gostermiyor
yani 16 satiri iki adet seri baglanmis 595 ile suruyorum

ete

Böyle bir komut tanımıyorum ben "pauses1"
bu komut ile nasıl derliyorsunda çıkış görmeye çalışıyorsun oda mechul.
diyelimki "pauses1" komutu PAUSEUS 1 olacak 1 mikro saniyelik bir gecikme yeterli gelmeyebilir. PAUSEUS 5 yap.

Shift komutunu birinde ,  shiftout clk,dta,1,[cikis.byte0,cikisbyte1]  (mode=1)
diğerinde , shiftout clk,dta,0,[cikis.byte0,cikisbyte1] şeklinde kullanmışsın. Bilerekmi yaptın bunu? cevap evetse neden mode 0 kullandın?

Ete

havyar

selam
595lerin birinde en yuksek bitten baslamasi digerinde en dusuk bitten boyle yaparsam calisir sandim
daha dogrusu
595leri yazilari 3 ecer atlayarak tariyor bu haliyle
ama  bir tane 595 kullandigim zaman yazilari gosteriyor
ikisini birden sirasiyla taratamadim
tariyor ama her 8*8 matrixte 3 sutun ledi gosteriyor yazilar tam gorun muyor

ete

#35
Bu şekilde bir yere varmamız mümkün gözükmüyor. Biraz sesli düşünmek gerekiyor sanırım.
Şimdi söyle bakalım 16x16 matrix'i nasıl sürüyorsun. Satır tarama yaptığımızı düşünelim. Bilgi sütundan verilecek o halde 16 bit için 2 adet sütundan bilgi verecek 595 kullanman gerekiyor bunlar seri bağlı olacaklar.
Satırları neyle sürüyorsun? yine 595 ilemi yoksa başka bir alternatifin mi vardır?

Senden cevap çıkmayınca bir açıklama bilgisi vermeye karar verdim. Umarım faydalı olur.

Şimdi varsayalım 2 adet 74HC595 'i sütundan bilgi vermek için kullanıyorsun 2 tanede satır taramak için kullanıyorsun.
Satırları taramak için satır 595'lerinin çıkışlarına ayrıca ULN2803 bağlanması gerekecektir.
Elimzde 16x16 lık matrise yazdıracağımız H harfi olduğunu düşünelim.
H harfi dataalrı şöyle olacaktır.
1. satır:%01110000 %00001110   
2. Satır:%01110000 %00001110
3. satır:%01110000 %00001110
4. satır:%01110000 %00001110
5. Satır:%01110000 %00001110
6. Satır:%01110000 %00001110
7. satır:%11111111 %11111111
8. satır:%11111111 %11111111

9. satır:%11111111 %11111111
10.satır:%01110000 %00001110
11.satır:%01110000 %00001110
12.satır:%01110000 %00001110
13.satır:%01110000 %00001110
14.satır:%01110000 %00001110
15.satır:%01110000 %00001110
16.satır:%01110000 %00001110

Şimdi yapılacak işi sıralayalım.
1. Satır-1 bilgisi (16 bit olarak) sütundanbilgi veren 74HC595'lere aktarılır

SHIFTOUT SUTUN_DTA,SUTUN_CLK,1,[Satır_1A,Satır_1B]:pulsout kilit,1

2. satırı aktif hale getiren shift registerlere 1. satır aktivasyon bilgisini verelim.
   BU bilgi şöyle olmalıdır %00000000 00000001

SHIFTOUT SATIR_DTA,SATIR_CLK,1,[0,1] bu sıralama ters geliyor ise 1,0 şeklinde verilmelidir.

3. yaklaşık 1 ms bekledikten sonra satır tekrar kapatılmalıdır.
   pause 1:SHIFTOUT SATIR_DTA,SATIR_CLK,1,[0,0]

4. Sonra bir sonraki satır için aynı işlemi yapmalıyız

SHIFTOUT SUTUN_DTA,SUTUN_CLK,1,[Satır_2A,Satır_2B]:pulsout kilit,1


5. satırı aktif hale getiren shift registerlere 2. satır aktivasyon bilgisini verelim.
   BU bilgi şöyle olmalıdır %00000000 00000010
   SHIFTOUT SATIR_DTA,SATIR_CLK,1,[0,2]

6. yaklaşık 1 ms bekledikten sonra satır tekrar kapatılmalıdır.
   pause 1:SHIFTOUT SATIR_DTA,SATIR_CLK,1,[0,0]

bu şekilde 16 satır bilgisi verilerek önce şekil ekranda oluşturulur.

Ekrana birden fazla karekter yazdırılacak ise her bir harf için 2 adet sütundan bilgi verme shift registeri olması gerekir. Bunları seri bağlarsanız bir seferde bütün boyda yer alan karekterlerin ilk satırlarına ait bilgi bir kerede ekrana verilir.
Aynı işlemi bütün karekterler için yaparsanız komple yazı ekrana yazdırılmış olacaktır.

İşin kaydırma kısmı ise diğerlerinden farklı değil. Yapılacak işlem 8 bit için değil 16 bit için yapılacaktır.
Yine bir örnek vermek gerekirse H harfini 1 bit sola kaydıralım.
Hep sesli düşünerek gittiğimiz için önce ilk satırı ele alalım. Ne vardı ilk satırda?
1. satır:%01110000 %00001110 bilgisi var idi. Bu bilgiyi 1 bit sola kaydırırsak ne hale gelecektir bu bilgi bakalım.
öncelikle %01110000 bilgisine bakalım. bir bit sola kayarsa bit7 boşa çıkacaktır. Boşa çıkan bu bit aslında en sağdaki karekterin 1. biti olarak oradan belirmesi gerekir. kafa karıştırmaması için onu şimdilik göz ardı ediyoruz.
ELimizdeki %01110000 bilgisi 1 bit sola kayınca %11100000 olacaktır. Dikkat edilirse burada bit0 'a yeni bir bit girmiş oldu ben "0" yazdım ama aslında buraya Satır-1B nin 7. biti gelmesi gerekir.
O halde satırımıza komple bilgi olarak bakarsak, %01110000 %00001110 şeklindeki bilgi ,
%11100000 %00011100 şeklini alacaktır.
Bunu döngü kurarak yapalım isterseniz,
FOR I=7 to 1 step -1
  satır_1A.0[I]=satır_1A.0[I-1]
next
Satır_1A.0=Satır_1B.7
For I=7 to 1 step -1
  Satır_1B.0[I]=Satır_1B.0[I-1]
Next

Şeklinde yapılır.
Diğerlerinide siz düşünün artık.

Ete


Evren Kılıç

merhaba erol abi ,
Öncelikle herkesin mübarek kurban bayramını kutlarım, herkese iyi bayramlar.
74595 konusunda daha sade anlatımı olan bir dersiniz var mı? ben iki örnek buldum birisi saat+termometre diğeri ise matris display ile yapılmış bir çalışma  bu ikisinden tam olarak anlayamadım. 4 dijitli bir devrede 1.dijit bilgisi nasıl gönderilir, ikinci dijit bilgisi nasıl gönderilir gibi. Örnegin 13. ders içinde taramalı yöntem ile yapılmış 4 dijit saydırma sistemi var bunu 74595 ile yapılışı nasıl olmalıdır şeklinde bir ders ilavesi yapabilir misiniz?

ete

74HC595 bir ders konusu olamayacak kadar üniversal bir shift registerdir. Türkçesi seri de paralele çevirici gibi düşünülebilir.
Bilgiyi aktarmak için bir CLK girişi bilginin verildiği bir DATA girişi ve kilit dediğimiz yollanmış bilginin çıkışa aktarılmasını sağlayan bir girişi vardır. Seri yoldan clk palsi eşliğinde yollanan bilgi içerdeki bir ön hafızaya depolanır ve orada bekler. Depolanmış bilginin çıkış pinlerinde görülmesi için Kilit bacağından bir puls gönderilmelidir. Basit çe 74HC595 bu şekilde çalışır.
Pic işlemcilerde bu seri iletişimi sağlayan SPI komutlarıdır ki bunlarda SHIFTOUT (verme) SHIFTIN (alma) şeklinde açıklanabilir.
74HC595 ler bir birlerine seri olarak bağlanabilir. Bu sayede display sürme işlemlerinde kullanılabilirler. 8 bitlik olan bu entegreler seri bağlanır ise 8 biti aşan bitler öndeki 8 biti itelerler yani diğer shift registere geçmeye zorlamış olurlar. Böylece bir yerden (ilk entegreden) yapılan DATA girişi ile birden fazla shift register sürülebilir. Temel mantık şöyledir. Daha iyi anlamak amacı ile 4 adet shift registeri seri bağladığımız varsayalım.
verilen ilk byte (8 bit) ilk data girişinin olduğu entegreye girer, İkinci byte verilince ilk entegredeki byte bir sonrakine aktarılır ve yeni yüklenen yine data girişi yapılanda yer alır. Bir byte daha verilir ise ilk giren byte 3 nolu entegreye aktarılır. Bir sonraki ikinci entegreye ve son yollanan yine data girişi yapılan entegrede yer alır. 4. cü byte da gönderilince bütün byte lar yer değiştirerek ilk yollanan en sondaki entegreye ve son yollanan da data girişi yapılan ilk entegrede olacak şekilde yerleşirler.
Tabiiki yollanan bilgilerin çıkışlara aktarılması için kilit pininden bir puls uygulanması gerekir. Bu puls ister en sonda 4 byte yollandıktan sonra isterse her byte yollandıktan sonra verilebilir.
Genel anlamda açıklama bu kadar yeterli bence. Ayrıca başka anlaşılmayan bir husus olursa sorarsın cevaplarız.

Ete


Evren Kılıç


Evren Kılıç

yani mantık bu şekilde olacak, bir süre evden uzak kaldığım için deneme yapamıyorum.

ete

SH_CP bacağı CLK dur. ST_CP ise Kilit bacağıdır. Yanlışlık olmasın.
Kilit 4 byte yollandıktan sonra da bir kere PULSOUT ST_CP,1 şeklinde bir puls verilerek yüklenen bilgiler çıkışlara aktarılır.
Bağlantı şeklin doru.
Ete

Evren Kılıç

#41
kodları bu şekilde düzenleyerek 595 i sürmeye çalıştım ama  displayleri tüm segmetleri yanıyor sonuç alamadım.
düzeltme 1: display CA olduğu için uln2003 kullanılması gerekiyor olabilir mi?
düzeltme 2: uln2003 ile de sonuç aynı


'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2009 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 04.11.2009                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
'32 BİT MAKİNALAR BU SİGORTA AYARLARINI KULLANSIN
@ DEVICE pic16F628A                      'işlemci 16F628                               
@ DEVICE pic16F628A, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_OFF            'MCLR pini kullanılMIYOR.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak

'64 BİT MAKİNALAR BU SİGORTA AYARINI KULLANSIN VE MPASM İLE DERLEME YAPSIN
'@ __config _BODEN_ON & _BOREN_ON & _CP_ON & _DATA_CP_ON & _PWRTE_ON & _WDT_ON & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT
'-----------------------------------------------------------------
DEFINE OSC 4
'-------------------------------------------------------------------------

PORTA=0:TRISA=%11110000     
PORTB=0:TRISB=%10000000   
CMCON=7
OPTION_REG=OPTION_REG=%00000010
'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

'-----------------------------------------------------------------


ZAMAN   VAR BYTE
SIRA    var BYTE
SAYI    VAR BYTE  'çevirme değişkeni
X       VAR BYTE  'ara değişken
BIRLER  VAR BYTE
ONLAR   VAR BYTE
YUZLER  VAR BYTE

I       VAR word  'döngü değişkenimiz
SAYAC   VAR WORD
POZ     VAR byte 75
Z       var byte
Y       VAR BIT

SYMBOL SH_CP=PORTA.0      ' SH_CP PİNİ
SYMBOL DS=PORTA.1      ' DATA PİNİ
SYMBOL ST_CP=PORTA.2      ' ST_CP PİNİ ÇIKIŞA GÖNDER

SYMBOL RST  =PORTB.7
SYMBOL ARTIR=PORTA.4       'Buton
SYMBOL AZALT=PORTA.5

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

BASLA: 
      IF ARTIR=0 THEN
        SAYAC=SAYAC+1
        IF SAYAC=1000 THEN SAYAC=999
        GOSUB BAK
        WHILE ARTIR=0:WEND
        GOSUB DELAY
      ENDIF
       
      IF AZALT=0 THEN
        SAYAC=SAYAC-1
        IF SAYAC=65535 THEN SAYAC=0
        GOSUB BAK
        WHILE AZALT=0:WEND
        GOSUB DELAY
      ENDIF
     
      IF RST=0 THEN
        SAYAC=0
        GOSUB BAK
        WHILE RST=0:WEND
        GOSUB DELAY
      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
         PAUSEUS 5
      Next
      RETURN
     
   
BAK:
      X=SAYAC DIG 0 :GOSUB AL:BIRLER=SAYI
      X=SAYAC DIG 1 :GOSUB AL:ONLAR=SAYI
      X=SAYAC DIG 2 :GOSUB AL:YUZLER=SAYI
     
      return   
                 

DISABLE
KESME:

     
        SHIFTOUT DS,ST_CP,1,[BIRLER]
        SHIFTOUT DS,ST_CP,1,[ONLAR]
        SHIFTOUT DS,ST_CP,1,[YUZLER]

        PULSOUT ST_CP,1  ' BİLGİYİ ÇIKIŞA GÖNDER

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

ete

74HC595 direk olarak Ortak katod display sürer. Sen ise Ortak ANot display sürmek istiyorsun. Bu durumda 595 ile display arasında ULN2003 kullanman gerekir.
ULN denilen entegre bildiğin sıralı NPN transistör gurubudur. Yani base ucuna HIGH uygularsan çıkıştan LOW alırsın. Ama HIGH alamazsın bu entegreden.
Bu durumda ULN kullandığın şeman doğru demektir.
Programda kesme kısmında CLK ve Data pnlerini kullanarak  SHIFTOUT komutunu uygulaman gerekir iken Kilit ve Data pinlerine bunu vermişsin. Burası yanlış. Yukarıda seni ikaz da etmiştim halbuki.
Kesme kısmı aşağıdaki şekilde olmalı.
DISABLE
KESME:       
        SHIFTOUT DS,SH_CP,1,[BIRLER,ONLAR,YUZLER]
        PULSOUT ST_CP,1  ' BİLGİYİ ÇIKIŞA GÖNDER                 
       TMR0=99
       INTCON.2=0        'TMR0 Kesme bayrağı sıfırlanıyor
       RESUME
       ENABLE

Aslında bu sistemde display taraması yapılmıyor. Bu nedenle kesme kullanmaya gerek de yok. Üstelik sürekli displaydeki bilgileri tarama yaparcasına yenilemeye de gerek yok.
BAK etiketi altına en sona,
        SHIFTOUT DS,SH_CP,1,[BIRLER,ONLAR,YUZLER]
        PULSOUT ST_CP,1  ' BİLGİYİ ÇIKIŞA GÖNDER   
yazarsan olur biter. Kesmeyi iptal et bu şekilde çalışır.
Shift register kayıt edilmiş bilgiyi değiştirinceye kadar saklar. Bu nedenle tarama gerekmiyor. Dolayısıyla kesme de gerekmiyor.
Son olarak segmentlerin hepsinin yanması yalnızca bir simulasyon kusurudur. Bunun sebebi ULN entegresinin HIGH çıkartamamasından kaynaklanıyor. Bu sorunu aşmak için ULN çıkışlarına birer PULLUP direnci bağlamalısın. Gerçek devrende buna gerek yok. Ama simulasyonda olacaktır.

Ete

Evren Kılıç

#43
Tamamdır teşekkürler yarın deneyeyim bilgi veririm.

Evren Kılıç

bugün denedim ama sonuç aynı dispalylerin birini pullup yatım ama buda cözüm olmadı.

Powered by EzPortal