اطلاعیه

Collapse
No announcement yet.

درخواست راهنمایی در مورد nrf24l01

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    درخواست راهنمایی در مورد nrf24l01

    سلام خدمت همه ی دوستان.
    من می خوام با mega8 یک nrf را کنترل کنم!( کتاب خانه ای که ازش استفاده میکنم را اخر پست گذاشتم)
    ولی متاسفانه طبق روال معمول جواب نداد.
    احتمال میدم توی گیرنده یه مشکلی وجود داشته باشه چون وقتی برنامه به تابع nrf_config(1) میرسه دگ ازش خارج نمیشه.
    . شما کتاب خانه ای که کدویژن تست شده باشه ندارید؟
    ممنون میشم راهنمایی کنید!
    این مدارم هست


    کد فرستند :


    #include <mega8.h>
    #include <delay.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <nRF24L01+.h>
    char inbuff[20],outbuff[20],state=0,a,b[20],c=0;
    char data=1;
    void main(void)
    {
    UCSRA=0X00;
    UCSRB=0X18;
    UCSRC=0X86;
    UBRRH=0x00;
    UBRRL=0x19;
    nRF_Config(0);
    while (1)
    {

    Send_Data(1 , &data);
    delay_ms(100);
    }
    }


    کد گیرنده :
    #include <mega8.h>
    #include <delay.h>
    #include <nRF24L01+.h>
    #define a PORTD.0
    #define b PORTD.1
    #define c PORTD.3
    #define d PORTD.4
    #define e PORTD.5
    #define f PORTD.6
    #define g PORTD.7
    #define h PORTB.2
    #define i PORTB.6
    #define j PORTB.7

    void main(void)
    {
    DDRD.0=1;DDRD.1=1;DDRD.3=1;DDRD.4=1;DDRD.5=1;
    DDRD.6=1;DDRD.7=1;DDRB.2=1;DDRB.6=1;DDRB.7=1;
    nRF_Config(1);
    while (1)
    {
    if(State == 1)
    {
    if(payload[1]==1){a=~a;}
    State=0;
    }

    j=~j;delay_ms(100);

    }
    }


    کد کتاب خانه :
    #ifndef __nRF24L01+_H
    #define __nRF24L01+_H


    #include <nRF24L01+.h>
    #include <stdio.h>
    #include <delay.h>
    // SPI functions
    #include <spi.h>


    #define CE PORTB.0
    #define CSN PORTB.1

    /* Instruction Mnemonics */
    #define R_REGISTER 0x00
    #define W_REGISTER 0x20
    #define REGISTER_MASK 0x1F
    #define ACTIVATE 0x50
    #define R_RX_PL_WID 0x60
    #define R_RX_PAYLOAD 0x61
    #define W_TX_PAYLOAD 0xA0
    #define W_ACK_PAYLOAD 0xA8
    #define FLUSH_TX 0xE1
    #define FLUSH_RX 0xE2
    #define REUSE_TX_PL 0xE3
    #define NOP 0xFF


    /* Memory Map */
    #define CONFIG 0x00
    #define EN_AA 0x01
    #define EN_RXADDR 0x02
    #define SETUP_AW 0x03
    #define SETUP_RETR 0x04
    #define RF_CH 0x05
    #define RF_SETUP 0x06
    #define STATUS 0x07
    #define OBSERVE_TX 0x08
    #define CD 0x09
    #define RX_ADDR_P0 0x0A
    #define RX_ADDR_P1 0x0B
    #define RX_ADDR_P2 0x0C
    #define RX_ADDR_P3 0x0D
    #define RX_ADDR_P4 0x0E
    #define RX_ADDR_P5 0x0F
    #define TX_ADDR 0x10
    #define RX_PW_P0 0x11
    #define RX_PW_P1 0x12
    #define RX_PW_P2 0x13
    #define RX_PW_P3 0x14
    #define RX_PW_P4 0x15
    #define RX_PW_P5 0x16
    #define FIFO_STATUS 0x17
    #define DYNPD 0x1C
    #define FEATURE 0x1D




    #pragma used+
    /* library function prototypes */

    flash unsigned char Base_Addrs[5]={0x00,0x01,0x03,0x07,0x00};
    unsigned char Temp_Addrs[5]={0x00,0x01,0x03,0x07,0x00};
    unsigned char payload[33];
    unsigned char Command_Reg = 0,Status_Reg = 0,State = 0;
    char Opr_Mode;
    bit send_actived = 0;


    void Set_Reg(unsigned char ins)
    {
    int i;
    CSN = 0;
    Status_Reg=spi(ins);
    switch(ins & 0xE0)
    {
    case 0x00:
    {
    if((ins & 0x1F)==0x0A || (ins & 0x1F)==0x0B || (ins & 0x1F)==0x10)
    {
    for(i=4;i>=0;i--)
    {
    Temp_Addrs[i]=spi(NOP);
    }
    }
    else
    {
    Command_Reg=spi(NOP);
    }
    break;
    }
    case W_REGISTER:
    {
    if((ins & 0x1F)==0x0A || (ins & 0x1F)==0x0B || (ins & 0x1F)==0x10)
    {
    for(i=4;i>=0;i--)
    {
    spi(Base_Addrs[i]);
    }
    }
    else
    {
    spi(Command_Reg);
    }
    break;
    }
    case R_RX_PL_WID:
    {
    if((ins & 0x01)==1)
    {
    i=payload[0];
    while(i!=0)
    {
    payload[i]=spi(NOP);
    i--;
    }
    }
    else
    {
    Command_Reg=spi(NOP);
    }
    break;
    }
    case W_TX_PAYLOAD:
    {
    i=payload[0];
    while(i!=0)
    {
    spi(payload[i]);
    i--;
    }
    break;
    }

    }
    CSN=1;
    delay_us(10);
    }




    // External Interrupt 0 service routine
    interrupt [EXT_INT0] void ext_int2_isr(void)
    {
    // Place your code here
    if(Opr_Mode==0)
    {
    Set_Reg(NOP);
    if(Status_Reg & W_REGISTER)
    {
    State = 2;
    Set_Reg(FIFO_STATUS);
    if((Command_Reg & 0x01)==0)
    {
    Set_Reg(R_RX_PL_WID);
    if(Command_Reg<=32)
    {
    payload[0]=Command_Reg;
    Set_Reg(R_RX_PAYLOAD);
    State = 3;
    }
    else
    Set_Reg(FLUSH_RX);
    }
    }
    else
    {
    State = 4;
    }
    }
    else
    {
    Set_Reg(R_RX_PL_WID);
    if(Command_Reg>32)
    {
    Set_Reg(FLUSH_RX);
    }
    else
    {
    payload[0]=Command_Reg;
    Set_Reg(R_RX_PAYLOAD);
    State = 1;
    }
    }
    Command_Reg = 0x7E;
    Set_Reg(0x27);
    Set_Reg(FLUSH_TX);
    }





    void Send_Data(char num , char *data)
    {
    int counter = 0;

    payload[0] = num;

    for(counter=0;counter<num;counter++)
    payload[counter+1] = *(data+counter);

    if(send_actived)
    {
    send_actived = 0;
    if((Temp_Addrs[4]==Base_Addrs[4]) && (Temp_Addrs[3]==Base_Addrs[3]) && (Temp_Addrs[2]==Base_Addrs[2]) && (Temp_Addrs[1]==Base_Addrs[1]) && (Temp_Addrs[0]==Base_Addrs[0]))
    {
    Set_Reg(FLUSH_TX);
    Set_Reg(W_TX_PAYLOAD);
    delay_ms(10);
    CE = 1;
    delay_us(20);
    CE = 0;
    delay_ms(10);
    }
    else
    State = 5;
    }

    if(State!=0)
    {
    send_actived=1; //faal sazi ersal mojadad
    State=0;
    }
    }



    void nRF_Config(char mode)
    {
    // Port B initialization
    // Func7=Out Func6=In Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In
    // State7=0 State6=T State5=0 State4=0 State3=T State2=T State1=T State0=T
    PORTB=0x00;
    DDRB.3=1; DDRB.4=0;DDRB.5=1;//b0

    CSN = 1;
    CE = 0;


    // External Interrupt(s) initialization
    // INT0: On
    // INT1: Off
    // INT2: Off
    // INT0 Mode: Falling Edge
    GICR|=0x40;
    MCUCR=0x02;
    GIFR=0x40;


    // SPI initialization
    // SPI Type: Master
    // SPI Clock Rate: 2000.000 kHz
    // SPI Clock Phase: Cycle Start
    // SPI Clock Polarity: Low
    // SPI Data Order: MSB First
    SPCR=0x50;
    SPSR=0x00;


    #asm("sei")

    delay_ms(110);

    Opr_Mode = mode;

    Command_Reg = 0x01;
    Set_Reg(0x21);

    Command_Reg = 0x01;
    Set_Reg(0x22);

    Command_Reg = 0x03;
    Set_Reg(0x23);

    Command_Reg = 0x2f;
    Set_Reg(0x24);

    Command_Reg = 0x01;
    Set_Reg(0x25);

    Command_Reg = 0x06;
    Set_Reg(0x26);

    Set_Reg(0x2A);

    Set_Reg(0x30);

    Command_Reg = 0x01;
    Set_Reg(0x3C);

    Command_Reg = 0x07;
    Set_Reg(0x3D);

    if(mode==0)
    {
    Command_Reg = 0x4E;
    Set_Reg(W_REGISTER);
    delay_ms(100);
    send_actived = 1;
    }
    else
    {
    Command_Reg = 0x3F;
    Set_Reg(W_REGISTER);
    delay_ms(5);
    CE = 1;
    }
    }


    #pragma used-


    //#pragma library nRF24L01+.lib


    #endif

    جدیدترین ویرایش توسط hosseinghaheri; ۲۰:۰۷ ۱۳۹۵/۰۷/۲۶.

    #2
    پاسخ : درخواست راهنمایی در مورد nrf24l01

    از جواب ها پیداست مثل این که با mega8 نمیشه اینکار را انجام داد!
    به زبون بیسیک هم نمیشه چنین کاری کرد؟
    دوستانی که با مگا 32 تست کردند جواب داده؟

    من کلا میخوام یک ارتباط بیسیم در حد 30 40 متر بین دو تا میکرو بر قرار کنم!
    به نظرتون باید چکار کنم.

    دیدگاه


      #3
      پاسخ : درخواست راهنمایی در مورد nrf24l01

      سلام
      دوست عزیز کاری به میکرو نداره
      خودم به شخصه با مگا 8 راه اندازی کردم و به خوبی جواب گرفتم
      فقط یه چند تا نکته هست که حتما باید رعایت بشه:
      1-خازن حدود 100 میکرو نزدیکترین جا به پایه ولتاژ ماژول قرار بده
      2-اصلا از بردبرد استفاده نکن (من خودم چندین بار روی برد برد بستم ولی جواب نگرفتم یه بار برد زدم و همون دفه اول جواب داد)
      3-اگه از پایه ss میکرو واسه کنترل cs ماژول استفاده نکردی حتما این پایه رو خروجی قرار بده و یکش کن در غیر اینصورت میکرو به حالت مستر نمیره و در حالت اسلیو باقی میمونه

      دیدگاه


        #4
        پاسخ : درخواست راهنمایی در مورد nrf24l01

        سلام!
        شما گفتید از مگا 8 جواب گریفتید!
        میشه سورس و کتاب خونش را قرار بدید.
        خودم از اینترنت گرفتم ولی هر کدومش یه جوره ، واسه همین می خوام تست شده باشه.
        روی برد برد نبستم ، براش pcb زدم.
        خازن 100 میکرو نزاشتم و پایه ce هم به ss وصل نکرده بودم. به b.0 وصله!
        به نظرتون اگه این مشکلات را رفع کنم جواب میده؟

        دیدگاه


          #5
          پاسخ : درخواست راهنمایی در مورد nrf24l01

          آره اصلا ربطی به میکرو نداره که مگا 8 باشه یا چیز دیگه!
          مهم اینه که پروتکل spi رو به صورت سخت افزاری یا نرم افزاری داشته باشید همین!!
          سورس رو من از سروس این تاپیک استفاده کردم ولی چون با avrstudio کار میکنم یکم تغییرش دادم!
          سلام برای راه اندازی ماژول +nRF24L01 موجود در فروشگاه (از اینجا (http://eshop.eca.ir/%D9%85%D8%A7%DA%98%D9%88%D9%84-%D9%87%D8%A7%DB%8C-ism-band/1720-%D9%85%D8%A7%DA%98%D9%88%D9%84-NRF24L01--PA-%D8%A8%D9%87-%D9%87%D9%85%D8%B1%D8%A7%D9%87-%D8%A2%D9%86%D8%AA%D9%86.html) تهیه فرمایید) دو برنامه برای ارسال و دریافت اطلاعات نوشتم.

          پایه ss که 100 درصد مهمه که به صورت خروجی تعریف بشه و یک بشه در غیر اینصورت اصلا جواب نمیده!
          خازن 100 میکرو هم بزارید بهتره ولی بعضی وقتا بدون این خازن هم جواب میده!
          بهتر اینه که بزارید
          ان شالله که مشکلتون حل میشه

          دیدگاه

          لطفا صبر کنید...
          X