wud u pls check da error in da code....any suggestion for improvement??
#include <avr/io.h>
#include <util/delay.h>
void initADC(){
DDRC|=0x00;
ADMUX|=(1<<REFS0)|(1<<ADLAR);
ADCSRA|=(1<<ADPS1)|(1<<ADPS2);
}
uint16_t readADC(uint8_t ch){
ADMUX|=(ADMUX & 0xF0)|(ch & 0x0F);
ADMUX|=ch;
ADCSRA|=(1<<ADEN);
ADCSRA|=(1<<ADSC);
while(!(ADCSRA & ADIF));
ADCSRA|=(1<<ADIF);
return ADC;
}
void pwm_init(){
TCCR1A|=(1<<COM1A1)|(1<<COM1A0)|(1<<WGM11)|(1<<WGM 10);
TCCR1B|=(1<<CS12);
TCNT1=0;
}
void pwm(uint16_t left, uint16_t right){
OCR1A=left;//left motor
OCR1B=right;
}
void enable_motor(){
PORTB|=(1<<PORTB1)|(1<<PORTB2); //check
}
void disable_motor(){
PORTB &=~((1<<PORTB1)|(1<<PORTB2));
}
void motor(){
uint8_t ch[6];
int w,right,left,sum=0;
unsigned char i;
initADC();
for(i=0;i<6;i++){
w=(readADC(i)/1024)*5; //converwsion into ADC voltage
if(w>2.5) ch[i]=1; //inserting 1 or 0 in ch array
else ch[i]=0;
}
for(i=0;i<4;i++){
sum+=ch[i]; //summing left (0-3)array elements
}
left=sum;
for(;i<7;i++){
sum+=ch[i];
}
right=sum; //right array elements (4-6)
if(right>left)
{
_delay_ms(10);
if(right>1) { //hard right
pwm(2,1024);
//check
PORTD=0x09; //0b00001001 right motor in forward dir left reverse
}
else {
pwm(2,1024);
}
if(right<left){
_delay_ms(10);
if(left>1) {
pwm(1024,2);
PORTD=0x06; //0b00000110 right motor reverse left motor forward
}
else pwm(1024,2);
}
else {
_delay_ms(10);
pwm(1024,1024); //left=right
} //more modification when all da digits are 1 last direction history
}
void main()
{
DDRD=0xFF;
DDRC=0xFF;
PORTD=PORTC=0x00;
initADC();
pwm_init();
enable_motor();
while(1) {motor();}
}


Reply With Quote