74hc595 kullanılarak sayıcı yapımında sorun

Başlatan ywzslm, 16 Eylül 2008, 03:20:16

ywzslm

herkese hayırlı geceler 74hc595 port çoklayıcısını kulanarak yapmaya çalıştığım bu sayıcı devresine tek tuş atamayı başardım tek segmentte herhangi bir hata vermemesine rağmen ikinci segmenti bağladğımda birinci segmentin bağlı olduğu 74hc595 portları binary olarak 1111'e kadar decimal olarak ise 15 kadar sayıp öyle sıfırlıyor tabi bu da devrenin 9 numarasından 10 numarasına geçişi yavaşlatıyor kodları aşağıdak gibidir şimdiden bu geçikme sorununa yardım edecek kişilere ve yorum getirecek arkadaşlara çok teşekkür ederim
kodlar;
PORTA=255:portb=0
TRISB=0   'PortB tamamı giriş yapıldı.
TRISA=%00000001  'A portu tamamı çıkış yapıldı.
'-----------------------------------------------------------------

CMCON=7
Symbol CLK=PortA.1
SYMBOL DTA=PORTA.2
SYMBOL AKTAR=PORTA.3
SYMBOL TUS=PORTA.0
BILGI  VAR  WORD
basilan var word

PORTA=0:bILGI=0:basilan=1
'-----------------------------------------------------------------

BASLA:
PROGRAM1:
        if tus=1 then
        BILGI=basilan
        basilan=basilan+1
        if BASILAN=9 then GOTO PROGRAM2
        ENDIF  
       if TUS=1 then
       PAUSE 200
       BILGI=basilan
       SHIFTOUT DTA,CLK,1,[BILGI]    
       HIGH AKTAR            
       PAUSEUS 5
       LOW AKTAR             
       ENDIF
  PROGRAM2:
        if tus=1 then
        basilan=basilan+1
        IF BASILAN=1 THEN RESUME PROGRAM1
     ENDIF  
       if TUS=1 then
       PAUSE 200
       BILGI=basilan
       SHIFTOUT DTA,CLK,1,[BILGI]    
       HIGH AKTAR            
       PAUSEUS 5
       LOW AKTAR             
       ENDIF
       GOTO PROGRAM1
       GOTO BASLA
       end
devrenin şekli;


proteus dosyası download linki;
http://rapidshare.com/files/145622131/tektus__ift_segment_kontrol_74hc595.rar.html
olgulardaki olgunluk biziz

Cetinal

konuyla tam alakası yok pic basic ten de anlamam  zaten ,,,,

74 hc595 ile 2 tane 4511 i sürmek yerine  2 tane 74hc595 le bu işi yapabılırsınız ve basit değişikliklerle uzatıp gidebilirsiniz 7 segment display sayısını ,

edit::

bu şekildeyken 3. bi display ekliyecek olsanız bi tane daha 74hc595 ve 4511 ekleyeceksınız ve siz zaten 2 tane 74hc595 software spı ile sürmüş olacaksınız 4511 lere binary bilgi yollamak yerıne dırek 7 segmentlere bılgı yollayın diye öneride bulunmak istedim

en başından en pratık yolu seçip ona gore hareket etmek daha ii olur diye bi düşüncem var belki yanlış da olabılır ama benim bakış açım bu ;)

ywzslm

cevabın ve düşüncen için çok teşekkür ederim yapmak istediğim zaten direk portan çalışmak yerine port çoklamağı geliştirmek bu  yüzden tek 74hc595 kullanılmıştır belki bu projenin bi üst versyonunda 3 segment yada daha çok segment bağlanabilir dediğim gibi asıl sorun burada 74hc595 tarafından geçiken port sorunudur yorumların için çok teşekkür ederim
olgulardaki olgunluk biziz

ete

Yapılmak istenen ile yapılan arasında sistem farklılığı var.
595 burada iki ayrı displayi BCD olararak sürmektedir. Yada sürmelidir. 595 ,8 bitlik bir entegre olup yarısı 1 nolu displayi diğer yarısıda ikinci displayi BCD (Binary Codlanmış Desimal)sürmektedir. 0-15 arasında sayıcının (basilan isimli değişken) aldığı değerleri ve buna karşılık 595'e verilen bilgi ile verilmesi gereken bilgilere bir bakalım istersen;

0 ==> 595'e verilen 0000 0000   verilmesi gereken  0000 0000
1 ==> 595'e verilen 0000 0001   verilmesi gereken  0000 0001
2 ==> 595'e verilen 0000 0010   verilmesi gereken  0000 0010
3 ==> 595'e verilen 0000 0011   verilmesi gereken  0000 0011
4 ==> 595'e verilen 0000 0100   verilmesi gereken  0000 0100
...  
..    
9 ==> 595'e verilen 0000 1001   verilmesi gereken  0000 1001    görüldüğü gibi 0-9 arasında sorun yok çünki verilen ile verilmesi gerekenler aynı.    Sorun 9 dan sonra başlıyor
10==>595'e verilen 0000 1010   verilmesi gereken  0001 0000
11==>595'e verilen 0000 1011   verilmesi gereken  0001 0001
12==>595'e verilen 0000 1100   verilmesi gereken  0001 0010
...
15==>595'e verilen 0000 1111   verilmesi gereken  0001 0101

O halde ne yapmak gerekiyor. Basilan altındaki değişkeni hanelerini ayırıp onları binary karşılıklarını birleştirip 8 bitlik bilgi haline getirip 595 e vermek gerekiyor.
Bunu nasıl yaparım;
Önce onlar hanesini (örneğimizde 1 rakamı) bilgi isimli değişkene veririm
Bilgi=%00000001  bu bizim onlar hanemiz olacağına göre bir sonraki displaye kaydırmam gerekli o halde bu bilgiyi 4 bit sola kaydırırım.
Bilgi=%00010000 haline gelir. Buna birler hanesini eklersem (diyelimki 5 olsun) Bilgi=%0001000+%00000101 = %00010101 şeklinde 595'e verilecek bilgiyi elde etmiş olurum.
Bunuda götürüp verdiğin zaman displaylerde 15 rakamını göreceksin.
Bu durumda programında bir sürü fazlalık oluşuyor. Onlarıda çıkartınca programın aşağıdaki hali alıyor.

PORTA=255:portb=0
TRISB=0   'PortB tamamı giriş yapıldı.
TRISA=%00000001  'A portu tamamı çıkış yapıldı.
'-----------------------------------------------------------------

CMCON=7
Symbol CLK=PortA.1
SYMBOL DTA=PORTA.2
SYMBOL AKTAR=PORTA.3
SYMBOL TUS=PORTA.0
BILGI  VAR  WORD
basilan var word
BIRLER VAR BYTE
ONLAR VAR BYTE

PORTA=0:bILGI=0:basilan=0
'-----------------------------------------------------------------

BASLA:
PROGRAM1:
         if tus=1 then
            BILGI=basilan
            basilan=basilan+1
            portB=basilan
            WHILE TUS=1:WEND
            PAUSE 100 
         ENDIF   

        GOSUB AYAR
        PORTB=BILGI
        SHIFTOUT DTA,CLK,1,[BILGI] 	
        HIGH AKTAR				
        PAUSEUS 5
        LOW AKTAR 				
       GOTO BASLA     
        
AYAR:
     BIRLER=BASILAN DIG 0
     ONLAR=BASILAN DIG 1
     BILGI=ONLAR<<4+BIRLER
     RETURN 
     
      end
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Logan

@ywzslm, yazdığın programı pek anlayamadım. MEsajında ne yapmak istediğini açıkça belirtseydin sana daha fazla yardımcı olabilirdim. O sebeple varsayımlar üzerinde konuşacağım.

Şimdi sanırım 74595 ve 4511 ile butona bağlı sayıcı yapmayı planlıyorsun. Gerekli registerleri oluşturmuş ve gerekli atamaları zaten yapmışsın. Fakat birler ve onlar isimli 2 adet register oluşturman gerekecek. Çünkü sayıcı olarak kullanmak istediğin değişkenin içeriğini hanelere ayırmak ve o haneler üzerinden 74595'e göndermek zorundasın.Yoksa sayıcı programın decimal olarak değil, hex olarak çalışır.
birler var byte  :  onlar var byte

main:
     if tus=1 then
     pause 50             'Buton gecikmesi
     bilgi=bilgi+1         ' Bilgi registeri 1 arttırılıyor
     birler=bilgi DIG 0  :  onlar=bilgi DIG 1  'Hanelere ayrılıyor
     birler=birler & $0f  :  onlar=onlar<<4    'Decimal görünmesi için birkaç işlem
     bilgi=birler+onlar  'Burada tekrar toplanıyor
     SHIFTOUT DTA,CLK,1,[bilgi]  '74595'e gönderiliyor
     endif
     goto main


Son olarak @RoMeO123'ün de bahsettiği gibi aradan 4511'leri kaldırıp segmentleri direk bağlarsan işin çok daha kolay olur. Display sayısını daha da arttırabilir ve programdaki yığılmayı da engelleyebilirsin...
İmza.

ywzslm

verilen cevaplar için çok teşekkür ederim dediğiniz gibi burada birler ve onlar olarak atama yapmadığımdan kaynaklanan bir hata oluşuyor buda portun daha geç kapanmasına sebep oluyor açıklamalarınız ve yardımlarınız için çok teşekkür ederim
olgulardaki olgunluk biziz