اطلاعیه

Collapse
No announcement yet.

RFM12 (فرستنده و گیرنده مخابراتی)

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

    RFM12 (فرستنده و گیرنده مخابراتی)

    سلام بچه هاو کسی با این ماژول کار کرده؟

    #2
    پاسخ : RFM12 (فرستنده و گیرنده مخابراتی)

    من با rfm01 و rfm02 کار کردم .ماژول های خیلی خوبی هستند ولی عیب بزرگ آنها اینست که توان خروجی آنها خیلی کم است و بدون تقویت و به تنهایی کاربردی ندارند .rfm12 چون فرستنده و گیرنده است و در داخل آن یک سوییچ rx/tx وجود داره تقویت کردن آن دردسر بیشتری داره به همین خاطر توصیه می کنم که به جای آن از فرستنده و گیرنده جدا استفاده کنید.
    ر کسي را بهر کاري در جهان آورده اند
    کار ما عشق است و ما را بهر آن آورده اند

    دیدگاه


      #3
      پاسخ : RFM12 (فرستنده و گیرنده مخابراتی)

      سلام
      تو datasheet این ماژول نوشته خروجیش سریال آیا درسته؟ چه نوع سریالی؟ RS232؟ کسی راش انداخته؟
      ممنون
      اللهمَ اغفرلیَ الذنوبَ التی تحبسُ الدعاء

      دیدگاه


        #4
        پاسخ : RFM12 (فرستنده و گیرنده مخابراتی)

        بله rs232 است.
        ر کسي را بهر کاري در جهان آورده اند
        کار ما عشق است و ما را بهر آن آورده اند

        دیدگاه


          #5
          پاسخ : RFM12 (فرستنده و گیرنده مخابراتی)

          سلام به همه دوستان عزیز من با این ماژول کار کردم ماژول فوق العاده خوبی هست و میشه به کمک اون خیلی از کار ها رو انجام داد و زحمت سیم کشی های طولانی رو رفع کرد من با زبان c این ماژول رو راه انداختم برنامه ای که میذارم به این صورت هست که یه مگا هشت دما و گاز رو از adc1 & adc0 میخونه و از طریق این ماژول میفرسته برای یه مگا 8 دیگه ، هم برنامه فرستنده رو میذارم هم برنامه گیرنده رو
          اینم برنامه فرستنده:

          /*


          Connections

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

          PD6: LED GREEN
          PD7: LED RED

          */
          #include <mega8.h>
          #include <stdlib.h>
          #include <stdio.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_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)


          #define RFM12_Reset PORTB.0
          #define ON 0
          #define OFF 1

          float T1,T2;
          float FltCurrentGas=0;
          bit edge=0;

          unsigned char uChCurrentTemp,i,uChCurrentGasPercent;

          eeprom int eepIntTemp=0,eepIntTol=0,eepIntGasHigh=500,eepIntG asPercent=0;
          eeprom float eepFltGasMedium=0,eepFltGasLow=0,eepFltGasPercent= 0;

          // External Interrupt 0 service routine
          interrupt [EXT_INT0] void ext_int0_isr(void)
          {
          // Place your code here

          if (edge)
          {
          T2=TCNT1;
          TCNT1=0;
          // INT0 Mode: Falling Edge
          MCUCR=0x02;
          edge=0;
          }else
          {
          T1=TCNT1;
          TCNT1=0;
          // INT0 Mode: Rising Edge
          MCUCR=0x03;
          edge=1;
          }
          }


          #define ADC_VREF_TYPE 0x40

          // Read the AD conversion result
          unsigned int read_adc(unsigned char adc_input)
          {
          ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
          // Delay needed for the stabilization of the ADC input voltage
          delay_us(10);
          // Start the AD conversion
          ADCSRA|=0x40;
          // Wait for the AD conversion to complete
          while ((ADCSRA & 0x10)==0);
          ADCSRA|=0x10;
          return ADCW;
          }

          /////////////////////////////////////////////////////////////////////
          void Temperature(void)
          {
          char strTemp[]="000";
          float tf;

          tf=read_adc(0); // LM35 Sensor is connected to PORTA.0(PIN 23)
          tf=(tf*500/1023);
          ftoa(tf,0,strTemp);

          uChCurrentTemp=atoi(strTemp); // Convert String To Integer */
          }
          /////////////////////////////////////////////////////////////////////

          void Gas_Sensor(void)
          {
          char strGas[]="0000000",StrGasPercent[]="0000000";
          float tf;

          tf=read_adc(5); //lm35 is connected to PORTA.0(pin 40)
          tf=(tf*500/1023);
          ftoa(tf,2,strGas);

          FltCurrentGas=atoi(strGas);

          eepFltGasMedium=(eepIntGasHigh-eepFltGasLow)/100;
          eepFltGasPercent=(FltCurrentGas-eepFltGasLow)/eepFltGasMedium;

          if (eepFltGasPercent<0)
          eepFltGasPercent=0;

          itoa(eepFltGasPercent,StrGasPercent); // Convert int To String

          uChCurrentGasPercent=atoi(StrGasPercent); // Convert String To Integer
          }

          /////////////////////////////////////////////////////////////////////
          // send //
          //__________________________________________________ _______________//
          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(0x80D7);//EL,EF,433band,12.0pF
          RFsend_WRT_CMD(0x8239);//!er,!ebb,ET,ES,EX,!eb,!ew,DC
          RFsend_WRT_CMD(0xA640);//A140=430.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(0xC483);//@PWR,NO RSTRIC,!st,!fi,OE,EN
          RFsend_WRT_CMD(0x9850);//!mp,9810=30kHz,MAX OUT
          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);
          }


          //__________________________________________________ _______________//
          // send //
          /////////////////////////////////////////////////////////////////////

          ///////////////////////////////////////////////////////////////////////////////
          ///////////////////////////////////////////////////////////////////////////////

          /////////////////////////////////////////////////////////////////////
          // Recieve //
          //__________________________________________________ _______________//

          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(0x80D7);//EL,EF,433band,11.5pF
          RFrecieve_WRT_CMD(0x82D9);//!er,!ebb,ET,ES,EX,!eb,!ew,DC
          RFrecieve_WRT_CMD(0xA640);//434MHz
          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(0xC483);//@PWR,NO RSTRIC,!st,!fi,OE,EN
          RFrecieve_WRT_CMD(0x9850);//!mp,9810=30kHz,MAX OUT
          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);
          }

          //__________________________________________________ _______________//
          // Recieve //
          /////////////////////////////////////////////////////////////////////

          void DataSend(char Sensor)
          {

          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


          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(0x30);//DATA BYTE 0
          ChkSum+=0x30;
          RF12_SEND(0x31);//DATA BYTE 1
          ChkSum+=0x31;
          RF12_SEND(0x32);
          ChkSum+=0x32;
          RF12_SEND(0x33);
          ChkSum+=0x33;
          RF12_SEND(0x34);
          ChkSum+=0x34;
          RF12_SEND(0x35);
          ChkSum+=0x35;
          RF12_SEND(0x36);
          ChkSum+=0x36;
          RF12_SEND(0x37);
          ChkSum+=0x37;
          RF12_SEND(0x38);
          ChkSum+=0x38;
          RF12_SEND(0x39);
          ChkSum+=0x39;
          RF12_SEND(0x3A);
          ChkSum+=0x3A;
          RF12_SEND(0x3B);
          ChkSum+=0x3B;
          RF12_SEND(0x3C);
          ChkSum+=0x3C;
          RF12_SEND(0x3D);
          ChkSum+=0x3D;
          RF12_SEND(0x3E);
          ChkSum+=0x3E;
          RF12_SEND(0x3F); //DATA BYTE 15
          ChkSum+=0x3F; */

          RF12_SEND(Sensor); //send chek sum

          RF12_SEND(0xAA);//DUMMY BYTE
          RF12_SEND(0xAA);//DUMMY BYTE
          RF12_SEND(0xAA);//DUMMY BYTE

          RFsend_WRT_CMD(0x8201);
          // LEDR_OFF();

          LEDR_OFF();
          // delay_ms(1000);

          // for(i=0;i<10000;i++)for(j=0;j<123;j++);//sleep 1 second appr.
          }

          //////////////////////////////////////////////////////////////

          void DataRecieve(void)
          {
          //Initialize command port
          RFrecieve_PORT_INIT();

          //Initialize RF12 chip
          RF12recieve_INIT();

          //Init FIFO
          RFrecieve_WRT_CMD(0xCA81);

          // LCD module initialization

          //Enable FIFO
          RFrecieve_WRT_CMD(0xCA83);

          //Receive payload data
          // for(i=0;i<16;i++)
          // {
          // ChkSum+=RF12_RECV();
          // }

          //Receive Check sum

          i=RF12_RECV();

          //Disable FIFO
          RFrecieve_WRT_CMD(0xCA81);


          //Package chkeck

          if(i=='R&#039
          {
          RFM12_Reset=ON; // reset rfm12
          delay_ms(100);
          RFM12_Reset=OFF;

          for(i=0;i<2;i++)
          {
          delay_ms(250);
          LEDG_ON();
          LEDR_OFF();
          delay_ms(250);
          LEDG_OFF();
          LEDR_ON();
          }
          LEDR_OFF();
          }

          if(i=='*&#039
          {
          eepFltGasLow=FltCurrentGas; // Calibration

          for (i=1;i<10;i++)
          {
          LEDG_ON();
          LEDR_ON();
          delay_ms(100);
          LEDR_OFF();
          LEDG_OFF();
          delay_ms(100);
          }
          }

          if(i=='A&#039
          {
          delay_ms(30);
          DataSend(uChCurrentTemp);
          LEDG_ON();
          delay_ms(10);
          LEDG_OFF();
          }

          if(i=='a&#039
          {
          delay_ms(30);
          DataSend(uChCurrentGasPercent);
          LEDG_ON();
          delay_ms(10);
          LEDG_OFF();
          }
          }

          /////////////////////////////////////////////////////////

          void main(void)
          {
          unsigned char i=0;
          // Global enable interrupts
          #asm("cli"

          // Input/Output Ports initialization
          // Port B initialization
          // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=Out
          // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=1
          PORTB=0x01;
          DDRB=0x01;

          // Port C initialization
          // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
          // State6=T State5=T State4=T State3=T State2=T State1=T State0=T
          PORTC=0x00;
          DDRC=0x00;

          // Port D initialization
          // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
          // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
          PORTD=0x00;
          DDRD=0x00;

          // Timer/Counter 2 initialization
          // Clock source: System Clock
          // Clock value: Timer 2 Stopped
          // Mode: Normal top=FFh
          // OC2 output: Disconnected
          ASSR=0x00;
          TCCR2=0x00;
          TCNT2=0x00;
          OCR2=0x00;

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

          // Timer(s)/Counter(s) Interrupt(s) initialization
          TIMSK=0x00;

          // USART initialization
          // Communication Parameters: 8 Data, 1 Stop, No Parity
          // USART Receiver: On
          // USART Transmitter: On
          // USART Mode: Asynchronous
          // USART Baud Rate: 1200
          UCSRA=0x00;
          UCSRB=0x18;
          UCSRC=0x86;
          UBRRH=0x02;
          UBRRL=0x08;

          // Analog Comparator initialization
          // Analog Comparator: Off
          // Analog Comparator Input Capture by Timer/Counter 1: Off
          // Analog Comparator Output: Off
          ACSR=0x80;
          SFIOR=0x00;

          // ADC initialization
          // ADC Clock frequency: 78.125 kHz
          // ADC Voltage Reference: AVCC pin
          ADMUX=ADC_VREF_TYPE & 0xff;
          ADCSRA=0x87;


          // Watchdog Timer initialization
          // Watchdog Timer Prescaler: OSC/2048k
          #pragma optsize-
          WDTCR=0x1F;
          WDTCR=0x0F;
          #ifdef _OPTIMIZE_SIZE_
          #pragma optsize+
          #endif

          //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(200);
          LEDG_ON();
          LEDR_ON();
          delay_ms(200);
          LEDG_OFF();
          LEDR_OFF();
          }

          LEDG_OFF();
          LEDR_OFF();

          RFM12_Reset=ON; // reset rfm12
          delay_ms(100);
          RFM12_Reset=OFF;

          for(i=0;i<2;i++)
          {
          delay_ms(250);
          LEDG_ON();
          LEDR_OFF();
          delay_ms(250);
          LEDG_OFF();
          LEDR_ON();
          }
          LEDR_OFF();

          while(1)
          {
          #asm ("wdr"
          Gas_Sensor();
          Temperature();
          DataRecieve();
          };
          }

          سه کس را شنیدم که غیبت رواست وز این درگذشتی چهارم خطاست
          یکی پادشاهی ملامت پسند کز او بر دل خلق بینی گزند
          حلال است از او نقل کردن خبر مگر خلق باشند از او بر حذر
          دوم پرده بر بی حیائی متن که خود میآ‌درد پرده بر خویشتن
          ز حوضش مدار ای برادر نگاه که او میآ‌درافتد به گردن به چاه
          سوم کژ ترازوی ناراست خوی ز فعل بدش هرچه دانی بگوی

          دیدگاه


            #6
            پاسخ : RFM12 (فرستنده و گیرنده مخابراتی)

            سلام
            بردش تا چقد جواب میده؟
            ممنون
            اللهمَ اغفرلیَ الذنوبَ التی تحبسُ الدعاء

            دیدگاه


              #7
              پاسخ : RFM12 (فرستنده و گیرنده مخابراتی)

              اینم سورس گیرنده :

              /*





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

              PD6: LED GREEN
              PD7: LED RED

              */
              #include <mega8.h>
              #include <stdlib.h>
              #include <stdio.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_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)

              #define RFM12_Reset PORTB.0
              #define ON 0
              #define OFF 1


              unsigned char uChRecieve;


              /////////////////////////////////////////////////////////////////////
              // send //
              //__________________________________________________ _______________//
              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(0x80D7);//EL,EF,433band,12.0pF
              RFsend_WRT_CMD(0x8239);//!er,!ebb,ET,ES,EX,!eb,!ew,DC
              RFsend_WRT_CMD(0xA640);//A140=430.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(0xC483);//@PWR,NO RSTRIC,!st,!fi,OE,EN
              RFsend_WRT_CMD(0x9850);//!mp,9810=30kHz,MAX OUT
              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);
              }


              //__________________________________________________ _______________//
              // send //
              /////////////////////////////////////////////////////////////////////

              ///////////////////////////////////////////////////////////////////////////////
              ///////////////////////////////////////////////////////////////////////////////

              /////////////////////////////////////////////////////////////////////
              // Recieve //
              //__________________________________________________ _______________//

              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(0x80D7);//EL,EF,433band,11.5pF
              RFrecieve_WRT_CMD(0x82D9);//!er,!ebb,ET,ES,EX,!eb,!ew,DC
              RFrecieve_WRT_CMD(0xA640);//434MHz
              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(0xC483);//@PWR,NO RSTRIC,!st,!fi,OE,EN
              RFrecieve_WRT_CMD(0x9850);//!mp,9810=30kHz,MAX OUT
              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);
              }

              //__________________________________________________ _______________//
              // Recieve //
              /////////////////////////////////////////////////////////////////////

              /////////////////////////////////////////////////////////////////////
              void DataRecieve(void)
              {
              //Initialize command port
              RFrecieve_PORT_INIT();

              //Initialize RF12 chip
              RF12recieve_INIT();

              //Init FIFO
              RFrecieve_WRT_CMD(0xCA81);

              // LCD module initialization

              //Enable FIFO
              RFrecieve_WRT_CMD(0xCA83);

              //Receive payload data
              //for(i=0;i<16;i++){
              // ChkSum+=RF12_RECV();
              // }

              //Receive Check sum

              uChRecieve=RF12_RECV();

              LEDG_ON();

              //Disable FIFO
              RFrecieve_WRT_CMD(0xCA81);

              putchar(uChRecieve);

              delay_ms(250);

              LEDG_OFF();
              }

              /////////////////////////////////////////////////////////


              void DataSend(unsigned char Device)
              {
              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


              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(0x30);//DATA BYTE 0
              ChkSum+=0x30;
              RF12_SEND(0x31);//DATA BYTE 1
              ChkSum+=0x31;
              RF12_SEND(0x32);
              ChkSum+=0x32;
              RF12_SEND(0x33);
              ChkSum+=0x33;
              RF12_SEND(0x34);
              ChkSum+=0x34;
              RF12_SEND(0x35);
              ChkSum+=0x35;
              RF12_SEND(0x36);
              ChkSum+=0x36;
              RF12_SEND(0x37);
              ChkSum+=0x37;
              RF12_SEND(0x38);
              ChkSum+=0x38;
              RF12_SEND(0x39);
              ChkSum+=0x39;
              RF12_SEND(0x3A);
              ChkSum+=0x3A;
              RF12_SEND(0x3B);
              ChkSum+=0x3B;
              RF12_SEND(0x3C);
              ChkSum+=0x3C;
              RF12_SEND(0x3D);
              ChkSum+=0x3D;
              RF12_SEND(0x3E);
              ChkSum+=0x3E;
              RF12_SEND(0x3F); //DATA BYTE 15
              ChkSum+=0x3F; */

              RF12_SEND(Device);

              RF12_SEND(0xAA);//DUMMY BYTE
              RF12_SEND(0xAA);//DUMMY BYTE
              RF12_SEND(0xAA);//DUMMY BYTE

              RFsend_WRT_CMD(0x8201);

              delay_ms(20);
              LEDR_OFF();

              if (Device=='*&#039
              delay_ms(2500);
              else
              if (Device=='R&#039
              return;
              else
              DataRecieve();

              }

              //////////////////////////////////////////////////////////////

              eeprom unsigned char Da_Status=0,Db_Status=0,Dc_Status=0,Dd_Status=0,De _Status=0;

              void main(void)
              {
              unsigned char i=0,Calibration='*',uChReset='R&#03 9;;
              unsigned char Device_A='A',Device_a='a',Devi ce_B='B',Device_b='b',Device_C ='C',Device_c='c';
              unsigned char Device_D='D',Device_d='d',Devi ce_E='E',Device_e='e';

              // Global enable interrupts
              #asm("cli"

              // Input/Output Ports initialization
              // Port B initialization
              // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=Out
              // State7=T State6=T State5=T State4=T State3=T State2=T State1=P State0=1
              PORTB=0x03;
              DDRB=0x01;

              // Port C initialization
              // Func6=In Func5=Out Func4=In Func3=In Func2=In Func1=In Func0=In
              // State6=T State5=1 State4=T State3=T State2=T State1=T State0=T
              PORTC=0x20;
              DDRC=0x20;

              // Port D initialization
              // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
              // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
              PORTD=0x00;
              DDRD=0x00;

              // Timer/Counter 2 initialization
              // Clock source: System Clock
              // Clock value: Timer 2 Stopped
              // Mode: Normal top=FFh
              // OC2 output: Disconnected
              ASSR=0x00;
              TCCR2=0x00;
              TCNT2=0x00;
              OCR2=0x00;

              // External Interrupt(s) initialization


              // Timer(s)/Counter(s) Interrupt(s) initialization
              TIMSK=0x00;

              // USART initialization
              // Communication Parameters: 8 Data, 1 Stop, No Parity
              // USART Receiver: Off
              // USART Transmitter: On
              // USART Mode: Asynchronous
              // USART Baud Rate: 9600
              UCSRA=0x00;
              UCSRB=0x08;
              UCSRC=0x86;
              UBRRH=0x00;
              UBRRL=0x40;

              // Analog Comparator initialization
              // Analog Comparator: Off
              // Analog Comparator Input Capture by Timer/Counter 1: Off
              // Analog Comparator Output: Off
              ACSR=0x80;
              SFIOR=0x00;

              // Watchdog Timer initialization
              // Watchdog Timer Prescaler: OSC/2048k
              #pragma optsize-
              WDTCR=0x1F;
              WDTCR=0x0F;
              #ifdef _OPTIMIZE_SIZE_
              #pragma optsize+
              #endif

              LEDG_OFF();
              LEDR_OFF();
              LEDG_OUTPUT();
              LEDR_OUTPUT();

              #asm ("wdr"

              for(i=0;i<3;i++)
              {
              delay_ms(200);
              LEDG_ON();
              LEDR_ON();
              delay_ms(200);
              LEDG_OFF();
              LEDR_OFF();
              }
              #asm ("wdr"

              LEDG_OFF();
              LEDR_OFF();

              // Start:

              #asm ("wdr"

              RFM12_Reset=ON; // reset rfm12
              delay_ms(100);
              RFM12_Reset=OFF;

              #asm ("wdr"

              DataSend(uChReset);

              for(i=0;i<2;i++)
              {
              delay_ms(250);
              LEDG_ON();
              LEDR_OFF();
              delay_ms(250);
              LEDG_OFF();
              LEDR_ON();
              }
              LEDR_OFF();
              #asm ("wdr"
              delay_ms(1000);
              #asm ("wdr"

              /* if (Da_Status==1 && Db_Status==1 && Dc_Status==1 && Dd_Status==1 && De_Status==1)
              goto lbl_De;
              else
              if (Da_Status==1 && Db_Status==1 && Dc_Status==1 && Dd_Status==1)
              goto lbl_Dd;
              else
              if (Da_Status==1 && Db_Status==1 && Dc_Status==1 && De_Status==1)
              goto lbl_De;
              else
              if (Da_Status==1 && Db_Status==1 && Dd_Status==1 && De_Status==1)
              goto lbl_Dd;
              else
              if (Db_Status==1 && Dc_Status==1 && Dd_Status==1 && De_Status==1)
              goto lbl_De;
              else
              if (Da_Status==1 && Db_Status==1 && Dc_Status==1)
              goto lbl_Dc;
              else
              if (Da_Status==1 && Db_Status==1 && Dd_Status==1)
              goto lbl_Dd;
              else
              if (Da_Status==1 && Db_Status==1 && De_Status==1)
              goto lbl_De;
              else
              if (Da_Status==1 && Dc_Status==1 && De_Status==1)
              goto lbl_De;
              else
              if (Da_Status==1 && Dc_Status==1 && Dd_Status==1)
              goto lbl_Dd;
              else
              if (Db_Status==1 && Dc_Status==1 && Dd_Status==1)
              goto lbl_Dd;
              else
              if (Da_Status==1 && Db_Status==1)
              goto lbl_Db;
              else
              if (Da_Status==1 && Dc_Status==1)
              goto lbl_Dc;
              else
              if (Da_Status==1 && Dd_Status==1)
              goto lbl_Dd;
              else
              if (Db_Status==1 && Dc_Status==1)
              goto lbl_Dc;
              else
              if (Db_Status==1 && Dd_Status==1)
              goto lbl_Dd;
              else
              if (Dc_Status==1 && Dd_Status==1)
              goto lbl_Dd;
              else
              if (Dc_Status==1 && De_Status==1)
              goto lbl_Dd;
              else */
              if (Da_Status==1)
              goto lbl_Da;
              else
              if (Db_Status==1)
              goto lbl_Db;
              else
              if (Dc_Status==1)
              goto lbl_Dc;
              else
              if (Dd_Status==1)
              goto lbl_Dd;
              else
              if (De_Status==1)
              goto lbl_De;

              while(1)
              {
              ///////////////////////////////
              #asm ("wdr"
              Da_Status=1;/////////
              if (PINB.1==0)
              DataSend(Calibration);

              putchar(Device_A);
              DataSend(Device_A);
              delay_ms(250);
              #asm ("wdr"
              if (PINB.1==0)
              DataSend(Calibration);

              putchar(Device_a);
              DataSend(Device_a);
              Da_Status=0;//////////
              delay_ms(1000);
              #asm ("wdr"
              if (PINB.1==0)
              DataSend(Calibration);
              lbl_Da:
              ////////////////////////////////////
              Db_Status=1;////////////
              putchar(Device_B);
              DataSend(Device_B);
              delay_ms(250);
              #asm ("wdr"
              if (PINB.1==0)
              DataSend(Calibration);

              putchar(Device_b);
              DataSend(Device_b);
              Db_Status=0;///////////
              delay_ms(1000);
              #asm ("wdr"
              if (PINB.1==0)
              DataSend(Calibration);
              lbl_Db:
              //////////////////////////////////
              Dc_Status=1;
              putchar(Device_C);
              DataSend(Device_C);
              delay_ms(250);
              #asm ("wdr"
              if (PINB.1==0)
              DataSend(Calibration);

              putchar(Device_c);
              DataSend(Device_c);
              Dc_Status=0;
              delay_ms(1000);
              #asm ("wdr"
              if (PINB.1==0)
              DataSend(Calibration);
              lbl_Dc:
              /////////////////////////////////
              Dd_Status=1;///////////
              putchar(Device_D);
              DataSend(Device_D);
              delay_ms(250);
              #asm ("wdr"
              if (PINB.1==0)
              DataSend(Calibration);

              putchar(Device_d);
              DataSend(Device_d);
              Dd_Status=0;/////////////
              delay_ms(1000);
              #asm ("wdr"
              if (PINB.1==0)
              DataSend(Calibration);
              lbl_Dd:
              /////////////////////////////////
              De_Status=1;//////////
              putchar(Device_E);
              DataSend(Device_E);
              delay_ms(250);
              #asm ("wdr"
              if (PINB.1==0)
              DataSend(Calibration);

              putchar(Device_e);
              DataSend(Device_e);
              De_Status=0;////////////
              delay_ms(1000);
              #asm ("wdr"
              if (PINB.1==0)
              DataSend(Calibration);
              lbl_De:
              };
              }

              سه کس را شنیدم که غیبت رواست وز این درگذشتی چهارم خطاست
              یکی پادشاهی ملامت پسند کز او بر دل خلق بینی گزند
              حلال است از او نقل کردن خبر مگر خلق باشند از او بر حذر
              دوم پرده بر بی حیائی متن که خود میآ‌درد پرده بر خویشتن
              ز حوضش مدار ای برادر نگاه که او میآ‌درافتد به گردن به چاه
              سوم کژ ترازوی ناراست خوی ز فعل بدش هرچه دانی بگوی

              دیدگاه


                #8
                پاسخ : RFM12 (فرستنده و گیرنده مخابراتی)

                سلام
                توی این صفحه دیتاشیت و اطلاعات راه اندازی هست:
                http://www.hoperf.com/pro/RFM12.html
                اینجا هم شماتیک و برنامه(فکر میکنم با برنامه دوستمون یکی باشه)
                http://www.hoperf.com/pdf/RF12_code.pdf
                در دیر مغان آمد یارم قدحی در دست
                مست از می می خواران از نرگس مستش مست

                دیدگاه


                  #9
                  پاسخ : RFM12 (فرستنده و گیرنده مخابراتی)

                  سلام آقای با وفا.... من برنامه شما رو دیدم واقا ممنون.. ولی چند تا سوال داشتم... یکی اینکه تو برنامه شما تنظیمات spi نبود یعنی نیازی نیست.... ؟ بعدش اینکه میشه برنامتون رو یه جوری تغییر بدین که یکم ساده تر بشه مثلا فقط یه چیزه ساده رو بفرسته مثله یه کاراکتر و بتونم با atmega 32 اینکارو انجام بدم... واقعا ممنون میشم اگه این لطف رو بکنین....

                  دیدگاه


                    #10
                    پاسخ : RFM12 (فرستنده و گیرنده مخابراتی)

                    سلام.ممکنه بگید با bascom چطوری میشه این ماژول ها رو راه انداخت؟

                    خیلی ممنون

                    دیدگاه


                      #11
                      پاسخ : RFM12 (فرستنده و گیرنده مخابراتی)

                      سلام به همگی
                      من با این ماژول کار کردم ولی مشکلی که من برخورد کردم این بود که وقتی فرستنده اطلاعات نفرسته گیرنده برای خودش اطلاعات دریافت می کنه این مشکل رو کسی داشته ؟

                      دیدگاه


                        #12
                        پاسخ : RFM12 (فرستنده و گیرنده مخابراتی)

                        سلام،

                        برنامه ی دیتاشیت این ماژول، نرم افزاری SPI رو ایجاد کرده تا با AVR هایی که SPI ندارند هم بشه از ماژول استفاده کرد اما در عمل چون این مسئله خیلی CPU رو مشغول میکنه در سرعت های بالا باعث ایجاد خطا در انتقال میشه، بهتره وقتی از قطعات سری ATmega که ماژول SPI دارند استفاده می کنید، این کار رو سخت افزاری انجام بدید. (البته اگر به سرعت بالا نیاز دارید.)
                        There is nothing so practical as a good theory. — Kurt Lewin, 1951

                        دیدگاه


                          #13
                          پاسخ : RFM12 (فرستنده و گیرنده مخابراتی)

                          سلام .
                          لطفا تنظیمات SPI تو code wizard برای برنامه code vision رو هم بگید.

                          دیدگاه


                            #14
                            پاسخ : RFM12 (فرستنده و گیرنده مخابراتی)

                            نوشته اصلی توسط Far-Afzun
                            سلام .
                            لطفا تنظیمات SPI تو code wizard برای برنامه code vision رو هم بگید.
                            سلام شما به تنظیمات SPI سخت افزاری نیازی ندارید
                            در دیر مغان آمد یارم قدحی در دست
                            مست از می می خواران از نرگس مستش مست

                            دیدگاه


                              #15
                              پاسخ : RFM12 (فرستنده و گیرنده مخابراتی)

                              من با کد دیتاشیت پیش رفتم ولی نتیجه نگرفتم . فکر می کنم مشکل از پایه ی nIRQ باشه . توی دیتاشیت نوشته که این پایه ی اینتراپت هست و وقتی low بشه اینتراپت اتفاق میفته . ولی پایه ی nIRQ ماژوی من همواره low هست به نظر شما مشکل از کجا می تونه باشه؟؟

                              دیدگاه

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