sir, our accelerometer is not working in a proper way.its such that out of the 4 motions of accelerometer only in 1 motion of accelerometer the speed of motor is maximum and for the other three motions the speed is less.wats the prb???..thers no hardware problem..connections are ok..accelerometer is also o.k.
coding for transiever side is below;
#include<avr/io.h>
#include<util/delay.h>
#include<compat/deprecated.h>
#include<ilabs/multiutil.h>
void init_MMA7660(void); //function for accelerometer
void transmit_cc(char data_tx); //functi0n to transmit to Receiver ID
int main(void)
{
init_usart(103); //16 mhtz feguency& also to set baudrate
_delay_ms(3000); //time for configuring module
transmit_char('<');
transmit_char('8'); //self ID
transmit_char('8'); //channel ID
transmit_char('>');
char data[3]={0,0,0}; //defining an array
_delay_ms(1000);
init_i2c();
init_MMA7660(); //calling function
while(1)
{
start_i2c();
write_i2c(0X98);
write_i2c(0X00);
start_i2c();
write_i2c(0X99);
data[0]=read_i2c(0); //accelerometer reading the x deflection value
data[1]=read_i2c(0); //accelerometer reading the y deflection value
data[2]=read_i2c(1);
stop_i2c();
if(bit_is_clear(data[0],5)) //
data[0]+=31;
else
data[0]-=31;
if(bit_is_clear(data[1],5))
data[1]+=31;
else
data[1]-=31;
if(data[1]<25)
{
if(data[1]<25&&data[1]>=22)
{
transmit_cc('f');
_delay_ms(20);
}
if(data[1]<22&&data[1]>=18)
{
transmit_cc('a');
_delay_ms(20);
}
if(data[1]<18&&data[1]>=14)
{
transmit_cc('c');
_delay_ms(20);
}
if(data[1]<14&&data[1]>=0)
{
transmit_cc('d');
_delay_ms(20);
}
}
if(data[1]>35)
{
if(data[1]>35&&data[1]<=38)
{
transmit_cc('b');
_delay_ms(20);
}
if(data[1]>38&&data[1]<=42)
{
transmit_cc('e');
_delay_ms(20);
}
if(data[1]>42)
{
transmit_cc('g');
_delay_ms(20);
}
}
if(data[0]<25)
{
if(data[0]<28&&data[0]>=23) //180
{
transmit_cc('l');
_delay_ms(20);
}
if(data[0]<23&&data[0]>=17) //100
{
transmit_cc('i');
_delay_ms(20);
}
if(data[0]<17&&data[0]>=0) //000
{
transmit_cc('j');
_delay_ms(20);
}
}
if(data[0]>40)
{
if(data[0]>40&&data[0]<=44) //180
{
transmit_cc('r');
_delay_ms(20);
}
if(data[0]>44&&data[0]<=49) //100
{
transmit_cc('k');
_delay_ms(20);
}
if(data[0]>49) //000
{
transmit_cc('m');
_delay_ms(20);
}
}
else
{
transmit_cc('p');
_delay_ms(20);
}
}
}
void init_MMA7660(void)
{
start_i2c(); //to start i2c
write_i2c(0X98); //send address n 98 is for write bit
write_i2c(0x07); //07 is address of mode register
write_i2c(0x01); //01 is to keep accelerometer in test mode
stop_i2c();
}
void transmit_cc(char data_tx)
{
transmit_char('6');
transmit_char(data_tx);
}
code for receiver side....
#include<avr/io.h>
#include<util/delay.h>
#include<compat/deprecated.h>
#include<ilabs/multiutil.h>
#include<avr/interrupt.h>
int main(void)
{
init_usart(52); // 8 megahtz freguency
_delay_ms(3000); //time required for configuring module
sei();
transmit_char('<');
transmit_char('6'); //self id
transmit_char('8'); //channel id
transmit_char('>');
while(1);
}
SIGNAL(SIG_UART_RECV)
{
char x; //define variable for storing received value
DDRB=0b00000110; // b1&b2 pin of PORTB connected to pwm on 1 side n motorpin of atmega8 on other
init_pwm(8); // to initiate pwm
DDRC=0X0F; //motor connected to portc
x=UDR; //storing inturrpt
if(x=='p') //stop
PORTC=0b00000000;
if(x=='f') //forward
{
PORTC=0b00001010;
OCR1A=100;
OCR1B=100;
}
if(x=='a')
{
PORTC=0b00001010;
OCR1A=150;
OCR1B=150;
}
if(x=='c')
{
PORTC=0b00001010;
OCR1A=200;
OCR1B=200;
}
if(x=='d')
{
PORTC=0b00001010;
OCR1A=255;
OCR1B=255;
}
if(x=='b') //backward
{
PORTC=0b00000101;
OCR1A=100;
OCR1B=100;
}
if(x=='e')
{
PORTC=0b00000101;
OCR1A=150;
OCR1B=150;
}
if(x=='g')
{
PORTC=0b00000101;
OCR1A=255;
OCR1B=255;
}
if(x=='l') //left
{
PORTC=0b00001010;
OCR1B=255; //RIGHT wheel
OCR1A=180; //LEFT wheel
}
if(x=='i')
{
PORTC=0b00001010;
OCR1B=255;
OCR1A=120;
}
if(x=='j')
{
PORTC=0b00000110;
OCR1B=255;
OCR1A=0;//changes
}
if(x=='r') //right
{
PORTC=0b00001010;
OCR1B=180; //right wheel
OCR1A=255; //left wheel
}
if(x=='k')
{
PORTC=0b00001010;
OCR1B=120;
OCR1A=255;
}
if(x=='m')
{
PORTC=0b00001010;
OCR1B=0;
OCR1A=255;
}
}
