Proton TX pinini hapsetmiş

Başlatan ÜC, 23 Temmuz 2018, 14:31:51

ÜC

 Eğer hserout komutu kullanılırsa TX pinini kullanmamızı engelliyor ve low yapamıyorum bir türlü pini.Pbp ilede aynısı oluyor. Pini kullanabilmenin bir yolu varmı ? Bu engellemeyi nasıl kaldırır ve tekrar geri verebilirim ?

Maxim

Benim bilgiğim o olay protona özel birşey değil
yani donanımsal uart kullanırsan rx-tx ikisi birden o iş için ayrılıyor.
yani muhtemelen C de aynısı olacaktır.

eğer sadece tx kullanacaksanız,
hserout yeriye serout veya rsout komutlarını kullanabilirsiniz
ama tabi bunlar yazılımsal çözüm olacak

ÜC

 Maxim hocam seri data alımını kesme ile alıyordum rahat oluyordu.Eğer aradığım çözüm yok ise önerdiğiniz gibi aynı pinden yazılımsal komutlarla halledeceğim artık

Tagli

Proton'u bilmiyorum ama donanımsal olarak sadece TX veya sadece RX mümkün. Belki Proton ilgili ayarı yaptıktan sonra ilgili register'daki bit 0 yapılarak Proton'u kandırmak mümkün olabilir, denemek lazım.
Gökçe Tağlıoğlu

RaMu

#4
@Tagli bende @Maxim gibi düşünüyorum,
başımada gelmişti, ASM ile yazmama rağmen uart aktif iken pini LOW HIGH yapamamıştım,
belki bütün picler için geçerli olmayabilir ama
sırf bu nedenle eğer RX kullanırken software TX gerekecekse başka bir pin ayırıyorum ve
eğer TX uart amacıyla kullanılmayacaksa başka iş içinde kullanmıyorum, boş bırakıyorum.

Şu yapıda kullanılabilir:
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Tagli

#5
Şimdi PIC16F886'nın datasheet'ine baktım, gerçekten de dediğiniz gibiymiş. Aklımda yanlış kalmış anlaşılan. Veya modelden modele değişiyor olabilir.

Bazı modellerin datasheet'lerinde TX pininin çalışması için ilgili TRIS bitinin 1 yapılması gerektiği yazılmış (halbuki insana 0 olması gerek gibi geliyor). Belki TXEN ve ilgili TRIS biti 0 yapılırsa seri portun pini ele geçirmesi engellenebilir.

umitco, PIC'in modeli nedir? Belki ona göre yorum yapsak daha sağlıklı olur.
Gökçe Tağlıoğlu

OG

#6
USART açıldığı andan itibaren ( RCSTA.7 bit idi sanırım )  pini usarta bağlar ve GPIO olarak (genel amaçlı olarak) kullanamazsın. USARTı kapatmak yani bu biti 0 yapmak gerek.
Tabi usart kapandı ise hserout / in komutu kullanılamaz veya kullanıldığı an usart açılıyor olabilir, burasını net hatırlamıyorum.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

ÜC

    "Eposta ve uyarıları al" yapmama rağmen mail gelmiyor bende cevap yok diyerek bakmadım kusura bakmayın.
  Tagli hocam işlemci 18F4431
  OG hocam sabah ilk işim önerinizi uygulamak olacak.
 Ramu hocam diğer bir pini kullanmakda mümkün ama böyle olsaydı çizim için uğraşmayacaktım epey.
  TX pinini IO olarak kullanmak istememin amacını açıklayayım. Max485 kullanarak 2 pic arasında hem haberleşmek hemde senkron olmalarını sağlamak istiyorum. Slavenin masteri devamlı takip etmesi ikisininde senkron çalışması lazım. Master TX pini low yaptığında slavedeki RX de devamlı low oluyor (hserout problemi olmazsa)  bu sayede senkroniizasyonu sağlamak niyetim.Data göndererekde olabilr ama hattı low yaparak daha pratik ve seri olacağını düşünüyorum.

RaMu

Elimde 18F4431 olsaydı denerdim ama
EUSART ı pasifleştirip pini LOW yapman işine yarıyorsa şöyle denenebilir:

Datasheet FIGURE 20-2: EUSART TRANSMIT BLOCK DIAGRAM a göre
RCSTA.SPEN = 0 yapılıp seri port disable(pasif) edilerek ve
ilgili TX pini TRISC.6 = 0 çıkış yapılarak
sonrasında RC6 pini 1-0 yapılabilir gibi gözüküyor.
Sonrasında TRISC.6 = 1 ve RCSTA.SPEN = 1 yapılarak
EUSART geri aktif edilebilir, edilemeyedebilir,
EUSART ı aktifleştirmek için bazı registerları belirli sıralı şekilde ayarlamak gerekebiliyor.
Yinede denenebilir, denersen olacakları yazarsın.

FIGURE 20-5: EUSART RECEIVE BLOCK DIAGRAM a da bakılırsa
SPEN = 0 yapıldığında RX in de disable olacağı veya o sırada
RCREG Receive buffer veya FIFO da anlamsız veri oluşabiliceği görülüyor.

MASTER TX pinini LOW yapmak için Master Eusart tan sürekli 0x00 göndersen olmuyor mu?
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

OG

Beni zamanında çok uğraştırmıştı bu konu. USART ON-OFF sırasında bazı sıkıntılar olmuştu.

Sizin işinizde anladığım bir tarafta tx diğer tarafta rx pini arada bir genel amaçlı kullanılacak.

Her şeyden önce
ilgili usart pinini bir direnç ile (1K gibi) pullup veya pulldown (hangi yön işinize en yatkın ise)
imkanı var ise yapmanızı öneririm işinizi çok kolaylaştıracaktır.

- - -
Mesela slave taraf
RX pini (dataya bakmadım, mesela portc.7 olsun)
direnç ile pullup yapın
TX tarafın low göndermesini bekleyeceksiniz

önce
PORTC.7 = 1
LATC.7 = 1   (18 serisinde ve gelişmiş 16 serisinde)
USART kapat (ilgili bit ile)
şimdi pin genel amaçlı
burada low oldumu kontrollerini yapıyorsunuz
Low olunca usarta döneceksiniz ama sizin start bitiniz H olduğundan
şimdi H bekliyorsunuz
H olduğu gibi hemen (* bu nokta için tx yani master tarafın açıklaması altta)
USART aç (ilgili bit ile)
(Low iken açarsaniz ilk byte kaçabilir)

* ilgili nokta için TX yani master tarafın açıklaması
TX taraf önce LOW sonra HIGH yaptıktan sonra birkaç bitlik bekleme süresi verin, sonra TX'in usartını açın

- - -
Master (TX) taraf, TX pini PORTC.6 olsun (dataya bakmadım)
Mümkün ise TX pinini bir direnç ile pullup yapın
USART işiniz bitti ise
LATC.6 = 1   (18 serisinde ve gelişmiş 16 serisinde)
PORTC.6 = 1
USART kapat (ilgili bit ile)
LOW yapman gerektiği zaman
LATC.6 = 0   (18 serisinde ve gelişmiş 16 serisinde)
PORTC.6 = 0
arada low süresi verildi, tekrar H yapılacak
LATC.6 = 1   (18 serisinde ve gelişmiş 16 serisinde)
PORTC.6 = 1
RX tarafın sağlıklı algılaması için birkaç bit bekle
USART aç (ilgili bit ile)
işlemlere devam

- - -
gibi.

Hatırlatma;
USART (invert çalışmıyor ise) TX pini usart açılınca HIGH olur.
Yani
USART'ı kapattınız ve TX pinini LOW yaptınız
Bu durumda iken USART'ı açtınız, TX pini HIGH'a sıçrar.
Bu durum istemediğiniz bir an H olması anlamına gelebilir, istenmeyen darbeler haberleşme akışını aksatabilir.
Bu sebeple usartı açmadan önce pini siz H yapın, sizin kontrolunuzde H olsun.

Pullup dirençleri bir çok yanlış algının önüne geçer, basit görmeyin, tavsiyemdir.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

ÜC

#10
Ortak kanaatiniz olan suçlu RCSTA.7 imiş. Bir Sıfır olduğunda haberleşmeyi kapatıyor ve pin low olabiliyor sıfır bir olduğunda haberleşme açılıyor.
  Ramu hocam sıfır göndererek nasıl olabilir bilmiyorum , gelen veriyi bit bit kontrol etmek usartta nasıl mümkün ? Gerçi gerek kalmadı bu bilgiye zaman harcamayın isterseniz.
  OG hocam sizin akışınızla benzerlik taşıyan bir kod yazmayı düşünüyordum ama aradaki detaylar çok işime yarayacak zahmet edip detaylı anlatmışsınız teşekkürler.
  Cevap yazan tüm arkadaşlara teşekkür ederim ,konuyu sonuca ulaştırdık şükür.

  OG hocam LATC registeriyle ilgili araştırdım biraz datasheetin heryernde geçiyor ama anlamadım doğrusu tampon bölge gibi birşey sanırım.Ufak bir açıklama yapabilirseniz memnun olurum hocam.

RaMu

Alıntı yapılan: umitco - 24 Temmuz 2018, 12:47:43Ortak kanaatiniz olan suçlu RCSTA.7 imiş. Bir olduğunda haberleşmeyi kapatıyor ve pin low olabiliyor sıfır olduğunda haberleşme açılıyor.
Tam tersi,
1 Seri Port Enable  (Aktif)
0 Seri Port Disable (Pasif)
Alıntı YapRamu hocam sıfır göndererek nasıl olabilir bilmiyorum , gelen veriyi bit bit kontrol etmek usartta nasıl mümkün ?
TX pinini elle 0 a çekmek ile UART tan sürekli 0x00 göndermek aynı şey,
ikiside TX pinini sürekli 0 da tutmuş olur.

Alıntı YapLATC registeriyle ilgili
Forumda daha önce konuşulmuştu ama konuyu bulamadım.
Temelde Read Modify Write problemine çözüm oluyor:
https://www.microchip.com/forums/m147383.aspx
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

ÜC

   
  Hatalı olmuş hocam ilk paragraf kusura bakmayın düzeltme için teşekkürler.
 
  Peki alırken nasıl olacak ? RX pini örn 10ms boyunca devamlı nasıl lowda duracak usart kullanarak ?

RaMu

Soruyu net anlamadım.

MCU A     MCU B
TXa ----- RXb
RXa ----- TXb
şeklinde bağlı A ve B MCU ları olsun,
RXb yi LOW da tutmak için A MCU su uart tan sürekli 0x00 gönderir,
RXa yı LOW da tutmak için B MCU su uart tan sürekli 0x00 gönderir.

Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

OG

Alıntı YapTX pinini elle 0 a çekmek ile UART tan sürekli 0x00 göndermek aynı şey,
ikiside TX pinini sürekli 0 da tutmuş olur.
Ancak 0x00 gönderirken her byte arasında H pulse lar da gider, bunlar stop bitleridir.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.