회원가입 ID/PW 찾기
AA

제가 이번에 컨베이어벨트를 만들게 됐습니다!!


그래서 지금 ATmega128 키트와 AVRstudio를 써서 구동시키는 공부를 하고있습니다.

우선 그림에서 보듯이, AVR에 PORTC를 모터드라이버 L298과 연결시켰고

모터는 5V 기어모터를 사용하고 있습니다.


제가 프로그래밍 지식이 하나도 없는데...


#include <avr/io.h>

#include <avr/interrupt.h>

#include <stdio.h>


// DC MOTOR Control

#define MOTOR_PORT PORTC

#define PWM_PORT 0x00

#define PWM1_ON (MOTOR_PORT|=0x01)

#define PWM1_OFF (MOTOR_PORT&=0xFE)

#define DIR1_ON (MOTOR_PORT|=0x02)

#define DIR1_OFF (MOTOR_PORT&=0xFD)

#define ENABLE1_OFF (MOTOR_PORT|=0x04)

#define ENABLE1_ON (MOTOR_PORT&=0xFB)

#define BREAK1_ON (MOTOR_PORT|=0x08)

#define BREAK1_OFF (MOTOR_PORT&=0xF7)


#define PWM2_ON (MOTOR_PORT|=0x10)

#define PWM2_OFF (MOTOR_PORT&=0xEF)

#define DIR2_ON (MOTOR_PORT|=0x20)

#define DIR2_OFF (MOTOR_PORT&=0xDF)

#define ENABLE2_OFF (MOTOR_PORT|=0x40)

#define ENABLE2_ON (MOTOR_PORT&=0xBF)

#define BREAK2_ON (MOTOR_PORT|=0x80)

#define BREAK2_OFF (MOTOR_PORT&=0x7F)



#define LEFT 1

#define RIGHT 2

#define STOP 3


// SPEED Control

#define MIN_SPEED 1

#define MAX_SPEED 1700

#define SPEED_UP  1


// SWITCH Control

#define SW_PORT     PINA

#define SW_PORT_DDR DDRA

#define PRESSED 2

#define OPEN 0


volatile unsigned char num=PWM_PORT;

volatile unsigned char motor_state=LEFT, motor2_state=LEFT;

volatile unsigned char T20ms=0, T2_20ms=0;

volatile unsigned int DCMOTOR[8], sw_state[8]={0,0,0,0,0,0,0,0};

volatile unsigned int Tcount=0,T2_count=0;

volatile unsigned int motor_speed,motor2_speed;


void port_init(void)

{

 PORTA = 0x00;

 DDRA  = 0x00;

 PORTB = 0x00;

 DDRB  = 0x00;

 PORTC = 0x00; //m103 output only

 DDRC  = 0xff;

 PORTD = 0x00;

 DDRD  = 0x00;

 PORTE = 0x00;

 DDRE  = 0x00;

 PORTF = 0x00;

 DDRF  = 0x00;

 PORTG = 0x00;

 DDRG  = 0x00;

}


//TIMER0 initialize - prescale:64

// WGM: Normal

// desired value: 1mSec

// actual value:  1.000mSec (0.0%)

void timer0_init(void)

{

 TCCR0 = 0x00; //stop

 ASSR  = 0x00; //set async mode

 TCNT0 = 0x06; //set count

 OCR0  = 0xFA;

 TCCR0 = 0x04; //start timer

}


ISR(TIMER0_OVF_vect)

{

 TCNT0 = 0x06; //reload counter value

 T20ms++;

 if(T20ms >= 20)

 {

T20ms = 0;

Tcount = 0;

 }

 

 T2_20ms++;

 if(T2_20ms >= 20)

 {

T2_20ms = 0;

T2_count = 0;

 }

}


//TIMER2 initialize - prescale:64

// WGM: Normal

// desired value: 100uSec

// actual value: 100.000uSec (0.0%)

void timer2_init(void)

{

 TCCR2 = 0x00; //stop

 TCNT2 = 0xEC; //setup

 OCR2  = 0x14;

 TCCR2 = 0x02; //start

}


ISR(TIMER2_OVF_vect)

{

 TCNT2 = 0xE7; //reload counter value

 Tcount++;

 T2_count++;

 

 if(DCMOTOR[0]>Tcount)

    MOTOR_PORT |= (0x01<<num);

 else

  MOTOR_PORT &= (~(0x01<<num));

 if(DCMOTOR[4]>Tcount)

    MOTOR_PORT |= (0x01<<4);

 else

  MOTOR_PORT &= (~(0x01<<4));

}


//call this routine to initialize all peripherals

void init_devices(void)

{

 //stop errant interrupts until set up

 cli(); //disable all interrupts

 XMCRA = 0x00; //external memory

 XMCRB = 0x00; //external memory

 port_init();

 timer0_init();

 timer2_init();


  MCUCR = 0x00;

 EICRA = 0x00; //extended ext ints

 EICRB = 0x00; //extended ext ints

 EIMSK = 0x00;

 TIMSK = 0x41; //timer interrupt sources

 ETIMSK = 0x00; //extended timer interrupt sources

 sei(); //re-enable interrupts

 //all peripherals are now initialized

}


void delay(int cnt)

{

unsigned int i, j;

for(i=0;i<cnt;i++){

for(j=0;j<1000;j++)

{

}

}

}


void motor_init(void){

ENABLE1_ON;

  PWM1_ON;

  BREAK1_OFF; 

DIR1_ON;

   

ENABLE2_ON;

  PWM2_ON;

  BREAK2_OFF; 

DIR2_ON;

}


//

int main(void)

{

 

 init_devices();

 //insert your functional code here...

 motor_init();

 SW_PORT_DDR = 0x00;

 DCMOTOR[0] =  motor_speed = 800;

 DCMOTOR[4] = motor2_speed = 100;   

 

 while(1){

switch(SW_PORT&0xff){

case 0x01 :  motor_speed+=SPEED_UP;

  break;

case 0x02 :  motor_speed-=SPEED_UP;

  break;

case 0x04 :  sw_state[2] = PRESSED;    

  break; 

case 0x08 :  sw_state[3] = PRESSED;  

  break;

case 0x10 :  motor2_speed+=SPEED_UP;

  break;

case 0x20 :  motor2_speed-=SPEED_UP;

  break;

case 0x40 :  sw_state[4] = PRESSED;    

  break; 

case 0x80 :  sw_state[5] = PRESSED;  

  break;

 

case 0x00 : if(sw_state[2] == PRESSED){

  if(motor_state == STOP){

motor_state = LEFT;

}else{

  motor_state = STOP;

}

sw_state[2] = OPEN;

}

if(sw_state[3] == PRESSED){

  if(motor_state == STOP){

motor_state = RIGHT;

}else{

  motor_state = STOP;

}

sw_state[3] = OPEN;

}

if(sw_state[4] == PRESSED){

  if(motor2_state == STOP){

motor2_state = LEFT;

}else{

  motor2_state = STOP;

}

sw_state[4] = OPEN;

}

if(sw_state[5] == PRESSED){

  if(motor2_state == STOP){

motor2_state = RIGHT;

}else{

  motor2_state = STOP;

}

sw_state[5] = OPEN;

}

break;

default : break;

}

if(motor_speed >= MAX_SPEED){

motor_speed = MAX_SPEED;  

}

if(motor_speed <= MIN_SPEED){

motor_speed = MIN_SPEED;  

}

if(motor2_speed >= MAX_SPEED){

motor2_speed = MAX_SPEED;  

}

if(motor2_speed <= MIN_SPEED){

motor2_speed = MIN_SPEED;  

}


switch(motor_state){

case LEFT  : BREAK1_OFF;

  DIR1_ON;

  break; 

case RIGHT : BREAK1_OFF;

  DIR1_OFF;

  break;

case STOP  : BREAK1_ON;

  break;

default : break;

}

switch(motor2_state){

case LEFT  : BREAK2_OFF;

  DIR2_ON;

  break; 

case RIGHT : BREAK2_OFF;

  DIR2_OFF;

  break;

case STOP  : BREAK2_ON;

  break;

default : break;

}

DCMOTOR[0] = motor_speed;

DCMOTOR[4] = motor2_speed;

delay(5);


}

return 0;

}


이런 소스를 가져오니. 왼쪽방향으로 일정속도로 계속 돌더군요...
이 소스를 가지고 정회전, 역회전, 정지 기능을 살리고싶은데,
어떻게 해야할 지를 모르겠습니다ㅠ PORTA등을 써서 스위치를 만들어야 하는지...어떤식으로 해 나가야할 지 알려주세요~~ㅠㅠ
댓글 2
  • No Profile

    타인이 작성한 소스를 가져올 때는 일단 이해부터 하셔야겠지요.

    아래처럼 코드를 입력하면 오른쪽으로 돌기, 정지 등이 될 것입니다.


    motor_state = RIGHT;

    motor_state = STOP;


    소스코드 이해부터 하세요^^



  • No Profile

    고수님들께 몇가지 질문을 드려도 될른지.........


    1. 위에 소스에서 발진 주파수는 얼마로 해서 타이머를 계산하면 1mS, 100uS가 나오는건가요?


    2. Timer/Counter2에서 Prescaler가 clk/8이 아닌지....


    3. 위에 소스에서 사용된 타이머의 시간 계산 방법좀 알려주시면 감사하겠습니다.

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

search
번호 분류 제목 글쓴이 조회 수 날짜
106 펌웨어 & 코딩언어 객체지향프로그래밍4 끼르 348 2017.06.19
105 펌웨어 & 코딩언어 적외선 센서에 대한 질문입니다.3 jaemi2010 348 2016.02.25
104 펌웨어 & 코딩언어 구조체 포인터 캐스팅??1 기다려줄래 319 2015.07.10
103 펌웨어 & 코딩언어 matlab에서 작성된 m file을 c++로 변환하고 싶습니다.1 마린스토리 286 2014.04.28
102 펌웨어 & 코딩언어 HOTC언어로된 MPPT제어 프로그램 Code Vision 으로 변환하기 찰떡젤리 583 2014.04.21
101 펌웨어 & 코딩언어 HOTC 명령어 좀 상세히 알고 싶습니다1 jsp 404 2014.04.03
100 펌웨어 & 코딩언어 HOT피보나치 수열..2 aNitMotD 557 2013.10.30
99 펌웨어 & 코딩언어 HOT1D FEM coding 문제 ..원하는 답이 안나와요 수치해석미쵸 510 2013.09.29
98 펌웨어 & 코딩언어 HOTPIC 16F628A와 CCSC 기반의 프로그래밍 질문입니다. 제발 도와주세요ㅠㅠ 신천동주민 485 2013.09.24
97 펌웨어 & 코딩언어 HOT비주얼베이직 연산 및 줄바꿈에 대한 질문입니다.1 원할머니보고쌈 683 2012.11.07
96 펌웨어 & 코딩언어 c언어 질문인데요..3 하하하하히 396 2012.09.10
95 펌웨어 & 코딩언어 HOTC언어제어3 tbwnaoslwj1 655 2012.08.09
94 펌웨어 & 코딩언어 HOTmatlab 질문입니다.. 소다수1 416 2012.06.06
93 펌웨어 & 코딩언어 HOT-(C언어(함수호출)로 만든 크리스*마스*트리*프로그램)-1 리종순2 1478 2011.12.14
92 펌웨어 & 코딩언어 HOT외부 SRAM 컨트롤하는 것좀 도와주세요.1 쩡무 1382 2011.11.15
91 펌웨어 & 코딩언어 HOTunikey program 수정 jjhuem 1129 2011.10.11
90 펌웨어 & 코딩언어 HOTAtmega128에서 Reset 하는 방법 중 궁금한 점이 있습니다!!!4 공돌이의꿈 3163 2011.06.21
89 펌웨어 & 코딩언어 HOTC언어랑 matlab의 차이?1 약곰탱이 3529 2011.06.02
88 펌웨어 & 코딩언어 HOTVHDL 전가산기 설계 질문입니다. 나트륨 2992 2011.03.26
87 펌웨어 & 코딩언어 HOTC 배열이용해서 엑셀 데이터 끌어오는 방법???2 꼬꼴리 2123 2011.03.24
  • 서툰 의사는 한번에 한 사람을 해치지만, 서툰 교사는 130명을 해친다.
    - 보이어
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.