본문 바로가기

나래온 1기(~2012.6)/라인트레이서 이야기

(3부작) 라인트레이서 이야기 - 번외 #3 모든 일의 시작, 초기화!

 

, 이제 시작을 해 보도록 합시다.
우선 소스부터 하나 읽고 시작할까요?

출처 : 따르미 Pro 2008(하늘아이 社) - main.h
void TIMER_INIT(void)
{
    TIMSK=((1<<TOIE2)|(1<<TOIE0)|(1<<TOIE1));
    TCCR0=(1<<CS01)|(1<<CS00);
    TCNT0=256-62.5;
    TCCR2=1<<CS20;
    TCNT2=0;
    TCCR1A=(1<<WGM11)|(1<<WGM10);
    TCCR1B=(0<<WGM12)|(1<<CS10);
    TCNT1=1000;
    OCR1A=0;
    OCR1B=0;
}

void SYS_INIT(void)
{      
    TIMER_INIT();
    DDRA=0x00;
    DDRB=0x4F;
    DDRC=0xFF;
    DDRD=0xFF;
    PORTA=0x00;    
    PORTB=0xFC;
    PORTC=0xFF;
    PORTD=0xFF;
    SREG=0x80;
    sei();
    sbi(PORTB,7);
    while(bit_is_set(PINB,7));
    while(bit_is_clear(PINB,7));
    DELAY_MSEC(500);
    time_sec=0;
}

.
.
.

사용자 삽입 이미지

아아, 어디에 쓰는 코드인가?



설명을 안하고 코드 먼저 풀어놓으니 참 어렵죠?
제가 풀어서 설명을 해 드리겠습니다.

1. TIMSK : 여러 타이머 중 어느 타이머를 쓸지를 미리 정해놓는 거에요.
2. TCCR(포트) : 로봇의 처리 속도는 매~우 빠른데, 시간을 그렇다고 해서 사람이 눈치채지도 못할 시간에 한 번씩 세는건 들어가는 숫자가 너무 커져서 오버플로가 빵빵 터질겁니다. 이걸 방지하는 데 쓰는 거에요.
3. TCNT(포트) : 지금 카운터가 몇 까지나 갔나를 설정하는 거에요.
4. OCR(포트) : A, B포트가 일치했을 때 포트를 통해서 밖으로 출력되거나 비교를 하게 됩니다.
5. DDR(포트) : 각 포트를 입력으로 설정할지, 출력으로 설정할지 고릅니다.
6. PORT(포트) : 각 포트의 데이터를 입력합니다.
7. SREG : 이게 들어와야지만 비로소 타이머가 동작을 시작한답니다.

자, 그럼 이제 저 코드를 풀어볼까요?

1. 타이머 사용 선언(TIMER_INIT 1번째 줄, TIMSK)
2. 타이머 분주 설정(TIMER_INIT 2,4,6,7번째 줄, TCCR)
3. 타이머 시작점 설정(TIMER_INIT 3,5,8번째 줄, TCNT)
4. 입출력 방향 설정(SYS_INIT 2,3,4,5번째 줄, DDR)
5. 포트 초기값 설정(SYS_INIT 6,7,8,9번째 줄, PORT)
6. 시작 버튼 눌릴때까지 기다린다. 줄~창 기다린다(SYS_INIT 13,14번째 줄)
7. 0.5초 기다린다(SYS_INIT 15번째 줄)
8. 타이머를 0으로 바꿔준다(SYS_INIT 16번째 줄)

이것이 우리가 자주 사용하는 라인트레이서의 시작인 초기화 부분입니다.
다른 회사 로봇에서도 거의 마찬가지의 과정으로 진행되죠.
사실 얼마 안되는 내용인데다가 눈에 익은 C코드인데 저 코드는 참 어렵죠?
그게 우리가 사용하는 컴퓨터와 임베디드의 차이입니다.
C 한 번 배우면 모든 장치에서 다 써먹는다는거, 다 거짓말입니다.

ps. 타이머 자체의 원리

1. 타이머 시작
2.
CPU가 일정 시간마다 한 번씩 타이머에 숫자를 쌓는다
3.
타이머 숫자가 넘친다
4.
일정 시간마다 하는 일을 한다
5. 초기화