سلام بچه هاو کسی با این ماژول کار کرده؟
اطلاعیه
Collapse
No announcement yet.
RFM12 (فرستنده و گیرنده مخابراتی)
Collapse
X
-
پاسخ : RFM12 (فرستنده و گیرنده مخابراتی)
من با rfm01 و rfm02 کار کردم .ماژول های خیلی خوبی هستند ولی عیب بزرگ آنها اینست که توان خروجی آنها خیلی کم است و بدون تقویت و به تنهایی کاربردی ندارند .rfm12 چون فرستنده و گیرنده است و در داخل آن یک سوییچ rx/tx وجود داره تقویت کردن آن دردسر بیشتری داره به همین خاطر توصیه می کنم که به جای آن از فرستنده و گیرنده جدا استفاده کنید.ر کسي را بهر کاري در جهان آورده اند
کار ما عشق است و ما را بهر آن آورده اند
-
پاسخ : 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'
{
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=='*'
{
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'
{
delay_ms(30);
DataSend(uChCurrentTemp);
LEDG_ON();
delay_ms(10);
LEDG_OFF();
}
if(i=='a'
{
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();
};
}
سه کس را شنیدم که غیبت رواست وز این درگذشتی چهارم خطاست
یکی پادشاهی ملامت پسند کز او بر دل خلق بینی گزند
حلال است از او نقل کردن خبر مگر خلق باشند از او بر حذر
دوم پرده بر بی حیائی متن که خود میآدرد پرده بر خویشتن
ز حوضش مدار ای برادر نگاه که او میآدرافتد به گردن به چاه
سوم کژ ترازوی ناراست خوی ز فعل بدش هرچه دانی بگوی
دیدگاه
-
پاسخ : 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=='*'
delay_ms(2500);
else
if (Device=='R'
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 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:
};
}
سه کس را شنیدم که غیبت رواست وز این درگذشتی چهارم خطاست
یکی پادشاهی ملامت پسند کز او بر دل خلق بینی گزند
حلال است از او نقل کردن خبر مگر خلق باشند از او بر حذر
دوم پرده بر بی حیائی متن که خود میآدرد پرده بر خویشتن
ز حوضش مدار ای برادر نگاه که او میآدرافتد به گردن به چاه
سوم کژ ترازوی ناراست خوی ز فعل بدش هرچه دانی بگوی
دیدگاه
-
پاسخ : RFM12 (فرستنده و گیرنده مخابراتی)
سلام
توی این صفحه دیتاشیت و اطلاعات راه اندازی هست:
http://www.hoperf.com/pro/RFM12.html
اینجا هم شماتیک و برنامه(فکر میکنم با برنامه دوستمون یکی باشه)
http://www.hoperf.com/pdf/RF12_code.pdfدر دیر مغان آمد یارم قدحی در دست
مست از می می خواران از نرگس مستش مست
دیدگاه
-
پاسخ : RFM12 (فرستنده و گیرنده مخابراتی)
سلام آقای با وفا.... من برنامه شما رو دیدم واقا ممنون.. ولی چند تا سوال داشتم... یکی اینکه تو برنامه شما تنظیمات spi نبود یعنی نیازی نیست.... ؟ بعدش اینکه میشه برنامتون رو یه جوری تغییر بدین که یکم ساده تر بشه مثلا فقط یه چیزه ساده رو بفرسته مثله یه کاراکتر و بتونم با atmega 32 اینکارو انجام بدم... واقعا ممنون میشم اگه این لطف رو بکنین....
دیدگاه
-
پاسخ : RFM12 (فرستنده و گیرنده مخابراتی)
سلام،
برنامه ی دیتاشیت این ماژول، نرم افزاری SPI رو ایجاد کرده تا با AVR هایی که SPI ندارند هم بشه از ماژول استفاده کرد اما در عمل چون این مسئله خیلی CPU رو مشغول میکنه در سرعت های بالا باعث ایجاد خطا در انتقال میشه، بهتره وقتی از قطعات سری ATmega که ماژول SPI دارند استفاده می کنید، این کار رو سخت افزاری انجام بدید. (البته اگر به سرعت بالا نیاز دارید.)There is nothing so practical as a good theory. — Kurt Lewin, 1951
دیدگاه
دیدگاه