Seri Giriş - Seri Çıkış Programında İçinden Çıkamadığım Sorun?

Başlatan mavikaplan, 13 Temmuz 2012, 11:35:15

mavikaplan

Arkadaşlar PIC16F84 'ün 6 pini kullanarak 16 Adet giriş-çıkış portu oluşturmaya çalışıyorum. Programı yazdım, devreyi proteus 'da kurdum ama devre yanlış çalışıyor. Saatlerce sorunun üzerinde kafa yordum ama bir türlü çözümünü bulamadım. Kodları ve Devreyi kaç defa baştan sona kontrol ettim ama yanlış bişey bulamadım. Arkadaşlar lütfen ilgilenirseniz yardımlarınızı bekliyorum  :)

NOT : Programın hex dosyası, proteus dosyası aşağıdaki indirme linkinde bulunmaktadır, isteyen arkadaşlar indirip kodları devrede deneyebilir.

Devre:


Program Kodları :
' PortB.0 pini seri veri çıkışı için clock pulse üretmek için kullanılsın
' PortB.1 pini Seri veri çıkışı yapmak için kullanılsın
' PortB.2 pini clock engelini açma/kapama için kullanılsın. 
' PortB.3 pininiden seri veri girişi yapmak için kullanalım ****
' PortB.4 pinini paralel veri yüklemek için impuls üretsin. (Shift-Load Pini)
' PortB.5 pini seri veri okumak için clock pulse üretsin.
trisb=%00001000
veri var byte
portb.2=1        ' 74LS165 Clocku Engelle
portb.4=1
portb.5=0
portb.0=0
basla:
gosub paralelgiris
gosub sericikis
pause 1000
goto basla
' 74LS165 Entegresine Paralel Bilgi Yükle Ardından Veriyi Mikrodenetliyiciye Seri Olarak PortB.3 Pinine Gönder
paralelgiris:
pulsout portb.4,1 ' Paralel Bilgiyi 74lS165 registerına yükle
portb.2=0         ' Clock Engelini Kaldır
veri.7=portb.3
pulsout portb.5,1
veri.6=portb.3
pulsout portb.5,1
veri.5=portb.3
pulsout portb.5,1
veri.4=portb.3
pulsout portb.5,1
veri.3=portb.3
pulsout portb.5,1
veri.2=portb.3
pulsout portb.5,1
veri.1=portb.3
pulsout portb.5,1
veri.0=portb.3
portb.2=1         ' 74LS165 Clocku Engelle
return
' 74LS164 Seri Giriş - Paralel Çıkış Entegresine Seri Olarak Bilgi Gönderme
sericikis:
portb.1=veri.7
pulsout portb.0,1
portb.1=veri.6
pulsout portb.0,1
portb.1=veri.5
pulsout portb.0,1
portb.1=veri.4
pulsout portb.0,1
portb.1=veri.3
pulsout portb.0,1
portb.1=veri.2
pulsout portb.0,1
portb.1=veri.1
pulsout portb.0,1
portb.1=veri.0
portb.0=0
return


Programın Hex Kodu ve Devrenin Proteus Dosyasını indirip denemek isteyen arkadaşlar : https://docs.google.com/open?id=0Bw2zrnpVqvJ0NHdGRE5JeEVYNzQ

ete

Aşağıdaki kodları dene bakalım. Kolay işi zor yoldan halletmeye çalışmışsın. Şemada da yalnızca 74165'in INH bacağını direk GND ye bağla.
Ayrıca butonları direk basılmış hallerinden kurtar. Gerekirse mevcut butonları sil yeniden buton yerleştir. Sanırım ledler direk yandığı için hepsini söndürmek amacı ile butonları basılı hale getirmişsin. Halbuki aldığın veriyi ters çevirsen buna gerek kalmazdı ben öyle yaptım.

Ete

@ DEVICE PIC16F84A                      'işlemci 16F84A                               
@ DEVICE PIC16F84A, WDT_ON              'Watch Dog timer açık
@ DEVICE PIC16F84A, PWRT_ON             'Power on timer açık
@ DEVICE PIC16F84A, PROTECT_OFF         'Kod Koruma kapalı
@ DEVICE PIC16F84A, XT_OSC                '4 Mhz kristalli XT osc kullanılacak.

TRISB=%00001000
VERI VAR  BYTE
SYMBOL DTA=PORTB.3
SYMBOL CLK=PORTB.5
SYMBOL AKTAR=PORTB.4

Pause 250 'açılış gecikmesi mutlaka gereklidir.


BASLA:
    gosub paralelgiris
    VERI=~Veri   'Veri bitlerini ters çeviriyoruz çünkü okunan taraf pullup lı bu satırı kullanmaz isen ledler direk yanar bastığın tuşa karılık gelen led söner 
    gosub sericikis
    pause 50
    goto basla

PARALELGIRIS:
             LOW AKTAR:PAUSEUS 10:HIGH AKTAR 'girişler okunup registere aktarıldı
             SHIFTIN DTA,CLK,0,[VERI]
             return
SERICIKIS:
          SHIFTOUT PORTB.1,PORTB.0,0,[VERI]
          return
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

mavikaplan

Çok teşekkür ederim verdiğiniz kodlar çalıştı ama benim asıl merak ettiğim yazdığım kodlarda hata nerede. Ben yazdığım kodlarda yanlış biyer göremiyorum. Sizi sorularımla meşgul ediyorum kusura bakmayın ama bu soruyu cevaplayabilirseniz çok memnun olurum. Bu hatanın nedenini öğrenmessem bu soru gece-gündüz aklımdan gitmez :)

mesaj birleştirme:: 13 Temmuz 2012, 13:36:55

Bu arada imzanizdaki sitenize üye oldum güzel bir siteye benziyor, ama üyeliğimin aktifleşmesi için sanırım onaylamanız gerekiyor :)

mesaj birleştirme:: 14 Temmuz 2012, 02:38:34

sorunun çözümünü buldum konu kapanabilir :)