- 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
댓글 없음:
댓글 쓰기