595 ile sorunum devam ediyor.

Başlatan wonder, 28 Ocak 2008, 14:03:10

wonder

595 in çalışmasını anlatan bişeyler buldum burda iki tane 595 benim istediğim gibi bağlanmış kodları aşağıda, burda 2 tane 8x8 matris sürmek için yazılmış birinci matris sağa sola kayıyor karaşimşek gibi, 2. matris binary olarak artıyor. benim anlamadığım
1. en alttaki pulse out latch nası çalışıyor mantığı ne,
2. ikinci 595 e geçiş birincinin dataout ucundan olduğunu biliyorum ama bunu kodlarla yazamıyorum nası oluyor anlayamadım,
ben devremde 4 tane 8x8 kullandım ve sondaki 2 taneye hiç geçiş yapamadım. benim istediğim sadece aşağıdaki tablodaki gibi taranma olması, tabloda 24 süyun var benimkinde 32 sütun, yardım ederseniz çok sevinirim.
(önceki 595 li kayan yazıda sutun kaydırma sorunu konuya cevap yazacaktım yanlışlıkla yeni konu açmışım)

000000000000000000000001
000000000000000000000010
000000000000000000000100
000000000000000000001000
000000000000000000010000
000000000000000000100000
000000000000000001000000
000000000000000010000000
000000000000000100000000
000000000000001000000000
000000000000010000000000
000000000000100000000000
000000000001000000000000
000000000010000000000000
000000000100000000000000
000000001000000000000000
000000010000000000000000
000000100000000000000000
000001000000000000000000
000010000000000000000000
000100000000000000000000
001000000000000000000000
010000000000000000000000
100000000000000000000000

...
pattern =%00000001
low latch
portb=%11111111  
counter=$00

ileri:
counter=counter+1
gosub cikis
pause 100
pattern=pattern<<1
if (pattern=%10000000) then geri
goto ileri

geri:
counter=counter+1
gosub cikis
pause 100
pattern=pattern>>1
if (pattern=%00000001) then ileri
goto geri

cikis
shiftout datap, clk, msbfirst,[counter]
shiftout datap, clk, msbfirst,[pattern]
pulsout  latch,5
return

Logan

@wonder, projenin devre şemasını da koysaydın iyi olurdu fakat az çok nasıl birşey olduğunu tahmin edebiliyorum. Oluşturmak istediğin sistem doğrultusunda 4 adet 74595 kullanmalı, bunların da bütün enable ve clock uçlarını paralel bağlamalısın. İlk entegrenin data girişini direk PIC'e, dataout çıkışını ise 2. entegrenin datain girişine bağlamalı ve böyle devam ederek bağlantıyı yapmalısın. Çalışma mantığına gelince, 4. entegrenin MSB bitinden başlayarak sırayla 32 biti göndermelisin. 32. bitide gönderdikten sonra enable sinyali vererek çıkışları aktif edersin ve böylece bilgiler çıkışa aktarılmış olur.
İmza.

wonder

Alıntı yapılan: "Logan"Çalışma mantığına gelince, 4. entegrenin MSB bitinden başlayarak sırayla 32 biti göndermelisin. 32. bitide gönderdikten sonra enable sinyali vererek çıkışları aktif edersin ve böylece bilgiler çıkışa aktarılmış olur.

hocam dediğin gibi 4 tane 595i bağlamıştım 595 ler 8x8 matris ledin sütunlarını seçiyor sadece. bana bunun kodlarını nası yazcağımı bi iki satır gösterirmisin yukarda benim yzdığım kodlar mevcut çalıştığı şekli uyguladım gördüm ama nası olduğunu anlayamadım. devre şeması aynen dediğin gibi önceki konumda linki vermiştim. yanlışlıkla o konuya cevap yazcam diye yeni konu açmışım şemayı yine koyayım.


wonder

32 veriyi nasıl göndereceğimi de merak ediyorum. 2 tane word değişkeni tanımlamam mı gerekiyor acaba.

Logan

Şimdi göndermek istediğimiz bilgi 0b00000000000000000000000000000001 olduğuna göre ( senin aşağıda yazmış olduğun bilgi 3 byte, 4 değil!!! ), ilk olarak bu bilginin 1. byte'ının lsb bitini yollayacağız. Bunun için içerisinde 4 adet register barındıran bir dizin oluşturmalıyız.
Alıntı Yap
unsigned char reg_buff[4];
Daha sonra bu dizinin registerlerini sırayla çağırıp 74595 lere yollamalıyız.

Alıntı Yap

  for (i=0;i<=3;i++) { send8([reg_buff); }
    enable=1; asm("nop"); enable=0;  // Bu gönderme işlemi bittikten sonra enable sinyali.


Bu da 595'lere yollayan alt program.

Alıntı Yap
void send8(unsigned char lcd_reg)
{
unsigned char a;

for (a=0;a<=7;a++) {
      if (lcd_reg&1) { sda_595=1; }
      else { sda_595=0; }
            scl_595=1; DelayUs(3); scl_595=0;
      lcd_reg=lcd_reg >> 1; }
}
Program burada bitiyor.  :)  
Umarım açıklayıcı olmuştur.
İmza.

wonder

Alıntı yapılan: "Logan"Şimdi göndermek istediğimiz bilgi 0b00000000000000000000000000000001 olduğuna göre ( senin aşağıda yazmış olduğun bilgi 3 byte, 4 değil!!! ), ilk olarak bu bilginin 1. byte'ının lsb bitini yollayacağız. Bunun için içerisinde 4 adet register barındıran bir dizin oluşturmalıyız.

Logan hocam çok teşekkür ederim ama ben pic c den anlamıyorum. gönderdiğiniz programa baktım bunu pbp ye nasıl dönüştürürüm diye ama yapamadım.  :(

ete

595 leri seri bağlayacaksın. İlk 595 in data bacağına picden giriş yapacak sonra 1. cinin Q'7 çıkışını ikincinin data bacağına bağlayacaksın. Bu şekilde bir birinin peşi sıra 595 leri bağlayabilirsin.
Hepsinin CLK bacağı ortak olacak , hepsinin Latch bacağıda ortak olacak.

Gelelim Latch ın nasıl çalıştığına. Entegre içinde buffer vardır. Senin data bacağından seri olarak verdiğin bilgi önce bufferda depolanır. Ancak Latch bacağını önce high sonra low yaparsan bufferdaki bilgi çıkış bacaklarına iletilir.
Şimdi senin yapacağın iş;
DATA=1    
SHIFTOUT DTA,CLK,1,[DATA]
     HIGH ST
     PAUSEus 100
     LOW ST
Her shiftout komutundan sonra latch'ı çalıştırırsan (HIGH ve LOW) bilgi çıkışa verilir.
Diyelimki 4 adet 595 seri bağlı.
En soldakinden data girdin ve en sağdakine bu bilgiyi iletmek istiyorsun.
Yalnızca 8 bitlik DATA=1 bilgisini tam 4 defa shiftout yaparsan DATA bilgisi 4. 595'e ulaşır. Latchı çalıştırırsan bu bilgi çıkışa verilir.
Hepsi bu kadar.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

wonder

ETE hocam çok teşekkür ederim bişeyler anlamaya başladım. aşağıdaki kodları yazdım. ama yine tarama şeklinde çalışmadı 1. ve 2. sütunlar aynı anda sağa doğru kaymaya başladı. 3. ve 4. ye ise hiç bilgi gitmiyor bir türlü

low latch
portb=%11111111  
a=%00000001

basla:
SHIFTOUT DaTAp,CLK,1,[a]
HIGH latch
PAUSE 1000
LOW latch
a=a<<1
if (a=%10000000) then ikincisutun
goto basla

ikincisutun:
a=%00000001
devam1:
SHIFTOUT DaTAp,CLK,1,[a]
SHIFTOUT DaTAp,CLK,1,[a]
HIGH latch
PAUSE 1000
LOW latch
a=a<<1
if (a=%10000000) then ucuncusutun
goto devam1

ucuncusutun:
a=%00000001
devam2:
SHIFTOUT DaTAp,CLK,1,[a]
SHIFTOUT DaTAp,CLK,1,[a]
SHIFTOUT DaTAp,CLK,1,[a]
HIGH latch
PAUSE 1000
LOW latch
a=a<<1
if (a=%10000000) then dorduncusutun
goto devam2

dorduncusutun:
a=%00000001
devam3:
SHIFTOUT DaTAp,CLK,1,[a]
SHIFTOUT DaTAp,CLK,1,[a]
SHIFTOUT DaTAp,CLK,1,[a]
SHIFTOUT DaTAp,CLK,1,[a]
HIGH latch
PAUSE 1000
LOW latch
a=a<<1
if (a=%10000000) then basla
goto devam3

ete

@wonder,
Birde aşağıdakileri dene bakalım.

PORTA=0:TRISA=0
PORTB=0:TRISB=0

@ DEVICE pic16F628A
@ DEVICE pic16F628A, WDT_off
@ DEVICE pic16F628A, PWRT_On
@ DEVICE pic16F628A, PROTECT_OFF
@ DEVICE pic16F628A, MCLR_off
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT

cmcon=7
symbol latch=portA.2
SYMBOL DaTAp=PortA.1
Symbol CLK=PORTA.0
a  var word
b  var word
c  var word
low latch
portb=%11111111
a=%00000001
b=0
c=0
basla:         

        SHIFTOUT DaTAp,CLK,1,[c.byte0]
        SHIFTOUT DaTAp,CLK,1,[b.byte0]
        SHIFTOUT DaTAp,CLK,1,[a.byte0]
        HIGH latch
        PAUSE 500
        LOW latch
        a=a<<1
        b=b<<1
        c=c<<1
        if a=256 then b=1
         if b=256 then c=1
         if c=256 then
          a=1:b=0:c=0
         endif 
        goto basla
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

wonder

Alıntı yapılan: "ete"@wonder,
Birde aşağıdakileri dene bakalım.

ETE hocam allah senden razı olsun, d için bi tanımlamayı da ekledim tam istediğim gibi oldu. baştan sona kadar tarıyor şimdi. çok teşekkür ederim.
bu kodlarla ilgili bi sorum olacak. değişkenleri word değilde byte tanımlayınca shiftout komutunun değişken yazılan kısmında byte  yazdığınız yerde hata veriyor. birde lsb yada msbfirst olarak verilen kısma 1 yazmak neyi değiştiriyor. zamanınız varsa o kısmı anlatmanız mümkümü acaba. tam çözemedim orayı.

ete

İşi kısa yoldan halletmek için word kullandım. Çünki 128 değerini sola doğrı 1 kere shift yaparsanız rakam 256 olur. Halbuki byte değişkeni 255 den büyük değer alamaz. Ayrıca ikinci 595'e 1 değerini birinci 256 olunca göndermek gerekiyor. Bu nedenle word kullanmıştım. Ama illaki byte tipi değişkenle yapacağım dersen aşağıdaki kodu dene;
PORTA=0:TRISA=0
PORTB=0:TRISB=0

@ DEVICE pic16F628A
@ DEVICE pic16F628A, WDT_off
@ DEVICE pic16F628A, PWRT_On
@ DEVICE pic16F628A, PROTECT_OFF
@ DEVICE pic16F628A, MCLR_off
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT

cmcon=7
symbol latch=portA.2
SYMBOL DaTAp=PortA.1
Symbol CLK=PORTA.0
a  var byte
b  var byte
c  var byte
low latch
portb=%11111111
a=%00000001
b=0
c=0
basla: 
        
        SHIFTOUT DaTAp,CLK,1,[c]

        SHIFTOUT DaTAp,CLK,1,[b]

        SHIFTOUT DaTAp,CLK,1,[a]

        HIGH latch
        PAUSE 500
        LOW latch
        
        if c>0 then
          c=c<<1
          if c=0 then 
            a=1:goto basla
          endif
        endif
        
        if b>0 then   
        b=b<<1
        if b=0 then c=1
        endif 
               
        if a>0 then
           a=a<<1
          if a=0 then b=1 
        endif
        goto basla

LSB düşük değerlikli bit (yani bit0) MSB ise büyük değerlikli bit yani bit7 dir.  LSB first demek önce bilgi lsb den başlanarak verilecek demektir. MSB first ise bilgi MSB den başlanarak verilecek demektir. Senin MSB first kullanman gerek ve bunu yapan değerde 1 dir. Buraya 1 yerine sıfır yazarsan LSB first yapmış olacaksın.

Yazılan rakamların açıklamaları şöyledir;

0=  LSBFIRST,  Shift data out düşük bit önce ve Clock low da kalır.

1= MSBFIRST,  Shift data out yüksek bit önce ve Clock low da kalır.

 4= Shift data out düşük bit önce ve Clock high da kalır.

5= Shift data out yüksek bir önce ve Clock high da kalır.

Kolay Gelsin
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

wonder

Tekrar teşekkür ederim ETE hocam, şimdi daha iyi anladım. hep istediğim kayan yazı saat ve dereceyi yapmaya çok yaklaştım.