NRF24L01 Kullanımı

Başlatan erdogan2734, 26 Haziran 2016, 00:07:04

erdogan2734

  Arkadaşlar Merhaba;
Öncelikle hepinize hayırlı ramazanlar.
Yeni bir projem var. NRF24L01 Kullanarak data ve ilerleyen süreçte ses iletimi yapmak istiyorum. Öncelikle bu işi PBP ile yapabilirmiyim diye kafamda çok soru işareti vardı. Yani C de arduinoda hazır kütüphaneler var kullanabilirdim. Ancak konunun tamamına hakim olmam gerektiği için başkasının hazırlamış olduğu kütüphane ile endüstriyel açıdan iyi bir yazılım ortaya çıkaramam diye düşünüyorum. Bu konuda ETE hocamın tavsiyelerini de dinleyerek kendi kütüphanemi oluşturmaya karar verdim.
    NRF24L01 ile hiç çalışmadım benim için şu anda 75 sayfalık bir datasheeten ibaret. Ancak forumda okuduğum bazı yazılar beni çok heyecanlandırdı. Özellikle Burak GÜNAY hocamızın bahsettiği bazı özellikler elimizde rf açısından bir hazine varmış gibi hissettirdi.
Toparlayacak olursak elimde daha önceden ETE hocamızın paylaşmış olduğu bir kaç dosya ve Protonda yazılmış BARAK isimli bir arkadaşın programı var. Ben bu gün ve yarın datasheet okuyup anlamaya çalışacağım.
Sizden ricam bu konuda çalışmış olan arkadaşlarım varsa bana bu konuda yol gösterirse çok sevinirim.
Bu arada elimde çokca 16f887 mevcut işlemci olarak bu ürünü kullanmak istiyorum. Eğer bu işlemcinin yeterli olmayacağını düşünen arkadaşım varsa önceden bildirirse çok iyi olur.

Hayırlı akşamlar.



Erdoğan
İmkansızın zaman aldığı bir dünya'da bana zorluktan bahsetme!

Burak

Evet Nordic tarafından üretilmiş işlemciler arasında en kalifiyelerinden birisi nRF24L01+ RF işlemcisi .. İşlemci ile haberleşme açısından tonlarca problem sayabilirim ama işi kitabına göre yaptığınızda sorunsuz çalışan bir koordinasyona sahip olduğunu görüyorsunuz ...  Bu bağlamda kullanılan MCU'nun Osilatör frekansından tutunda Lojik seviye transisyonlarına kadar birçok problematik durum var .. İfade etmem gereken bir başka şey ise bu işlemcinin QFN kılıfta olması DIY PCB dizaynlarına manuel olarak eklenebilme sıkıntısı oluşturması mühendisleri yada hobistleri mecburi olarak breakout modülleri kullanmaya mecbur bırakıyor .. Bu breakout modüllerinde de komponent eksikliğinden ve nRF'nin Chip Enable/Disable özelliği olmamasından dolayı eklenti bir transistör dizaynına ihtiyaç duymasına sebep oluyor .. Audio / Video veya Raw data aktarımında kesinlikle mükemmel bir işlemci ama tam bir analog dizayn ile birleşince bu ancak mümkün oluyor .. İşlemciyi ACK ve NACK protokolü ile kullanma özgürlüğüne sahipsiniz ve hatta yetmezse kendi protokolünüzü yazabilirsiniz .. Tek bir işlemci 60 us'lik sürede Alıcı moddan Verici moda yada tam tersine dönüşüm sağlayabiliyor buda onu çok önemli bir istasyona dönüştürmüş oluyor .. Ben NACK biçiminde kullanarak eklenti prosedürlerden kurtuldum çünkü bu yazılım sürecinde ciddi bir külfet oluşturuyor .. Ayrıca CRC'yide iptal ettim çünkü zaten alıcı tarafta veri kontrolü yapılmakta olduğundan beni 2 byte'lık datadan azat etmiş oluyor ..Sonuç olarak kitap iyi okunmalı , programlama dilinin spi komutlarına hakim olunmalı ve SPI protokolü iyi tanınmalıdır .. Geriside bol sabır bol zaman gerektiren işler ..

Burak
Ω Gens Una Sumus Ω

magic_gun

NRF , tek cumle ile rf konusunda ayrı bir dünya rgisterlerine hakim olduktan sonra // ki bu dtasheeti yalayıp yutmak demek oluyor
sonrası için sadece sizin hayal gucunuze ve kuracagınız algoritmaya bakıyor ,ilk defa kullanmayak için niyetlenip datasheet i hazmetikten sonra gerisi corap sokugu gibi geldi ,,, umarım asagıdaki kod biraz yardımcı olur ,,,




;***************************************************************
;Test.asm
;Tx/Rx test program 4 Nrf
;MCU: PIC16F8xxx with hard ssp module

;
;user interface
;LED      - RB5, output (pin 11)
;PB        - RA1, input (pin 18)
;
;nRF24L01 connections to 16F8xxx
;
;IRQ             - RA0, input (pin 17)
;CE               - RB0, output (pin 6)
;MISO/SDI   - RB1, input (pin 7)
;MOSI/SDO  - RB2, ouput (pin 8)
;CSN            - RB3, output (pin 9)
;SCK           - RB4, output (pin 10)
;***************************************************************

   errorlevel -302

#define   IRQ       0
#define   MISO    1
#define   MOSI    2
#define   SCK      4
#define   CSN      3
#define   CE         0
#define   LED       5
#define PB           1




#define SPI_SCK 4
#define SPI_SO 2
#define SPI_SI 1

#include   <p16f886.inc>


   CBLOCK 0x20
   scrA
   count
   RXDATA
   TXDATA
   status
   data_0
   data_1
   data_2
   data_3
   data_4
   ENDC

   org      0

   nop

;**************************************************************
;main program
;**************************************************************
   call   init
   banksel   PORTB
   call   flash_led


zzz:
   bcf      PORTB,CSN      ;CSN low
   call   short_dly
   
   movlw   0x10               ;send command (read configuration)
   movwf   TXDATA         ;put in TXDATA
   call   spi_send_read     ;send it
   call   short_dly

   call   spi_send_read
   movfw   RXDATA         ;status is first byte received
   movwf   status            ;save it
   call   short_dly


   call   spi_send_read
   movfw   RXDATA
   movwf   data_0
   call   short_dly

   call   spi_send_read
   movfw   RXDATA
   movwf   data_1


   call   spi_send_read
   movfw   RXDATA
   movwf   data_2


   call   spi_send_read
   movfw   RXDATA
   movwf   data_3

   call   spi_send_read
   movfw   RXDATA
   movwf   data_4

   nop
   bsf      PORTB,CSN      ;CSN high
   nop
   goto   zzz

stop:
   goto   stop



aaa:

   BANKSEL   SSPSTAT
LOOP:   
   BTFSS    SSPSTAT, BF    ;Has data been received (transmit complete)?
   GOTO    LOOP                 ;No
   BCF    STATUS, RP0       ;Specify Bank0
   MOVF    SSPBUF, W       ;W reg = contents of SSPBUF
   MOVWF    RXDATA         ;Save in user RAM, if data is meaningful
   MOVF    TXDATA, W       ;W reg = contents of TXDATA
   MOVWF    SSPBUF          ;New data to xmit

   goto   aaa


spi_send_read:
   banksel   PORTB
   bcf      PORTB,SPI_SCK   ;SCK low
   movfw   TXDATA
   movlw   8                        ;8 bits to send
   movwf   count
sp1_1:
   rlf      TXDATA,f              ;MS bit in C
   btfss   STATUS,C           ;C = 0?     
   goto   spi_2                   ;no, jump
   bsf      PORTB,SPI_SO   ;yes, output one
   goto   spi_3
spi_2:
   bcf      PORTB,SPI_SO   ;output zero
spi_3:
   btfsc   PORTB,SPI_SI    ;SPI_SI input low?
   goto   spi_4            ;no, jump
   bcf      STATUS,C       ;yes, clear carry bit
   goto   spi_5
spi_4:
   bsf      STATUS,C      ;set carry bit
spi_5:
   rlf      RXDATA,f      ;rotate RXDATA left
   bsf      PORTB,SPI_SCK   ;SCK high to latch bit
   decfsz   count,f         ;count = 0?
   goto   sp1_1         ;no, loop back
   return               ;yes, return


;***************************************************************
;initialisation
;***************************************************************
init:

   ;oscillator setup
   BANKSEL   OSCCON
   MOVLW   0x70      ; 8 MHz int. RC osc.
   MOVWF   OSCCON

WAIT1:
   BTFSS   OSCCON,2   ; wait until freq. is stable
   GOTO   WAIT1

   ;I/O setup
   BANKSEL PORTA       ; select bank of PORTA
   CLRF    PORTA       ; Initialize ports by
   CLRF   PORTB      ; clearing output data latches
   BANKSEL   ANSEL       ; Select Bank of ANSEL
   MOVLW   0x00       ; Configure all pins
   MOVWF   ANSEL       ; as digital
   BANKSEL TRISB
   MOVLW   0x02      ; configure PORTB I/O (00000010)
   MOVWF   TRISB   
   MOVLW   0x01      ;configure PORTA I/O (00000001)
   MOVWF   TRISA
   banksel   PORTB
   bsf      PORTB,CSN   ;CSN high
   bcf      PORTB,CE   ;CE low

   return

   ;SPI setup
   BANKSEL   SSPSTAT
   MOVLW   0x40      ;SPI master mode (01000000)
   MOVWF   SSPSTAT
   MOVLW   0x32      ;enable SSP for SPI master mode, clock = OSC/64 (00110010)
   MOVWF   SSPCON

   RETURN


;******************************************************************
;flash LED five times
;******************************************************************
flash_led
   movlw   5
   movwf   count
flash1:
   BSF      PORTB,LED   ;toggle LED
   call   dly
   BCF      PORTB,LED
   call   dly
   decfsz   count,f
   goto   flash1
   return

;****************************************************************
;transmit configuration
;****************************************************************
Tx_config:
   banksel   PORTA

   clrf   PORTA
   movlw   0x38
   movwf   TRISA
   bcf   PORTA,CE   ;set config mode (CE = 0, CSN = 1)
   nop
   bsf   PORTA,CSN
   call   dly
   ;send 24 bit configuration word 001000110100111000000100 (0x234E04) MS bit first
   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   ;configuration enabled on falling edge of CSN
   return

;******************************************************************
;receive configuration
;******************************************************************
Rx_config:
   banksel   PORTA
   clrw
   movfw   PORTA      ;all bits low
   movlw   0x38      ;DATA1, DR1 output
   movfw   TRISA
   banksel   PORTA
   bcf   PORTA,CE   ;set config mode (CE = 0. CS = 1)
   bsf   PORTA,CSN
   call   dly
   ;send 24 bit configuration word 001000110100111000000101 (0x234E05) MS bit first
   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      ;DATA1 muse be input
   movwf   TRISA
   bcf   PORTA,CE
   nop
   bsf   PORTA,CSN
   return


;*****************************************************************************
;transmit data
;*****************************************************************************
Tx_data:
   banksel   PORTA
   bsf   PORTA,CE   ;power up RF front end (CE = 1)
   call   dly
   movlw   0xE7      ;RF address 11100111 (0xE7)
   call   put_byte   ;clock in address
   movlw   0x11      ;send four data bytes (0x11223344)
   call   put_byte
   movlw   0x22
   call   put_byte
   movlw   0x33
   call   put_byte
   movlw   0x44
   call   put_byte
   bcf   PORTA,CE   ;start transmission (CE = 0)
   return


;****************************************************************************
;receive data
;****************************************************************************
Rx_data:
   banksel   PORTA
   bcf   PORTA,CE   ;power down RF front end
   clrf   data_0      ;zero buffers so that we can ensure that
   clrf   data_1      ;correct date is being received
   clrf   data_2
   clrf   data_3
   call   get_byte   ;receive four bytes and save in buffer
   movwf   data_0
   call   get_byte
   movwf   data_1
   call   get_byte
   movwf   data_2
   call   get_byte
   movwf   data_3
   bsf      PORTA,CE   ;power up RF front end
   return

;***************************************************************************
;send byte to nRF24L01 (MS bit first)
;byte in  WREG
;***************************************************************************
put_byte:
   banksel   PORTA
   movwf   scrA   ;save byte
   movlw   8   ;initialise bit counter
   movwf   count
put_1:
   btfsc   scrA,7   ;bit 7 = 0?
   goto   put_2   ;no, jump
   bcf      PORTA,MOSI   ;clear DATA
   nop
   bsf      PORTA,SCK   ;clock it
   nop
   bcf      PORTA,SCK
   goto   put_3
put_2:
   bsf      PORTA,MOSI   ;set DATA
   nop
   bsf      PORTA,SCK   ;clock it
   nop
   bcf      PORTA,SCK
put_3:
   rlf      scrA,f      ;left shift for next bit
   decfsz   count,f      ;more bits?
   goto   put_1      ;yes, loop back
   return            ;no, return         


;***************************************************************************
;get byte from nRF24L01 (MS bit first) by clocking in data from MISO
;byte returned in WREG
;***************************************************************************
get_byte:
   banksel   PORTA
   movlw   8      ;initialise bit counter
   movwf   count
get_1:
   btfsc   PORTA,MISO   ;data = 1?
   goto   get_2     
   bcf      scrA,0      ;no, clear MS bit
   goto   get_3
get_2:
   bsf      scrA,0      ;Yes, set MS bit
get_3:
   bsf      PORTA,SCK
   nop
   bcf      PORTA,SCK
   rlf      scrA,f      ;left shift for next bit
   decfsz   count,f      ;more bits?
   goto   get_1      ;no, loop back
   movfw   scrA      ;return with byte in WREG
   return


;**************************************************************************
;delay routine
;**************************************************************************
dly:
   movlw   0xFF
   movwf   scrB
dly_1
   movlw   0xFF                       
   movwf   scrA                         
dly_2:   
   decfsz   scrA, F                   
   goto   dly_2
   decfsz   scrB,F
   goto   dly_1                         
   return
   

short_dly:
   movlw   0x0F                       
   movwf   scrA                         
short_1:   
   decfsz   scrA, F                   
   goto   dly_2
   decfsz   scrB,F
   return

   end

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

erdogan2734

   Burak Hocam ve MagicGun
Datasheet okumaya başladım, 75 sayfalık ingilizce neredeyse bir kitapdan bahsediyoruz. Okudukça notlarımı alıyorum, daha bir algoritma oluşturmadım şimdilik sadece notlar alıp idrak etmeye çalışıyorum.
Ürün gerçekten harika bir şey, ben her zaman şuna bakarım birisi bu işi yaptıysa ben neden yapamayayım, oda insan evladı bende.
Adamlar bu ürün ile data, video ses (analog-digital) yollamışlar elimde örnek devreler var. Bende bir şeyler yapabilirim diye düşünüyorum.
Sonuç olarak iyi çalışmak gerek , iyi idrak etmek gerek.
        Burak Hocam NACK ve CRC konusunu sizin yazınızdan sonra biraz okudum. Ama tam hakim değilim. Benim amacım ilk olarak bir tuşa bastığımda karşı taraftan bir ledi yakmak. Bu basitlikde bir şey yaptıkdan sonra baya derinlere inmek istiyorum. Ayrıca bir yazınızda bu ürünün veri kaçırmadığını ve hafızasında bu veriyi tuttuğunu belirtmişsiniz, şuna bakın ya böyle bir rf var ve biz hala 433Mhz lerle uğraşıyoruz. Çok heyecan verici.
      Gelişme oldukça yazacağım umarım bu konu bu ürünle çalışmak isteyen diğer arkadaşlarada güç verir.
Hayırlı haftalar.


Erdoğan
İmkansızın zaman aldığı bir dünya'da bana zorluktan bahsetme!

Burak

Alıntı YapAyrıca bir yazınızda bu ürünün veri kaçırmadığını ve hafızasında bu veriyi tuttuğunu belirtmişsiniz, şuna bakın ya böyle bir rf var ve biz hala 433Mhz lerle uğraşıyoruz. Çok heyecan verici.

Evet bunları bir açıklığa kavuşturalım hemde seri iletişim methodolojisindeki haberleşme methodlarını bir tekrar etmiş oluruz ..
Normalde iletişim methodları senkron ve asenkron olmak üzere ikiye ayrılırlar .. Bunun yanısıra USART , SPI , I2C , One Wire , CAN gibi çok meşhur iletişim protokolleride vardır .. Yani bizim yapmamız gereken bir iletişim methodu seçmek ve birde protokol seçmek ..
Diyelim ki elimizde 433 MHZ'de çalışan ASK olarak haberleşen 1 adet TX bir adette RX modül var .. TX'ten sorumlu MCU gönderme komut satırını işletmeye başladığı anda verici modülün data pinine seri olarak örneğin 5 byte'lık veriyi yollamak istiyor .. Bunu yaparken veriyi ; radyo frekans yöntemle aktarımdan sorumlu olan modül hazır mı değil mi diye düşünmeksizin çok basit PBP seri iletişim komut örneği itibariyle HSEROUT , SEROUT yada SEROUT2 tarzında bir satırı işleterek tek bir pinden gönderiyor .. Modülün yaptığı ise senin datanı 433 MHZ'lik bir sinyal ile çarparak karşı tarafa modüleli bir biçimde yayınıma uğratmak .. Şimdi olay burada başlıyor ; Bu örnekte USART iletişim protokolünü kullanarak iletişim yaptığımızı baz alalım ..

Veri yollama sistematiğinde ;

1 : verinin bir sembolünün kural birim zamanda gönderilme hızı (örn:9600 Baudrate) 
2 : modülasyon/demodulasyon frekansı (örn:433 MHZ)

Olmak üzere iki adet koşul alıcı taraftada eşit ise bu gönderme işlemindeki veri evvela alıcının RX modülü tarafından 433 MHZ'lik veri filtrelenerek saf data olarak elde ediliyor ama her bir sembolün alınma hızı alıcının timerları ile yaptığı hesaba uygun olacak şekilde alıcı pin tarafından zamanlamalı olarak alınmalı .. Peki alınan bu veriler nerede saklanıyor ?

Burada genel olarak senkron çalışanlar 433 MHZ'lik alıcı ve verici modül , asenkron çalışanlar ise MCU birimleridir .. ;Dolayısıyla buffer (veri deposu) MCU'nun niteliğine göre değişmekte olup PIC mikrodenetleyici ailelerinde 2 seviye derinlikte yani 2 byte genişliğindedir .. İşte bu gelen veriler evvela bu donanımsal USART arabirimlerindeki bufferlarda saklanmaktadır . Sorunda tabiiki şu ki 433 vb ASK RF için radyofrekans gürültü çok rahat bir şekilde bu iki byte'lık buffer'ı kısa sürede saçma sapan verilerle sürekli olarak doldurarak alıcı birimi hadsiz bir biçimde meşgul edip işgal eder ...

Tabii şu ana kadar yazdıklarım nRF ile alakası uzaktan yakından olmayan şeyler çünkü ondaki özellikleri sıraladıkça USART / ASK / Asenkron haberleşmenin ne kadar zayıf ve niteliksiz kaldığını göreceğiz ;

İlk olarak nRF24L01+ (+ olmayan nRF versiyonunu hiç tavsiye etmem !) Frekans modülasyonu(FSK) ile iletişim sağlar dolayısıyla menzili kat be kat Genlik modulasyonuna(ASK) göre fazladır .. hatta Nordic bu iletişim methodunu bir tık daha artırıp GFSK yani Gauss Frekans modulasyonuna yönlendirmiştir ki bu hem daha güvenli , hem gürültüden son derece uzak hemde menzili daha fazladır .. Diğer bir avantajı ise gürültüden etkilenim ihtimali %0'dır çünkü adresleme parametreleri RF işlemciye kayıt edilir ve böylece ön adresleme karakterleri  uyuşmayan hiçbir veri datapipe'a aktarılmaz yani buffer'da hiçbirzaman gereksiz veri yoktur .. CRC kullanılmasıda verinin hatasız iletim ihtimalini yok eder çünkü gönderilen veri üzerinden hesaplanan CRC polinomu hatasız bir dinamik veri akışı sağlar .. 6 adet her biri 32 byte'lık buffer'a sahiptir .. Yani bir seferde 32 * 6 byte genişliğinde veri alabilir

Bu işlemciye özgü bir diğer durum ise , haberleşme frekansınında dijital olarak ayarlanabilmesi , Yani ;
2400 MHz ile 2525 MHz arasında 1 MHz'lik çözünürlükte ayar ile değiştirilebilecek bir modulasyon frekansı ayar seçeneği bulunuyor yazılımsal olarak .. Öyle eskisi gibi ayar bobini , vida ile frekans ayarı yapılmak zorunda kalınmıyor ...

Sonuç olarak herşey aslında hep istediğimiz özgür çalışan bir MCU platformu için gerekli olan tüm avantajlar olarak ifade edilebilir çünkü , RF işlemcisi kendi işini , MCU kendi işini istediği zaman yapıyor .. Sadece master istediği anda bütün slave'lardan veri alabiliyor .. Yani şu olay yok .. Bir sn , şu anda başka bir işim var veri talebini lütfen sonra sorunuz tarzında bir durum yok .. MCU istediği zaman veri geldimi diye soruyor , nRF'de geldi yada gelmedi diye cevap verip herkes yoluna devam ediyor .. Tabii bu diyalog korkunç hızlı bir şekilde gerçekleşiyor .. Ve son olarakta video ve ses aktarımı için PLL ve Continuous wave özellikleri konulmuş ....

Gerisi sadece hayal gücü ve ihtiyaç doğrultusunda yazılıma yüklenmeye kalıyor .. Bu işlemciyi endüstriyel bir çalışma biçiminde kullanmak için hazır breakout board bile kullansanız onu reset ve reconfig statüsüne almayı gerektirecek bazı analog tasarımlarıda eklemeyi unutmamalısınız .. Benim yaptığım ilk nRF'li proje dahil olmak üzere 2 yılın üzerinde süredir çalışan sistemlerim var yani bu işlemci hakkını verirseniz güzel çalışan bir malzeme , yeterki ay , yıl demeden üzerine düşün ve uğraşın ..

Burak
Ω Gens Una Sumus Ω

erdogan2734

Burak Hocam Merhaba;
Sistemde SPI haberleşme kullanacağız. Genelde forumlarda gördüğüm örnekler 18f serisi entegrelerde yapılmış.
Benim elimde yüklü miktarda (100 adetden fazla) 16f887 mevcut ve bu işlemcide de donanımsal SPI kullanabiliyoruz.
Eğer işlemci hızımızın NRF24 için bir sakıncası yoksa ben bu işlemciyi kullanmak istiyorum. Siz daha önce bir çok uygulama yapmışsınızdır.
Mimarimi bu işlemci üzerine kursam yarın sorun yaşarmıyım? Direk 18f serisini mi kullanmalıyım.
   
Ayrıca datasheet okudukça ve yazılarınızı takip ettikçe yeni şeyler öğreniyorum.
Ben öncelikle tüm yazılımlarımda ETE hocamızdan öğrendiğimiz şekilde, karışıklık yada araya ikincil şahıslar girmesin diye veri gönderirken bir ön ID yollardım.

Örneğin:
HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]
HSEROUT ["E","R","D",ver,VER1.lowbyte,ver1.highbyte]


Şimdi sadece CRC(Cyclic Redundancy Check) kullanarak ikincil şahısların etkileşimini min. a indirebiliyoruz.

Bu ürünü öğrendiğimizde aslında 1 isek 2 olacağız bundan kesinlikle eminim.






Erdoğan
İmkansızın zaman aldığı bir dünya'da bana zorluktan bahsetme!

Burak

#6
Alıntı yapılan: erdogan2734 - 27 Haziran 2016, 17:16:56
Burak Hocam Merhaba;
Sistemde SPI haberleşme kullanacağız. Genelde forumlarda gördüğüm örnekler 18f serisi entegrelerde yapılmış.
Benim elimde yüklü miktarda (100 adetden fazla) 16f887 mevcut ve bu işlemcide de donanımsal SPI kullanabiliyoruz.
Eğer işlemci hızımızın NRF24 için bir sakıncası yoksa ben bu işlemciyi kullanmak istiyorum. Siz daha önce bir çok uygulama yapmışsınızdır.
Mimarimi bu işlemci üzerine kursam yarın sorun yaşarmıyım? Direk 18f serisini mi kullanmalıyım.
   
Ayrıca datasheet okudukça ve yazılarınızı takip ettikçe yeni şeyler öğreniyorum.
Ben öncelikle tüm yazılımlarımda ETE hocamızdan öğrendiğimiz şekilde, karışıklık yada araya ikincil şahıslar girmesin diye veri gönderirken bir ön ID yollardım.

Örneğin:
HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]
HSEROUT ["E","R","D",ver,VER1.lowbyte,ver1.highbyte]


Şimdi sadece CRC(Cyclic Redundancy Check) kullanarak ikincil şahısların etkileşimini min. a indirebiliyoruz.

Bu ürünü öğrendiğimizde aslında 1 isek 2 olacağız bundan kesinlikle eminim.

Öncelikle bu tür asenkron iletişim komutlarının senin projenle bir alakası yok eğer var zannediyorsan diye söylüyorum .. İkincisi kullanacağın PIC16F628A olsa bile yinede iş görür çünkü donanımsal SPI kullanmak zorunda değilsin , SHIFTIN , SHIFTOUT komutları yeterince mükemmel ..

Son olarak CRC olayını iyice bir araştırman gerek çünkü bunun input modifier'lar ile bir alakası yok senin hserout komutundaki "E","R","D" karakterleri sadece adresleme ve veribaşı index'i yaratmaya yarar , alıcı tarafta bu karakter WAIT("ERD") şeklinde mevcut olur ..

CRC'de ise diyelim ki iki byte veri göndereceğiz .. Birinci veri , A olsun ikinci veri B olsun .. CRC'nin kendine has algoritması bu değerleri RF işlemcinin kendi içindeki bir polinomla çarparak , bir sonuca ulaştırır örneğin .. 1. polinomu 3 ile çarp ikinciden çıkar 3'e böl 4 ile topla ve sonucu bul şeklinde .. Diyelim ki sonuç 120 çıktı bunuda gönderilecek verilerin sonuncusu olarak bu veri trenine bindirip yollar .. Yani nRF için konuşacak olursak ;

1 byte preamble --> 3-5 byte arasında değişen adres byte'ları --> Asıl gönderilecek veri 0-32 byte arasında değişen ---> CRC byte'ları 1-2 byte arasında değişen ...

Aynı şekilde bu veri alındığında filtrelenip alınan ise sadece asıl verinin kendisidir .. Tabii ki bu veriler ancak CRC de doğruysa FIFO'lara alınır ... Aksi takdirde gelen veriyi chip elimine edip siler .. CRC nasıl doğru olmaz ? Diyelim ki sıcaklık verisi aktarıyoruz .. 1 byte'lık bir veri olsun C' derece üzerinden konuşuyoruz diyelim ..  İlk olarak işlemci 25 derece gönderecek , bu gönderilecek veriyi nRF'e veriyosun nRF bu verinin CRC'sini de hesap edip senin ön adres byte'ların ile birlikte (Diyelim ki buda 3 byte olsun) 5 byte olarak veri gönderiyor . ilk 3 byte adres byte'ları 4. byte verinin kendisi olan 25 derece 5. byte ise CRC verisi olan byte olsun .. Karşıdaki nRF bunu alıp almamakta şu yöntemi güdüyor ..

Adresler uygun mu ?
Gelen veri üzerinden alıcı modül tarafından hesaplanan CRC ile gönderilen CRC eşit mi ? Eşitse bu veri havada kolüzyona uğramadan yani bozunmadan gelmiştir diyerek bu veriyi FIFO'larına aktarıyor ..

Burak
Ω Gens Una Sumus Ω

erdogan2734

Hocam Merhaba;

Bugün ufaktan algoritmayı oluşturmak istiyorum. SPI kullanarak haberleşme yapmak istiyorum.
Öncelikle pin bağlantıları 16f887 dahili 4 Mhz osilator kullandığımı düşünerek yazıyorum.

CE       = RX-TX mode istediğimiz pine bağlayabiliriz.
CSN    = Veri yazmak için kullandığımız pin istediğimiz pine bağlayabilirz.
SCK    = SPI clock Pin PORTC.3 Zorunlumudur?
MOSI  = PORTC.7 rx bacağı. Zorunlumudur?
MISO  = PORTA.6 CLK OUT PIN Zorunlumudur?
IRQ     =Rx de veri geldiğinde kesme oluşturmak istersek PORTB.0, istemezsek istediğimiz bacağa bağlayabiliriz.


SPI haberleşmede SCK-MOSI ve MISO çıkışları için kullandığım pinler zorunlu pinlermidir.
Yoksa kafama göre herhangi bir yere bağlayabilirmiyim.

Önemli bir not: NRF24 ile olduğu gibi SPI haberleşme ile ilgili de daha önce çalışmadığım için sorularım basit gelebilir.
Hiç çalışmadığımı dikkate alırsanız çok sevinirim.
Erdoğan
İmkansızın zaman aldığı bir dünya'da bana zorluktan bahsetme!

Burak

Alıntı yapılan: erdogan2734 - 28 Haziran 2016, 11:43:55
Hocam Merhaba;

Bugün ufaktan algoritmayı oluşturmak istiyorum. SPI kullanarak haberleşme yapmak istiyorum.
Öncelikle pin bağlantıları 16f887 dahili 4 Mhz osilator kullandığımı düşünerek yazıyorum.

CE       = RX-TX mode istediğimiz pine bağlayabiliriz.
CSN    = Veri yazmak için kullandığımız pin istediğimiz pine bağlayabilirz.
SCK    = SPI clock Pin PORTC.3 Zorunlumudur?
MOSI  = PORTC.7 rx bacağı. Zorunlumudur?
MISO  = PORTA.6 CLK OUT PIN Zorunlumudur?
IRQ     =Rx de veri geldiğinde kesme oluşturmak istersek PORTB.0, istemezsek istediğimiz bacağa bağlayabiliriz.


SPI haberleşmede SCK-MOSI ve MISO çıkışları için kullandığım pinler zorunlu pinlermidir.
Yoksa kafama göre herhangi bir yere bağlayabilirmiyim.

Önemli bir not: NRF24 ile olduğu gibi SPI haberleşme ile ilgili de daha önce çalışmadığım için sorularım basit gelebilir.
Hiç çalışmadığımı dikkate alırsanız çok sevinirim.

SPI iletişimde ;

CSN veri alışverişini başlatacak olan kenar düşümünü yada yükselmesini sağlamakla yükümlü pindir ..
MOSI Master'ın veriyi Slave'a ilettiği pindir ;
MISO Slave'ın veriyi Master'a ilettiği pindir ;
SCK Veriyi iletirken yada alırken kullandığımız pulse üretim pinidir .
CE açılımı Chip Enable olan bir pin olup her seri haberleşen işlemcide farklı bir görevi vardır bunu da bu işlemci için datasheet'i okuyup kendin öğrenmen gerek ..

MISO pini giriş diğer tüm pinler çıkış olmak zorunda bu pin için pull-up kullanıp kullanmamak devrenin gürültü immünitesine göre yapılması gereken bir seçimdir ama normalde pull-up kullanılmaması gerekir ..

Bence SPI iletişim ile ilgili block ve çizge diyagramları bir oku , hangi pinden ne çıkarsa ve hangi pin o anda ne olursa neler oluyor sorularını bir oturup çözmen gerek ..

Burak
Ω Gens Una Sumus Ω

erdogan2734

#9
Alıntı yapılan: Burak GÜNAY - 28 Haziran 2016, 13:53:28
SPI iletişimde ;

CSN veri alışverişini başlatacak olan kenar düşümünü yada yükselmesini sağlamakla yükümlü pindir ..
MOSI Master'ın veriyi Slave'a ilettiği pindir ;
MISO Slave'ın veriyi Master'a ilettiği pindir ;
SCK Veriyi iletirken yada alırken kullandığımız pulse üretim pinidir .
CE açılımı Chip Enable olan bir pin olup her seri haberleşen işlemcide farklı bir görevi vardır bunu da bu işlemci için datasheet'i okuyup kendin öğrenmen gerek ..

MISO pini giriş diğer tüm pinler çıkış olmak zorunda bu pin için pull-up kullanıp kullanmamak devrenin gürültü immünitesine göre yapılması gereken bir seçimdir ama normalde pull-up kullanılmaması gerekir ..

Bence SPI iletişim ile ilgili block ve çizge diyagramları bir oku , hangi pinden ne çıkarsa ve hangi pin o anda ne olursa neler oluyor sorularını bir oturup çözmen gerek ..

Burak

Hocam Merhaba;

Burada benin.
CSN pini,CE pini yada SCK pininin işlevi ile ilgili sıkıntım yok.
2 gündür datasheet inceliyorum zaten olmaması gerekir.
Benim sormak istediğim bazı örneklerde MISO-MOSI-SCK pinleri farklı, bazılarında farklı pinlere bağlanmış olduğunu görüyorum.
Bu daha çok nrf24 ile değilde SPI haberleşme ile ilgili olan bir konu sanırım.
Bu sebeple SPI haberleşmeye biraz daha bakacağım.

Sormak istediğim bir konu daha var.
NRF24 İÇİN

WRG_REG    0x00
Bu registere veri yazdırmak için adres olarak 0x00 yolladım,
daha sonra Örneğin CRC enable yapacağım.
0x48'' (01001000) PTX, PWR_Dn, CRC 1 Byte, CRC enabled, MASK_MAX_RT, MASK_TX_DS intterupts reflected On NRF_IRQ
Bunun için 0x00 adresinin ardından 0x48 yollamam yeterlimidir.
Yada bunun için başka bir yolmu deneyeceğiz?.
Aslında registar tablosunu anlamaya çalışıyorum.
Mesela ,yine bir örnek vermek istiyorum.
0x00 yolladım ardında PWR_UP=1 yapmak istiyorum. Bunun için 0x00 ardından 0x4B (01001010) yollamam doğrumudur.


CSN=0
SSPBUF=0x00
WHILE SSPIF=0:WEND
SSPIF=0
SSPBUF=0x4B
WHILE SSPIF=0:WEND
CSN=1


Teşekkür Ederim.


Erdoğan
İmkansızın zaman aldığı bir dünya'da bana zorluktan bahsetme!

Burak

Alıntı YapBenim sormak istediğim bazı örneklerde MISO-MOSI-SCK pinleri farklı, bazılarında farklı pinlere bağlanmış olduğunu görüyorum.
Ne örneği ? Hangi örnekler ?

Alıntı YapCSN=0
SSPBUF=0x00
WHILE SSPIF=0:WEND
SSPIF=0
SSPBUF=0x4B
WHILE SSPIF=0:WEND
CSN=1

Burada donanımsal SPI kullanılıyo açıkcası ben donanımsal SPI kullanmanın bir avantaj olduğunu düşünmüyorum aksine karmaşıklık anlamına geliyor .. Zaten nRF'nin SPI modülü instant felan değil donanımsal ve kendi bufferları var .. İkinci bir donanımsal SPI'ya ne gerek var ? Ben şahsen tercih etmiyorum ..

Son olarak kayıtçılara ulaşım - yazma - okuma ile ilgili formulasyon datasheet'te yeterince güzel ve açık bir şekilde anlatılmış .. Daha dikkatli okuman ve incelemen gerekecek ..

Burak
Ω Gens Una Sumus Ω

erdogan2734

#11
Alıntı yapılan: Burak GÜNAY - 28 Haziran 2016, 16:52:25
Ne örneği ? Hangi örnekler ?

Burada donanımsal SPI kullanılıyo açıkcası ben donanımsal SPI kullanmanın bir avantaj olduğunu düşünmüyorum aksine karmaşıklık anlamına geliyor .. Zaten nRF'nin SPI modülü instant felan değil donanımsal ve kendi bufferları var .. İkinci bir donanımsal SPI'ya ne gerek var ? Ben şahsen tercih etmiyorum ..

Son olarak kayıtçılara ulaşım - yazma - okuma ile ilgili formulasyon datasheet'te yeterince güzel ve açık bir şekilde anlatılmış .. Daha dikkatli okuman ve incelemen gerekecek ..

Burak


Hocam Merhaba;

Siz SHIFTIN-SHIFTOUT komutları ile mi kontrol sağlıyorsunuz?
Yada bana öneriniz kafa karışıklığı olmaması açısından bende bu komutu kullansam ilerde sıkıntı yaşar mıyım?
Erdoğan
İmkansızın zaman aldığı bir dünya'da bana zorluktan bahsetme!

Burak

Aynen ben SPI iletişim komutlarını kullanıyorum , şu ana kadar da hiçbir sıkıntı yaşamadım ..

Burak
Ω Gens Una Sumus Ω

erdogan2734

Alıntı yapılan: Burak GÜNAY - 28 Haziran 2016, 17:14:26
Aynen ben SPI iletişim komutlarını kullanıyorum , şu ana kadar da hiçbir sıkıntı yaşamadım ..

Burak

ETE hocamızın vaktinde paylaştığı bir örnek vardı.
Bu örmekte 
'' SHIFTOUT miso, sck, 1,[ADRES]''
'' SHIFTOUT miso, sck, 1,[KOMUT]''
Şeklinde bir çalışma yapılmıştı.
Bu tarz iletişimde Adres komutu sonrası yollayacağımız veri arasında pause koymamıza gerek varmı sizce?
Bilgi kaçırma olasılığı varmıdır hocam, yada siz herhangi bir gecikme kullanıyormusunuz?
Erdoğan
İmkansızın zaman aldığı bir dünya'da bana zorluktan bahsetme!

Burak

Ben herhangi bir delay kullanmıyorum ..

Burak
Ω Gens Una Sumus Ω

Powered by EzPortal