firevsice55
Junior Member level 1
The following program dont work, cant figure out why. I've tried all kinds of configurations for the RFM12 module in this code.
The hardware is connected in the right way, its 868Mhz RFM12 Module.
The transmitter code seems to be correct, but the receiver is creating an issue.
Receiver Code For switching on a Relay
Transmitter Code for the above receiver.
If Anyone can please solve my problem
The hardware is connected in the right way, its 868Mhz RFM12 Module.
The transmitter code seems to be correct, but the receiver is creating an issue.
Receiver Code For switching on a Relay
Code:
#include<reg51.h>
#include"delay.h"
#include"intrins.h"
//#include <lcd.h>
//#include "serial_tx_rx.h"
typedef unsigned char uchar;
typedef unsigned int uint;
sbit SDI = P2^4;
sbit nSEL = P2^3;
sbit nIRQ = P3^2;
sbit SCK = P2^5;
sbit SDO = P2^2;
sbit LED = P2^0;
sbit RES = P2^1;
sbit INTQ = P3^3;
sbit RELAY1 = P1^6;
/*sbit RELAY2 = P2^3;
sbit RELAY3 = P2^4;
sbit RELAY4 = P2^5; */
void delay_ms1(unsigned int c1);
void Init_RF12_rx(void);
void Write0( void );
void Write1( void );
void WriteCMD( uint CMD );
uchar RF12_RDFIFO(void);
uint CheckSum;
uchar i=0,j=0;
bdata char relay;
/*sbit relay_1=relay^0;
sbit relay_2=relay^1;
sbit relay_3=relay^2;
sbit relay_4=relay^3; */
uchar RF_RXBUF[19];
void delay_ms1(unsigned int c1) //for 11.059Mhz
{
unsigned c2;
for(;c1>0;--c1)
for(c2=0;c2<115;++c2)
// for(c3=0;c3<10;++c3)
;
}
void Init_RF12_rx(void)
{
nSEL=1;
SDI=1;
SCK=0;
SDO=0;
WriteCMD(0x8067); //EL,EF,868band,12.0pF
WriteCMD(0x82D9); //er,!ebb,ET,ES,EX,!eb,!ew,DC (bug was here)
WriteCMD(0xA67C); //freq select
WriteCMD(0xC647); //4.8kbps
WriteCMD(0x94A0); //VDI,FAST,134kHz,0dBm,-103dBm
WriteCMD(0xC2AC); //AL,!ml,DIG,DQD4
WriteCMD(0xCA81); //FIFO8,SYNC,!ff,DR (FIFO level = 8)
WriteCMD(0xCED4); //SYNC=2DD4;
WriteCMD(0xC483); //@PWR,NO RSTRIC,!st,!fi,OE,EN
WriteCMD(0x9850); //!mp,90kHz,MAX OUT
// WriteCMD(0xCC77); //!OB1,!OB0, LPX,!ddy,DDIT,BW0
WriteCMD(0xE000); //NOT USED
WriteCMD(0xC800); //NOT USED
WriteCMD(0xC040); //1.66MHz,2.2V
}
void main()
{
RES=1;
nIRQ=0;
// initialise_lcd();
delay_ms1(500);
delay_ms1(500);
// delay_ms1(500);
LED = 0;
delay_ms1(50);
// display_msg("Keep Finger");
// init_serial();
// send_hex8(0xab);
// send_char('\r');
// send_char(':');
/* initialise_lcd();
delay_ms1(50);
initialise_lcd();
delay_ms1(50);
initialise_lcd();
delay_ms1(50);
display_msg("welcome");
diplay_hex8(0x23);*/
//P3=0xaa;
//while(1);
Init_RF12_rx();
WriteCMD(0xCA81);
WriteCMD(0xCA83);
LED=1;
RELAY1 = 0;
while(1)
{
RELAY1 = 0;
while(!nIRQ)
{
LED =0;
RF_RXBUF[i++] = RF12_RDFIFO();
if(i==17)
// if(i==14)
{
i=0;
//reset FIFO and read to receive next Byte
CheckSum=0;
for(j=0;j<16;j++)
CheckSum+=RF_RXBUF[j]; //add 0x30-----0x3F
CheckSum&=0x0FF;
relay = RF_RXBUF[1];
// send_cmd(0x01);
// send_data( relay +0x30);
if(relay==0x04)
{
relay = 0;
// send_cmd(0x01);
// display_msg("open Doors");
RELAY1 = 1;
delay_ms1(500);
delay_ms1(500);
delay_ms1(500);
delay_ms1(500);
delay_ms1(500);
delay_ms1(500);
delay_ms1(10);
// send_cmd(0x01);
// display_msg("Keep Finger");
}
RELAY1 = 0;
WriteCMD(0x8208);
delay_ms1(500);
delay_ms1(500);
LED=1;
if(CheckSum==RF_RXBUF[16])
{
LED=1;
}
delay_ms1(8);
LED=0;
}
}
// LED =1;
}
}
void Write0( void )
{
SCK=0;
_nop_();
SDI=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCK=1;
_nop_();
}
void Write1( void )
{
SCK=0;
_nop_();
SDI=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCK=1;
_nop_();
}
void WriteCMD( uint CMD )
{
uchar n=16;
SCK=0;
nSEL=0;
while(n--)
{
if(CMD&0x8000)
Write1();
else
Write0();
CMD=CMD<<1;
}
SCK=0;
nSEL=1;
}
uchar RF12_RDFIFO(void)
{
uchar k,Result;
SCK=0;
SDI=0;
nSEL=0;
for(k=0;k<16;k++)
{ //skip status bits
SCK=1;
_nop_();
_nop_();
SCK=0;
_nop_();
_nop_();
}
Result=0;
for(k=0;k<8;k++)
{ //read fifo data byte
Result=Result<<1;
if(SDO)
{
Result|=1;
}
SCK=1;
_nop_();
_nop_();
SCK=0;
_nop_();
_nop_();
}
nSEL=1;
return(Result);
}
Transmitter Code for the above receiver.
Code:
#include<reg52.h>
#include<stdio.h>
#include"intrins.h"
typedef unsigned char uchar;
typedef unsigned int uint;
sbit SDI = P2^4;
sbit nSEL = P2^3;
sbit nIRQ = P3^2;
sbit SCK = P2^5;
sbit SDO = P2^2;
sbit LED = P2^0;
sbit RES = P2^1;
sbit INTQ = P3^3;
uint ChkSum;
int sushant,x;
int temp_var;
// char relay;
void Init_RF12_tx(void);
void Write0( void );
void Write1( void );
void WriteCMD( uint CMD );
void DelayUs( uint us );
void DelayMs(uint ms);
void WriteFSKbyte( uchar DATA );
void delay_ms1(unsigned int c1);
//////////////////////// lcd ////////////////////////////////////////////////////
// #define DATA_LINE P0 // proteus = p0
//void lcd_delay_ms(unsigned char ch);
//bit read_busy();
//void write_byte(unsigned char dat);
//void send_cmd(unsigned char dat);
//void display_msg(unsigned char *dat);
//void send_data(unsigned char dat);
//void initialise_lcd();
void delay_ms1(unsigned int c1) //for 11.059Mhz
{
unsigned int c2;
for(;c1>0;--c1)
for(c2=0;c2<115;++c2)
// for(c3=0;c3<10;++c3)
;
}
//////////////////////// main ////////////////////////////////////////////////////
void main()
{
RES=1;
nIRQ=1;
// initialise_lcd();
delay_ms1(100);
delay_ms1(100);
Init_RF12_tx();//only now comment
// initialise_lcd();
// display_msg("sushant");
// TMOD = 0x20;
// SCON = 0X52;
// TH1 = 0XFD;
// TR1 = 1;
while(1)
{
// while(RI==0); //to make if in next level
x = 0x04;
// sushant = SBUF;
// x = sushant;
// x = x & 0x7f;
// x = (x - 0x30);
// SBUF = 0;
// RI = 0;
// send_cmd(0x01);
// send_cmd(0x80);
// display_msg("inside");
// send_cmd(0xc0);
// send_data( x +0x30);
LED=0;
ChkSum=0;
WriteCMD(0x8238);
// WriteCMD(0x8228); //OPEN PA ,enable transmitter
delay_ms1(1);
_nop_();
_nop_();
WriteFSKbyte( 0xAA );
WriteFSKbyte( 0xAA );
WriteFSKbyte( 0xAA );
WriteFSKbyte( 0x2D );
WriteFSKbyte( 0xD4 );
WriteFSKbyte( 0x30 );//DATA0
ChkSum+=0x30;
WriteFSKbyte( x );//DATA1
ChkSum+= x ;
WriteFSKbyte( 0x32 );
ChkSum+=0x32;
WriteFSKbyte( 0x33 );
ChkSum+=0x33;
WriteFSKbyte( 0x34 );
ChkSum+=0x34;
WriteFSKbyte( 0x35 );
ChkSum+=0x35;
WriteFSKbyte( 0x36 );
ChkSum+=0x36;
WriteFSKbyte( 0x37 );
ChkSum+=0x37;
WriteFSKbyte( 0x38 );
ChkSum+=0x38;
WriteFSKbyte( 0x39 );
ChkSum+=0x39;
WriteFSKbyte( 0x3A );
ChkSum+=0x3A;
WriteFSKbyte( 0x3B );
ChkSum+=0x3B;
WriteFSKbyte( 0x3C );
ChkSum+=0x3C;
WriteFSKbyte( 0x3D );
ChkSum+=0x3D;
WriteFSKbyte( 0x3E );
ChkSum+=0x3E;
WriteFSKbyte( 0x3F );//DATA15
ChkSum+=0x3F;
ChkSum &= 0x0FF;
WriteFSKbyte( ChkSum );
WriteFSKbyte( 0xAA );
WriteFSKbyte( 0xAA );
WriteFSKbyte( 0xAA );
WriteCMD( 0x8208 ); //CLOSE PA ,disable tx
// WriteCMD( 0x8200 ); //Receive end, enter sleep
delay_ms1(100);
delay_ms1(10);
delay_ms1(10);
delay_ms1(100);
delay_ms1(100);
delay_ms1(100);
LED=1;
delay_ms1(100);
delay_ms1(10);
delay_ms1(10);
delay_ms1(100);
delay_ms1(100);
delay_ms1(100);
delay_ms1(100);
// LED=0;
// delay_ms1(1000);
}
}
void Init_RF12_tx(void)
{
nSEL=1;
SDI=1;
SCK=0;
WriteCMD(0x80A7); //EL,EF,868band,12.0pF
WriteCMD(0x8208); //!er,!ebb,ET,ES,EX,!eb,!ew,DC
WriteCMD(0xA680); //frequency select
WriteCMD(0xC647); //4.8kbps
WriteCMD(0x94A0); //VDI,FAST,134kHz,0dBm,-103dBm
WriteCMD(0xC2AB); //AL,!ml,DIG,DQD4
WriteCMD(0xCA81); //FIFO8,SYNC,!ff,DR
WriteCMD(0xCED4); //SYNC=2DD4
WriteCMD(0xC4F7); //@PWR,NO RSTRIC,!st,!fi,OE,EN
WriteCMD(0x9850); //!mp,90kHz,MAX OUT
//WriteCMD(0xCC77); //OB1, COB0, LPX, Iddy, CDDITCBW0
WriteCMD(0xE000); //NOT USED
WriteCMD(0xC800); //NOT USED
WriteCMD(0xC040); //1.66MHz,2.2V
}
void Write0( void )
{
SCK=0;
_nop_();
SDI=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCK=1;
_nop_();
}
void Write1( void )
{
SCK=0;
_nop_();
SDI=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCK=1;
_nop_();
}
void WriteCMD( uint CMD )
{
uchar n=16;
SCK=0;
nSEL=0;
while(n--)
{
if(CMD&0x8000)
Write1();
else
Write0();
CMD=CMD<<1;
}
SCK=0;
nSEL=1;
}
void WriteFSKbyte( uchar DATA )
{
uchar RGIT=0;
uint temp=0xB800;
temp|=DATA;
Loop:
SCK=0;
nSEL=0;
SDI=0;
SCK=1;
if(SDO) //Polling SDO
{
RGIT=1;
}
else
{
RGIT=0;
}
SCK=0;
SDI=1;
nSEL=1;
if(RGIT==0)
{
goto Loop;
}
else
{
RGIT=0;
WriteCMD(temp);
}
}
If Anyone can please solve my problem