회원가입 ID/PW 찾기
AA

안녕하세요 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);

}


댓글 0

하드웨어 설계 및 개발에 대하여 개발자들이 자유롭게 토론하는 공간입니다.
- Q&A, 자유주재 토론, 관련 정보 공유
- 분야 : 마이크로프로세서 응용, 전기/전자(아날로그/디지털) 회로 설계, C/C++ 프로그래밍, 펌웨어,
         PCB Artwork, 트러블슈팅 등 하드웨어 설계에 관한 전반인 내용
※ 게시글에 맞는 분류를 선택하여 글을 작성해 주시면 쾌적한 사이트 운영에 많은 도움이 됩니다.
※ 하드웨어 인사이트는 회원들간의 거래정보를 게재할 뿐이지, 그 어떤 책임과 의무도 가지지 않습니다.

search
번호 분류 제목 글쓴이 조회 수 날짜
55 Software & IDEs HOTAllegro OrCAD 16.6 파일 보내주실 수 있나요?2 jihE 492 2018.01.28
54 Software & IDEs 소스 분석툴 관련 질문드려요2 아톰신 179 2017.01.02
53 Software & IDEs 리눅스 커널에 대해 공부하려고 하는데 서적 한부 추천 부탁드립니다.1 아톰신 192 2017.01.02
52 Software & IDEs PADS.9.4.1 받을수 있는 방법(훈련병)2 하운드 302 2016.07.13
51 Software & IDEs 리눅스는 여기 사이트와 거리가 먼거죠?1 pcb훈련변 187 2016.06.05
50 Software & IDEs epm3128act100-10n 프로그램 확인 땡쟁이 229 2015.12.17
49 Software & IDEs 신입생입니다.3 sunni 231 2015.12.09
48 Software & IDEs gps단말기 펌웨어질문입니다1 힘술쟁이 260 2015.11.18
47 Software & IDEs HOTUSB를 사용하는 디바이스 펌웨어 개발 책? 문서?1 베이아터 484 2014.01.09
46 Software & IDEs HOT큐블럭 프로그래밍 관련 질문 올립니다.1 행복이아빠 606 2013.08.22
45 Software & IDEs HOTProteus 7.7 Professional2 Keyshaun 758 2013.07.12
44 Software & IDEs HOTmsp430f1611을 사용하고 있는데 ADC에서 읽어들인 값하고 직접 테스터기로 찍은 값이 달라요1 김진성짱 816 2013.06.25
43 Software & IDEs HOTOV9620 SXGA 모드 설정 좀 도와주세요1 로미옹 525 2013.03.25
42 Software & IDEs HOT주차 시스템 회로 구성하는데요.. peng2 1207 2011.10.09
41 Software & IDEs HOTFreescale 질문인데 아시는 분 없나요? ㅠㅠ2 jzho 1555 2011.07.19
40 Software & IDEs HOTkey board 관련1 jjhuem 2453 2011.07.06
39 Software & IDEs HOT펌웨어 하다가 막히는 부분이 있어서 질문 드립니다. 마모루 1568 2011.06.13
38 Software & IDEs HOT어셈블리어 공부하기1 아이스으 2199 2011.03.22
37 Software & IDEs HOT스마트폰 앱 개발시 음성필터요..1 귤씅 2211 2011.01.28
36 Software & IDEs HOTWDK 관련 문의 입니다.1 소보루 1296 2010.11.18
  • 인생은 짧고 예술은 길다.
    - 히포크라테스
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.