BASIC4MCU | 질문게시판 | atmega128 라인트레이서 오류 질문드립니다!
페이지 정보
작성자 소리왕 작성일2020-12-14 19:28 조회3,850회 댓글1건본문
우선 적외선센서, 초음파센서, 모터드라이버, 서보모터 2개사용합니다
TRUE 값과 FALSE 값에서 문제가 있는거같은데 자꾸 lvalue required as left operand of assignment 오류가 뜹니다.
그리고 전체적으로 코드 잘못된부분을 한번 봐주셨으면합니다!
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 16000000UL
#include <util/delay.h>
#define CDS_VALUE 800
#define MAX 200
#define MID 210
#define MIN 220
#define STOP 255
#define FALSE 0
#define TRUE 1
#define STRAIGHT 2
#define LEFTTURN 3
#define RIGHTTURN 4
unsigned int Timer_Cnt, TravelTime, Timer_Cnt2;
unsigned int Distance = 0;
unsigned char digit[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
unsigned char fnd_sel[] = {0x01, 0x02, 0x04, 0x08};
void EINT_init()
{
ADMUX = 0x00;
ADCSRA = 0x87;
DDRE &= 0b11001111;
EICRB = 0b00001010;
EIMSK = 0b00110000;
}
void Timer0_init()
{
TCNT0 = 0;
TCCR0 = 0b00000111;
TCNT1 = 0;
TCCR1A = 0xF1;
TCCR1B = 0x0C;
OCR1A = 255;
OCR1B = 255;
TCNT2 = 0;
TCCR2 = 0x06;
TIMSK = 0x41;
}
void PORT_init()
{
DDRA = 0xff;
DDRB = 0x00;
PORTB = 0x00;
TCCR2 = 0x7B;
TCCR1A = 0x7B;
DDRF = 0b01110000;
DDRE = 0b11001111;
DDRC = 0xff;
DDRG = 0xff;
}
unsigned char Measure_IR_Sensors()
{
return (PINF >> 1) & 0x07; //0b00001110
}
void IR_Sensor_Flag()
{
unsigned char IRvalue;
DDRA = 0xff;
DDRF = 0x00;
IRvalue = (PINF >> 1) &0x07;
if(IRvalue = 0b00000101)
STRAIGHT;
else if (IRvalue == 0b00000110)
LEFTTURN;
else if (IRvalue == 0b000000011)
RIGHTTURN;
Timer_Cnt2 ++;
}
void Distance_Measure_Flag()
{
if ( (PINF & 0x10) == 0x00)
{
PORTF = 0x40;
_delay_us(11);
PORTF = 0x00;
while ( (PINF & 0x80) == 0x00);
TCNT0 = 0;
while ( (PINF & 0x80) == 0x80);
TravelTime = TCNT0;
}
}
unsigned char Measure_Distance()
{
return ((PINF & 0b11000000) == 0b11000000); //0b11000000
}
void display_fnd(unsigned int count)
{
int i, fnd[4];
fnd[3] = (count/1000)%10;
fnd[2] = (count/100)%10;
fnd[1] = (count/10)%10;
fnd[0] = count%10;
for (i=0; i<4; i++)
{
PORTC = digit[fnd[i]];
PORTG = fnd_sel[i];
_delay_ms(2);
}
}
void Left_Motor(unsigned char speed)
{
OCR1A = speed;
TCNT1 = 0;
}
void Right_Motor(unsigned char speed)
{
OCR1B = speed;
TCNT1 = 0;
}
void Move (unsigned char direction, unsigned char speed)
{
switch (direction)
{
case STRAIGHT:
Left_Motor(speed);
Right_Motor(speed);
break;
case LEFTTURN:
Left_Motor(STOP);
Right_Motor(speed);
break;
case RIGHTTURN:
Left_Motor(speed);
Right_Motor(STOP);
break;
case STOP:
Left_Motor(STOP);
Right_Motor(STOP);
default:
Left_Motor(STOP);
Right_Motor(STOP);
break;
}
}
void Control_Motors(unsigned int object_dist, unsigned char IR_value)
{ unsigned char speed;
if (object_dist < 10)
speed = STOP;
else if (object_dist < 20)
speed = STOP-10;
else
speed = MID;
switch (IR_value)
{
case 0b00000101:
Move(STRAIGHT, speed);
break;
case 0b00000111:
Move(STRAIGHT, STOP);
break;
case 0b00000110:
Move(RIGHTTURN, speed);
break;
case 0b00000100:
Move(RIGHTTURN, speed);
break;
case 0b00000011:
Move(LEFTTURN, speed);
case 0b00000001:
Move(LEFTTURN, speed);
break;
default:
Move(STOP, STOP);
}
}
ISR(TIMER0_OVF_vect)
{
cli();
TCNT0 = 0x00;
Timer_Cnt ++;
sei();
}
ISR(TIMER2_OVF_vect)
{
cli();
TCNT2 = 100;
IR_Sensor_Flag = TRUE;
if(Timer_Cnt2 == 20)
{
Timer_Cnt2 = 0;
Distance_Measure_Flag = TRUE;
}
else
Timer_Cnt2++;
sei();
}
int main()
{
unsigned int Distance = 0;
unsigned char IR_Sensor_Value = 0x07;
PORT_init() ;
Timer0_init();
EINT_init();
sei();
while (1)
{
if ( Distance_Measure_Flag == TRUE) {
Measure_Distance();
Distance_Measure_Flag = FALSE;
}
if (IR_Sensor_Flag == TRUE)
{
IR_Sensor_Value = Measure_IR_Sensors();
PORTA = (PORTA & 0xF8) | IR_Sensor_Value;
IR_Sensor_Flag = FALSE;
}
Control_Motors(Distance, IR_Sensor_Value);
display_fnd(Distance);
}
}
댓글 1
조회수 3,850master님의 댓글
master 작성일
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 16000000UL
#include <util/delay.h>
//
#define CDS_VALUE 800
#define MAX 200
#define MID 210
#define MIN 220
#define STOP 255
//
#define STRAIGHT 2
#define LEFTTURN 3
#define RIGHTTURN 4
//
unsigned char digit[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char fnd_sel[]={1,2,4,8};
unsigned int Timer_Cnt,TravelTime,Timer_Cnt2,Distance=0;
//
unsigned char Measure_IR_Sensors(){
return (PINF>>1)&7; //0b00001110
}
//
void IR_Sensor_Flag(){
unsigned char IRvalue;
DDRA=0xff;
DDRF=0x00;
IRvalue=(PINF>>1)&7;
if (IRvalue==0b101)STRAIGHT;
else if(IRvalue==0b110)LEFTTURN;
else if(IRvalue==0b011)RIGHTTURN;
Timer_Cnt2 ++;
}
//
void Distance_Measure_Flag(){
if((PINF&0x10)==0){
PORTF=0x40; _delay_us(11); PORTF=0x00;
while((PINF&0x80)==0x00);
TCNT0=0;
while((PINF&0x80)==0x80);
TravelTime=TCNT0;
}
}
//
unsigned char Measure_Distance(){
return ((PINF&0xC0)==0xC0); //0b11000000
}
//
void display_fnd(unsigned int count){
int i,fnd[4];
fnd[3]=(count/1000)%10; fnd[2]=(count/100)%10; fnd[1]=(count/10)%10; fnd[0]=count%10;
for(i=0;i<4;i++){ PORTC=digit[fnd[i]]; PORTG=fnd_sel[i]; _delay_ms(2); }
}
//
void Left_Motor (unsigned char speed){ OCR1A=speed; TCNT1=0; }
void Right_Motor(unsigned char speed){ OCR1B=speed; TCNT1=0; }
//
void Move(unsigned char direction,unsigned char speed){
switch(direction){
case STRAIGHT: Left_Motor(speed); Right_Motor(speed); break;
case LEFTTURN: Left_Motor(STOP); Right_Motor(speed); break;
case RIGHTTURN: Left_Motor(speed); Right_Motor(STOP); break;
case STOP: default: Left_Motor(STOP); Right_Motor(STOP); break;
}
}
//
void Control_Motors(unsigned int object_dist,unsigned char IR_value){
unsigned char speed;
if (object_dist<10)speed=STOP;
else if(object_dist<20)speed=STOP-10;
else speed=MID;
switch(IR_value){
case 0b101: Move(STRAIGHT,speed); break;
case 0b111: Move(STRAIGHT,STOP); break;
case 0b110: Move(RIGHTTURN,speed); break;
case 0b100: Move(RIGHTTURN,speed); break;
case 0b011: Move(LEFTTURN,speed); break;
case 0b001: Move(LEFTTURN,speed); break;
default: Move(STOP,STOP); break;
}
}
//
ISR(TIMER0_OVF_vect){ Timer_Cnt ++; }
//
ISR(TIMER2_OVF_vect){
TCNT2=100;
IR_Sensor_Flag=1;
if(++Timer_Cnt2>=20){ Timer_Cnt2=0; Distance_Measure_Flag=1; }
}
//
int main(){
unsigned int Distance=0;
unsigned char IR_Sensor_Value=0x07;
DDRA=0xff; DDRC=0xff; DDRE=0xCF; DDRF=0x70; DDRG=0xff;
//
TCCR0=0x07;
TCCR1A=0xF1; TCCR1B=0x0C; OCR1A=255; OCR1B=255;
TCCR2=0x06;
TIMSK=0x41;
//
ADCSRA=0x87;
EICRB=0xAA; EIMSK=0x30;
sei();
while(1){
if(Distance_Measure_Flag){ Distance=Measure_Distance(); Distance_Measure_Flag=0; }
if(IR_Sensor_Flag ){ IR_Sensor_Value=Measure_IR_Sensors(); PORTA=(PORTA&0xF8)|IR_Sensor_Value; IR_Sensor_Flag=0; }
Control_Motors(Distance,IR_Sensor_Value);
display_fnd(Distance);
}
}
switch 문에 break;를 빼먹은 곳이 각각 1곳이 있습니다.
if()문에 =를 하나만 사용한 곳이 있습니다.
Measure_Distance(); 리턴값이 있는 함수는 변수를 사용해서 리턴값을 받아야합니다. Distance=Measure_Distance();
DDRF=0x70; 포트 F의 상위 4비트는 비트7만 입력인데
Measure_Distance() 이 함수에서는
return ((PINF&0xC0)==0xC0); 비트7과 비트6 두 개의 비트를 리턴값으로 사용하고 있네요?
비트6이 입력일까요? 출력일까요?
대충 체크되는 것만 손봤습니다.
나머지는 잘 체크해서 완성 시키세요