NRF24L01+ PAYLOAD SORUNU

Başlatan tesla, 16 Şubat 2017, 00:31:02

ete

Bende deney boardunda çalıştım. Hiç sorun olmadı. Bazen alıp bazen almama gibi sorunlar mesafe dışında olmadı.
Elinizdeki modüllerin NRF24L01+ modeli olduğuna dikkat edin. Gerçi aralarında uymsuzluk yok deniliyor ama NRF24L01 modeli (sadece Plus eksik) de sorunlar olduğunu okumuştum.
Yukarıda dediklerimi açacak olursak;
Config registere bir değer vereceğimizi düşünelim;
YAZILAN=%00111011 bu değer olsun. Bunu SPI portuna Yazma registerini kullanarak yazıyorum,
        csn=0
        shiftout mosi, sck, 1, [W_KOMUT,YAZILAN]
        csn=1
Ancak bakalım doğru yazıldımı hemen ardından Bu sefer okuma registeri yardımı ile aynı adresi okuyorum.
Okunan değer Bu sefer Okunan=%xxxxxxxx şeklinde geri okunmuş oluyor.
IF OKUNAN <>YAZILAN THEN TEKRAR YAZ diyorum.
Bütün register ayarlarında bunu yapın. Normalda yazmada şaşma olmaması gerekir. Ancak sanırım NRF içinde kendi organizasyonunda bazı durumlarda okuma yazma gecikebiliyor herhalde ve bu yolla işi garantiye almış oluyorsunuz.
Bu modülün bütün espirisi REGISTER ayarlarında. Onları çok dikkatli seçip yapmak gerekiyor. Aksi taktirde sıkıntı var demektir.

Bir soru da ben sorayım. 1 adet RX ve 2 adet TX olan bir ortamda TX lerden birisi PIPE0 ve diğeride PIPE1 kullansa  RX her ikisi ile haberleşebilirmi? Malum TX de Pipe seçimi yok sadece bir adres üzerinden data yolluyor. Ama RX adres seçimi kullanarak ve diğer bazı registerleri kontrol edilerek Pipe larını kullanabiliyor ama bu konuda detaylı bir açıklama göremedim. Sadece Pipe0 adresi ile Pipe1 adresi bir birinden farklı olduğunu sonraki Pipe larda ise Pipe1 e göre sadece 1 byteın farklı olabileceğini gördüm. Bunu hiç denemedim ve deneyen varmı diye bu soruyu sordum. Amacım RX e iki ayrı data adresi vererek iki farklı TX den mesaj almasını sağlamak. Kısaca iki farklı Pipe nasıl kullanılır pratikte. Benim düşüncem TX1 e PIPE0 adresi vermek ve Diğer TX2 ise PIPE1 adresini vermek. RX de ise PIPE0 adresi olarak TX1 in adresini PIPE1 adresi olarak de TX2 nin adresini kullanmak. Deneyeceğim en kısa zamanda.

Ete


tesla

Cevabınız için teşekkür ederim ete bey doğrusu kaydediciler için böyle bir sorun olabileceğini beklemiyordum.

Sizin sorunuzun cevabı olarak;
İki adet verici ve bir alıcı kullanılabilir bence lakin iki vericinin belli bir zaman farkı ile alıcıya veri yollaması şartı ile aksi takdirde iki vericinin deTX_ADDR değeri aynı olacağından alıcı hangisi ile iletişim kuracağını şaşırabilir.

Örneğin;

Yazdığınız vericilerden birinde yollama işlemi her 3 saniyede bir olsun, ikinci vericide bu işlem 4 saniyede bir olsun. Bu şekilde sorun olmaz diye düşünüyorum. Size deneyip sonucu bildirmek isterdim fakat elimde 2 adet modül var.

Ete bey sizin PIC 'de kullandığınız kristal değeri ve SPI iletişim hızınız nedir ?

ete

Sorumun cevabını buldum kendim aslında. Buldum derken açıkladığım şekilde olduğuna iyice kanaat getirdim. Yani;
RX tarafında hem Pipe0 hem Pipe1 aktif edilecek.
RX tarafında Pipe0 adresi  olarak TX1 adresi kullanılacak.
RX tarafında Pipe1 adresi olarak TX2 adresi kullanılacak.

RX veri aldığı zaman Önce Status 3-1 bitlerine bakılacak ve verinin hangi pipe için geldiği öğrenilecek. Sonra Payload okunup işlem yapılacak.
Zor değil kolay ancak kod uzun biraz onunla uğraşıyorum.

Senin soruna gelince,
Bir kaç değişik pic kullandım aslında 16F1827 ve 16F628A kullandım.
628 de 4 Mhzde çalıştım 1827 de 32 Mhz e kadar denedim alışveriş hızında bir fark göremedim.

Şu anda yine data sheet de register map üzerinde yoğunlaşmış durumdayım. Okurken senin sorununda sürekli aklıma geliyor.
Şöyle baştan aşağı tarayınca şu bilgileri de vermeden geçemeyeceğim.
1. kesinlikle her haberleşmeden sonra (veri yolladıktan sonra FLUSH_TX) (veri alındıktan sonra FLUSH_RX) flush işlemi yapılmalıdır.
2. Auto_ACK kullanmayın
3. Kesme kullanıyorsanız kesmeyi algılayıp işiniz bitince mutlaka kesme bitini sıfırlayın (STATUS registerden)
4. TX tarafında FIFO_status okunarak 5 nolu bite bakın  1 ise dolu demektir gidip Flush yapıp boşaltın.
5. RX tarafında yine FIFO status okuyup 1 nolu bite bakıp 1 ise gidip Flushyaptırıp boşaltın.

Ete

tesla

Sizin yönteminiz de gayet iyi fakat benim dediğim yöntem de olur gibi geliyor daha az bir kod ile. Sadece vericilere aynı anda yollama yapmasınlar diye farklı gecikmeler konacak o kadar. Alıcı adresi ve iki vericide de adres değerleri aynı olacak yani.

Aslında ben saydığınız maddelerin hepsini yapıyorum, status kaydedicisindeki kesme bayraklarını lojik-1 ile sıfırlamamızdan bahsediyorsunuz değil mi ? Şu an için IRQ kullanmıyorum.

ete

Bir birinin aynısı iki TX yaparsanız ve aynı anda haberleşmezler ise tabiiki her iki TX de RX ile haberleşir. Ancak aynı anda veri yollarlar ise sinyal çakışması ve hatta 433 Mhz RF lerde olduğu gibi bir birlerinin sinyallerini bloke etme durumu ortaya çıkar.
Buu göze alamam. Ayrıca birde ilk anda bir birlerini göremeyen ve üzerlerindeki eşleştirme butonlarına basılarak karşılklı olarak bir birleri ile tanışan ve veri alıp vermeye hazır hale gelen bir sistem tasarlıyorum. Bu nedenle yönteminiz bana hiç uygun değil.
Olursa benim yöntem en iyisi gibi gözüküyor. Akşama deneyeceğim bakalım.

Önerilerimin sadece Kesme kısmını değerlendirip şumudur demişsiniz. Elbette Status registerin hem TX hemde RX kesmeleri için bitleri mevcut bunlara 1 yazarak sıfırlamanız gerek. Ama diğer önerilerimde kulak verin bence.

Ete

tesla

Teşekkür ederim ete bey akşama tekrar denemeler yapacağım.

Powered by EzPortal