BASIC4MCU | 질문게시판 | 답변 : ATMEGA128 서보 모터 제어 관련 질문 드립니다
페이지 정보
작성자 master 작성일2022-12-11 05:24 조회1,654회 댓글1건본문
#include <mega128.h>
#include <delay.h>
//
#define SW1 PINC.0
#define SW2 PINC.1
//
char run=1,flag1=0,flag2=0;
//
interrupt [TIM1_COMPA] void timer1_compare(void){ PORTA.0=0; }
interrupt [TIM1_OVF] void timer_overflow(void) { PORTA.0=1; }
//
void timer1_Init(void){
TCCR1A=1<<WGM11;
TCCR1B=1<<WGM12 | 1<<CS11 | 1<<CS10 | 1<<WGM13; //16000000Hz/64=250000Hz=4us
ICR1=4999; // 4us*5000=20ms
TIMSK=1<<TOIE1 | 1<<OCIE1A;
}
//
void main(void){
int i;
DDRA=0x01; PORTC=0x03;
timer1_Init();
SREG|=0x80;
while(1){
loop1:;
if(!SW1){
if(flag1==0){ flag1=1; run^=1; delay_ms(50); } // run 토글
}
else{
if(flag1){ flag1=0; delay_ms(50); }
}
//-----------------------
if(run){ // 150*20ms=3sec
for(i=300;i<=450;i++){ OCR1A=i; delay_ms(20); if(!SW1)goto loop1; } // 4us*300=1200us=-30도
for(i=450;i>=300;i--){ OCR1A=i; delay_ms(20); if(!SW1)goto loop1; } // 4us*450=1800us=+30도
}
}
}
2개의 for문을 한번에 빠져나오기 위해서 goto문을 사용했습니다.
goto문의 주의 점은 같은 함수 안에서만 사용해야 문제가 발생하지 않습니다.
PWM은 계속 발생하면서 OCR1A를 변경하지 않도록 for()문 진입을 막았습니다.
댓글 1
조회수 1,654알쓰리님의 댓글
알쓰리 작성일와.. 감사합니다!! go to 문은 생각 못 해 봤습니다 ㅠ