안녕하세요 AVR 입문자 입니다.
다름이 아니라 제가 작은 키트를 작동하려고 하는데요.(ATMEGA32, 모터와 거리센서 3개(왼쪽,정면,오른쪽))
작동하려고 하는 것은 거리센서 (왼쪽,정면,오른쪽)에 신호가 가면 모터가 그에 맞게 동작을 하는 것입니다.
문제는 제가 구현하고자 하는 대로 되지 않는 것에 속하는대요.
만약 정면 거리센서에 신호가 가면 멈추었다가 방향을 어느정도(90도)턴을 한다던가 하는 구현이 재대로 되지 않습니다. 지금은 센서에 신호가 가면 반응(왼쪽턴, 오른쪽 턴)을 하고 신호가 없으면 다시 전진하는 식으로 되어 있는데요
간단한 딜레이 함수를 소스에 구현하여 중간에 넣어 보았지만 계속 신호가 들어 와야지만 동작을 실행 합니다...(신호가 없으면 바로 직진.)
신호를 한번 주면 그에 맞는 동작을 하고 다시 원래의 동작을 하는 방법이 궁금함니다. 거리센서인 만큼 거리에 따라서 전압이 달라지는데 거리에 따라서 그에 맞게 동작을 맞추어 보고 싶은데 ㅠ 손도 못대고 있는 상황인데요. 어디 부터 다시 손 봐야 하나요?
고수님들 도와주시면 감사하겠습니다.
제가 열심히 만든 소스 입니다. 고수님들의 많은 조언 부탁드립니다.
#include <inttypes.h>
#include <avr/io.h>
#include <avr/iom32.h>
#include <avr/interrupt.h>
#ifndef BV
#define BV _BV
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif //#endif define end
static int speedMotor0 = 0; // always > 0
static int speedMotor1 = 0; // always > 0
void ledOn(int i);
void ledOff(int i);
void delay(int temp);
void adc_port_init(void);
inline int abs(int a) ;
void motor(int i, int speed);
void motors(int motor0, int motor1);
void motorsOff();
unsigned char startConvertion(unsigned char ch);
unsigned char readConvertData(void);
void ADC_proce0(volatile unsigned char i);
void ADC_proce1(volatile unsigned char i);
void ADC_proce2(volatile unsigned char i);
void ADC_proce3(volatile unsigned char i);
void ADC_proce4(volatile unsigned char i);
bool button(int i);
int main()
{
adc_port_init();
while(1){
if(startConvertion(0)||startConvertion(1)||startConvertion(2)){
ADC_proce0(startConvertion(0)); // Left sensor Converting
ADC_proce1(startConvertion(1)); // mid sensor Converting
ADC_proce2(startConvertion(2)); // right sensor Converting
}
else if(startConvertion(0) && startConvertion(1)){
ADC_proce3(startConvertion(0)); // Left sensor Converting
}
else if(startConvertion(1) && startConvertion(2)){
ADC_proce4(startConvertion(2)); // right sensor Converting
}
}
}
bool button(int i)
{
if ((i<0) || (i>3)) return false;
return ( (PINA & (16<<i)) == 0);
}
void ledOn(int i)
{
if ((i<0) || (i>1)) return;
cbi(PORTC, i+6); // clear bit -> LED on
}
void ledOff(int i)
{
if ((i<0) || (i>1)) return;
sbi(PORTC, i+6); // set bit -> LED off
}
void delay(int temp)
{
while(temp--);
}
inline int abs(int a)
{
if (a>=0) return a;
else return -a;
}
void adc_port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
ADCSRA = 0x00; //disable adc
ADMUX = 0x00; //select adc input 0
ACSR = 0x80;
ADCSRA = 0xC6;
}
unsigned char startConvertion(unsigned char ch) //ADC start
{
ADCSRA = ADCSRA & 0x0f;
ADMUX = 0x60 | (ch & 0x0f);
ADCSRA = ADCSRA | 0xc0;
return ADCSRA;
}
unsigned char readConvertData(void)
{
volatile unsigned char temp;
while((ADCSRA & 0x10)==0);
ADCSRA = ADCSRA | 0x10;
temp = ADCL;
temp = ADCH;
ADCSRA = ADCSRA | 0x10;
return temp;
}
void ADC_proce0(volatile unsigned char i){
int ADC_data;
ADC_data=readConvertData();
if(ADC_data>100)
{
motors(255,-0);
ledOn(1);
ledOff(0);
delay(3000);
}
else{
ledOff(1);
motors(255,-255);
}
}
void ADC_proce1(volatile unsigned char i){
int ADC_data;
ADC_data=readConvertData();
if(ADC_data>100)
{
motors(0,0);
delay(3000);
ledOn(1);
ledOn(0);
}
else{
ledOff(1);
ledOff(0);
motors(255,-255);
}
}
void ADC_proce2(volatile unsigned char i){
int ADC_data;
ADC_data=readConvertData();
if(ADC_data>100)
{
motors(0,-255);
ledOn(0);
ledOff(1);
delay(3000);
}
else{
ledOff(0);
motors(255,-255);
}
}
void ADC_proce3(volatile unsigned char i){
int ADC_data;
ADC_data=readConvertData();
if(ADC_data>100)
{
motors(255,0);
ledOn(1);
ledOff(0);
delay(3000);
}
else{
ledOff(1);
motors(255,-255);
}
}
void ADC_proce4(volatile unsigned char i){
int ADC_data;
ADC_data=readConvertData();
if(ADC_data>100)
{
motors(0,-255);
ledOn(1);
ledOff(0);
delay(3000);
}
else{
ledOff(1);
motors(255,-255);
}
}
void motor(int i, int speed)
{
if ((i<0) || (i>1)) return;
if (i==0) {
speedMotor0 = abs(speed);
if (speed==0) {
cbi(PORTC, 4); // input1 = 0
cbi(PORTC, 5); // input2 = 0
}
else if (speed>0) {
sbi(PORTC, 5); // input1 = 1
cbi(PORTC, 4); // input2 = 0
}
else {
cbi(PORTC, 5); // input1 = 0
sbi(PORTC, 4); // input2 = 1
}
}
if (i==1) {
speedMotor1 = abs(speed);
if (speed==0) {
cbi(PORTC, 2); // input3 = 0
cbi(PORTC, 3); // input4 = 0
}
else if (speed>0){
sbi(PORTC, 3); // input3 = 1
cbi(PORTC, 2); // input4 = 0
}
else {
cbi(PORTC, 3); // input3 = 0
sbi(PORTC, 2); // input4 = 1
}
}
}
void motors(int motor0, int motor1)
{
motor(0, motor0);
motor(1, motor1);
}
void motorsOff()
{
motor(0, 0);
motor(1, 0);
}