16F877 port sayısını yetiremedim.

Başlatan akkoyunlu74, 14 Şubat 2011, 20:16:50

akkoyunlu74

shiftout komutu 8 bit üzerinden mi çalışır?
yani 32 led için göndereceğim 32 biti (örneğin hepsinin lojik 1 olması durumunda) (FFFFFFFF) hex bilgisini bu komutla işleyebilirmiyim? 

Mucit23

shiftout komutu bildiğim kadarıyla 16 bite kadar destekliyor. Ben genelde veriyi hep 8 bitlik parçalar halinder halinde gönderirim. Veri şhiftregister içerisinde kayarak ilerlediği için en sonda gözükmesi istediğin veriyi en başta yollamalısın
shitout dta,clk,1[veri1]
shitout dta,clk,1[veri2]
shitout dta,clk,1[veri3]
shitout dta,clk,1[veri4]
Veri yollama biçimi bu şekilde olabilir. Veya farklı koşullara bağlı olarak veriyi yollayabilirsin. Veri yolladıktan Sonra latch bacağına 1 puls uygulayarak veri çıkışa aktarılır.

akkoyunlu74

cevap için sağol,
4 tene 74595i bağladığımda, 32 adet veri 8'erli guruplar olarak entegrelerde [veri1], [veri2] diye sıralanacak latc 1 yapılınca 32'si birden çıkışta görünebilecek. Doğru mu anladım?

akkoyunlu74

#18
[IMG]http://img594.imageshack.us/img594/5185/adszkjo.jpg[/img]

Uploaded with ImageShack.us

arkadaşlar şekildeki bağlantıda tek lojik 1'in sırayla gezmesi gerekmezmi?
ETE hocamın programının aynısı sadece 2. 74595i ekledim ama ilk palsten sonra 2. 595 tede lojik 1 görünüp dolanmaya başlıyor?
1. 595'in q7' ni 2. 595'in datasına bağlamam yeterli olmalı , hata nerede , fikriniz varmı?

programda da bir miktar değişiklik gerekli evet ama daha ilk döngüde bunu yapmasını anlayamadım
program bu
Symbol CLK=PortA.0
SYMBOL DTA=PORTA.1
SYMBOL AKTAR=PORTA.2
BILGI VAR WORD
PORTA=0:bILGI=1
'-----------------------------------------------------------------
BASLA: IF BILGI=256 THEN BILGI=1
SHIFTOUT DTA,CLK,1,[BILGI] ''seri olarak bilgi 74HC595 in registerine yazılıyor
HiGH AKTAR ''yazılan bilgi çıkıslara aktarılıyor
PAUSEUS 5
LOW AKTAR ''BILGI ÇIKISA AKTARILDI
BILGI=BILGI*2 ''bir sonraki pin High olacak sekilde bilgi degeri artırıldı
PAUSE 500
GOTO BASLA

Mucit23

Alıntı yapılan: akkoyunlu74 - 17 Şubat 2011, 10:10:10
cevap için sağol,
4 tene 74595i bağladığımda, 32 adet veri 8'erli guruplar olarak entegrelerde [veri1], [veri2] diye sıralanacak latc 1 yapılınca 32'si birden çıkışta görünebilecek. Doğru mu anladım?

32 adet değişken kullanmıyacaksın. Sadece 4 adet 74595 olduğu için 4 adet veri değişkeni ile tüm 595 lere iletişim sağlayabilirsin. Mantığını anlaman için söylüyorum. Her değişken 8 bitten oluştuğunu unutma. ;)

  Ete hocanın programında her serferinde sadece 1 adet veri gönderilip çıkışa aktarıldığı için veri hemen 9 nolu ucdan çıkmaya başlıyor ve ikinci 595dede aynı bilgi ilk 595 inkinden 1 eksik olarak devam ediyor.

akkoyunlu74

Alıntı yapılan: mucit23 - 17 Şubat 2011, 14:01:35
Alıntı yapılan: akkoyunlu74 - 17 Şubat 2011, 10:10:10
cevap için sağol,
4 tene 74595i bağladığımda, 32 adet veri 8'erli guruplar olarak entegrelerde [veri1], [veri2] diye sıralanacak latc 1 yapılınca 32'si birden çıkışta görünebilecek. Doğru mu anladım?

32 adet değişken kullanmıyacaksın. Sadece 4 adet 74595 olduğu için 4 adet veri değişkeni ile tüm 595 lere iletişim sağlayabilirsin. Mantığını anlaman için söylüyorum. Her değişken 8 bitten oluştuğunu unutma. ;)

  Ete hocanın programında her serferinde sadece 1 adet veri gönderilip çıkışa aktarıldığı için veri hemen 9 nolu ucdan çıkmaya başlıyor ve ikinci 595dede aynı bilgi ilk 595 inkinden 1 eksik olarak devam ediyor.

Evet o kısım veri4'e kadar gidecek hepsini yazmadım, sağol
Ama ben bu program yazma işinde çok eksiğim olduğunu bilmeme rağmen mantık hatası yapmazdım. Şimdi mucit hocam siz programın bu şekilde çalışmasının olağan olduğunu görüyorsunuz, o zaman 595 in çalışmasını kavrayamamışım demekki.
her clock palsinde data giriçinden gönderilen bilgi ilk olarak sıfırıncı registere gidip



1 clk da datadan gönderilen ilk bayt 0. registere aktarılıp st_cp ucu ile
00000001 bilgisi çıkışa aktarılıyor.
2. clk da örnekte olduğu gibi 0 bilgisi gelecek ve 0. registere 0 bilgisi, 1. reğistere daha önce 0. registerde yer alan 1 bilgisi aktarılacak, st_cp ucu ili
00000010 bilgisi çıkışa aktarılacak ve süreç devam edecek. ben bu entegrenin çalışmasını böyle yorumladım. hata nerede?

akkoyunlu74

xnch hocama bu başlığı kayan yazı mesaş projeleri başlığı altına eklemesini rica etmiştim.
başta işi en basit şekliyle (kendime göre) yapmayı amaçladığımdan başlığı buraya açmıştım.
ilk mesajdaki resmi  şimdi çok komik buluyorum. aten arkadaşlarda dilleri döndüğünce yazmışlar.
Moderatör arkadaşlardan ricam, başlığı taşımaları.

Mucit23

Alıntı yapılan: akkoyunlu74 - 17 Şubat 2011, 18:09:41
Alıntı yapılan: mucit23 - 17 Şubat 2011, 14:01:35
Alıntı yapılan: akkoyunlu74 - 17 Şubat 2011, 10:10:10
cevap için sağol,
4 tene 74595i bağladığımda, 32 adet veri 8'erli guruplar olarak entegrelerde [veri1], [veri2] diye sıralanacak latc 1 yapılınca 32'si birden çıkışta görünebilecek. Doğru mu anladım?

32 adet değişken kullanmıyacaksın. Sadece 4 adet 74595 olduğu için 4 adet veri değişkeni ile tüm 595 lere iletişim sağlayabilirsin. Mantığını anlaman için söylüyorum. Her değişken 8 bitten oluştuğunu unutma. ;)

  Ete hocanın programında her serferinde sadece 1 adet veri gönderilip çıkışa aktarıldığı için veri hemen 9 nolu ucdan çıkmaya başlıyor ve ikinci 595dede aynı bilgi ilk 595 inkinden 1 eksik olarak devam ediyor.

Evet o kısım veri4'e kadar gidecek hepsini yazmadım, sağol
Ama ben bu program yazma işinde çok eksiğim olduğunu bilmeme rağmen mantık hatası yapmazdım. Şimdi mucit hocam siz programın bu şekilde çalışmasının olağan olduğunu görüyorsunuz, o zaman 595 in çalışmasını kavrayamamışım demekki.
her clock palsinde data giriçinden gönderilen bilgi ilk olarak sıfırıncı registere gidip



1 clk da datadan gönderilen ilk bayt 0. registere aktarılıp st_cp ucu ile
00000001 bilgisi çıkışa aktarılıyor.
2. clk da örnekte olduğu gibi 0 bilgisi gelecek ve 0. registere 0 bilgisi, 1. reğistere daha önce 0. registerde yer alan 1 bilgisi aktarılacak, st_cp ucu ili
00000010 bilgisi çıkışa aktarılacak ve süreç devam edecek. ben bu entegrenin çalışmasını böyle yorumladım. hata nerede?

Anlatamadım galiba;
Latch işlemini en son yapmalısın. Yani gönderilecek tüm veriyi gönderip en son latch işlemi yapmalısın. 1. clockda verinin 0. biti içeri alınır. 2. clockda 1. bit, 3.clockda 2. bit 4. clockda 3. bit, 5. clockda 4.bit, 6. clockda 5. bit, 7.clockda 6.bit,8. clockda 7. bit içeri alınır. Bu aşamalaya kadar 1 bytelık veri içeri alındı yani 74595 in 8 bitlik tüm çıkışlar gönderdiğimiz seri bilgi ile doldu. Bundan sonra 12 nolu uca bir pals uygularsask veriyi çıkışa aktarılmış olur ve register içeriği temizlenir. ama dışarıdaki veri kaybolmaz. Ha diyelim 12 nolu uca pals uygulamadık clock  vermeye devam ettik. Bu sefer register içerisindeki veri tümüyle her bir clock darbesinde kaymaya başlayacak ve ilk gönderilen datalar 9 nolu ucdan çıkıp diğer 74595 in 14 nolu ucundan içeri alınmaya başlayacak. Dediğim gibi veri 74595 içerisinde kayarak ilerlediği için ilk gönderdiğimiz veri en sonda olucak daima. Verini adeti önemli değil. kaç adet 74595 varsa okadar 8 bitlik veri gönderilecek tüm 74595lerin registerleri dolana kadar 12 nolu uca pals uygulanmayacak. Tüm veri gönderme işi bittiğinde yani 74595lerin tüm registerleri dolduktan sonra 12 nolu uca pals uygulanır ver tüm 74595lerin içeriği dışarı aktarılır.Registerler temizlenir. Bundan sonra yeni bir veri için tüm işlemler baştan başlar.

Hepsi bukadar.

omereliusuk

Alıntı yapılan: mucit23 - 17 Şubat 2011, 10:04:22
shiftout komutu bildiğim kadarıyla 16 bite kadar destekliyor. Ben genelde veriyi hep 8 bitlik parçalar halinder halinde gönderirim. Veri şhiftregister içerisinde kayarak ilerlediği için en sonda gözükmesi istediğin veriyi en başta yollamalısın
shitout dta,clk,1[veri1]
shitout dta,clk,1[veri2]
shitout dta,clk,1[veri3]
shitout dta,clk,1[veri4]
Veri yollama biçimi bu şekilde olabilir. Veya farklı koşullara bağlı olarak veriyi yollayabilirsin. Veri yolladıktan Sonra latch bacağına 1 puls uygulayarak veri çıkışa aktarılır.

shiftout dta,clk,1[veri0,veri1,veri2,veri3]'verileri sıralı olarak gönder sorun yok.
pulsout latch,1 'lacht pini ile kilitle ve aktar


veya bunu denemek lazım
dim veri[4] as byte
dim w as byte
dim i as byte
xxx:
i=3
for w=0 to 3  'burada da istediğin kadar veri gönder
shiftout dta,clk,1[veri]
i=i-1
next
pulsout latch,1
return
şeklinde de olabilir diye düşünüyorum ama olmayabilir de... şimdi  aklıma geldi.

akkoyunlu74

WORD Tipi Değişken;
TOPLAM    VAR   WORD   , burada TOPLAM isimli değişken çift baytlık yani 16 bitlik bir değişken olup alabileceği rakam değerleri 0 - 65535 arasında olacaktır.

Arkadaşlar ledleri kaydırma işlemini anladım aşağıdaki gibi hallettim

BASLA: IF BILGI=65535+1 THEN BILGI=1
SHIFTOUT DTA,CLK,1,[BILGI\16]


word değişkeninin alabileceği en büyüt değişken 65535 yani o kısma  65536 yazamıyorum .
onun yerine 65535+1 yazarak karşılığı denk getirdim. Peki siz nasıl çözerdiniz? Böyle bir yazılım mantığı varmıdır?

z

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

akkoyunlu74

bilgi=%00000000000000000000000000000011  burada 32 bit verisini tek satırda yazmam mümkünmü?
SHIFTOUT DTA,CLK,1,[BILGI\32] ''seri olarak bilgi 74HC595 in registerine yazılıyor
HiGH AKTAR ''yazılan bilgi çıkıslara aktarılıyor
PAUSEUS 5
LOW AKTAR ''BILGI ÇIKISA AKTARILDI
pause   500

bu programla 32 bitte çalışılmaz bilgi de word olarak tanımlanmış, bu programda 32 biti 2 ye bölmeden tek satırda yazmanın yolu varmıdır?

bunalmış hocam dediğiniz oldu, sanırım program kısalmışta( :)) oldu.

akkoyunlu74

#27
Symbol CLK=PortD.0
SYMBOL DTA=PORTD.1
SYMBOL AKTAR=PORTD.2
BILGI VAR word
PORTD=0:bILGI=1
'-----------------------------------------------------------------
BASLA: IF BILGI=0 THEN BILGI=1
SHIFTOUT DTA,CLK,1,[BILGI\16] ''seri olarak bilgi 74HC595 in registerine yazılıyor
HiGH AKTAR ''yazılan bilgi çıkıslara aktarılıyor
PAUSEUS 5
LOW AKTAR ''BILGI ÇIKISA AKTARILDI
BILGI=BILGI*2 ''bir sonraki pin High olacak sekilde bilgi degeri artırıldı
PAUSE 500
GOTO BASLA

Arkadaşlar yukardaki programa uygun devreyi breadboard a kurdum,ilk 8 bitten sonra süratle geçiş yapıyor.
Bağlantılarda hata yok,  breadboard bu tür devrelerde hata verirmi_ daha önce aynı sıkıntıyı yaşayanlar oldumu?



Tamam arkadaşlar, entegre 16f877    A harfi yok. ADCON1=7 yazmak gerekliydi , kusura bakmayın.

akkoyunlu74



arkadaşlar kastettiğim çift renkli dot matris bu idi

akkoyunlu74

reset uçları hariç eksik çizim varmı acaba,?
74595 elimde vardı deneme fırsatım oldu.
Ancak tpic595 kargoda deneyemedim ve baskı devreyi bugün bitirmek istiyorum. sizce semada eksik varmı?

[IMG]http://img407.imageshack.us/img407/3876/dotmatris3son.jpg[/img]

Uploaded with ImageShack.us