Ardışık yazılan portlarda çıkış verme sorunu.

Başlatan F.T, 10 Haziran 2015, 18:47:42

F.T

Arkadaşlar protonda

If MNALRM=0 Then MNEL=1
If MNEL=1 Then GoSub BAZER:GoSub MANEKRAN:GoSub BUTONDEVREDE:PORTC.5=1:PORTC.6=1

gibi bir komut satırım var.Bu komut satırı proteuse ta normal çalışıyor.Her iki port 1 oluyor.Fakat gerçek devrede  komut satırında portc.5=1 olmuyor fakat portc.6=1 oluyor.Bunun gibi sorun yaşayan varmı?Yine derleyici hatasımı.Benim hatam ne?
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

z

PORTC.5=1:PORTC.6=1

Araya işe yaramaz bir komut ekleyince ne oluyor?

PORTC.5=1
İşe yaramaz bir komut ekle
PORTC.6=1

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Tagli

Olay PORT register'larına erişimin read-modify-write mantığı ile yapılmasından kaynaklanıyor. Daha önce forumda birkaç kez bahsedilmişti - çoğunlukla da benim tarafımdan. Olay şöyle oluyor: Herhangi bir register'ı değiştiren bir komut önce o register'ı okuyor, sonra değiştirip tekrar yerine yazıyor. PORT'ta özel durum var. Okuduğun şey bacakların o anki durumu, ama yazdığın yer ilgili portun latch'ı. İlk 1 yazma komutu ilgili bitin latch'ını 1 yapıyor. İkinci komut ise önce PORT'u okuyor ama bu kısa sürede ilk komutun etkisi henüz ortaya çıkıp bacağı fiziksel olarak 1 yapmadığından o bacak 0 olarak okunuyor ve 2 yazımda ilk bacak 0 ikinci 1 olarak latch'a yazılıyor.

PIC18 ve ileri işlemciler ile yeni çıkan PIC16'larda LAT register'ları olmasının nedeni bu. Yazımlar LAT register'larına yapıldığında bu sorun olmuyor. LAT register'ı yoksa, iki komut arasına 1 veya 2 us gecikme koymak genelde yeterli oluyor. Olmazsa süreyi uzat.
Gökçe Tağlıoğlu

F.T

Hocam örnek olsun diye o şekil yazdım.Gerçektede arada zaman gecikmesi var.Çünkü daha öncede bu tip bir sorunla karşılaştım.Araya nop nop nop nop gibi bir kaç nop yazınca olmuştu.Veyahut gecikme koyunca olmuştu.Ama bunda olmadı  ne yaptıisem.16f877a işlemcisinde lat varmıki.hiç kullanmadım verdiğim örnekte lat komutunu nasıl kullanmalıyım.
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

t2


F.T

t2 hocam bu protondanmı kaynaklanıyor.

Hocam latC.5=1 komutu için proton hata veriyor.sanki bir değişkenin 5. ve 6. biti gibi görüyor ve böyle bir değişken yok diyor.
            latC.6=1
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

OG

Protondan değil Tagli açıklamış

Başka bir çözüm. Bir değişkenin bitlerini portun bitleri gibi kabul edip gereken set veya clear yapılır, sonra o değişken port'a yüklenir.

dim x as byte


x.0 = 1
x.5 = 0
.
.

PORTC = x

gibi.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

F.T

OG hocam durumu bir değişkene bit olarak yükleyip sonra portu o değişken bitinemi eşleştircez.Doğrusu bumu.Ayrıca bu durum her zaman oluşan bir durum değil.Çoğu programlarda bu durum oluşmuyor ama bazen de oluşuyor.bu sorunun kesin çözümü bu yöntemmidir.
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

OG

Sebep hız diyebiliriz. Yukarıda açıklanmış.

Ya aralara bekleme ilave etmek gerekir NOP gibi, gereken sayıda ki bunun kesin bir sayısı yok
Ya LAT registeri ile sürülür. 18 serisi ve yeni nesil 16 serisinde.
Ya da port bitleri sıra ile tek tek değil de benim gösterdiğim şekilde bir defada sürülür.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

F.T

Hocam C portunun hepsi çıkış değilki.ilk 5 biti giriş diğer 3 biti çıkış nasıl olacak.

TRISC=%00011111:PORTC=0

şöyle olurmu

Symbol S5 = PORTC.5
Symbol S6 = PORTC.6

dim x as byte

basla:

x.5=1
x.6=1

s5=x.5
s6=x.6

goto basla

Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

OG

Giriş olan pinler çıkışa bir değer yüklenince etkilenmez zaten.

----

Symbol S5 = PORTC.5
Symbol S6 = PORTC.6

deyip

s5=x.5
s6=x.6

dersen aynı şey olur.

Derleyici S5 gördüğü yeri siler PORTC.5 koyar , S6 gördüğü yeri siler PORTC.6 koyar.
O zaman şu satırlar
s5=x.5
s6=x.6

şuna dönüşür

PORTC.5=x.5
PORTC.6=x.6

Yani pinler yine ardı ardına sürülür, Tagli'nin bahsettiği hata tekrar ortaya çıkar yani değişen birşey olmaz.

-----

Porta süreceğin değer için bir değişken atarsın

dim c_portu as byte gibi.

Baştan bu değişkene portun durumunu yüklersin

c_portu = PORTC


Sonraki işlemlerde bitleri değişeceğin yerlerde değişkenin bitlerini değiştirirsin

c_portu.5 =0
c_portu.6 =1

gibi.

Porta yüklemek istediğinde de

PORTC = c_portu

dersin bütün bitler aynı anda yüklenir.
Yani şu alttaki hatalı davranış durumu veren

PORTC.5=0
PORTC.6=1

komutundan kurtarmış olursun.

-------

Veya
PORTC.5=0
nop
nop
.
.
PORTC.6=1
nop
nop
.
.
PORTC.4=0

şeklinde kullanırsın. Aradaki "nop" lar portun fiziksel durumunu doğru okumak için gereken gecikmeyi sağlar, ancak bu süre kesin bir değere sahip olmadığından ne kadar nop kullanma gerekliliği de belirsizdir

Gösterdiğim yöntemde bu durumdan kurtarmış olursun.

Veya işlemcinde LAT geçerli ise direk
LAT.5=0
LAT.6=1

şeklinde kullanabilirsin.

Bu konuda benim bildiğim başka söylenebilecek bir şey yok. Yöntemlerin birini seçmek zorundasın sanıyorum.

FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

F.T

OG hocam değişkene portu eşitleyip bit bazında değiştirmek ve sonra portu değişkene yükleme olayı bana daha iyi olacak gibi geliyor.Çünkü düğer gecikme olayını ne kadar denedi isem olmadı bir türlü.
Tüm hocalarıma yardımlarından dolayı teşekkür ediyorum.
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

z

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

F.T

If MNEL=1 Then GoSub BAZER:GoSub MANEKRAN:GoSub BUTONDEVREDE:CAKTAR=PORTC:CAKTAR.5=1:CAKTAR.6=1:PORTC=CAKTAR

Hocam port çıkışlarında transistör üzerinden röle sürüyorum.Bu ayakları tek tek çıkış olarak programdan sorunsuz kullanıyorum.Fakat iki ayak aynı anda aktif olmuyor.Yukarıdaki satırı uyguladım fakat yine aynı port c.5 aktif olmuyor port c.6 aktif oluyor.Ne ettiysem ikisi aynı anda aktif olmuyor.For next ile gecikme döngüsü olan alt program var baya uzun süre vermeme rağmen portlar yine aynı şekilde sıkıntı yapıyor.
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

Tagli

Belki sorun başka bir şeyden kaynaklanıyordur. Bu iki satırın yerini değiştirmeyi denedin mi?  Yani önce 6 sonra 5'i açarsan da yine benzeri durumla karşılaşıyor musun?
Gökçe Tağlıoğlu