1) 지식 창고는 본인이 작성한 콘텐츠(팁/노하우/리소스/강좌 등)을 무료 혹은 가상화폐인 납포인트를 통해 공유하는 공간입니다.
2) 본인이 작성한 콘텐츠에 대해서만 지식 창고에 등록할 수 있으며, 저작권에 위배되는 콘텐츠는 사전경고 없이 삭제될 수 있습니다.
3) 콘텐츠 구매 및 첨부파일 다운로드는 회원그룹 '연구원' 이상 가능하오니, 경험치를 쌓아 진급한 후에 이용 부탁드립니다.
4) 무료 콘텐츠의 본문은 구매절차 없이 즉시 이용할 수 있으며, 판매 납포인트가 있는 콘텐츠는 구매 후 이용할 수 있습니다.
5) 콘텐츠 판매에 따른 납포인트 수익은 지정한 비율(50%)에 따라 판매자에게 지급하며, 납포인트 수익을 통해 진급을 빨리할 수 있습니다.
6) 구매 후 평가를 하면 구매 납포인트의 20%를 돌려 드립니다.
판매자 | 아크마 | 판매 납포인트 | 무료 | 평점 | 4.1점 / 총 8명 참여 |
---|
//ICC-AVR application builder : 2008-10-04 10:37AM // Target : M16 // Crystal: 16Mhz // made by akma // http://www.micombox.com/
#include <iom16v.h> #include "common.h" #include "acc.h"
#define MOTOR_PORT PORTC #define MOTOR_DDR DDRC
#define SPEED_HIGH 160 // 최고속도(STEP) #define SPEED_START 0 // 시작속도(STEP)
word speed_limit, old_speed_limit; word time_r,time_l; word acc_index_r, acc_index_l; byte stepleft=0, stepright=0; byte motor_arrived_left; byte robot_forward, old_robot_forward;
void port_init(void) { PORTA = 0x00; DDRA = 0x00; PORTB = 0x00; DDRB = 0x00; MOTOR_PORT = 0x00; MOTOR_DDR = 0xff; PORTD = 0x00; DDRD = 0x00; }
//UART0 initialize // desired baud rate: 9600 // actual: baud rate:9600 (0.0%) // char size: 8 bit // parity: Disabled void uart0_init(void) { UCSRB = 0x00; //disable while setting baud rate UCSRA = 0x02; UCSRC = BIT(URSEL) | 0x06; UBRRL = 0x8F; //set baud rate lo UBRRH = 0x00; //set baud rate hi UCSRB = 0x08; }
//call this routine to initialize all peripherals void init_devices(void) { //stop errant interrupts until set up CLI(); //disable all interrupts port_init(); uart0_init(); MCUCR = 0x00; GICR = 0x00; SEI(); //re-enable interrupts //all peripherals are now initialized }
unsigned char LeftMotor(unsigned char step, char dir) { step = step & 0x0f; if(dir){ switch(step){ case 0x09: step=0x01; break; case 0x01: step=0x03; break; case 0x03: step=0x02; break; case 0x02: step=0x06; break; case 0x06: step=0x04; break; case 0x04: step=0x0c; break; case 0x0c: step=0x08; break; case 0x08: step=0x09; break; default: step=0x0c; break; } }else{ switch(step){ case 0x09: step=0x08; break; case 0x01: step=0x09; break; case 0x03: step=0x01; break; case 0x02: step=0x03; break; case 0x06: step=0x02; break; case 0x04: step=0x06; break; case 0x0c: step=0x04; break; case 0x08: step=0x0c; break; default: step=0x0c; break; } } return step; }
unsigned char RightMotor(unsigned char step, char dir) { step = step & 0xf0; if(dir){ switch(step){ case 0x90: step=0x10; break; case 0x10: step=0x30; break; case 0x30: step=0x20; break; case 0x20: step=0x60; break; case 0x60: step=0x40; break; case 0x40: step=0xc0; break; case 0xc0: step=0x80; break; case 0x80: step=0x90; break; default: step=0xc0; break; } }else{ switch(step){ case 0x90: step=0x80; break; case 0x10: step=0x90; break; case 0x30: step=0x10; break; case 0x20: step=0x30; break; case 0x60: step=0x20; break; case 0x40: step=0x60; break; case 0xc0: step=0x40; break; case 0x80: step=0xc0; break; default: step=0xc0; break; } } return step; }
void cal_speed_l(void) { if(speed_limit > acc_index_l) acc_index_l++; else if(speed_limit < acc_index_l) acc_index_l--; // if (acc_index_l > speed_limit) acc_index_l = speed_limit; time_l=acc_table[acc_index_l];
}
void cal_speed_r(void) { if(speed_limit > acc_index_r) acc_index_r++; else if(speed_limit < acc_index_r) acc_index_r--; // if (acc_index_r > speed_limit) acc_index_r = speed_limit; time_r=acc_table[acc_index_r]; }
#pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF void timer0_ovf_isr(void) { stepleft=LeftMotor(stepleft,!robot_forward); // forward MOTOR_PORT = stepleft|stepright; cal_speed_l(); TCNT0 = time_l; //reload counter value }
#pragma interrupt_handler timer2_ovf_isr:iv_TIM2_OVF void timer2_ovf_isr(void) { stepright=RightMotor(stepright,robot_forward); // forward MOTOR_PORT = stepleft|stepright; cal_speed_r(); TCNT2 = time_r; //reload counter value }
void start_motor() { // limit speed old_speed_limit = speed_limit = SPEED_HIGH; // start speed acc_index_l = SPEED_START; acc_index_r = SPEED_START; time_l = acc_table[acc_index_l]; time_r = acc_table[acc_index_r]; TCNT0 = time_l; // register high byte TCNT2 = time_r; // register high byte TCCR0 = 0x04; //start timer, 256 prescale TCCR2 = 0x06; //start timer, 256 prescale TIMSK = 0x41; //timer interrupt sources }
void set_dir(byte _forward) { if(old_robot_forward!=_forward) { old_speed_limit = speed_limit; speed_limit = 15; while(!(acc_index_r==speed_limit)&&!(acc_index_l==speed_limit));
robot_forward = _forward; speed_limit = old_speed_limit; } old_robot_forward = robot_forward; }
void main(void) { byte stepleft=0, stepright=0; init_devices(); MOTOR_PORT = 0x00; old_robot_forward = robot_forward = 1; speed_limit = SPEED_HIGH; delay_ms(10); start_motor(); while(1) { set_dir(1); delay_ms(3000); set_dir(0); delay_ms(3000); } }