74HC595 KULLANIMI YARDIM

Başlatan designer.21, 06 Mayıs 2020, 13:02:07

designer.21

@ DEVICE PIC16F628A
@ DEVICE PIC16F628A, WDT_ON
@ DEVICE PIC16F628A, PWRT_ON
@ DEVICE PIC16F628A, BOD_ON
@ DEVICE PIC16F628A, PROTECT_OFF
@ DEVICE PIC16F628A, LVP_OFF
@ DEVICE PIC16F628A, CPD_OFF
@ DEVICE PIC16F628A, INTRC_OSC_NOCLKOUT
'---------------------------------------------

DEFINE OSC 4  
TRISA=%00000000
TRISB=0

CMCON=7

YAN var byte
LED VAR WORD


symbol CLK=PORTA.0
SYMBOL DTA=PORTA.1
SYMBOL KIL=PORTA.2

pause 300

clear
YAN=0
BASLA:

LED=LED ^ (DCD YAN)

shiftout DTA,CLK,1,[Led.byte1,led.byte0]:pulsout KIL,1

pause 500
yan=yan+1
if yan=12 then 
  yan=0
  led=0
endif  
goto basla

Forumda 74HC595 sayıcı ile ilgili Ete Hocamın bir projesi var. bu projeye ilave birkaç tane daha 595 eklemek istiyorum. sormak istediğim şu; bir adet 16f628A ile en fazla kaç adet 595 kullanabilirim. mesela Ete hocamın bu projesine bir tane daha eklemek istedim ama bu konularla ilgili kaynak karışıklığı var.

mesela rica etsem bu projede bulunan aşağıdaki satırları açıklayabilir misiniz. üçüncü veya daha fazla sayıcı eklemek bu satırlarla mı bağlantılı

LED=LED ^ (DCD YAN)

shiftout DTA,CLK,1,[Led.byte1,led.byte0]:pulsout KIL,1

designer.21

resimdeki devreye uyarlamak istiyorum ama çıkamadım işin içinden


ete

#2
SHift Registerler bir birlerine seri olarak bağlanabilirler. Bunu yapmak için clk girişi ve KILIT (aktarma) girişleri hepsine ortak bağlanır. Data girişi yalnızca ilk baştakine yapılır ve seri hatta yer alanlardan ilkinin Q' çıkışı bir sonrakinin data girişine bağlanır. Bu şekilde kaç tane isterseniz seri bağlanabilir. Ancak unutmayın seri bağlanan her bir 595 programda bir veri yüklenmesine gerek duyacaktır. Bu nedenle mantıklı olarak 6-7 taneye kadar bağlayabilirsiniz.
Bunları sürme şekline gelince, diyelimki 4 adet 595 seri bağlı . Bu durumda her seferinde 4 byte bunlara göndermeniz gerekir.
SHIFTOUT DTA,CLK,1,[Led1,Led2,led3,led4]:pulsout KIL,1 şeklindeki kullanım doğrudur.
Sisteme ilke olarak verilen Led1 byte değeri en sondaki 595 de yer alacaktır.
Bu açıklamaya göre yaparsın artık herhalde.

Gözümden kaçmış bir soruyada cevap vereyim bu arada,
LED=LED ^ (DCD YAN)
komutunda LED değişken değeri ile YAN isimli değişken değeri XOR yapılmaktadır. Bir nevi bit bazında Toggle işlemi gibi düşünebilirsiniz.
LED=%10010011 olsun
YAN= olsun
LED=LED ^ YAN= %10010011 XOR %00001100 = %10011111 şeklinde döner.

Aslında örnekte bir de DCD komutu yer alıyor. Bu bir byte değişkeninde hangi bit'in set edileceğini ayarlar. Mesela A=DCD 3  denildiğinde A=%00001000  eşitliğinde görüleceği üzere 3 nolu biti set eder. BU 8 led bağlı bir sistemde hangi ledin yakılacağını kolaylıkla ayarlayabilir.  YANACAK=5 PORTB=DCD YANACAK  derseniz  PORTB=%00100000 şeklini alır. Bunu XOR ile yaparsanız o bit Toggle çalışır. PORTB=PORTB ^ DCD YANACAK  şeklindeki komut PORTB nin değerini alıp yanacak karşılığı olan 5 nolu biti XOR yapar. Yani 5 nolu bit 1 ise onu sıfır yapar yada o bit sıfır ise 1 yapar.

Lojik XOR tablosuna bakacak olursanız sistem aşağıdaki eşitliklere göre çalışmaktadır.
1 XOR 0=1
0 XOR 1=1
1 XOR 1=0
0 XOR 0=0
Aynı komutu yeniden verecek olursanız yani LED=%10011111 XOR %00001100 =%10010011 şeklinde değer eski haline dönecektir.


Ete

designer.21

Teşekkür ederim Hocam çok sağolun, kurcalayayım biraz hakkından gelirim inşallah : )

designer.21

#4
Ete Hocam, çok uğraştım çabaladım ama yine çıkamadım işin içinden. bahsettiğiniz her seferinde 4 byte göndermek gerek nasıl olur bulamadım. baktım olacak gibi değil ben de 74hc595'in çalışma mantığından yola çıkarak aşağıdaki kodlarla devreyi çalıştırdım.
kabul ediyorum kodlar basit abes ve sıradan : ) ama elimden bu geldi.

devrenin, tam olarak bu şekil çalışmasını istiyordum. proteusta çalışıyor ama devrede nasıl olacak çok merak ediyorum. entegre siparişim gelir gelmez hazırlyacam


@ __config _CP_OFF & _PWRTE_ON & _WDT_ON & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT

DEFINE OSC 4
OPTION_REG.7=0  
TRISA=%00000000
TRISB=%00000001

CMCON=7

I VAR BYTE
SAY VAR BYTE

symbol TIK1=PORTA.0
SYMBOL CTRL=PORTA.1
SYMBOL TIK2=PORTA.2



pause 200

BASLA:
      IF PORTB.0=0 THEN GIT
      GOTO BASLA
      
GIT:

                FOR SAY=0 TO 4

                        For I=0 to 19
                            KONTROL:
                                HIGH CTRL
                              
                            BUTON1:
                                HIGH TIK1
                                PAUSE 20
                                LOW TIK1
                                
                            BUTON2:
                                HIGH TIK2
                                PAUSE 20
                                LOW TIK2
                        Next I 
                        
                        
                        For I=0 to 19
                            XKONTROL:
                                LOW CTRL
                              
                            XBUTON1:
                                HIGH TIK1
                                PAUSE 20
                                LOW TIK1
                                
                            XBUTON2:
                                HIGH TIK2
                                PAUSE 20
                                LOW TIK2
                        Next I
                    
                NEXT SAY
                
                  For I=0 to 32
                            YKONTROL:
                                LOW CTRL
                              
                            YBUTON1:
                                HIGH TIK1
                                PAUSE 20
                                LOW TIK1
                                
                            YBUTON2:
                                HIGH TIK2
                                PAUSE 20
                                LOW TIK2
                        Next I        
    

GOTO Basla
  
END[attach id=7306]74HC595.rar[/attach]

designer.21

bu arada yukarıya dosya ekledim. görünüyor umarım.

ete

Aslında uyguladığın sistem kaydırma işine daha uygun ama tek yönde.
Her neyse aşağıdaki programı bir dene bakalım. Mantığını anlayabilecekmisin.

Ete

 @__config _CP_OFF & _PWRTE_ON & _WDT_ON & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT

DEFINE OSC 4
OPTION_REG.7=0  
TRISA=%00000000
TRISB=%00000001

CMCON=7

I VAR BYTE
SAY VAR BYTE
SAYI_BIR var BYTE 
SAYI_IKI VAR BYTE
SAYI_UC  VAR BYTE
SAYI_DORT VAR BYTE
SAYI_BES VAR BYTE

EKLE_BES VAR BIT
EKLE_DORT VAR BIT
EKLE_UC VAR BIT
EKLE_IKI VAR BIT
EKLE_BIR VAR BIT
symbol CLK=PORTA.0
SYMBOL DTA=PORTA.1
SYMBOL KIL=PORTA.2
'   BIR      IKI      UC      DORT     BES
'01234567 01234567 01234567 01234567 0123456 ledlere diziliş böyle
SAYI_BIR=%11111111
SAYI_IKI=%11111111
SAYI_UC =%00001111
SAYI_DORT=%00000000
SAYI_BES=%00000000
pause 200

BASLA:
       IF PORTB.0=0 THEN GIT
       GOTO BASLA
       
GIT:

       SHIFTOUT DTA,CLK,1,[SAYI_BES,SAYI_DORT,sAYI_UC,SAYI_IKI,SAYI_BIR]
       PULSOUT KIL,1
       PAUSE 200
       DTA=0  'data girişini sıfırlıyoruz
       FOR I=0 TO 19
       PULSOUT CLK,1 'sonra her clk pulsinde sisteme bir adet LOW biti vermiş oluyoruz
       PULSOUT KIL,1 'böylece ledler bir bit aşağı doğru kaymış oluyor 
       PAUSE 200
       NEXT
       
       SAYI_BIR=%00000000       'aşağıdaki format bu şekilde oluyor
       SAYI_IKI=%00000000       'bunu değişkenlerimize veriyoruz
       SAYI_UC =%11110000
       SAYI_DORT=%11111111
       SAYI_BES=%11111111 
'   BIR      IKI      UC      DORT     BES
'01234567 01234567 01234567 01234567 0123456 
GIT_BIR
       FOR I=0 TO 19            '20 defa yukarı kaydırmamız gerekecek
'her kayışta ilk bitleri kayda alıp kaydıktan sonra diğer byte bunu ekliyoruz kayan bit o tarafa geçmiş oluyor
       EKLE_BES=SAYI_BES.0:EKLE_DORT=SAYI_DORT.0:EKLE_UC=SAYI_UC.0:EKLE_IKI=SAYI_IKI.0:EKLE_BIR=SAYI_BIR.0
       SAYI_BES=SAYI_BES>>1':SAYI_BES.0=EKLE_DORT
       SAYI_DORT=SAYI_DORT>>1:SAYI_DORT.7=EKLE_BES
       SAYI_UC=SAYI_UC>>1:SAYI_UC.7=EKLE_DORT
       SAYI_IKI=SAYI_IKI>>1:SAYI_IKI.7=EKLE_UC
       SAYI_BIR=SAYI_BIR>>1:SAYI_BIR.7=EKLE_IKI
       SHIFTOUT DTA,CLK,1,[SAYI_BES,SAYI_DORT,SAYI_UC,SAYI_IKI,SAYI_BIR]
       PULSOUT KIL,1
       PAUSE 200
       NEXT        
       GOTO BASLA

designer.21

Hocam bu şekil çok daha güzelmiş ya. ben de dün bunu aklımdan geçirmiştim, sürekli ileri yönde oluyor da bu kaymayı bir de geri getirebilir miyiz diye, hatta sorayım dedim ama ihtimal vermediğim için sormamıştım. çok beğendim bunu. ne yapıp edip mantığını kavramaya çalışayım ben bunun. Teşekkürler Hocam.

ete

#8
Geri kaydırma mantığı şöyle çalışıyor.
Bir defa ledlerin bit numaralarına göre dizilişi şöyle;
01234567 01234567 01234567 01234567 01234567
   BIR.....IKI.......UC......DORT......BES

Ledler ileri doğru kaydırılıp sona dayandığında şu şekilde görülüyorlar
00000000 00000000 00001111 11111111 11111111

Dizilişe bakarsan bitlerin ters durduğunu anlayabilirsin. Biz yazarken sıfır nolu biti en sağa koyarız ama senin şemandaki dizilişe göre en solda duruyor sıfır nolu bit yukardaki bitleri numaralandırdığım satıra bak.
Şimdi bütün ledleri bir hane sola kaydıracağız (aslında Byte içinde sağa kaydırma yapıyoruz)
Beş nolu byte bir bit kayarsa 1111110 şeklini alacaktır. Aynı şekilde Dört nolu byte da bir bit kaydırılırsa 11111110 şeklini alacaktır. Beş nolu Byte'ın sıfır nolu biti ortadan kayboldu onun yerine 1 nolu bit  geldi. Yapılması gereken Beş nolu Byte'ın sıfır nolu bitini önceden kayıt edip (başka bir bit değişkenine verip) ,byte kaydırdıktan sonra beşinci byte ın 0 sıfır nolu bitini 4 nolu byte ın 7 nolu bitine geçirmemiz gerekiyor. Çünki Beş den kayan bit oraya geçiyor görsel olarak. Bütün yapılan budur işte.
0 0000000 <=0 0000000 <=0 0001111 <=1 1111111 <=1 1111111
00000000 00000000 00011111 11111111 11111110 şeklini alacak ilk kaymadan sonra. Kayacak olan bitlerin bir önceki Byte geçecek olanları ok ile işaretledim. Ok yönü kayma yada geçme yönü oluyor
Umarım anlarsın.
Ete

designer.21

verdiğiniz bilgiler için çok teşekkür ederim Hocam. gerçekten çok açıklayıcı bilgiler tane tane anlatmışsınız.
 
Hocam zahmet olmazsa, bu anlattıklarınızı pekiştirmek için bu konuyla ilgili sizden son bir kaç ricam olacak.

1. "PULSOUT CLK,1"  bu satırlardaki virgülden sonra gelen rakam ne anlama geliyor. mesela burada 1 var.

aşağıdaki satırların kısa bir açıklamasını yapabilir misiniz. mesela noktadan sonraki "0", "7" ve ">>1" ifadeleri ne anlama geliyor.

2. "EKLE_BES=SAYI_BES.0"   

3. "SAYI_BES=SAYI_BES>>1"

4. "SAYI_DORT.7=EKLE_BES"

Hocam size zahmet veriyorum ama bu bilgiler her yerde olan bilgiler değil maalesef, mecbur sizlerden istiyoruz. cevaplarınız için şimdiden teşekkür ederim.

ete

1. "PULSOUT CLK,1"  bu satırlardaki virgülden sonra gelen rakam ne anlama geliyor. mesela burada 1 var.  Bu komut CLK isimli pinden 10 (1x10=10) us lik bir puls çıkartır. Yani bu komut;
      CLK=1:PAUSEUS 10:CLK=0  komut dizisi ile aynı işi yapmış olur

2. "EKLE_BES=SAYI_BES.0"   , SAYI_BES.0  SAYI_BES byte değişkeninin sıfır nolu biti demek oluyor.
   Bu biti alıp EKE_BES isimli bit değişkenine veriyoruz (orada saklıyoruz)

3. "SAYI_BES=SAYI_BES>>1"   SAYI_BES isimli Byte değişken değerini 1 bit sağa kaydırıyoruz.

4. "SAYI_DORT.7=EKLE_BES"   SAYI_DORT isimli değişkenin 7. ci bitine EKLE_BES isimli bit değişkenini atıyoruz. Kısaca 7 nolu biti EKLE_BES isimli bit değişkeninin değeri ile değiştiriyoruz.

Ete

designer.21

Hocam çok çok teşekkür ederim. öyle güzel ve açıklayıcı anlatıyorsunuz ki ne kadar teşekkür etsem azdır. bu son yazdıklarınızla da aklımda ki tüm soru işaretlerini kaldırdınız. sağlıcakla...

Powered by EzPortal