tusped ile çift segment kontrolü????

Başlatan ywzslm, 22 Kasım 2008, 03:54:50

ywzslm

herkese iyi geceler uzun zamandır üzerinde uğraştığım çift segmenti tusped ile kullanabilmeye çalışıyorum fakat tek segment yapabildiğim programı nedense ikinci segmente bir türlü aktaramamaktayım çoklayıcı kullandığımdan bunun bir sorun yarattığını düşünmeye başladım devre ilk bastığım rakamı dig 1'e ikinci bastığım rakamı ise dig 2'e yüklemesini istiyorum
i=i
x=x*10
y=x+i
bilgi=y
mantığını kullanmaya çalıştım başarılı olamadım şimdiden yardımları geçen ve yorumları ile yol gösteren herkese çok teşekkür ederim

devre şeması;



kodlar;
trisA=%00000001
trisB=%11111111

CMCON=7    
OPTION_REG.7=0 

tus var word
i VAR WORD
X VAR BYTE
y var byte
BILGI VAR BYTE
BIRLER VAR BYTE 
ONLAR VAR BYTE
BASILAN VAR BYTE
BASILAN1 VAR BYTE
BASILAN2  VAR BYTE


Symbol CLK=PortA.0        
SYMBOL DTA=PORTA.1        
SYMBOL AKTAR=PORTA.2                             

Symbol YATAY_A= PORTB.4   
Symbol YATAY_B= PORTB.5                                   
Symbol YATAY_C= PORTB.6                                    
Symbol YATAY_D= PORTB.7    
Symbol DIKEY_1= PORTB.1   
Symbol DIKEY_2= PORTB.2   
Symbol DIKEY_3= PORTB.3    
PORTA=0:i=0:basilan=0                                  

Tus=0
Pause 200
BASILAN1=i
BASILAN2=X
basilan=y
y=x+i

BASLA:
PORTB =254  
YATAY_A=0

    If DIKEY_1=0THEN
      Tus=1:PORTA=%00000001
      While DIKEY_1=0
      Wend
    Endif
   If DIKEY_2=0 Then
    Tus=2:PORTA=%00000010
    While DIKEY_2=0
    Wend
    Endif
    If DIKEY_3=0 Then
    Tus=3:PORTA=%00000011
    While DIKEY_3=0
    Wend
    Endif
    High YATAY_A
    
YATAY_B=0
    If DIKEY_1=0 Then
    Tus=4:PORTA=%00000100
    While DIKEY_1=0
    Wend
    Endif
    If DIKEY_2=0 Then
    Tus=5:PORTA=%00000101
    While DIKEY_2=0
    Wend
    Endif
    If DIKEY_3=0 Then
    Tus=6:PORTA=%00000110
    While DIKEY_3=0
    Wend
    Endif
    High YATAY_B
    
YATAY_C=0
    If DIKEY_1=0 Then
    Tus=7:PORTA=%00000111
    While DIKEY_1=0
    Wend
    Endif
    If DIKEY_2=0 Then
    Tus=8:PORTA=%00001000
    While DIKEY_2=0
    Wend
    Endif
    If DIKEY_3=0 Then
    Tus=9:PORTA=%00001001
    While DIKEY_3=0
    Wend
    Endif
    High YATAY_C
    
YATAY_D=0
;--------------------------------------------
    If DIKEY_1=0 Then
    Tus=11 
 
       xx:
          IF DIKEY_2=0 THEN GOTO BASLA
          PORTA=i
          i=i+1   
          IF i>9 THEN i=0
          PAUSE 100
          while DIKEY_1=0
          WEND     
          goto xx
          Endif

  
    If DIKEY_2=0 Then
    Tus=0:PORTA=%00000000
    While DIKEY_2=0
    Wend
    Endif
    
    
    If DIKEY_3=0 Then
    Tus=12
  
       yy:
          IF DIKEY_2=0 THEN GOTO BASLA
          PORTA=i
          i=i-1
          IF i<0 THEN i=15
          PAUSE 150
          while DIKEY_3=0
          wend
          GOTO YY
          ENDIF
          High YATAY_D


pause 150

                                  
        BILGI=y               
        SHIFTOUT DTA,CLK,1,[TUS]   
        HIGH AKTAR                              
        PAUSEUS 50                                                       
        LOW AKTAR                                                         
        GOSUB kofte                     
Goto BASLA
kofte:                                  
     BIRLER=BASILAN1 DIg 1              
     ONLAR=BASILAN2 DIG 0                
     RETURN
      
RETURN 
GOTO BASLA    
      
END

proteus simulasyon dosyası;
http://rapidshare.com/files/166136663/deneme_segment.rar.html
http://rapidshare.com/files/166138625/deneme_segment.rar.html
iki farklı kod ile upload yaptım
olgulardaki olgunluk biziz

ete

Birazcık daha gayret etse idin sona gelmiştin. Gerçi devren bu yapmak istediğine hiç de uygun değil. Önce bir shift register kullanmışsın sonra ona bağlı iki display sürücüsü kullanmışsın. Halbuki bu iş 2 adet shift register ile daha sağlıklı yapılırdı ve 1 entegre kârın olurdu. Bu konuya sonra yendien değineceğim.

Gelelim Sayı hesabına, bu tip işlerde en mantıklı yol 10 tabanına göre sayı sisteminin özelliğini kullanmaktır.

Aşağıdaki örneği dikkatlice izlemeni istiyorum;
Tuş takımından 248 rakamlarına sırası ile basıldığını farz ediyoruz.

1. basılan tuş 2 tuşu olacaktır. ELimizde SAYI isimli bir değişkenimiz olacak ve tüm tışlar basıldıktan sonra SAYI=248 elde edilecek.
İlk tuş basıldıktan sonra SAYI=TUS  dedik ve sayımız 2 oldu yani SAYI=2

Şimdi bunu ekrana yazdırırken;
BIRLER=SAYI DIG 0  dememiz gerekir yani sağdan sola doğru ilk hane birler hanesidir (10 tabanına göre sayı sisteminde).
ONLAR= SAYI DIG 1  yani sağdan sola 2. hane onlar hanesidir. Bu hane varsa gösterilir yoksa değeri sıfırdır.
YUZLER=SAYI DIG 2  aynı şekilde 3. hanede yüzler hanesidir. Varsa gösterilir yoksa değeri 0 olur.

2. Basılan tuş 4 tuşu olacaktır. AYnı formulü kullanarak sayımızı hesaplıyoruz. Önce 2 sonra 4 basıldığına göre sayımız 24 olacak. O halde hesap SAYI=SAYI * 10 + TUS  şeklinde olacaktır. Sayı nin ilk değeri 2 olduğundan 10 ile çarpınca Sayımız 20 olacak buna basılan tuş 4'ü de eklersek sayımız 24 olacaktır. SAYI=24 oldu. Bunu aynı sistemle ekrana yazdırdığın zaman bir ler hanesi 1 displayde onlar hanesi ise 2. displayda gözükmesi gerekir. Sende iki display olduğu için artık yüzler hanesini izah etmeye gerek yok ama mantık hep aynı.

Gelelim bilginin ekranda gösterilmesine.
4511 ler ABCD kodları ile çalıştığına göre , 74595 in 2 rakamını göstermesi için Q0-Q3 arası pinlerinden %0010 şeklinde bir çıkış vermesi gerekir ki bu binary olarak 2 dir. Bu değer zaten gösterilmektedir.
Peki 4 sayısının ikinci displayde gösterilmesi için ne olması gerek.
74595 in Q4-Q7 çıkışlarında %0100 değerinin yer alması gerekir.
Her iki display tek bir 74595 ile sürüleceğine göre tek bir shiftout komutu iki display bilgisini 74595'e vermesi gerekecek. O halde 74595 vermeiz gereken bilgi şu şekilde olmalıdır %01000010 dır. Bakaım bu sayının desimal karşılığı neye denk gelmektedir. Bu sayı 64+2=66 sayısına denk gelir.
Bu durumda yaılacak iş şöyle olmalıdır. Burada AKTAR isimli ikinici bir değişken kullanalım.
Önce AKTAR=ONLAR<<4   yazıyoruz. Anlamı ise Onlar bilgisini 4 basamak sola kaydırıyoruz yani Q4-Q7 ye getiriyoruz. (AKTAR=4<<4 oldu ve buda 64 sayısına eşit olacak)
Sonra AKTAR=AKTAR+Birler diyoruz.  Böylece AKTAR=66 değerini elde etmiş olacağız.
Bunuda SHIFTOUT DTA,CLK,1,[AKATR]  şeklinde aktardınmı iki rakamıda displaylerde görmen gerekir.

Son bir ekleme yapayım. Her tuşa basıldıktan sonra Gosup Hesap şeklinde gidilen bir alt program ayarla ve orada;
HESAP:
          SAYI=SAYI*10+TUS
           RETURN
şeklinde sayı hesabını yapıp geri dön. Programındaki  Tusi tusx ifadelerini sil yalnızca Tus kullan.
Ekrana yazdırmak için ise
EKRAN :
  Birler=SAYI Dig 0
  Onlar=SAYI Dig 1
  Aktar =Onlar <<4+Birler
  SHIFTOUT DTA,CLK,1,[AKTAR]
  Return
şeklinde bir alt program kullan.

Gelelim iki 74595 ile bu iş nasıl olurdu konusuna,
Pic den bir DTA ve bir CLK ucunu 74595 in ilgili girişlerine bağlıyorsun.
Her iki 595 in CLK uçlarını ortak bağlıyorsun. 1. 595 in DS (DTA) ucunu pice bağlamış idin. Bunun Q7' çıkışını ikinci 595 in DS(DTA) ucuna bağlayacaksın.
Her iki 595 in ST_CP uçlarını ortak bağlayıp 3. bir pic pinine bağlayacaksın.
595 lerin Q0-Q6 pinlerini ortak katod displaye bağlayacaksın.
Sistem bu şekilde kullanmaya hazır hale gelecek. Tabiiki 595 lerin MR uçları ortak bağlanıp HIGH'a ve OE uçlarıda ortak bağlanıp LOW'a çekilcektir.
Şimdi gelelim ekrana yazdırma işine,
ELinde , BIRLER ve ONLAR isimli iki tane yazılacak bilgi var.
Ancak standart display sürücüsü kullanmadığımız için sayı değerine karşılık gelen pinleri displayde aktif edilmesi için bir çevirici kullanmamız gerekecek.
CEVIR:
LOOKUP X,[63,6,91,79,102,109,125,7,127,111],AKTAR:RETURN
şeklindeki bir alt program sana elindeki sayıya karşılık hangi değeri shiftout yapacağını bulur.
Bu durumda sistem şöyle işleyecek.
Birler=SAYI DIG 0 :X=Birler:Gosub Cevir
SHIFTOUT DTA,CLK,1,[AKTAR]

Onlar=SAYI DIG 1:X=ONlar:Gosub Cevir
SHIFTOUT DTA,CLK,1,[AKTAR]
HIGH ST_CP:PAUSEUS 10:LOW ST_CP      'ST_CP pinlerine bir pals veriyoruz. Bilginin çıkışa aktarılması için
RETURN
İşte bu şekilde iki rakamda iki displayde gösterilmiş olacaktır.

Programında TRIS (giriş Çıkış ) tanımlamalarında yanlış. Tuş takımı PortB ye bağlı . Bu pinlerin Yatay girişleri Çıkış olması , ve dikey pinlerinde giriş olması gerekir. (Yatayı LOW yapıyorsun dikeylerden hangisi LOW olmuş ona bakıyorsun).

Son bir iyilik yapayım ve sana mevcut programının bu açıklamalara uygun çalışır halinide koyayım. Muhtemelen yapamayacaksın ve yeniden soracaksın. En iyi öğrenme göresl yoldan olduğuna göre yazılanlarıiyice incelersen bilgin pekişecektir.
Bu arada tuş takımından * tuşunu 1 hane silme tuşu olarak ayarladım. Basıtkça rakamdan 1 hane eksiliyor. 2 defa basarsanda rakam sıfırlanıyor.

Hepsi bu kadar.
Ete

trisA=%00000000
trisB=%00001111
CMCON=7    
OPTION_REG.7=0 'pull-up dirençleri aktif

tus var byte
SAYI var byte
BILGI VAR BYTE
BIRLER VAR BYTE 
ONLAR VAR BYTE
BASILAN VAR BYTE
BASILANi VAR BYTE
BASILANx  VAR BYTE
Symbol CLK=PortA.0        
SYMBOL DTA=PORTA.1        
SYMBOL AKTAR=PORTA.2                                       

Symbol YATAY_A= PORTB.4   
Symbol YATAY_B= PORTB.5    
Symbol YATAY_C= PORTB.6    
Symbol YATAY_D= PORTB.7    
Symbol DIKEY_1= PORTB.1    
Symbol DIKEY_2= PORTB.2    
Symbol DIKEY_3= PORTB.3   
PORTA=0:basilan=0                                      
;-----------------------------------------------------------
Pause 200
BASLA:              
PORTB=254  
YATAY_A=0

    If DIKEY_1=0THEN
    TUS=1:GOSUB HESAP    
    While DIKEY_1=0
    Wend
    Endif
    
    If DIKEY_2=0 Then
    TUS=2:GOSUB HESAP
    While DIKEY_2=0
    Wend
    Endif
    
    If DIKEY_3=0 Then
    TUS=3:GOSUB HESAP
    While DIKEY_3=0
    Wend
    Endif
    
High YATAY_A
 
YATAY_B=0
    If DIKEY_1=0 Then
    TUS=4:GOSUB HESAP
    While DIKEY_1=0
    Wend
    Endif   
    
    If DIKEY_2=0 Then
    TUS=5:GOSUB HESAP
    While DIKEY_2=0
    Wend
    Endif
    
    If DIKEY_3=0 Then
    TUS=6:GOSUB HESAP
    While DIKEY_3=0
    Wend
    Endif
    
High YATAY_B    
YATAY_C=0
    If DIKEY_1=0 Then
    TUS=7:GOSUB HESAP
    While DIKEY_1=0
    Wend
    Endif
    
    If DIKEY_2=0 Then
    TUS=8:GOSUB HESAP
    While DIKEY_2=0
    Wend
    Endif
    
    If DIKEY_3=0 Then
    TUS=9:GOSUB HESAP
    While DIKEY_3=0
    Wend
    Endif
    
High YATAY_C    
YATAY_D=0  
    If DIKEY_1=0 Then
    SAYI=SAYI/10:TUS=0
    While DIKEY_1=0
    Wend
    Endif 

    If DIKEY_2=0 Then
    TUS=0:GOSUB HESAP
    While DIKEY_2=0
    Wend
    Endif
  
pause 50  
        GOSUB kofte                           
        SHIFTOUT DTA,CLK,1,[BILGI]   
        HIGH AKTAR                    
        PAUSEUS 5                                                       
        LOW AKTAR                                                         
                             
Goto BASLA
kofte:                                  
        BIRLER=SAYI DIg 0                                   
        ONLAR=SAYI DIG 1
        BILGI=Onlar<<4+birler
        return        
HESAP:
      SAYI=SAYI*10+TUS
      return     
END
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

ywzslm

yardımlarınız için çok teşekkür ederim düşündüğüm yolun doğru çıkması daha dogrusu bu yolu kullanarak yapılabilmesi verdiğim zamana değdi açıkçası ellerinize sağlık şimdiden
olgulardaki olgunluk biziz

hatmeto

@ETE hocama teşekkür ederim. :oops:

Sayenizde yanlış uygulamalrı düzelttim. Teşekkürler :roll:   :oops:
Bir admin ataasözü derki: "biliyorsan paylaş mod yapsınlar. bilmiyorsan sus banlamasınlar"