İki tane PIC16F877A arasında SPI ile haberleşen örnek PBP devre

Başlatan toprak, 29 Aralık 2013, 21:30:32

Mymale26

Hocam nrf24l01 wireles modul data sheet 'ini incelik fakat ingilizcemîz yeterli olmadıgı için yeterli bîlgiye ulaşamadık.nrf24l01 ile yapılmış örnek(program dosya) varmı elinizde türkçe olmadıgı için diger örnekleri anlayamiyoruz.bu projede bîze yardımcı olursanız sevinirim
Saygılar.

ete

Bu modül ile hiç çalışmadım. İlgimi çekiyor ama data sheet banada çok ağır geldi. Daha çok profesyoneller için hazırlanmış besbelli. Eliimde de örnek falanda yok maalesef.

Ete

Mymale26

Hocam bilgileriniz için teşşekkür ederiz. Eger sonradan eklîceginiz bir şey olursa burda paylaşırsanız sevinirim. Ben projemi bitirirsem size bilgi veririm. Tekrardan teşekkürler
Saygılarımla.

ete

Biraz araştırdım ve çalıştığı iddia edilen 3 adet program buldum. Bunlardan sonu 1 ile biten program hem alıcıda hem vericide kullanılarak karşılıklı haberleşme yapabiliyormuş.
İnceleyin bakalım bir şeyler anlayabilecekmisiniz.

Ete

Mymale26

hocam biz bunları inceliyeceğiz şimdiden igliniz için teşşekkür ederiz. Sizin önerdiğiniz pıc16f877 ile kablosuz haberleşe yapabilecegimiz bir kablosuz modul varmı ? atx-arx gibi 433Mhz kadar düşük olmamalı bizim için mesafe onemli en az acık alanda 100m rahat calısması lazım...
Saygılar...

ete


magic_gun

Nrf 24l01 aslında guzel bir chip shock brust ile aynı anda birçok verici-alıcı ile habelesebiliyor ama malesef  oyle 250 mt degil acık alanda dahi. ( yada tr içinden temin ettiğimiz moduller) kısa mesafe için ornegin vinc kumandası tarzında bir iş yapacaksanız biçilmiş kaftan hele ortamda 433 mhz kirligi varken yada aynı anda kullanmanız geeken bircok master slave modul var ise kesinlikle karısma olayı yok ,, kanal bazında herbirini ayarlayabiliyorsunuz saygılarımla , uzun mesafe ve kanal secimi istiyorsanız dorjinin modulleri bu konuda ustun ,kolay gelsin


saygılarımla
M.gun

edit: Nrf config ve recive & transmit rutinleri / herhangi bir MC nin hardware SPI kullanılabilir ....bilgi paylasırsak coğalır







Tx_config:
   banksel   PORTA

   clrf   PORTA
   movlw   0x38
   movwf   TRISA
   bcf   PORTA,CE 
   nop
   bsf   PORTA,CSN
   call   dly

   movlw   0x23
   call   put_byte
   movlw   0x4E
   call   put_byte
   movlw   0x04
   call   put_byte
   call   dly
   banksel   PORTA
   bcf   PORTA,CE
   nop
   bsf   PORTA,CSN 
   return

Rx_config:
   banksel   PORTA
   clrw
   movfw   PORTA     
   movlw   0x38     
   movfw   TRISA
   banksel   PORTA
   bcf   PORTA,CE   
   bsf   PORTA,CSN
   call   dly

   movlw   0x23
   call   put_byte
   movlw   0x4E
   call   put_byte
   movlw   0x05
   call   put_byte
   banksel   PORTA
   bcf   PORTA,CE
   nop
   bcf   PORTA,CSN
   clrw
   movwf   PORTA
   movlw   0x3A     
   movwf   TRISA
   bcf   PORTA,CE
   nop
   bsf   PORTA,CSN
   return


Tx_data:
   banksel   PORTA
   bsf   PORTA,CE   
   call   dly
   movlw   0xE7     
   call   put_byte   
   movlw   0x11     
   call   put_byte
   movlw   0x22
   call   put_byte
   movlw   0x33
   call   put_byte
   movlw   0x44
   call   put_byte
   bcf   PORTA,CE   
   return


Rx_data:
   banksel   PORTA
   bcf   PORTA,CE   
   clrf   data_0     
   clrf   data_1     
   clrf   data_2
   clrf   data_3
   call   get_byte   
   movwf   data_0
   call   get_byte
   movwf   data_1
   call   get_byte
   movwf   data_2
   call   get_byte
   movwf   data_3
   bsf      PORTA,CE   
   return



put_byte:
   banksel   PORTA
   movwf   scrA   
   movlw   8   
   movwf   count
put_1:
   btfsc   scrA,7   
   goto   put_2   
   bcf      PORTA,MOSI   
   nop
   bsf      PORTA,SCK
   nop
   bcf      PORTA,SCK
   goto   put_3
put_2:
   bsf      PORTA,MOSI   
   nop
   bsf      PORTA,SCK   
   nop
   bcf      PORTA,SCK
put_3:
   rlf      scrA,f     
   decfsz   count,f     
   goto   put_1     
   return                   



get_byte:
   banksel   PORTA
   movlw   8     
   movwf   count
get_1:
   btfsc   PORTA,MISO   
   goto   get_2     
   bcf      scrA,0     
   goto   get_3
get_2:
   bsf      scrA,0     
get_3:
   bsf      PORTA,SCK
   nop
   bcf      PORTA,SCK
   rlf      scrA,f     
   decfsz   count,f     
   goto   get_1     
   movfw   scrA     
   return



hayal etemeden basaramazsınız
u cnt achieve w/out dreamin

Mymale26

Hocam ben ete hocamın önerdigi modulu(dorjini) incelicem mesefesi daha uygun projem için ama elimde şu an nrf24l01 var ısıste cizemiyorum yanlız devreyi dorjini bilmiyorum ama nrf modulu isiste yok ve nasıl koyacagımı veya oluşturacagımı bilmiyorum isiste cizsem yazılıma gecicem  isisde nasıl cizebîlirim nrf yî sizce??

magic_gun

Nrf için malesef ISIS te model yok( yada benim bildigim kadarı ile) onun için tek care gerçek donanım üzerinde çalışmak ,data sheet i incelemek ( ki gözünuz korkmasın gayet kolay - ETE hocamın dediği gibi herseyin bası datasheet okumakla başlıyor) hele siz bi başlayın elbirliği ile size yardım ederiz ,,, ki kaldıki bu işler high level compiler ile cok daha basit ,,,,
hayal etemeden basaramazsınız
u cnt achieve w/out dreamin

ete

Biraz daha yakından bakınca data sheet'in o kadar da kötü olmadığını farkettim.
Öncelikle register tablosunu iiyi incelemek gerekiyor. Hemen her şey orada açıklanmış.
Ayrıca bir örnek haberleşme sıralaması vermişler. Bunu esas alarakda bir komut dizisi yaratılabilir.
Vakiit buldukça incelemeye devam ediyorum. Aslında çok komplike bir alet. Çünki hemen her eyi kullanıcı tercihine bırakmışlar.
Bizim için bazı yeni terimler var işin içinde.  Mesela "Enhanced ShockBurst" bu bir çalışma modu. Genelde bu tercih ediliyor. Sebebide NRF nin bu modda paket bitlerinin alınmasında veya verilmesinde her şeyi kendisi otomatik ayarlıyor olması gerek.
Detayına giremiyorum dil ağır geliyor bana.

Payload : Kullanıcı tarafından tanımlanan paket içeriği oluyor. 0-32 byte arasında değişebilir şekilde tanımlanabiliyor. Aslında Enhanced Shock Burst modu 2 alternatifli Payload sistemi kabul ediyor. Birisi statik diğeri dinamik. Statik olan aynı zamanda default seçim oluyorki açıklaması şöyle verilmiş ,vericinin yolladığı data adedi (byte adedi) ile alıcının beklediği data adedi standart şekilde aynı olmalı.
Dinamik modda ise data paket uzunlukları değişken tercih ediliyor. Bu iş için bazı registerlerin kullanıldığı belirtilmiş detayına henüz giremedim.

Pipe : Bu modülde bir alıcının 6 adet verici ile aynı anda haberleşebilmesini sağlayan ve DataPipe0,DataPipe1 ...DataPipe6 gibi isimler verilen aynı adreste 6 lojik kanal olarak açıklanan bir sistem olarak gözüküyor.
Her pipe'ın ayarlanabilir 5 byte lık adres bilgisi olduğu belirtilmiş. DataPipe-0 ın 5 bytelık kendi adresi olduğu ancak 1-5 arasındakilerin yalnızca LSB (byte0)ın kendilerine has olduğunu diğer byte ların 1-5 arasında aynı olacağını belirtiyor.

Bu modül SPI üzerinden haberleşiyor. İdeal olanı donanımsal SPI portunu kullanmak olmalı elbette. Hemen akla şu soru geliyor. Diğer modüllerde USART portunu kullanıp USART kesmesi kullanarak gelecek data başında bekleme zorunluluğumuz yok idi. Bu alette ne yapacağız. Bunu düşünmüşler elbette. Bir IRQ pini var ve normalda HIGH da bekleyen bu pin bir bilgi geldiğinde otomatik LOW a düşmektedir. Bu pini PortB.0 kesmesine bağlarsanız sizde data geldiğini kolaylıkla anlayabilirsiniz.
İlla kesme ilede olması şart değil Bu pin ara ara kontrol edilerek gelmiş veriler modülden çekilebilir. Bu şekilde data kaçırmanın söz konusu olmadığını düşünüyorum.

Bütün iş register tablosuna hakim olmaya kalıyor. Yada data sheet de verilen ;
"Enhanced ShockBurst™ Transmitting Payload" Yani Enhanced Schock Burst Modunda Bir Data paketi Yollanması açıklamasını iyice anlayıp ona uygun işlem yapmak gerekiyor. Bunun birde aynı modda Data alma uygulaması var. İkisinide dilim döndüğünce anlatmaya çalışacağım.
Önce TX Modunu açıklayayım.
1. Configuration bit PRIM_RX  LOW yapılmalı
2. MCU 'da yollanacak bir data var ise,  Alıcı Nod adresi (TX_ADDR) ve Payload Data  (TX_PLD) Modüle SPI portundan yollanmalıdır.  TX Payload genişliği (yada uzunluğu) TX_FIFO ya yazılırken sayılır. TX_PLD (payload) kesiksiz olarak TX FIFO ya MCU tarafından yazılmalı ve bu esnada CSN, LOW da tutulmalıdır.
TX_ADDR ikinci yazmada değişmemiş ise yeniden yazılması gerekmez. Şayet PTX cihazı bir ACK alacak ise Data Pipe-0 ACK paketini alacak şekilde configure edilmeli. Data Pipe-0 ın RX adresi ile (RX_ADDR_P0) ,PTX cihazın  TX adresi (TX_ADDR) aynı olmalıdır. Örnek vermek gerekirse , sayfa 37 de Resim 12 ye bakın. TX5 cihaz ile RX cihazı arasında aşağıdaki adres tanımlamaları yapılmalıdır.

TX5 device: TX_ADDR = 0xB3B4B5B605
TX5 device: RX_ADDR_P0 = 0xB3B4B5B605
RX device: RX_ADDR_P5 = 0xB3B4B5B605

3. CE pininde bir HIGH palsi haberleşmeyi başlatır.  CE üzerindeki min. puls süresi 10us olmalıdır.

4. nRF24L01 ShockBurst™:
- Radio güç verilir.
- 16MHz dahili clok çalışmaya başlar.
- RF paketi tamamlanır (paket açıklamalarına bakın)
- Data yüksek hızla aktarılır (MCU tarafından ayarlanan 1Mbps veya 2Mbps ).

5. Şayet otomatik ACK alma aktive edilmiş ise (ENAA_P0=1), ve Alıcı Paket içinde NO_ACK biti set edilmemiş ise ,radio anında RX moduna döner. Şayet geçerli bir paket alınmış ise haberleşme başarılı olarak nitelendirilir.  Status registeri içinde yer alan TX_DS biti set edilerek Payload TX FIFO dan çıkartılır. Şayet belirlenen sür eiçinde geçerli bir ACK paketi alınmaz ise ve otomatik yeniden gönder set edilmiş ise Payload yeniden yollanır.
Burada başka açıklamalarda verilmiş ama şimdilik onalar değinmeyeceğim.

6. CE pini LOW ise nRF24L01 standby-I mode moduna girer. LOW olmaz ise bir sonraki TX FIFO gönderilir. TX FIFO boş ise ve CE hala HIGH da ise  nRF24L01 standby-II mod'una girer.  Bu modların ne analam geldiğini henüz bilmiyorum.

7. Şayet  nRF24L01 standby-II modunda ise ve CE low a çekilirse anında standby-I moduna döner.

Hepsi bu kadar. Bir sonraki mesajımda ALMA adımlarını açıklayacağım.

Ete

ete

Aşağıda bir alma işleminde takip edilecek adımlar açıklanmıştır.

1. CONFIG registeri, PRIM_RX biti set edilerek (PRIM_RX=1 ise RX , PRIM_RX=0 ise TX modu oluyor) RX modu seçilmiş olur.
Data alacak tüm Data Pipe'ları enable edilir.(EN_RXADDR register ile) ve doğru payload genişliği (RX_PW_Px Regsiteri) ile set edilir.  Adresler , Enhanced ShockBurst™ transmit payload açıklaması 2 madde de açıklandığı gibi set edilir.

2. CE Pini HIGH yapılarak Aktif RX moduna geçilir.

3. 130us sonra nRF24L01 gelen haberleşmeyi göstermeye başlar.

4. Geçerli bir paket alınmış ise (adres uyuyor ve doğru bir CRC var ise) gelen payload RX_FIFO da depolanır ve
   STATUS registerinin RX_DR biti HIGH olarak set edilir.Aynı zamanda IRQ pini aktif olur (LOW) , STATUS registeri P_NO bitleri (3:1)
   Hangi data Payload alındığını gösterir.
   
5. Şayet autoacknowledgement enable edilmiş ise bir ACK paketi geriye yollanır.(alınan paket içindeki NO_ACK biti set edilmiş ise yollanmaz).
Şayet TX_PLD FIFO da bir Payload var ise bu Payload ACK paketine eklenir.

6. MCU , SE pinini LOW a çeker ve böylece modül Standby-I moduna girer (Düşük akım çekme modu)

7. MCU bu aşamada Payload datlarını SPI aracılığı ile alır.

8. nRF24L01 şimdi yeniden TX yada RX moduna veya kapatma moduna girmek için hazırdır.

Ete

Mymale26

Hocam bilgiler için teşekkür ederiz.Fakat bu bilgileri yorumlayıp anlıcak kadar bilgi sahibi deyiliz.hocam bna daha basit olarak kapalı alanda 100m mesafede kablosuz led yakıp söndürmeyle bilgi verirseniz onu anlayıp onun üstüne cıkabilirim ve projemi bu doğrultuta yapabilirim.
Saygılarımla.

ete

Bu modülün kapalı alanda 100 m. den haberleşebileceğini sanmam. en fazla olsa olsa 30-40m olabilir.
Bu modül öyle al , bağla kullan özellikli bir modül değil. Çalışma sistemi çok farklı olduğu gibi oluşturulacak algoritmalarda farklı olmalı. Sürekli olarak bir yerlere bakma durumunuz var. 
Her şeyden önemlisi henüz istediğini yapacak kadar modüle hakim değilim. Bir şeyler yapabilmek için modüle hakim olmak lazım.

Yavaş yavaş inceliyorum. Ama zaman alır incelemem. Verdiğim programları adapte edin.

Ete

Mymale26

peki hocam bu modulu yani nrfyi kullanmayalım sizin dediginiz DRF7020D13 kullanalım isisde varmı yokmu daha bakmadım bakıcam isiste cizip kablosuz led yakma yapabiliriz dimi bu modulle peki ?Sizide ugrastırıyoruz hocam kusura bakmayın daha yeni yeni ögrenıyoruz bu konuları yardımlarınız ıcın gercekten mınnettarım
Saygılarımla

ete

Her şeyi isiste aramayın lütfen. RF modün simulasyonu olmayacağı için iste model dosyasıda olmaz.
Ares te pad yerleştirerek bu zorluğu aşabilirsiniz.

Eye

Powered by EzPortal