74HC595 ile Tarama Problemi

Başlatan kouakif2, 19 Haziran 2008, 10:04:26

kouakif2

74hc595 ile birden fazla tarama işlemini nasıl yapabilirim..
   İlk taramayla displaydeki herhangi bir segmenti yakabiliyorum,
ama diğer taramalarda segmentler aktif olmuyor,sadece ilk taratmamdaki
segment aktif kalıyor..
Daha açıkca anlatmam gerekirse "void x(unsigned char y)"(tarama fonk.)
diye bir fonksiyon tanımlıyorum..fonksiyonu ilk çağırışımda
diyelimki ilk olarak y'ye 5 vermiş olayım..5.sıradaki segment aktif oluyor..
Ama fonksiyonu diğer çağırmalarımda hiçbirşey olmuyor..Bunu nasıl düzeltebilirim??

x(5);aktif

x(3);               diğerleri pasif??
x(2);
...
...

M_B

Merhaba;

74HC595 leri oncelıkle nasıl bagladın.
ornek baglantı olarak söyle yapabilirsin.

birinci 595 in Q7' ucunu (9) diger 595 in DS ucuna (14) bagla
digerlerinide aynı sekılde devam et kac tane kullanacaksan.
Daha sonra
Hepsinin SH_CP ucunu(11) bir birine bagla
Hepsinin ST_CP ucunu(12) bir birine bagla
Hepsinin OE ucunu(13) GND ye bagla
Hepsinin MR ucunu(10) 5V  bagla

Umarım anlatabilmişimdir.
Kolay gelsın
M_B


ornek veri gonderme fonksıyonu:
Not: fonksıyon alıntıdır.
***************  595 verı gonderme fonksıyonu ***********
#define data1   PIN_B6 // DS ucu 14 nolu uç
#define clock1  PIN_B5 // SH_CP 11 nolu uç
#define latch1  PIN_B7 // ST_CP 12 nolu uç


void hc_595_gonder(unsigned char veri)
{
unsigned char j;

      for (j=0; j<8;j++)
      {   
         if((veri & 0x80)==0x80) { output_high(data1); }
           
         else { output_low(data1); }
           
         output_high(clock1);
         delay_us(1);
         output_low(clock1);
         veri<<=1;
      }
// veri gönderme sonu

   output_high(latch1);
   delay_us(1);
   output_low(latch1); 

}
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

kouakif2

http://rapidshare.com/files/123537907/xy595.JPG
Devre şeması yukarıdaki linkte...
Mesela  o devredeki 31,32,12,.. çıkışlarını istediğim zaman aktif
etmek istiyorum,ama teki aktif olduktan sonra diğerleri olmuyor..
x(31);diyorum herşey güzel..
Fakat x(32) veya diğerlerini hemen arkasına veya başka biryere koyunca,x(31) arkasından gelenler pasif oluyor..
Fonksiyonlara giriyor ama..aktif olmuyorlar.
Fonksiyonlara girdiğini nerden anladım diyorsanız,
x(31);   //aktif
x(32);   //pasif,çıkış vermiyorlar.
x(12);
p2_1=1;  //yapınca led aktif oluyor.. lede kadar geldiğine göre o
kısımları geçiyor demektir..Yoksa yanılıyor muyum?

picusta

x bilinmeyen oldugu için problemi çözmekte insan zorlaniyor.
x 'in ne oldugunu yazsan çözüm bulunabilir, sorun muhtemlen x'te.
Resimleri rapid yerine imageshack sitesine yüklersen daha güzle olur.

kouakif2

x fonksiyonun adıydı..

bu arada ben problemimi birazda olsa çözdüm.fakat sırayla tarama yaptırabiliyorum.
Yani istediğim çıkışa direk gidemiyorum..
Örnek verecek olursam..
x(31); diyip 31. çıkışı aktif edemiyorum..

x(1);diyerek birer birer aralıklarla çıkış verdirebiliyorum.
x(2);diyerek 2şer 2şer aralıklarla çıkış verdirebiliyorum..

bunuda konumuzun içindeki kodlarla yapabiliyorum..diğer arkadaşımızın açıkladığı..(yukarıdaki kod..)

Direk çıkış verdirmek için  ne yapabilirim.Önerilerinizi bekliyorum..
Şimdiden teşekkürler..

M_B

Alıntı yapılan: "kouakif2"http://rapidshare.com/files/123537907/xy595.JPG
Devre şeması yukarıdaki linkte...
Mesela  o devredeki 31,32,12,.. çıkışlarını istediğim zaman aktif
etmek istiyorum,ama teki aktif olduktan sonra diğerleri olmuyor..
x(31);diyorum herşey güzel..
Fakat x(32) veya diğerlerini hemen arkasına veya başka biryere koyunca,x(31) arkasından gelenler pasif oluyor..
Fonksiyonlara giriyor ama..aktif olmuyorlar.
Fonksiyonlara girdiğini nerden anladım diyorsanız,
x(31);   //aktif
x(32);   //pasif,çıkış vermiyorlar.
x(12);
p2_1=1;  //yapınca led aktif oluyor.. lede kadar geldiğine göre o
kısımları geçiyor demektir..Yoksa yanılıyor muyum?

merhaba anladıgım kadarıyla semandaki SHR4 kısmındaki
12 ; 39 ; 35 ; 32 ; 31 nolu pinlerin konumunu degistirmek ıstıyorsun.
bunu yapabılmen ıcın oncelıkle
Herzaman SHR1 SHR2  ve SHR3 bilgilerinide her zaman gondereceksin.
cunku entegremiz shift kaydırıcı oldugu ıcın.
İlk girilen deger her clock palsınde bır kayar


ornek olarak
SHR4 için  ıstedigin pinlerin lojık durumunu yaz  15 gibi
SHR1 için ilk onceki deger // bu kısımdakı veriler degişmedigi için.
SHR2 için ilk onceki deger // bu kısımdakı veriler degişmedigi için.
SHR3 için ilk onceki deger // bu kısımdakı veriler degişmedigi için.

void hc_595_gonder(SHR4)
void hc_595_gonder(SHR3)
void hc_595_gonder(SHR2)
void hc_595_gonder(SHR1)
sonunda
output_high(latch1);
  delay_us(1);
  output_low(latch1);
yaparak verilerin gozukmesını saglayacaksın.

not: bir oncekı mesajımda void hc_595_gonder(unsigned char veri )
fonksıyonu ıcındekı  
   output_high(latch1);
   delay_us(1);
   output_low(latch1);
cıkarman gerekıyor.
tum veriler gittikten sonra benım yukarda yazdıgım gıbı kullanman gerekiyor.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

kouakif2

Hocam çok sağolasın..birşey daha sorayım,umarım biliyorsunuzdur..
Programımı yazdım,çalışıyor..fakat ilk çalıştırmamda displayler devreye
girmiyor..devreyi tekrar açıp kapatıyorum..bu sefer çalışıyor..
Acaba bunun nedeni ilk seferde boşta çalışmasından mıdır?
Yazdığım fonksiyon aşağıda..acaba ondan mı kaynaklanıyor..
/*****************************************/
void veri_yolla(unsigned char veri)
{
unsigned char j;

     for (j=0; j<veri; j++)    
     {
     if(j==veri)
       {
        for(j = veri; j< 40; j++)//5 tane 595im var..ondan 40 yaptım..      
               {
           p1=p1 | D_DATA;
   }
      }    
        else
       {
          p1=p1 & (~D_DATA);
         
       }
                                p1=p1 | D_CLOCK;
       p1=p1 & (~D_CLOCK);
 
       veri<<1;
               
     }

  p1=p1 | D_REF;
  p1=p1 & (~D_REF);
}
/************************************************/

kouakif2

Merhaba Arkadaşlar,bu seferki sorum;

74hc595 ile bi display sürüyor olalım..Ama bu bir buton kontrolü ile olsun..
Butona bastığımızda display segmentleri sürülsün..Butona tekrar bastığımızda
sürme işlemi tekrar gerçekleşsin..Böyle bir yazılımı nasıl yapabiliriz..

Ben uğraştım ama yapamadım..Bir kere tüm segmentleri sürüyorum,ama butona 2.kez
basışımda sürme işlemi tekrar gerçekleşmiyor..Sadece bir kere sürme gerçekleşiyor..

Yardımcı olursanız sevinirim..Teşekkürler.