اطلاعیه

Collapse
No announcement yet.

نحوه استفاده صحیح از ماژول rfm12b

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

    نحوه استفاده صحیح از ماژول rfm12b

    سلام خدمت همه دوستان عزیز چند وقتی است که سخت درگیر ساخت یک سیتم data transmitter شدم و تفریبا از همه ماژول های موجود در بازار استفاده کردم که از آن جمله می توانم به RFM01 و RFM02 وRFM12و RXQ1 و RXLD1و...... اشاره کنم اما سئوالاتی برای من و جود دارد
    1- وقتی من دستگاهی رو با استفاده از این ماژول ها طراحی می کنم خوب البته دیگران هم از همین ماژول و از همین فرکانسها ISM BAND استفاده می کنند و لذا این باعث ایجاد تداخل می شود من ازماژول RFM12 استفاده می کنم
    2- با کمی تحقیق فهمیدم که می بایست از روش های کدینگ استفاده کنم اما هنوز این مسئله در ذهنم وجود دارد که حتی با کدینگ چطور اطلاعات که به صورت همزمان وبرروی یک باند ارسال می شود باهم تداخل نمی کنند مثلا بلوتوث را در نظر بگیرید همزمان ممکن است چند نفر بصورت دو به دو باهم ارتباط بر قرار کنند و بروری یک فرکانس اما تداخلی ایجاد نمیشود و هیچ هماهنگی نیز بین این دستگاهها وجود ندارد مثلا فرض کنید من دستگاهی را روی باند 433مگا هرتز طراحی کردم پس چطور اطلاعات خود را ارسال کنم وقتی که دیگران هم دارند همین کار رو انجام می دهند!!!!!!!! oo: oo: oo: oo: و سیگنال آنها برای من نویز روی کانال ارتباط محسوب می شود هدف من ایجاد چهار ارتباط دو به دو و به صورت POINT TO POINT در یک محوطه و به صورت سریال است
    فرض کنید که دو تا کامپیوتر که قبلا از طریق سریال پورت به هم به صورت باسیم متصل بودند رو می خوام به صورت بی سیم ارتباط اونها رو بر قرار کنم طرحی که به ذهن خودم رسید این است که از دوتا ماژول RFM12 و دو تا ATMEGA8 استفاده کنم که این دو تا میکرو وظیفه دارند تا اطلاعات دریافت شده از پورت سریال خودشون رو با ماژول ارسال و اطلاعات در یافتی از ماژول رو به پورت سریال خودشون ار سال کنند در اصل میکرو ها در حکم یک واسط جهت ار سال و در یافت اطلاعات می باشند

    3-مطلب بعدی آنکه اگر بخواهم یک ارتباط HALF DUPLEX داشته باشم می بایست از چهار ماژول استفاده کنم یا دو ماژول کفایت می کند همانگونه که قبلا هم گفتم تمام ایستگاه های من با یک PC در ارتباط هستند یعنی من قصد دارم تا اطلاعات خود رو از طریق پورت سریال به یک میکرو ATMEGA8 بدهم و این میکرو اطلاعات رو از طریق ماژول RFM12 ارسال کنه و یک ماژول دیگه که به یک ATMEGA8 دیگه متصل است این اطلاعات رو گرفته و در نهایت این اطلاعات از پورت سریال این ایستگاه قابل دسترسی باشه در اصل می خواهم یک ارتباط سریال باسیم رو تبدیل به بی سیم کنم و ابته به صورت HALF DUPLEX
    4-وقتی یک ایستگاه اطلاعاتی رو ارسال می کنه می بایست مقصد تایید کنه ack یا نه
    لطفا راهنمایی کنید :applause: :applause: :applause: :cry2: :cry2: :cry2:
    به دیگران بیاموز تا بتو بیاموزند
    bioosun@gmail.com

    #2
    پاسخ : نحوه استفاده صحیح از ماژول rfm12b

    آقا یه سوال که شاید زیاد ربط نداشته باشه، برنامه ی خود دیتاشیت RFM12 کار می کنه؟
    There is nothing so practical as a good theory. — Kurt Lewin, 1951

    دیدگاه


      #3
      پاسخ : نحوه استفاده صحیح از ماژول rfm12b

      اکثر اینها دارای کانال های مختلف می باشند . مثلا bluetooth فکر میکنم خونده بودم که 400 کانال مجزا به فاصله 10 مگاهرتز داشت . (آ‌ اعدادش دقیقا یادم نیست ) .

      در دیتاشیت چیزی مثل تعداد کانال ها ذکر نشده ؟!
      فتو بلاگ من
      کاردستی ها :
      روبات شطرنج باز ( یادگار دوران جوانی )
      فارسی نویسی مستقیم در نمایشگر های گرافیکی
      کتابچه خود آموز زبان توصیف سخت افزار Verilog

      دیدگاه


        #4
        پاسخ : نحوه استفاده صحیح از ماژول rfm12b

        برنامش کار میکنه :nice: :nice: دوستان اگر امکان داره را هنمایی کنند (( جناب نحوی - جناب یار محمدی)) :cry2: :cry2:
        به دیگران بیاموز تا بتو بیاموزند
        bioosun@gmail.com

        دیدگاه


          #5
          پاسخ : نحوه استفاده صحیح از ماژول rfm12b

          سلام
          برنامه توی سایتش کار میکنه،اما اگر درست یادم باشه نصفش اضافه بود :biggrin:
          اگر میخوای اطلاعات رو کد کنی توصیه میکنم از روش TEA استفاده کنی(مراجعه کن به مقاله طراحی سیستم امنیتی بر پایه مادون قرمز توی بخش دانلود)
          جواب سوال راجع به تداخل رو نمیدونم ولی علاقه دارم بفهمم
          برای ارتباط HALF DUPLEX فکر میکنم همون دوتا کافی باشه
          در مورد سوال چهارم باید بگم این بستگی به پروتکلی داره که شما طراحی میکنید(همون برنامه ای که مینوسی)،مثلا اگر شما فرستنده از دریافت اطلاعات توسط گیرنده گاه بشه ارتباط قوی تر و مطمئن تری رو دارید
          در دیر مغان آمد یارم قدحی در دست
          مست از می می خواران از نرگس مستش مست

          دیدگاه


            #6
            پاسخ : نحوه استفاده صحیح از ماژول rfm12b

            از لطف شما بی نهایت ممنون
            من برنامه رو باز نویسی کردم و اون رو طوری نوشتم با ACK از طرف گیرنده برای فرستنده ار سال بشه اما مشکلی که وجود دارد این است که چون مراحل و دستورات خیلی هستند سرعت به شدت پاییه و با وجود اینکه این ماژول قدرت ارسال اطلاعات با سرعت 115 کیلو بیت رو داره اما به دلیل مراحل طولانی کار هرگز به چنین سرعتی نرسیدم و حداکثر سرعت به 119 بایت بر ثانیه محدود میشه حالا نمی دونم چکار کنم این هم دروغی از کار در اومد
            من سرعتش رو با یک برنامه روی PC که با دلفی نوشتم اندازه گیری کردم :angry: :angry: :angry: :angry: :angry:
            به دیگران بیاموز تا بتو بیاموزند
            bioosun@gmail.com

            دیدگاه


              #7
              پاسخ : نحوه استفاده صحیح از ماژول rfm12b

              سلام
              یک برنامه عادی (بدون مراحلی که فرمودید) بنویسید و ببینید حداکثر با چه سرعتی میتونید دیتا بفرستید
              اگر میتونید سرعتش رو با خود میکرو اندازه بگیرید
              در دیر مغان آمد یارم قدحی در دست
              مست از می می خواران از نرگس مستش مست

              دیدگاه


                #8
                پاسخ : نحوه استفاده صحیح از ماژول rfm12b

                با سلام خدمت شما جناب یار محمدی . یک مشکل در ارتباط با تنظیم صحیح ماژول دارم یعنی تابع RF12_INT . متاسفانه برنامه ای که در دیتاشیت ماژول وجود دارد کار نمی کند و من برنامه ای رو که در سایت وجود داره استفاده کردم و درست هم بود ولی وقتی خواستم سرعت رو بالا ببرم ماژول کار نکرد

                void RF12recieve_INIT(void){
                RFrecieve_WRT_CMD(0x80E7);//EL,EF,868band,11.5pF
                RFrecieve_WRT_CMD(0x8239);//!er,!ebb,ET,ES,EX,!eb,!ew,DC
                RFrecieve_WRT_CMD(0xA640);//860.8MHz
                RFrecieve_WRT_CMD(0xC647);//4.8kbps
                RFrecieve_WRT_CMD(0x94A0);//VDI,FAST,134kHz,0dBm,-103dBm
                RFrecieve_WRT_CMD(0xC2AC);//AL,!ml,DIG,DQD4
                RFrecieve_WRT_CMD(0xCA81);//FIFO8,SYNC,!ff,DR
                RFrecieve_WRT_CMD(0xCED4);//SYNC=2DD4
                RFrecieve_WRT_CMD(0xC483);//@PWR,NO RSTRIC,!st,!fi,OE,EN
                RFrecieve_WRT_CMD(0x9850);//!mp,9810=30kHz,MAX OUT
                RFrecieve_WRT_CMD(0xCC67);//OB1,OB0,!1PX,!DDY,DDIT,BWO
                RFrecieve_WRT_CMD(0xE000);//NOT USE
                RFrecieve_WRT_CMD(0xC800);//NOT USE
                RFrecieve_WRT_CMD(0xC400);//1.66MHz,2.2V
                }
                من از ماژول با فرکانس 868 مگاهرتز استفاده می کنم برای تنظیم سرعت روی 100 کیلو بیت برثانیه باید کد 0x8203 به جای 0x8247 ارسال گردد اما با ارسال این کد ماژول از کار می افتد در دیتاشیت برنامه RF_int هم برای فرستنده و هم گیرنده یکسان است ولی در عمل اینطور نیست و این دو روتین باهم تفاوت دارند

                روتین در گیرنده

                void RF12recieve_INIT(void){
                RFrecieve_WRT_CMD(0x80E7);//EL,EF,868band,11.5pF
                RFrecieve_WRT_CMD(0x8239);//!er,!ebb,ET,ES,EX,!eb,!ew,DC
                RFrecieve_WRT_CMD(0xA640);//860.8MHz
                RFrecieve_WRT_CMD(0xC647);//100kbps
                RFrecieve_WRT_CMD(0x94A0);//VDI,FAST,134kHz,0dBm,-103dBm
                RFrecieve_WRT_CMD(0xC2AC);//AL,!ml,DIG,DQD4
                RFrecieve_WRT_CMD(0xCA81);//FIFO8,SYNC,!ff,DR
                RFrecieve_WRT_CMD(0xCED4);//SYNC=2DD4
                RFrecieve_WRT_CMD(0xC483);//@PWR,NO RSTRIC,!st,!fi,OE,EN
                RFrecieve_WRT_CMD(0x9850);//!mp,9810=30kHz,MAX OUT
                RFrecieve_WRT_CMD(0xCC67);//OB1,OB0,!1PX,!DDY,DDIT,BWO
                RFrecieve_WRT_CMD(0xE000);//NOT USE
                RFrecieve_WRT_CMD(0xC800);//NOT USE
                RFrecieve_WRT_CMD(0xC400);//1.66MHz,2.2V
                }

                روتین در فرستنده

                void RF12send_INIT(void){
                RFsend_WRT_CMD(0x80E7);//EL,EF,868band,12.0pF
                RFsend_WRT_CMD(0x8239);//!er,!ebb,ET,ES,EX,!eb,!ew,DC
                RFsend_WRT_CMD(0xA640);//860.8MHz
                RFsend_WRT_CMD(0xC647);//19.2kbps
                RFsend_WRT_CMD(0x94A0);//VDI,FAST,134kHz,0dBm,-103dBm
                RFsend_WRT_CMD(0xC2AC);//AL,!ml,DIG,DQD4
                RFsend_WRT_CMD(0xCA81);//FIFO8,SYNC,!ff,DR
                RFsend_WRT_CMD(0xCED4);//SYNC=2DD4
                RFsend_WRT_CMD(0xC483);//@PWR,NO RSTRIC,!st,!fi,OE,EN
                RFsend_WRT_CMD(0x9850);//!mp,9810=30kHz,MAX OUT
                RFsend_WRT_CMD(0xCC67);//OB1,OB0,!1PX,!DDY,DDIT,BWO
                RFsend_WRT_CMD(0xE000);//NOT USE
                RFsend_WRT_CMD(0xC800);//NOT USE
                RFsend_WRT_CMD(0xC400);//1.66MHz,2.2V
                }

                برنامه ای رو جهت تست برروی دو میکرو که به دو ماژول متصل هستند نوشتم که اولی یک رشته رو مکرر به دومی ارسال می کنه و گیرنده هم این اطلاعات رو به پورت سریال ارسال می کنه
                قبل از این آزمایش من یک برنامه نوشتم که در یک حلقه بی نهایت یک رشته رو با بادریت 9600 ارسال می کرد

                while(1){
                putsf("HOW ARE YOU"
                }

                سپس با یک برنامه که تعداد بایت ها رو در یک ثانیه اندازه گیری می کرد عدد 960 بایت رو دیدم چرا که هر ارتباط سریال 10 بیت است و بنابراین 960 بایت حداکثر می تواند با این بادریت در یک ثانیه منتقل شود
                بعد از این آزمایش این رشته رو در فرستنده قرار دادم و در گیرنده از طریق پورت سریال میکرو گیرنده به کامپیوتر دادم تا متوجه شوم که سرعت چقدر افت کرده

                به دیگران بیاموز تا بتو بیاموزند
                bioosun@gmail.com

                دیدگاه


                  #9
                  پاسخ : نحوه استفاده صحیح از ماژول rfm12b

                  برنامه فرستنده

                  #include <mega8.h>
                  #include <stdlib.h>
                  #include <stdio.h>
                  #include <delay.h>
                  char buff[16];
                  bit QC_flag;
                  /*Connections

                  ATMEGA8 SIDE RF12 SIDE
                  SCK--------------->SCK
                  MISO--------------->SDO
                  MOSI--------------->SDI
                  SS--------------->nSEL
                  INT0<---------------nIRQ

                  PD6: LED GREEN
                  PD7: LED RED

                  */
                  //****************************define**************** *****************//
                  #define DDR_IN 0
                  #define DDR_OUT 1

                  #define PORT_SEL PORTB
                  #define PIN_SEL PINB
                  #define DDR_SEL DDRB

                  #define PORT_SDI PORTB
                  #define PIN_SDI PINB
                  #define DDR_SDI DDRB

                  #define PORT_SCK PORTB
                  #define PIN_SCK PINB
                  #define DDR_SCK DDRB

                  #define PORT_SDO PORTB
                  #define PIN_SDO PINB
                  #define DDR_SDO DDRB

                  #define PORT_IRQ PORTD
                  #define PIN_IRQ PIND
                  #define DDR_IRQ DDRD

                  #define PORT_DATA PORTD
                  #define PIN_DATA PIND
                  #define DDR_DATA DDRD

                  #define PB7 7//--\
                  #define PB6 6// |
                  #define RFXX_SCK 5// |
                  #define RFXX_SDO 4// |RF_PORT
                  #define RFXX_SDI 3// |
                  #define RFXX_SEL 2// |
                  #define NC 1// |
                  #define PB0 0//--/

                  #define SEL_OUTPUT() DDR_SEL |= (1<<RFXX_SEL)
                  #define HI_SEL() PORT_SEL|= (1<<RFXX_SEL)
                  #define LOW_SEL() PORT_SEL&=~(1<<RFXX_SEL)

                  #define SDI_OUTPUT() DDR_SDI |= (1<<RFXX_SDI)
                  #define HI_SDI() PORT_SDI|= (1<<RFXX_SDI)
                  #define LOW_SDI() PORT_SDI&=~(1<<RFXX_SDI)

                  #define SDO_INPUT() DDR_SDO&= ~(1<<RFXX_SDO)
                  #define LOW_SDO() PORT_SDO&= (1<<RFXX_SDO)
                  #define SDO_HI() PIN_SDO&(1<<RFXX_SDO)

                  #define SCK_OUTPUT() DDR_SCK |= (1<<RFXX_SCK)
                  #define HI_SCK() PORT_SCK|= (1<<RFXX_SCK)
                  #define LOW_SCK() PORT_SCK&=~(1<<RFXX_SCK)

                  ////////////////////////////////
                  #define RF12_IRQ 2
                  #define IRQ_IN() DDR_IRQ &=~(1<<RF12_IRQ)
                  #define WAIT_IRQ_LOW() while(PIND&(1<<RF12_IRQ))
                  //////////////////////////////

                  #define RF12_DATA 4//PD4
                  #define DATA_OUT() DDR_DATA|=1<<RF12_DATA
                  #define HI_DATA() PORT_DATA|=1<<RF12_DATA

                  #define LEDG_OUTPUT() DDRD|=~(1<<6)
                  #define LEDR_OUTPUT() DDRD|=~(1<<7)

                  #define LEDG_ON() PORTD&=~(1<<6)
                  #define LEDG_OFF() PORTD|= (1<<6)
                  #define LEDR_ON() PORTD&=~(1<<7)
                  #define LEDR_OFF() PORTD|= (1<<7)

                  //****************************** *******************************//
                  /////////////////////////////////////////////////////////////////
                  // ********************basic function for recive data ********//
                  /////////////////////////////////////////////////////////////////
                  void RFrecieve_PORT_INIT(void){
                  HI_SEL();
                  HI_SDI();
                  LOW_SCK();
                  //SET nFFS pin HI when using FIFO
                  HI_DATA();
                  SEL_OUTPUT();
                  SDI_OUTPUT();
                  SDO_INPUT();
                  SCK_OUTPUT();
                  IRQ_IN();
                  DATA_OUT();
                  }

                  unsigned int RFrecieve_WRT_CMD(unsigned int aCmd){
                  unsigned char i;
                  unsigned int temp;
                  temp=0;
                  LOW_SCK();
                  LOW_SEL();
                  for(i=0;i<16;i++){
                  if(aCmd&0x8000){
                  HI_SDI();
                  }else{
                  LOW_SDI();
                  }
                  HI_SCK();
                  temp<<=1;
                  if(SDO_HI()){
                  temp|=0x0001;
                  }
                  LOW_SCK();

                  aCmd<<=1;
                  };
                  HI_SEL();
                  return(temp);
                  }

                  void RF12recieve_INIT(void){
                  RFrecieve_WRT_CMD(0x80E7);//EL,EF,868band,11.5pF
                  RFrecieve_WRT_CMD(0x8239);//!er,!ebb,ET,ES,EX,!eb,!ew,DC
                  RFrecieve_WRT_CMD(0xA640);//860.8MHz
                  RFrecieve_WRT_CMD(0xC647);//100kbps
                  RFrecieve_WRT_CMD(0x94A0);//VDI,FAST,134kHz,0dBm,-103dBm
                  RFrecieve_WRT_CMD(0xC2AC);//AL,!ml,DIG,DQD4
                  RFrecieve_WRT_CMD(0xCA81);//FIFO8,SYNC,!ff,DR
                  RFrecieve_WRT_CMD(0xCED4);//SYNC=2DD4
                  RFrecieve_WRT_CMD(0xC483);//@PWR,NO RSTRIC,!st,!fi,OE,EN
                  RFrecieve_WRT_CMD(0x9850);//!mp,9810=30kHz,MAX OUT
                  RFrecieve_WRT_CMD(0xCC67);//OB1,OB0,!1PX,!DDY,DDIT,BWO
                  RFrecieve_WRT_CMD(0xE000);//NOT USE
                  RFrecieve_WRT_CMD(0xC800);//NOT USE
                  RFrecieve_WRT_CMD(0xC400);//1.66MHz,2.2V
                  }

                  unsigned char RF12_RECV(void){
                  unsigned int FIFO_data;
                  WAIT_IRQ_LOW();
                  RFrecieve_WRT_CMD(0x0000);
                  FIFO_data=RFrecieve_WRT_CMD(0xB000);
                  return(FIFO_data&0x00FF);
                  }
                  ////////////////////////////////////////////////////////////////////////////////
                  //************************* basic functon for transmiting data****************//
                  ////////////////////////////////////////////////////////////////////////////////
                  void RFsend_PORT_INIT(void){
                  HI_SEL();
                  HI_SDI();
                  LOW_SCK();
                  SEL_OUTPUT();
                  SDI_OUTPUT();
                  SDO_INPUT();
                  SCK_OUTPUT();
                  }

                  unsigned int RFsend_WRT_CMD(unsigned int aCmd){
                  unsigned char i;
                  unsigned int temp;
                  LOW_SCK();
                  LOW_SEL();
                  for(i=0;i<16;i++){
                  temp<<=1;
                  if(SDO_HI()){
                  temp|=0x0001;
                  }
                  LOW_SCK();
                  if(aCmd&0x8000){
                  HI_SDI();

                  }else{
                  LOW_SDI();
                  }
                  HI_SCK();
                  aCmd<<=1;
                  };
                  LOW_SCK();
                  HI_SEL();
                  return(temp);
                  }

                  void RF12send_INIT(void){
                  RFsend_WRT_CMD(0x80E7);//EL,EF,868band,12.0pF
                  RFsend_WRT_CMD(0x8239);//!er,!ebb,ET,ES,EX,!eb,!ew,DC
                  RFsend_WRT_CMD(0xA640);//860.8MHz
                  RFsend_WRT_CMD(0xC647);//19.2kbps
                  RFsend_WRT_CMD(0x94A0);//VDI,FAST,134kHz,0dBm,-103dBm
                  RFsend_WRT_CMD(0xC2AC);//AL,!ml,DIG,DQD4
                  RFsend_WRT_CMD(0xCA81);//FIFO8,SYNC,!ff,DR
                  RFsend_WRT_CMD(0xCED4);//SYNC=2DD4
                  RFsend_WRT_CMD(0xC483);//@PWR,NO RSTRIC,!st,!fi,OE,EN
                  RFsend_WRT_CMD(0x9850);//!mp,9810=30kHz,MAX OUT
                  RFsend_WRT_CMD(0xCC67);//OB1,OB0,!1PX,!DDY,DDIT,BWO
                  RFsend_WRT_CMD(0xE000);//NOT USE
                  RFsend_WRT_CMD(0xC800);//NOT USE
                  RFsend_WRT_CMD(0xC400);//1.66MHz,2.2V
                  }

                  void RF12_SEND(unsigned char aByte){
                  while(PIND&(1<<2));//wait for previously TX over
                  RFsend_WRT_CMD(0xB800+aByte);
                  }

                  ////////////////////////////////////////////////////////////////////
                  ///////////////////////////main function for data recieve//////////
                  ///////////////////////////////////////////////////////////////////

                  void DataRecieve(void)
                  {
                  unsigned char i;
                  unsigned char ChkSum;

                  //Initialize command port
                  RFrecieve_PORT_INIT();

                  //Initialize RF12 chip
                  RF12recieve_INIT();

                  //Init FIFO
                  RFrecieve_WRT_CMD(0xCA81);
                  //Enable FIFO
                  RFrecieve_WRT_CMD(0xCA83);
                  ChkSum=0;
                  // Receive payload data
                  for(i=0;i<16;i++){
                  buff[i]=RF12_RECV();
                  ChkSum+=buff[i];
                  }
                  //Receive Check sum
                  i=RF12_RECV();
                  //Disable FIFO
                  RFrecieve_WRT_CMD(0xCA81);

                  if(ChkSum==i){
                  QC_flag=1;
                  /////////////////////////////////////////////////////
                  // ********* sending ack for transmiter************//
                  ////////////////////////////////////////////////////
                  DDRB=0x00;
                  DDRD=0x00;
                  RFsend_PORT_INIT();
                  RF12send_INIT();
                  DDRD|=(1<<RF12_DATA);
                  PORTD|=(1<<RF12_DATA);// SET nFFS pin HI when using TX register
                  DDRD&=~(1<<2); //PD2(INT0)
                  RFsend_WRT_CMD(0x0000);//read status register
                  RFsend_WRT_CMD(0x8239);//!er,!ebb,ET,ES,EX,!eb,!ew,DC
                  RF12_SEND(0xAA);//PREAMBLE
                  RF12_SEND(0xAA);//PREAMBLE
                  RF12_SEND(0xAA);//PREAMBLE
                  RF12_SEND(0x2D);//SYNC HI BYTE
                  RF12_SEND(0xD4);//SYNC LOW BYTE
                  RF12_SEND('T'//send ack
                  RF12_SEND(0xAA);//DUMMY BYTE
                  RF12_SEND(0xAA);//DUMMY BYTE
                  RF12_SEND(0xAA);//DUMMY BYTE
                  RFsend_WRT_CMD(0x8201);
                  //////////////////////////////////////////////////////////
                  /////////////////////////////////////////////////////////


                  }
                  else
                  {
                  QC_flag=0;
                  };
                  }

                  //////////////////////////////////////////////////////////////////
                  ////////////////////// main function for send data///////////////
                  /////////////////////////////////////////////////////////////////
                  char DataSend(void)
                  {
                  unsigned char ChkSum;
                  unsigned char ack='F';
                  unsigned int FIFO_data;
                  DDRB=0x00;
                  DDRD=0x00;
                  RFsend_PORT_INIT();
                  RF12send_INIT();

                  DDRD|=(1<<RF12_DATA);
                  PORTD|=(1<<RF12_DATA);// SET nFFS pin HI when using TX register
                  DDRD&=~(1<<2); //PD2(INT0)

                  LEDR_ON();
                  RFsend_WRT_CMD(0x0000);//read status register
                  RFsend_WRT_CMD(0x8239);//!er,!ebb,ET,ES,EX,!eb,!ew,DC

                  ChkSum=0;
                  RF12_SEND(0xAA);//PREAMBLE
                  RF12_SEND(0xAA);//PREAMBLE
                  RF12_SEND(0xAA);//PREAMBLE
                  RF12_SEND(0x2D);//SYNC HI BYTE
                  RF12_SEND(0xD4);//SYNC LOW BYTE

                  RF12_SEND(buff[0]);//DATA BYTE 0
                  ChkSum+=buff[0];
                  RF12_SEND(buff[1]);//DATA BYTE 1
                  ChkSum+=buff[1];
                  RF12_SEND(buff[2]);
                  ChkSum+=buff[2];
                  RF12_SEND(buff[3]);
                  ChkSum+=buff[3];
                  RF12_SEND(buff[4]);
                  ChkSum+=buff[4];
                  RF12_SEND(buff[5]);
                  ChkSum+=buff[5];
                  RF12_SEND(buff[6]);
                  ChkSum+=buff[6];
                  RF12_SEND(buff[7]);
                  ChkSum+=buff[7];
                  RF12_SEND(buff[8]);
                  ChkSum+=buff[8];
                  RF12_SEND(buff[9]);
                  ChkSum+=buff[9];
                  RF12_SEND(buff[10]);
                  ChkSum+=buff[10];
                  RF12_SEND(buff[11]);
                  ChkSum+=buff[11];
                  RF12_SEND(buff[12]);
                  ChkSum+=buff[12];
                  RF12_SEND(buff[13]);
                  ChkSum+=buff[13];
                  RF12_SEND(buff[14]);
                  ChkSum+=buff[14];
                  RF12_SEND(buff[15]); //DATA BYTE 15
                  ChkSum+=buff[15];
                  RF12_SEND(ChkSum);
                  RF12_SEND(0xAA);//DUMMY BYTE
                  RF12_SEND(0xAA);//DUMMY BYTE
                  RF12_SEND(0xAA);//DUMMY BYTE
                  RFsend_WRT_CMD(0x8201);

                  }
                  ////////////////////////////////////////////////////////////////////
                  ///////////////////////////////////////////////////////////////////



                  void main(void)
                  {

                  .......

                  buff[0]='*';
                  buff[1]='H';
                  buff[2]='O';
                  buff[3]='W';
                  buff[4]='';
                  buff[5]='A';
                  buff[6]='R';
                  buff[7]='E';
                  buff[8]='';
                  buff[9]='Y';
                  buff[10]='O';
                  buff[11]='U';
                  buff[12]='*';
                  buff[13]='*';
                  buff[14]='*';
                  buff[15]='*';


                  while (1)
                  {
                  DataSend();
                  }

                  به دیگران بیاموز تا بتو بیاموزند
                  bioosun@gmail.com

                  دیدگاه


                    #10
                    پاسخ : نحوه استفاده صحیح از ماژول rfm12b

                    برنامه در گیرنده
                    #include <mega8.h>
                    #include <stdlib.h>
                    #include <stdio.h>
                    #include <delay.h>
                    char buff[16];
                    bit QC_flag;
                    /*Connections

                    ATMEGA8 SIDE RF12 SIDE
                    SCK--------------->SCK
                    MISO--------------->SDO
                    MOSI--------------->SDI
                    SS--------------->nSEL
                    INT0<---------------nIRQ

                    PD6: LED GREEN
                    PD7: LED RED

                    */
                    //****************************define**************** *****************//
                    #define DDR_IN 0
                    #define DDR_OUT 1

                    #define PORT_SEL PORTB
                    #define PIN_SEL PINB
                    #define DDR_SEL DDRB

                    #define PORT_SDI PORTB
                    #define PIN_SDI PINB
                    #define DDR_SDI DDRB

                    #define PORT_SCK PORTB
                    #define PIN_SCK PINB
                    #define DDR_SCK DDRB

                    #define PORT_SDO PORTB
                    #define PIN_SDO PINB
                    #define DDR_SDO DDRB

                    #define PORT_IRQ PORTD
                    #define PIN_IRQ PIND
                    #define DDR_IRQ DDRD

                    #define PORT_DATA PORTD
                    #define PIN_DATA PIND
                    #define DDR_DATA DDRD

                    #define PB7 7//--\
                    #define PB6 6// |
                    #define RFXX_SCK 5// |
                    #define RFXX_SDO 4// |RF_PORT
                    #define RFXX_SDI 3// |
                    #define RFXX_SEL 2// |
                    #define NC 1// |
                    #define PB0 0//--/

                    #define SEL_OUTPUT() DDR_SEL |= (1<<RFXX_SEL)
                    #define HI_SEL() PORT_SEL|= (1<<RFXX_SEL)
                    #define LOW_SEL() PORT_SEL&=~(1<<RFXX_SEL)

                    #define SDI_OUTPUT() DDR_SDI |= (1<<RFXX_SDI)
                    #define HI_SDI() PORT_SDI|= (1<<RFXX_SDI)
                    #define LOW_SDI() PORT_SDI&=~(1<<RFXX_SDI)

                    #define SDO_INPUT() DDR_SDO&= ~(1<<RFXX_SDO)
                    #define LOW_SDO() PORT_SDO&= (1<<RFXX_SDO)
                    #define SDO_HI() PIN_SDO&(1<<RFXX_SDO)

                    #define SCK_OUTPUT() DDR_SCK |= (1<<RFXX_SCK)
                    #define HI_SCK() PORT_SCK|= (1<<RFXX_SCK)
                    #define LOW_SCK() PORT_SCK&=~(1<<RFXX_SCK)

                    ////////////////////////////////
                    #define RF12_IRQ 2
                    #define IRQ_IN() DDR_IRQ &=~(1<<RF12_IRQ)
                    #define WAIT_IRQ_LOW() while(PIND&(1<<RF12_IRQ))
                    //////////////////////////////

                    #define RF12_DATA 4//PD4
                    #define DATA_OUT() DDR_DATA|=1<<RF12_DATA
                    #define HI_DATA() PORT_DATA|=1<<RF12_DATA

                    #define LEDG_OUTPUT() DDRD|=~(1<<6)
                    #define LEDR_OUTPUT() DDRD|=~(1<<7)

                    #define LEDG_ON() PORTD&=~(1<<6)
                    #define LEDG_OFF() PORTD|= (1<<6)
                    #define LEDR_ON() PORTD&=~(1<<7)
                    #define LEDR_OFF() PORTD|= (1<<7)

                    //****************************** *******************************//
                    /////////////////////////////////////////////////////////////////
                    // ********************basic function for recive data ********//
                    /////////////////////////////////////////////////////////////////
                    void RFrecieve_PORT_INIT(void){
                    HI_SEL();
                    HI_SDI();
                    LOW_SCK();
                    //SET nFFS pin HI when using FIFO
                    HI_DATA();
                    SEL_OUTPUT();
                    SDI_OUTPUT();
                    SDO_INPUT();
                    SCK_OUTPUT();
                    IRQ_IN();
                    DATA_OUT();
                    }

                    unsigned int RFrecieve_WRT_CMD(unsigned int aCmd){
                    unsigned char i;
                    unsigned int temp;
                    temp=0;
                    LOW_SCK();
                    LOW_SEL();
                    for(i=0;i<16;i++){
                    if(aCmd&0x8000){
                    HI_SDI();
                    }else{
                    LOW_SDI();
                    }
                    HI_SCK();
                    temp<<=1;
                    if(SDO_HI()){
                    temp|=0x0001;
                    }
                    LOW_SCK();

                    aCmd<<=1;
                    };
                    HI_SEL();
                    return(temp);
                    }

                    void RF12recieve_INIT(void){
                    RFrecieve_WRT_CMD(0x80E7);//EL,EF,868band,11.5pF
                    RFrecieve_WRT_CMD(0x8239);//!er,!ebb,ET,ES,EX,!eb,!ew,DC
                    RFrecieve_WRT_CMD(0xA640);//860.8MHz
                    RFrecieve_WRT_CMD(0xC647);//100kbps
                    RFrecieve_WRT_CMD(0x94A0);//VDI,FAST,134kHz,0dBm,-103dBm
                    RFrecieve_WRT_CMD(0xC2AC);//AL,!ml,DIG,DQD4
                    RFrecieve_WRT_CMD(0xCA81);//FIFO8,SYNC,!ff,DR
                    RFrecieve_WRT_CMD(0xCED4);//SYNC=2DD4
                    RFrecieve_WRT_CMD(0xC483);//@PWR,NO RSTRIC,!st,!fi,OE,EN
                    RFrecieve_WRT_CMD(0x9850);//!mp,9810=30kHz,MAX OUT
                    RFrecieve_WRT_CMD(0xCC67);//OB1,OB0,!1PX,!DDY,DDIT,BWO
                    RFrecieve_WRT_CMD(0xE000);//NOT USE
                    RFrecieve_WRT_CMD(0xC800);//NOT USE
                    RFrecieve_WRT_CMD(0xC400);//1.66MHz,2.2V
                    }

                    unsigned char RF12_RECV(void){
                    unsigned int FIFO_data;
                    WAIT_IRQ_LOW();
                    RFrecieve_WRT_CMD(0x0000);
                    FIFO_data=RFrecieve_WRT_CMD(0xB000);
                    return(FIFO_data&0x00FF);
                    }
                    ////////////////////////////////////////////////////////////////////////////////
                    //************************* basic functon for transmiting data****************//
                    ////////////////////////////////////////////////////////////////////////////////
                    void RFsend_PORT_INIT(void){
                    HI_SEL();
                    HI_SDI();
                    LOW_SCK();
                    SEL_OUTPUT();
                    SDI_OUTPUT();
                    SDO_INPUT();
                    SCK_OUTPUT();
                    }

                    unsigned int RFsend_WRT_CMD(unsigned int aCmd){
                    unsigned char i;
                    unsigned int temp;
                    LOW_SCK();
                    LOW_SEL();
                    for(i=0;i<16;i++){
                    temp<<=1;
                    if(SDO_HI()){
                    temp|=0x0001;
                    }
                    LOW_SCK();
                    if(aCmd&0x8000){
                    HI_SDI();

                    }else{
                    LOW_SDI();
                    }
                    HI_SCK();
                    aCmd<<=1;
                    };
                    LOW_SCK();
                    HI_SEL();
                    return(temp);
                    }

                    void RF12send_INIT(void){
                    RFsend_WRT_CMD(0x80E7);//EL,EF,868band,12.0pF
                    RFsend_WRT_CMD(0x8239);//!er,!ebb,ET,ES,EX,!eb,!ew,DC
                    RFsend_WRT_CMD(0xA640);//860.8MHz
                    RFsend_WRT_CMD(0xC647);//19.2kbps
                    RFsend_WRT_CMD(0x94A0);//VDI,FAST,134kHz,0dBm,-103dBm
                    RFsend_WRT_CMD(0xC2AC);//AL,!ml,DIG,DQD4
                    RFsend_WRT_CMD(0xCA81);//FIFO8,SYNC,!ff,DR
                    RFsend_WRT_CMD(0xCED4);//SYNC=2DD4
                    RFsend_WRT_CMD(0xC483);//@PWR,NO RSTRIC,!st,!fi,OE,EN
                    RFsend_WRT_CMD(0x9850);//!mp,9810=30kHz,MAX OUT
                    RFsend_WRT_CMD(0xCC67);//OB1,OB0,!1PX,!DDY,DDIT,BWO
                    RFsend_WRT_CMD(0xE000);//NOT USE
                    RFsend_WRT_CMD(0xC800);//NOT USE
                    RFsend_WRT_CMD(0xC400);//1.66MHz,2.2V
                    }

                    void RF12_SEND(unsigned char aByte){
                    while(PIND&(1<<2));//wait for previously TX over
                    RFsend_WRT_CMD(0xB800+aByte);
                    }

                    ////////////////////////////////////////////////////////////////////
                    ///////////////////////////main function for data recieve//////////
                    ///////////////////////////////////////////////////////////////////

                    void DataRecieve(void)
                    {
                    unsigned char i;
                    unsigned char ChkSum;

                    //Initialize command port
                    RFrecieve_PORT_INIT();

                    //Initialize RF12 chip
                    RF12recieve_INIT();

                    //Init FIFO
                    RFrecieve_WRT_CMD(0xCA81);
                    //Enable FIFO
                    RFrecieve_WRT_CMD(0xCA83);
                    ChkSum=0;
                    // Receive payload data
                    for(i=0;i<16;i++){
                    buff[i]=RF12_RECV();
                    ChkSum+=buff[i];
                    }
                    //Receive Check sum
                    i=RF12_RECV();
                    //Disable FIFO
                    RFrecieve_WRT_CMD(0xCA81);

                    if(ChkSum==i){
                    QC_flag=1;
                    }
                    else
                    {
                    QC_flag=0;
                    };
                    }

                    //////////////////////////////////////////////////////////////////
                    ////////////////////// main function for send data///////////////
                    /////////////////////////////////////////////////////////////////
                    char DataSend(void)
                    {
                    unsigned char ChkSum;
                    unsigned char ack='F';
                    unsigned int FIFO_data;
                    DDRB=0x00;
                    DDRD=0x00;
                    RFsend_PORT_INIT();
                    RF12send_INIT();

                    DDRD|=(1<<RF12_DATA);
                    PORTD|=(1<<RF12_DATA);// SET nFFS pin HI when using TX register
                    DDRD&=~(1<<2); //PD2(INT0)

                    LEDR_ON();
                    RFsend_WRT_CMD(0x0000);//read status register
                    RFsend_WRT_CMD(0x8239);//!er,!ebb,ET,ES,EX,!eb,!ew,DC

                    ChkSum=0;
                    RF12_SEND(0xAA);//PREAMBLE
                    RF12_SEND(0xAA);//PREAMBLE
                    RF12_SEND(0xAA);//PREAMBLE
                    RF12_SEND(0x2D);//SYNC HI BYTE
                    RF12_SEND(0xD4);//SYNC LOW BYTE

                    RF12_SEND(buff[0]);//DATA BYTE 0
                    ChkSum+=buff[0];
                    RF12_SEND(buff[1]);//DATA BYTE 1
                    ChkSum+=buff[1];
                    RF12_SEND(buff[2]);
                    ChkSum+=buff[2];
                    RF12_SEND(buff[3]);
                    ChkSum+=buff[3];
                    RF12_SEND(buff[4]);
                    ChkSum+=buff[4];
                    RF12_SEND(buff[5]);
                    ChkSum+=buff[5];
                    RF12_SEND(buff[6]);
                    ChkSum+=buff[6];
                    RF12_SEND(buff[7]);
                    ChkSum+=buff[7];
                    RF12_SEND(buff[8]);
                    ChkSum+=buff[8];
                    RF12_SEND(buff[9]);
                    ChkSum+=buff[9];
                    RF12_SEND(buff[10]);
                    ChkSum+=buff[10];
                    RF12_SEND(buff[11]);
                    ChkSum+=buff[11];
                    RF12_SEND(buff[12]);
                    ChkSum+=buff[12];
                    RF12_SEND(buff[13]);
                    ChkSum+=buff[13];
                    RF12_SEND(buff[14]);
                    ChkSum+=buff[14];
                    RF12_SEND(buff[15]); //DATA BYTE 15
                    ChkSum+=buff[15];
                    RF12_SEND(ChkSum);
                    RF12_SEND(0xAA);//DUMMY BYTE
                    RF12_SEND(0xAA);//DUMMY BYTE
                    RF12_SEND(0xAA);//DUMMY BYTE
                    RFsend_WRT_CMD(0x8201);


                    }
                    ////////////////////////////////////////////////////////////////////
                    ///////////////////////////////////////////////////////////////////

                    void main(void)
                    {
                    while (1)
                    {
                    DataRecieve();
                    if(QC_flag==1){
                    puts(buff);
                    DDRD.6=1;
                    PORTD.6=1;
                    DDRD.7=1;
                    PORTD.7=1;
                    }
                    else{
                    DDRD.6=0;
                    PORTD.6=0;
                    DDRD.7=0;
                    PORTD.7=0;
                    };



                    };
                    }
                    :angry: :angry: :angry: :angry: :cry2: :cry2: :cry2: :cry2: :cry2: :cry2: :cry2: :cry2: :cry2: :cry2: :cry2: :cry2: :cry2:
                    به دیگران بیاموز تا بتو بیاموزند
                    bioosun@gmail.com

                    دیدگاه


                      #11
                      پاسخ : نحوه استفاده صحیح از ماژول rfm12b

                      با سلام . من حداکثر سرعتی که از این ماژول جواب گرفتم 19.2k در حالت تنظیمات بود که نهایتا با عمایاتی که برروی دیتا جهت درست رسیدن دیتا به مقصد انجام شد ( گرفتن ACK از گیرنده در فرستنده ) به سرعت 400 بایت بر ثانیه دست پیدا کردم اما مشکل دیگری که برایم ایجاد شده این است که مجبورم اطلاعات گرفته شده از پورت سریال رو در میکرو رو در یک آرایه قرار بدم تا میکرو سر فرصت اطلاعات با استفاده از ماژول ارسال کنه چند تا مشکل دارم برای این کار چگونه باید عمل کنم الگوریتم کار چطوریه فرض کنید بافر من 500 بایت باشه و از بردار وقفه پورت سریال میکرو هم استفاده کرده باشم خوب در بردار وقفه اطلاعات بایت به بایت در آرایه ذخیره می شن ولی چطور میکرو این اطلاعات رو برداشت کنه و اطلاعات قدیمی رو پاک کنه فکر کنم مثل این میمونه که بخوام یک رم FIFO رو پیاده سازی کنم ولی چند تا مشکل وجود داره اول اینکه هنگامی که میکرو در حال ارسال است ممکنه اطلاعات وارد پورت سریال میکرو بشه و در بردار وقفه اطلاعات بیاد و وسط کار همه چیز رو بهم بریزه در حقیقت من در طرح یک الگوریتم صحیح و مدیریت شده جهت نقل انتقال اطلاعات از پورت سریال به حافظه و از حافظه به ماژول فرستنده دچار مشکل شده ام . جناب یار محمدی اگر امکان دارد راهنمایی بفرمایید :applause: :cry2:
                      به دیگران بیاموز تا بتو بیاموزند
                      bioosun@gmail.com

                      دیدگاه


                        #12
                        پاسخ : نحوه استفاده صحیح از ماژول rfm12b

                        شما باید از وقفه های سخت افزاری برای تشخیص و دادن اولویت به دریافت اطلاعات استفاده کنید

                        +

                        برای ارسال اطلاعات باید از یک بافر نرم افزاری fifo که ذکر کردید استفاده کنید .

                        --

                        کامپایلرتون چیه ؟!

                        در کتابخونه UARTآ‌ موجود در AVRLib . از هردوی این موارد پشتیبانی میکنه . buffered & interrupted UART
                        فتو بلاگ من
                        کاردستی ها :
                        روبات شطرنج باز ( یادگار دوران جوانی )
                        فارسی نویسی مستقیم در نمایشگر های گرافیکی
                        کتابچه خود آموز زبان توصیف سخت افزار Verilog

                        دیدگاه


                          #13
                          پاسخ : نحوه استفاده صحیح از ماژول rfm12b

                          سلام
                          اینکه وقفه ارتباط سریال بیاد مشکلی پیش نمیاره،چون دیگه بعد از اون اطلاعات ارسال نمیشه،این مقاله رو هم بخونید:
                          http://www.avrfreaks.net/index.php?module=Freaks%20Files&func=viewFile& amp;id=415&showinfo=1
                          شما میخواید دوتا PC رو شبکه کنید یا چند تا؟؟
                          در دیر مغان آمد یارم قدحی در دست
                          مست از می می خواران از نرگس مستش مست

                          دیدگاه


                            #14
                            پاسخ : نحوه استفاده صحیح از ماژول rfm12b

                            سلام کامپایلر من codevision است :mrgreen: :mrgreen:

                            " برای ارسال اطلاعات باید از یک بافر نرم افزاری fifo که ذکر کردید استفاده کنید" چگونه می توانم این کار رو انجام بدم یعنی چطور یک برنامه FIFO نرم افزاری بنویسم :cry:
                            به دیگران بیاموز تا بتو بیاموزند
                            bioosun@gmail.com

                            دیدگاه


                              #15
                              پاسخ : نحوه استفاده صحیح از ماژول rfm12b

                              جناب یار محمدی هدف من ارتباط یک میکرو و یک کامپیوتر به صورت wirless توسط این ماژول است به نحوی که اطلاعات بدون تداخل و ازبین رفتن رد بدل گردد.
                              به دیگران بیاموز تا بتو بیاموزند
                              bioosun@gmail.com

                              دیدگاه

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