안녕하세요__)
아트마님께서 업로드해주신 코드를 봤습니당.. 혹시 컴파일러가 ICC이신지요 +_+?;;
타이머1오버플로우 핸드러부분입니다.
CLRBIT(PORTG,SV_OUTPUT);
SETBIT(PORTG,SV_OUTPUT);
이부분인데요 CLRBIT, SETBIT가 뭔지를 모르겠습니당 -_-;;
함수 init_servo부분입니다.
TCCR1B = 0x00; //stop
Q :초기화단계에서 타이머를 정지시키는건 모든 초기화가 완료되기 전에 인터럽트가 발생하는것을 방지하기 위해서 인가요?
TCNT1H = 0xF4; //setup
TCNT1L = 0x48;
Q :인터럽트가 발생하는 시간을 설정하는데 있어서 사람들마다 각각 차이가 많이나더군요. 다수의 모터의 제어에 있어서 타이머1이 발생하는 시간은 아무렇게 줘도 상관이 없는건가요?
OCR1AH = 0x0B;
OCR1AL = 0xB8;
OCR1BH = 0x0B;
OCR1BL = 0xB8;
OCR1CH = 0x0B;
OCR1CL = 0xB8;
ICR1H = 0x0B;
ICR1L = 0xB8;
TCCR1A = 0x00;
Q : 가장 궁금한 부분입니다. 모드형태가 노멀모드인데 왜 OCR과 ICR값을 설정을 해주는지 모르겠습니다;;; 그리고 0BB8이라고 설정하신 부분도 궁금합니다..;;;
TCCR1B = 0x02; //start Timer
SVMove함수가 하는 일이 무엇인지 모르겠습니다 __);;;;
마지막으로!!!;;;
업로드 해주신 코드를 눈으로 컴파일을 해보았습니다.
1.
void SetSVAngle(1400, 10)
{
sv_speed = speed; // 10=10
sv_target = ang; // 1400=1400
if(speed == SPEED_MAX) 참이 아니므로 점프;;
{
sv_angle = ang;
}
}
2.오버플로발생->오버플로루틴으로 점프!
3.
#pragma interrupt_handler timer1_ovf_isr:15
void timer1_ovf_isr(void)
{
//TIMER1 has overflowed
TCCR1B = 0x00; //stop
// Place your code
if( (sv_angle + sv_speed) < sv_target) // 1번. 1400+10 < 1400 이므로 거짓입니다.
sv_angle += sv_speed;
else if( (sv_angle - sv_speed) > sv_target) //2번. 1400-10 > 1400 이므로 역시 거짓입니다.
sv_angle -= sv_speed;
else
sv_angle = sv_target; // 3번. 1400=1400
if(sv_flag == 1) // 4번. sv_flag가 0으로 초기화되었기 때문에 점프
{
sv_flag = 0;
CLRBIT(PORTG, SV_OUTPUT);
sv_rate = PULS_OFF - sv_angle; // low level time
}
else // 5번. sv_flag가 0에서 1로 바뀌고 SETBIT???을 실행합니다.
{
sv_flag = 1;
SETBIT(PORTG, SV_OUTPUT);
sv_rate = sv_angle; // 1400=1400
}
//TIMER1 has overflowed // 6번, 비주얼 C로 계산을 해봤습니다. TCNT1의 값 : 64000
TCNT1H =(BYTE)(((65535 - sv_rate + 1)& 0xff00) >> 8);
TCNT1L = (BYTE)(((65535 - sv_rate + 1) & 0x00ff));
TCCR1B = 0x02; //start Timer
}
6번과정에서 TCNT1이 카운트를 해서 주기를 만들어내면 그값으로 모터가 움직이게 되는건가요?
제대로 해석한건지 자신이 없네요 ^_^;;;
님원하시는대로 iccavr로 올려드렸습니다. ㅋㅋ
CLRBIT(PORTG,SV_OUTPUT);
SETBIT(PORTG,SV_OUTPUT);
이것은 매크로인데
clrbit는 해당 비트를 0으로 만드는 매크로이며
setbit는 해당 비트를 1로 만드는 매크로입니다.
인터넷 검색해보시면 많이 나올듯합니다..
아마 common.h 헤더파일에 정의해서 에러나지 않나싶습니다.
직접 정의해서 사용해주세요.
원하는 각을 원하는 속도로 서보모터를 이동하게 하는 함수입니다.
요 함수를 불러내주시면 원하는 각도로 이동하게하는데 이때 지정된 속도로 이동합니다.