16F628A İLE 2 ADET SERİ BAĞLI 74HC595 İLE SIRALI LED YAKMA

Başlatan Y_K, 18 Aralık 2021, 23:49:34

Y_K

TRISA=%00000000  
TRISB=%00000000
'-----------------------------------------------------------------
@ DEVICE pic16F628                      'işlemci 16F628                                
@ DEVICE pic16F628, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628, PWRT_ON            'Power on timer açık
@ DEVICE pic16F628, PROTECT_OFF        'Kod Protek kapalı
@ DEVICE pic16F628, MCLR_off            'MCLR pini kullanılıyor.
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak 
'-----------------------------------------------------------------
CMCON=7
symbol CLK=PortA.0
SYMBOL DTA=PORTA.1
SYMBOL AKTAR=PORTA.2

BILGI  VAR  WORD
PORTA=0:bILGI=0
'-----------------------------------------------------------------
BASLA: 
        IF BILGI>>15 THEN BILGI=0
        SHIFTOUT DTA,CLK,1,[BILGI1,BILGI]
        HIGH AKTAR:PAUSEus 5:LOW AKTAR 'BILGI ÇIKIŞA AKTARILDI
        

      BILGI=BILGI*2+1
      PAUSE 500
GOTO BASLA

Arkadaşlar, öncelikle Ete hocam'a saygılarımı sunuyorum. Yeni olduğum için kusuruma bakmasın.

16F628A entegresinde A portuna seri bağlı 2 adet 74HC595, B portuna seri bağlı 2 adet 74HC595 ekleyip ledleri sıra ile yakmak istiyorum. Sıra ile yanacak ve yanık kalacak ama bunlar bir birinden bağımsız çalışacak. Bunun için sadece A portuna yukarıdaki gibi yazıyorum 2 ciye bilgi gitmiyor.

Edit (ETE)
Mesajını ben düzenledim bir daha ki sefere dikkatli ol lütfen. Kod tag kullanmayı ihmal etme. Kod tag yukarıda sağdan ikinci gurubun içinde yer alıyor.


ete

Mesajlarını küçük harflerle yazmanı rica ediyorum. Forum dilinde büyük harf kızgınlık ifadesidir.
Mesajı ben düzelttim ama gelecek sefer daha dikkatli ol lütfen.

Gelelim asıl meseleye. Böyle bir sistemi yaratmanın en akıllıca yolu tek bir WORD değişkeni kullanıp bunu 8 er bitlik iki bileşene ayırmak ve bu bileşenleri 595 lere vermek olurdu.
Zaten programında BILGI isimli bir word değişkeni tanımlamışsın. Eksik olanı ben yapayım. BILGI isimli değişen 16 bitlik ve bunun her biri 8 bitlik iki bileşeni var. Bunlar BILGI.BYTE1 (üst byte) ve BILGI.Byte0 buda alt byte oluyor.
programın doğru çalışan hali aşağıdadır.

CMCON=7
symbol CLK=PortA.0
SYMBOL DTA=PORTA.1
SYMBOL AKTAR=PORTA.2

BILGI  VAR  WORD
PORTA=0:bILGI=0
'-----------------------------------------------------------------

BASLA: 
        IF BILGI=0 THEN BILGI=1   'sayı sıfır ise 1 den başlamak zorunda
        SHIFTOUT DTA,CLK,1,[BILGI.byte1,BILGI.byte0]
        HIGH AKTAR:PAUSEus 5:LOW AKTAR 'BILGI ÇIKIŞA AKTARILDI
        
       PAUSE 500
       IF BILGI=32768 THEN TERS_YON  'TERS YÖNE KAYDIRMAYA GİTMESİ GEREK.
       BILGI=(BILGI*2)+1
       IF BILGI<65500 THEN BASLA
'program bu satıra gelince bütün çıkışlar aktif olmuş demektir şimdi burada biraz bekletme yapıp
TERS_YON:
pause 500
'bu seferde tersi yönde saydırma yapalım
'     BILGI değişkeni son hesaplamada 32768 DE KALDI 

        SHIFTOUT DTA,CLK,1,[BILGI.byte1,BILGI.byte0]
        HIGH AKTAR:PAUSEus 5:LOW AKTAR 'BILGI ÇIKIŞA AKTARILDI   

        BILGI=BILGI/2
        IF BILGI>0 THEN TERS_YON    
GOTO BASLA
Ete

Y_K

Hocam yeni olduğumu belirtmiştim dediğiniz gibi küçük harf ile yazmam gerektiğini unutmuşum siz sadece bu sitede öğretmen değil bilginin efendiliğinide öğretiyorsunuz 2 gün oldu ama öğrendiğim şeyler ömre bedel oldu bundan sonra dediklerinizi harfiyen uymaya ve uygulamaya çalışacağım.saygı ile eğiliyorum.

Y_K

hocam bunu tek yönde yakmak ister isek yani 16 bit yandıktan sonra hepsi sönüp baştan yanmasını istersek ters yönde neyi değiştireceğiz.ve aynı şeyleri b portu içinde uygularsak simetri bir çıkış olurmu? 

Y_K

CMCON=7
symbol CLK=PortA.0
SYMBOL DTA=PORTA.1
SYMBOL AKTAR=PORTA.2

BILGI  VAR  WORD
PORTA=0:bILGI=0
'-----------------------------------------------------------------

BASLA: 
        IF BILGI=0 THEN BILGI=1  'sayı sıfır ise 1 den başlamak zorunda
        SHIFTOUT DTA,CLK,1,[BILGI.byte1,BILGI.byte0]
        HIGH AKTAR:PAUSEus 5:LOW AKTAR 'BILGI ÇIKIŞA AKTARILDI
        
      PAUSE 500
      IF BILGI=32768 THEN TERS_YON  'TERS YÖNE KAYDIRMAYA GİTMESİ GEREK.
      BILGI=(BILGI*2)+1
      IF BILGI<65500 THEN BASLA
'program bu satıra gelince bütün çıkışlar aktif olmuş demektir şimdi burada biraz bekletme yapıp
TERS_YON:
pause 500
'bu seferde tersi yönde saydırma yapalım
'    BILGI değişkeni son hesaplamada 32768 DE KALDI 

        SHIFTOUT DTA,CLK,1,[BILGI.byte1,BILGI.byte0]
        HIGH AKTAR:PAUSEus 5:LOW AKTAR 'BILGI ÇIKIŞA AKTARILDI  

        BILGI=BILGI/2
        IF BILGI>0 THEN TERS_YON    
GOTO BASLA

hocam bunu tek yönde yakmak ister isek yani 16 bit yandıktan sonra hepsi sönüp baştan yanmasını istersek ters yönde neyi değiştireceğiz.ve aynı şeyleri b portu içinde uygularsak simetri bir çıkış olurmu? 

ete

Bu istediğini yapmak için üst tarafta da bazı değişiklikler yapmak gerek.
Birincisi, bütün bitleri yakacak olan Bilgi değeri 65535 dir. Bu rakama ise 32767 rakamından sonra gelmesi gerekiyor. Bu rakama ulaşacak bunu shift edecek ama sonrasında Ters_yon etiketine gidecek.

Program TERS_YON etiketine geldiği zaman,
- öneki gibi bir 500 ms beklesin   (PAUSE 500)
- Sonra hepsini söndürmek için Register Sıfırlanmalı  (BILGI=0)
- Sonra bunu 595 lere yollamalısın (Malum Shiftout komutu )
        SHIFTOUT DTA,CLK,1,[BILGI.byte1,BILGI.byte0]
        HIGH AKTAR:PAUSEus 5:LOW AKTAR 'BILGI ÇIKIŞA AKTARILDI 
daha sonra programı en başa yollarsın (GOTO BASLA)

hepsi bu kadar.

BASLA: 
        IF BILGI=0 THEN BILGI=1   'sayı sıfır ise 1 den başlamak zorunda
        SHIFTOUT DTA,CLK,1,[BILGI.byte1,BILGI.byte0]
        HIGH AKTAR:PAUSEus 5:LOW AKTAR 'BILGI ÇIKIŞA AKTARILDI
        
       PAUSE 500
       IF BILGI=65535 THEN TERS_YON  'TERS YÖNE KAYDIRMAYA GİTMESİ GEREK. 
       BILGI=(BILGI*2)+1
       IF BILGI<=65535 THEN BASLA

TERS_YON:

pause 500 
        BILGI=0
        SHIFTOUT DTA,CLK,1,[BILGI.byte1,BILGI.byte0]
        HIGH AKTAR:PAUSEus 5:LOW AKTAR 'BILGI ÇIKIŞA AKTARILDI   
  
GOTO BASLA

Ete

Y_K

Alıntı YapBASLA
        IF 
BILGI=0 THEN BILGI=1   'sayı sıfır ise 1 den başlamak zorunda
        SHIFTOUT DTA,CLK,1,[BILGI.byte1,BILGI.byte0]
        HIGH AKTAR:PAUSEus 5:LOW AKTAR '
BILGI ÇIKIŞA AKTARILDI
        
       PAUSE 500
       
IF BILGI=65535 THEN TERS_YON  'TERS YÖNE KAYDIRMAYA GİTMESİ GEREK. 
       BILGI=(BILGI*2)+1
       IF BILGI<=65535 THEN BASLA

TERS_YON:

pause 500 
        BILGI=0
        SHIFTOUT DTA,CLK,1,[BILGI.byte1,BILGI.byte0]
        HIGH AKTAR:PAUSEus 5:LOW AKTAR '
BILGI ÇIKIŞA AKTARILDI   
  
GOTO BASLA
Hocam çok teşekkür ederim dediğinizi yaptım tam istediğim gibi çalıştı fakat ikinci 595teki sadece son led Q7 yani 7.aykta bağlı olan led yanmadan başa dönüyor oda yanıp sonra başa dönmesi için ne yapmak gerekiyor.

ete

Bence yanlışın var. Son ledin de yanması için gereken düzenlemeyi yapmıştım.
Bilgi=32767 olduğunda son led hariç tümü yanacaktır. SOnra sırası ile aşağıdaki satırlar işlev görecek;
-        PAUSE 500 '500  ms bekledi

-       IF BILGI=65535 THEN TERS_YON  'henüz rakam 65535 olmadığı için bu satır atlanacak
       BILGI=(BILGI*2)+1   'bu işlem sonucunda BILGI=65535 olacak
       IF BILGI<=65535 THEN BASLA  'bu komut sayesinde program son kez BASLA satırına atlayacak.
Ardından shiftout komutları ile 65535 rakamı 595 lere aktarılacak ki bu sayı bitin ledleri yakacak olan sayıdır. Sonra yeniden 500 ms bekleyecek ve ardından BILGI=65535 olduğu için program TERS_YON etiketine atlayacak.
Ya son ledinbağlantısında bir sorun var yada çiziminde başka bir yanlışlık olmalı. Şimdi bende denedim bu kodları bende son led yanıyor sorun sende yada devrende.

Ete

Y_K

Süpersiniz Hocam IF BILGI<=65535 te olan yere = koymamışım hakkınızı helal edin.şuanda düzeldi.595 leri çoğaltmak veya azaltmak istersek nasıl bir işlem yapmamız gerekiyor.

mehmet

Clock ve latch ortak olacak.
Data in - data out girdi çıktı
olacak şekilde istediniz kadar
ekleyebilirsiniz.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

Y_K

SHIFTOUT DTA,CLK,1,[BILGI.byte1,BILGI.byte0] 
HIGH AKTAR:PAUSEus 5:LOW AKTAR  
Senin dediğin gibi olmuyor mehmet kardeşim.

mehmet

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

ete

Her eklediğin 74HC595 için SHIFTOUT komutuna da bir bilgi eklemelisin.
İşin mantığına göre her yolladığın 8 bitlik bilgi bir öncekini iteler yada öteler. Daha basit anlamda açıklamak gerekir ise;
4 adet 74HC595 i seri bağladığını varsayalım.
SHIFTOUT DTA,CLK,1,[SAYI] 
HIGH AKTAR:PAUSEus 5:LOW AKTAR 
komutunu verdiğin zaman SAYI bitleri 1 nolu 74HC595 çıkışında görülür. Hiç bir şey değiştirme yeniden aynı shiftout komutunu ver bu sefer ikinci de görülür. Bu şekilde devam ederek 4 cüye kadar 4 defa shiftout komutu vererek SAYI bitlerini 4 cü 595 e taşıyabilirsin. İŞlemi 4 defa yapmak yerine 4 adet bilgiyi tek bir SHIFTOUT komutu ile verirsen veriliş sırasına göre bilgiler sıralı 595 lerin çıkışında görülür. O halde temel prensip şu diyebiliriz. Son verilen bilgi bir öncekini seri hatta bağlı bir sonrakine öteler. Bu mantığı kullanarak Mehmet'inde dediği gibi CLK ve AKTAR uçlarını ortak kullanarak istediğin sayıda 595 kullanabilirsin. Elbette 595 sayısı artıkça işlem hızıda yavaşlayacaktır. Düşünsene 1 addet 8 bitlik bilgi aktarımı ile 10 tane 8 bitlik bilgi aktarımı arasında elbette zaman farkı olacaktır. Umarım işin mantığını anlamışsındır.

Bazı farklı bilgilerde vereyim. Shiftout komutunu unut yada kullanma. Data ucuna HIGH ver. CLK ucuna bir puls uygula ve aktar ucunada bir puls uygula. 1 nolu 595 in 1 nolu çıkışı HIGH olur. Bir clk palsi daha ver ve aktar a da bir puls uygula bu sefer 2 nolu çıkışda high olacaktır. Her bir clk palsi data nın bir bit ötelenmesini sağlar. Bu sistemlede bütün çıkışları HIGH yapabilirsin.


Ete

Y_K

CMCON=7
symbol CLK=PortA.0
SYMBOL DTA=PORTA.1
SYMBOL AKTAR=PORTA.2

BILGI  VAR  WORD
PORTA=0:bILGI=0

BASLA: 
        IF BILGI=0 THEN BILGI=1  
        SHIFTOUT DTA,CLK,1,[BILGI.byte1,BILGI.byte0]
        HIGH AKTAR:PAUSEus 5:LOW AKTAR 
        
       PAUSE 500
       IF BILGI=65535 THEN TERS_YON   
       BILGI=(BILGI*2)+1
       IF BILGI<=65535 THEN BASLA

TERS_YON:

pause 500 
        BILGI=0
        SHIFTOUT DTA,CLK,1,[BILGI.byte1,BILGI.byte0]
        HIGH AKTAR:PAUSEus 5:LOW AKTAR  
  
GOTO BASLA
Buna göre seri üçüncü ve dördüncü 595 eklemek istersem ne yazdımsa olmadı aynı anda yandı 

Powered by EzPortal