이제 막 공부 시작했습니다.
시작부터 막히네요..
ㅜㅜ
아래는 서보를 움직이는 소스입니다.
근데 언제 인터럽트가 발생하는지
그리고 인터럽트가 발생하면
함수 - interrupt[TIM0_OVF] void timer_int0(void) 여기에서 처리하는것 같은데
여기에서 TIM0_OVF 은 무엇인가요?
찾아보니깐 17번이던데
아주초보이니깐 자세히 알려주면 정말 감사하겠습니다.
부탁 드립니다.
#include <mega128.h> unsigned int tim0_cnt, mos_pos, change;
unsigned int rc_time[6] = {54,150,130,150,210,150}; //0도 , 90도 , 180도 & 54 , 132 , 210
#define SERVO_PORT1 PORTD void port_init()
{
PORTA = 0x00; //segment를 위하여
DDRA = 0xFF;
PORTC=0x00; //segmemt를 위한 출력
DDRC=0xFF;
PORTD = 0xFF; //서보 모토
DDRD = 0xFF; }
//타이머 /카운터0 인터럽트 주기
//이론치 (256-238)*8분주 *1/16us = 9us, 실측치 약 10us마다 오버플로우가 발생!!
interrupt[TIM0_OVF] void timer_int0(void) //TIM_OVF 는 17 0x11
{
tim0_cnt++;
TCNT0=238; //타이머/카운터0 초기값 재설정
}
void init_device()
{
//타이머/카운터0 인터럽트 주기
//이론치(256-238)*8분주*1/16us = 9us: 실측치 10us
TIMSK = 0x01; //타이머/카운터 인터럽트 마스크 레지스터 TOIEO = 1 설정 TOV0을 해서 인터럽트 서비스 루틴 가능케 함
TCCR0 = 0x02; //정이머 카운터 제어 레지스터 : 분주비 결정 3으로 결정 (256-238)/8 하면 2.25 그래서 3으로 결정
TCNT0 = 238; //타이머 카운트 레지스터 oxff - 238(oxEE) = 0x11;
SREG = 0x80;
} void main(void)
{ int mydebug; port_init();
init_device(); tim0_cnt = 0; //타이머/카운터0 오버플로우 횟수 리셋
mos_pos = 0; //모터 위치 = 0도
change = 0; //각도 변화 주기 리셋
tim0_cnt=0;
while(1)
{
//rc_time[6] = {54,150,130,150,210,150};
if(tim0_cnt >= 2000) //10us * 2000 = 20ms출력
{
tim0_cnt = 0;
SERVO_PORT1 = 0xFF;
change++;
//20ms * 100 = 2sec 각도 변화 주기 체크
if(change == 100)
{
mos_pos = (mos_pos+1)%6;
change = 0;
}
}
if(tim0_cnt >= rc_time[mos_pos]) //모터 LOW 출력
{
SERVO_PORT1 = 0x00;
}
} }
시작부터 막히네요..
ㅜㅜ
아래는 서보를 움직이는 소스입니다.
근데 언제 인터럽트가 발생하는지
그리고 인터럽트가 발생하면
함수 - interrupt[TIM0_OVF] void timer_int0(void) 여기에서 처리하는것 같은데
여기에서 TIM0_OVF 은 무엇인가요?
찾아보니깐 17번이던데
아주초보이니깐 자세히 알려주면 정말 감사하겠습니다.
부탁 드립니다.
#include <mega128.h> unsigned int tim0_cnt, mos_pos, change;
unsigned int rc_time[6] = {54,150,130,150,210,150}; //0도 , 90도 , 180도 & 54 , 132 , 210
#define SERVO_PORT1 PORTD void port_init()
{
PORTA = 0x00; //segment를 위하여
DDRA = 0xFF;
PORTC=0x00; //segmemt를 위한 출력
DDRC=0xFF;
PORTD = 0xFF; //서보 모토
DDRD = 0xFF; }
//타이머 /카운터0 인터럽트 주기
//이론치 (256-238)*8분주 *1/16us = 9us, 실측치 약 10us마다 오버플로우가 발생!!
interrupt[TIM0_OVF] void timer_int0(void) //TIM_OVF 는 17 0x11
{
tim0_cnt++;
TCNT0=238; //타이머/카운터0 초기값 재설정
}
void init_device()
{
//타이머/카운터0 인터럽트 주기
//이론치(256-238)*8분주*1/16us = 9us: 실측치 10us
TIMSK = 0x01; //타이머/카운터 인터럽트 마스크 레지스터 TOIEO = 1 설정 TOV0을 해서 인터럽트 서비스 루틴 가능케 함
TCCR0 = 0x02; //정이머 카운터 제어 레지스터 : 분주비 결정 3으로 결정 (256-238)/8 하면 2.25 그래서 3으로 결정
TCNT0 = 238; //타이머 카운트 레지스터 oxff - 238(oxEE) = 0x11;
SREG = 0x80;
} void main(void)
{ int mydebug; port_init();
init_device(); tim0_cnt = 0; //타이머/카운터0 오버플로우 횟수 리셋
mos_pos = 0; //모터 위치 = 0도
change = 0; //각도 변화 주기 리셋
tim0_cnt=0;
while(1)
{
//rc_time[6] = {54,150,130,150,210,150};
if(tim0_cnt >= 2000) //10us * 2000 = 20ms출력
{
tim0_cnt = 0;
SERVO_PORT1 = 0xFF;
change++;
//20ms * 100 = 2sec 각도 변화 주기 체크
if(change == 100)
{
mos_pos = (mos_pos+1)%6;
change = 0;
}
}
if(tim0_cnt >= rc_time[mos_pos]) //모터 LOW 출력
{
SERVO_PORT1 = 0x00;
}
} }
수행되는 함수라고 생각하시면 될것 같습니다.
타이머가 계수를 하다가(숫자를 세다가) Tcnt 레지스터 값이 over flow가 되면 인터럽트 함수를 수행하는 계념이지요..^^
그리고 님이 질문하신 interrupt[TIM0_OVF] void timer_int0(void) 는 코드비전 tool에서 사용하는 문법으로써
timer_counter 0,1,2,3 번중 0번 카운터가 over_flow 됬을때 핸들러(서비스루틴)을 수행하라는 일종에 함수 선언부 입니다.
많은 도움이 되었습니다..
너무 친철하게 설명해 주셔서 몸둘바를 모르겠네요.
풍요로운 한가위 되세요