اطلاعیه

Collapse
No announcement yet.

مشکل با RFM12

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

    مشکل با RFM12

    سلام دوستان به شدت و فوری نیاز به کمک دارم.
    این کدی که این پایین هست کد فرستنده گیرنده هست که با این ماژول نوشته شده که قراره وقتی یک کلید تو مدار فرستنده زده میشه ارسال داده شروع بشه و در سمت گیرنده یک بازر فعال بشه بعد در گیرنده با زدن یک کلید بازر غیر فعال بشه.
    ولی مساله این بود که با این که با هر بار اجرای کد بدون زدن کلید ال ای دی ها چشمک میزدند یعنی شرظی که برای زدن کلید گذاشتم انگار دیده نمیشه اصلا!!!!!!!
    لطفا در این مورد راهنمایی کنید منو.خیلی عجله دارم. :angry: :cry:
    این برنامه فرستنده اولیه است که شرط کلیدو نمیبینه:
    کد:
    #include <mega8.h>
    #include <delay.h> 
    #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_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 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_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) 
    void RFXX_PORT_INIT(void){ 
      HI_SEL(); 
      HI_SDI(); 
      LOW_SCK(); 
      SEL_OUTPUT(); 
      SDI_OUTPUT(); 
      SDO_INPUT(); 
      SCK_OUTPUT(); 
    } 
    unsigned int RFXX_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 RF12_INIT(void){ 
      RFXX_WRT_CMD(0x80D7);//EL,EF,433band,12.0pF 
      RFXX_WRT_CMD(0x8239);//!er,!ebb,ET,ES,EX,!eb,!ew,DC 
      RFXX_WRT_CMD(0xA640);//A140=430.8MHz 
      RFXX_WRT_CMD(0xC647);//19.2kbps 
      RFXX_WRT_CMD(0x94A0);//VDI,FAST,134kHz,0dBm,-103dBm 
      RFXX_WRT_CMD(0xC2AC);//AL,!ml,DIG,DQD4 
      RFXX_WRT_CMD(0xCA81);//FIFO8,SYNC,!ff,DR 
      RFXX_WRT_CMD(0xC483);//@PWR,NO RSTRIC,!st,!fi,OE,EN 
      RFXX_WRT_CMD(0x9850);//!mp,9810=30kHz,MAX OUT 
      RFXX_WRT_CMD(0xE000);//NOT USE 
      RFXX_WRT_CMD(0xC800);//NOT USE 
      RFXX_WRT_CMD(0xC400);//1.66MHz,2.2V 
    } 
    void RF12_SEND(unsigned char aByte){ 
      while(PIND&(1<<2));//wait for previously TX over 
      RFXX_WRT_CMD(0xB800+aByte); 
    } 
    void Delay_ms(unsigned char amS){ 
      unsigned char i; 
      unsigned int j; 
      for(i=0;i<amS;i++)for(j=0;j<91;j++); 
    } 
    void main(void) 
    { 
      unsigned int i,j; 
      int data;
      DDRB=0x00;//PB INPUT; 
      DDRD=0x00;//PD INPUT; 
      PORTD.1=1; 
      if(PIND.1==0){ 
      #asm("cli"); 
      DDRC.5=0;
    PORTC.5=1;
     
      //POWER ON indication: both LEDR and LEDG blink 3 times 
     
       
      
      delay_ms(300);
      LEDG_OFF(); 
      LEDR_OFF(); 
      LEDG_OUTPUT(); 
      LEDR_OUTPUT(); 
      for(i=0;i<3;i++){ 
       Delay_ms(200); 
       LEDG_ON(); 
       LEDR_ON(); 
       Delay_ms(200); 
       LEDG_OFF(); 
       LEDR_OFF(); 
      } 
      //
       // LEDG_OFF(); 
       // LEDR_OFF();
       PORTD.6=0;
       PORTD.7=0; 
      RFXX_PORT_INIT(); 
      RF12_INIT(); 
      DDRD|=(1<<RF12_DATA); 
      PORTD|=(1<<RF12_DATA);// SET nFFS pin HI when using TX register 
      DDRD&=~(1<<2);      //PD2(INT0) 
      while(1){ 
    
        
        
        
        
       if(PINC.5==0){ //khodam 
       LEDR_ON(); 
       RFXX_WRT_CMD(0x0000);//read status register 
       RFXX_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 
        
    
    
    //---------------------------------------------your byte-----------------------------------------
       
       
       data=12; // baraye nemoone in byte ro barabare 12 gharar midam va too girande 
            // check mikonam age hamin adad resid ye LED rooshan o khamoosh mikonam 
            
       RF12_SEND(data); // IT IS YOUR BYTE TO SEND TO RECEIVER (A NUMBER BETWEEN 0-255)
       
    //---------------------------------------------your byte----------------------------------------- 
      
        
    
       RF12_SEND(0xAA);//DUMMY BYTE 
       RF12_SEND(0xAA);//DUMMY BYTE 
       RF12_SEND(0xAA);//DUMMY BYTE 
       
       RFXX_WRT_CMD(0x8201); 
       LEDR_OFF(); 
       LEDG_OFF(); 
        // PORTD.6=0;
        // PORTD.7=0;
       for(i=0;i<3000;i++)for(j=0;j<123;j++);//sleep moment. 
       
      }; 
      }
    }
    این هم کد گیرنده اولیه:
    کد:
    #include <mega8.h> 
    #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) 
    
    void RFXX_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 RFXX_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 RF12_INIT(void){ 
      RFXX_WRT_CMD(0x80D7);//EL,EF,433band,11.5pF 
      RFXX_WRT_CMD(0x82D9);//!er,!ebb,ET,ES,EX,!eb,!ew,DC 
      RFXX_WRT_CMD(0xA640);//434MHz 
      RFXX_WRT_CMD(0xC647);//4.8kbps 
      RFXX_WRT_CMD(0x94A0);//VDI,FAST,134kHz,0dBm,-103dBm 
      RFXX_WRT_CMD(0xC2AC);//AL,!ml,DIG,DQD4 
      RFXX_WRT_CMD(0xCA81);//FIFO8,SYNC,!ff,DR 
      RFXX_WRT_CMD(0xC483);//@PWR,NO RSTRIC,!st,!fi,OE,EN 
      RFXX_WRT_CMD(0x9850);//!mp,9810=30kHz,MAX OUT 
      RFXX_WRT_CMD(0xE000);//NOT USE 
      RFXX_WRT_CMD(0xC800);//NOT USE 
      RFXX_WRT_CMD(0xC400);//1.66MHz,2.2V 
    } 
    unsigned char RF12_RECV(void){ 
      unsigned int FIFO_data; 
     WAIT_IRQ_LOW(); 
      RFXX_WRT_CMD(0x0000); 
      FIFO_data=RFXX_WRT_CMD(0xB000); 
      return(FIFO_data&0x00FF); 
    } 
    void Delay_ms(unsigned char amS){ 
      unsigned char i; 
      unsigned int j; 
      for(i=0;i<amS;i++)for(j=0;j<914;j++); 
    } 
    void main(void) 
    { 
      int data; 
      unsigned int i; 
      unsigned char ChkSum; 
      DDRC.4=1; //khodam
      DDRC.5=0; //khodam
      
    
    
    
      //POWER ON indication: both LEDR and LEDG blink 3 times 
      LEDG_OFF(); 
      LEDR_OFF(); 
      LEDG_OUTPUT(); 
      LEDR_OUTPUT(); 
      for(i=0;i<3;i++){ 
       Delay_ms(50); 
       LEDG_ON(); 
       LEDR_ON(); 
       Delay_ms(50); 
    
      LEDG_OFF(); 
      LEDR_OFF(); 
     } 
      LEDG_OFF(); 
      LEDR_OFF(); 
     //Initialize command port 
     RFXX_PORT_INIT(); 
     //Initialize RF12 chip 
     RF12_INIT(); 
     //Init FIFO 
     RFXX_WRT_CMD(0xCA81); 
    
     while(1){ 
      //Enable FIFO 
      RFXX_WRT_CMD(0xCA83); 
      ChkSum=0; 
    
    
    //-----------------------------------recive data ----------------------- 
      //Receive Data 
      data=RF12_RECV(); 
    //-----------------------------------recive data ----------------------- 
    
    
      //Disable FIFO 
      RFXX_WRT_CMD(0xCA81); 
    
      
      
      if(data==12) 
        { 
        while(PINC.5!=0)
        {
         PORTC.4=1;//khodam
         LEDG_ON(); 
         Delay_ms(10); 
         LEDG_OFF(); 
         }  
     } 
    }

    #2
    پاسخ : مشکل با RFM12

    تو رو خدا کمک کنید خیلی عجله دارم :cry: :cry: :cry:

    دیدگاه


      #3
      پاسخ : مشکل با RFM12

      توی کد گیرنده اول data رو مساوی 12 قرار دادید بعد با 12 مقایسش کردید :eek:
      کد:
      ...
       data=12;//khodam
        if(data==12) 
          { 
      ...

      دیدگاه


        #4
        پاسخ : مشکل با RFM12

        ببخشید چون عجله داشتم یادم رفت این خط رو که برای تست گذاشتم کامنت کنم
        ولی حالا اصلا مشکل من با فرستنده است که اصلا انگار زده شدن یا نشدن کلید هیچ تاثیری نداره توش :cry2:

        دیدگاه


          #5
          پاسخ : مشکل با RFM12

          خطی که پین 5 پورت c رو ورودی می کرد شما کامنتش کردید:
          کد:
           if(PIND.1==0){ 
            #asm("cli"); 
            //DDRC.5=0;<----
          فکر کنم باید pullup اون پایه رو هم فعال کنید

          دیدگاه


            #6
            پاسخ : مشکل با RFM12

            نوشته اصلی توسط alis_a
            خطی که پین 5 پورت c رو ورودی می کرد شما کامنتش کردید:
            کد:
             if(PIND.1==0){ 
              #asm("cli"); 
              //DDRC.5=0;<----
            فکر کنم باید pullup اون پایه رو هم فعال کنید
            بله ولی قضیه اینکه تا وقتی کلید زده نشده اصلا توی اون if بزرگی که روی PIND.1
            گذاشتم هم نباید بره ولی در هر صورت برنامه اجرا میشه!!!!!

            دیدگاه


              #7
              پاسخ : مشکل با RFM12

              اون شرطی که میگید نباید توی یه لوپ باشه؟
              این جوری که خارج لوپ نوشتیدش ایراد نداره؟

              دیدگاه


                #8
                پاسخ : مشکل با RFM12

                نوشته اصلی توسط alis_a
                اون شرطی که میگید نباید توی یه لوپ باشه؟
                این جوری که خارج لوپ نوشتیدش ایراد نداره؟
                ببینید این برنامه برای اینکه ما متوجه بشیم مدار روشن شده قبل از اینکه وارد لوپ اصلی بشه فقط در ابتدا ال ای دی های قرار داده شده روی پایه های 6 و 7 پرت دی میکرو 3 بار چشمک میزنن. قاعدتا وقتی من اول برنامه یه شرط زده شدن کلید گذاشتم نباید این 3 بار چشمک زدن رو ببینم تا وقتی که شرط اجرا بشه،ولی مشکل عجیبی که هست اینه که در هر صورت این سه بار چشمک زدن دیده میشه. یعنی من اصلا نمی فهمم که چرا این ال ای دی ها بدون زدن کلید چشمک میزنن!!!!!!!!

                دیدگاه


                  #9
                  پاسخ : مشکل با RFM12

                  دوستان کسی نمیتونه هیچ کمکی کنه؟ :cry2: :cry2: :angry:

                  دیدگاه


                    #10
                    پاسخ : مشکل با RFM12

                    سلام
                    میشه این قسمت رو توضیح بدی:
                    کد:
                    DDRD=0x00;//PD INPUT; 
                      PORTD.1=1; 
                      if(PIND.1==0){
                    پورت D رو ورودی تعریف کردی
                    بعد D.1 رو برابر با 1 کردی
                    بعد همونو خوندی به عنوان شرط؟
                    :NO:
                    من که سر در نیاوردم!
                    :eek:
                    1: اللهم صل علي محمد و آل محمد و عجل فرجهم و ...
                    2: دانش بهتره يا ثروت؟ بدون شعور هيچکدوم!
                    3: دلا معاش چنان کن که گر بلغزد پاي *** فرشته‌ات به دو دست دعا نگه دارد (حافظ)

                    دیدگاه

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