Kaskat bağlı 4094 problemi

Başlatan tunayk, 29 Eylül 2022, 23:08:00

JOKERAS

#15
@tunayk , Kodunuzdaki  i=i<<1; bu kısım ne işe yarıyor?

Eğer kod bu ise bu kodun çalıştığından eminmisiniz?
status0 'un değerini kim neye göre belirliyor?

Edit; Şu şekilde deneyin bir.
Portlarda 0x55AA datasını görmeniz gerekir.

#define Size 16

unsigned int status0 = 0x55AA;

for( İdx = 0; İdx < Size; ++İdx ) {

      Shift_reg_data = (status0 >> idx) & 0x01;
      Shift_Reg_Clock =1;
      delay_ms(1);
      Shift_Reg_Clock = 0
}
    Shift_Reg_Strobe = 1;
    delay_ms(1);
    Shift_Reg_Strobe = 0;

tunayk

Çalıştığına eminiz :)

Status pic işlemcinin özel bir register i olup, 0. Biti Carry flag'idir. Kodda gördüğünüz gibi sola kaydırma yapılarak i değişkeninin 15. Bitinin durumuna bakılıyor. Bu bir 1 ise kaydırma sonrası Carry 1 olur.

Ben de sizin gibi düşünüp döngü ile değil bit bit yazdım ancak nafile. :(

ete

4094 daha önce kullanmadığım bir entegre. Ama konu başlığını görünce merak ettim ve ufak bir deneme yaptım tabiiki simulasyonda.

Gördüğüm birinci önemli nokta ilk verdiğiniz DATA sıfır nolu çıkışa yerleşiyor. Sonraki 1 nolu çıkışa ve o şekilde devam edip gidiyor. Kullandığınız kod biçiminden verdiğiniz bilgilerin entegre çıkışına ters yerleşecek şekilde düzenlenmiş. Yapmanız gereken önce en yüksek değerlikli biti ilk olarak DATA girişine vermeniz ardında sırası ile giderek sıfır nolu bite kadar bunu yapmanız gerek.

Ben basic çalışırım. Ama vereceğim örnekleri kolayca C diline çevirebilirsiniz.

Öncelikle 15 den başlayıp 0'a ulaşan bir ters döngü kurmak gerekiyor. Azalan döngü diyelim. Gerçi terside olabilir ama döngü içinde ufak bir çıkarma işi yapmanız gerek.

SAYI=%1100110010001001
FOR X=15 to 0 Step-1
 SHIFT_REG_DATA=(SAYI>>X) & %01  '15 nolu biti aldık ve Data girişine verdik
 SHIFT_REG_CLK=1:PAUSEUS 5:SHIFT_REG_CLK=0
NEXT

Ben strobe pinini CLK girişine bağlayarak ayrıca STROBE kontrolü yapmadım. Bu şekilde de düzgün çalışıyor. Siz gerekirse STrobu da kontrol edebilirsiniz.

AYnı işi artan döngü ile yapmak istersek;
SAYI=%1100110010001001
FOR X=0 to 15 
 SHIFT_REG_DATA=(SAYI>>(15-X)) & %01  '15 nolu biti aldık ve Data girişine verdik
 SHIFT_REG_CLK=1:PAUSEUS 5:SHIFT_REG_CLK=0
NEXT
şeklinde yapmak gerekir.

0X55AA sayısı öyle bir sayıki tersten de verseniz düzden de verseniz aynı sonucu alıyorsunuz ve bu sizi şaşırtıyor. Şu sayıyı 0X55AB olarak deneyin farkı göreceksiniz.

Ortada aslında garip bir sorun var ve bunun kaynağı bütün bu anlattıklarımla alakalı olmayabilir. Sanki STROP kontrolü ile ilgili bir sorunmuş gibi gözüküyor. Bu nedenle CLK ile STROB girişlerini birleştirerek (veya Strob girişine direk HIGH uygulayarak)ve programdan strob kontrolünü kaldırarak bir deneyin derim.

Ete


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

dnacikaya

@tunayk hocam probleme yazılım veya donanım açısından bir çözüm bulabildinizmi?