2010년 3월 18일 목요일

타이머/카운터0 Overflow 사용 예

- AVR 외부에 부착되어 있는 크리스탈(보통 16Mhz)를 내부의 정해져 있는 분주비(0, 8, 32, 64, 128, 256, 1024 중 선택)로 나누어서 나오는 시간에(예로 16Mhz / 1024 = 15625hz 이걸 주기로 바꾸면 1/15625 = 0.000064(64us)가 됩니다.)

 

- TCNT0(0 ~ 255까지 채울 수 있는 물통이고 위의 예로 가정하면 64us마다 레지스터가 1씩 차게 된다)라는 레지스터를 한 칸씩 채우게 되는데 이 TCNT0라는 레지스터가 꽉 차고 넘치는 순간(255인 상태에서 +1을 해줘서 다시 0이 되는 순간)에 인터럽트 함수의 호출이 이루어 진다고 생각하시면 됩니다.

 

- TCCR0

  • Bit 7 : PWM모드가 아닌 경우에만 유효
  • Bit 6 : WGM00, WGM01(파형 발생 모드) ==> 타이머/카운터 0의 동작모드를 지정하는 비트
  • Bit 5, 4 : COM01, COM00
  • Bit2, 0 : CS02, CS01, CS00(Clock Select)

- TCNT0

  • 8비트 카운터 값을 저장하고 있는 레지스터
  • 읽고 쓰기 동작을 할 때 접근 가능하다.

- TIMSK

  • Bit 1 : OCIE0
    • OCIE0 = 0 : 타이머/카운터0 출력 비교 매치 인터럽트 사용불가
    • OCIE0 = 1 : 타이머/카운터0 출력 비교 매치 인터럽트 활성화
  • Bit 0 : TOIE0
    • TOIE0 = 0 : 타이머/카운터0 오버플로우 인터럽트 사용불가
    • TOIE0 = 1 : 타이머/카운터0 오버플로우 인터럽트 활성화

- 예

  • 16Mhz / 64 = 250000, 주기 1/250000 = 4us
  • TCNT0 레지스터가 1씩 증가하는 데 걸리는 시간 = 4us
  • TCNT0에 미리 채워 넣은 값 = 6, 남은 공간 = 249
  • TCNT0를 꽉 채우기 위해 남은 공간은 155고 넘치는 순간 인터럽트가 발생하기 때문에 +1, 0.000004 * 250 = 0.001
  • 인터럽트 발생 주기 0.001초
  • 인터럽트 함수에서는 fnd_a(예)라는 변수가 1000이 되면 fnd_b가 증가(예) 한다.
  • 0.001초 마다 인터럽트 함수에 들어가는데, 거기에 fnd_b가 1 증가하기 위해서는 fnd_a가 1000이 되어야 한다.
  • 이는 대략 1초를 만들기 위함인데, 0.001 * 1000 = fnd_b가 1증가 하는 시간이 된다.
  • 즉 fnd_b가 1 증가하는데 걸리는 시간은 대략 1초가 된다.

 

출처 : AVR Study Cafe

댓글 없음:

댓글 쓰기