BASIC4MCU | 질문게시판 | ATMEGA128 CTC MODE 모터조종 질문입니다
페이지 정보
작성자 킹드나인 작성일2022-04-18 10:52 조회484회 댓글2건본문
안녕하세요 서보 모터를 ctc mode를 사용하여 조종하려고 하는데
어느 부분이 잘못된 것인지 잘 모르겠어서 질문드립니다
프로그램은 코드비전을 사용했습니다
모터는 PB6를 사용하였으며
PWM을 사용했을 경우 정상적으로 동작했습니다
volatile unsigned int ctc= 1;
interrupt [TIM1_COMPA] void compare(void)
{
#asm("nop");
SMnum++; // 다른 함수에서 사용
ctc++; // 인터럽트에 들어올때마다 ctc값이 1씩 증가
}
void Gripper(int value, int repetition)
{
int cnt=0; // while문에서 빠져나오기 위한 값
DDRB = 0xFF; // 서보모터 연결포트 출력모드
PORTB = 0xff;
TCCR1A = 0x20; // CTC mode, OC1B가 출력.
TCCR1B = 0x0A; // 8분주 16MHz / 8 = 2MHz
TCNT1 = 0x00;
TIMSK = (1<<OCIE1B); // T/C 1 비교매치 인터럽트 A enable
SREG |= 0x80; // 전체 인터럽트 허용
while(cnt<repetition) // 특정 수치만큼 반복
{
PORTB = 0x40; // PB6가 출력
OCR1B = value;
while(ctc == 1);
OCR1B = 40000-value; // while안에서 OCR1B의 값을 특정 수치만큼 번갈아가며 값을 전함
while(ctc == 2);
cnt++;
ctc= 1; // ctc변수 초기화
}
}
문제는 이 부분입니다 제가 led를 사용하여 어느 부분에서 막히는지 확인하였습니다
while(cnt<repetition) // 특정 수치만큼 반복
{
PORTB = 0x40; // PB6가 출력
OCR1B = value;
while(ctc == 1);
-> 여기서 함수가 진행되지 않습니다
인터럽트가 문제일까요? 어느 부분이 문제인가요?
OCR1B = 40000-value; // while안에서 OCR1B의 값을 특정 수치만큼 번갈아가며 값을 전함
while(ctc == 2);
cnt++;
ctc= 1; // ctc변수 초기화
}
댓글 2
조회수 484master님의 댓글
master 작성일
OCR1A 설정도 없이 TIM1_COMPA 인터럽트를 사용하고 있고
OCR1A 초기값이 0 이라서 TCNT1이 0으로 묶여있는데
OCR1B 설정을 한다고 해서 뭐가 달라질 것이 있는지 모르겠습니다.
전체소스를 첨부하세요
master님의 댓글
master 작성일
https://cafe.naver.com/circuitsmanual/5902
서보모터는 이런식으로 간단하게 제어하는 편이 낫지 않을까요?