타이머를 이용하여 1초마다 인터럽트 하는 코드
#include <avr/io.h>
#include <avr/interrupt.h>
int state = 0;
ISR(TIMER1_OVF_vect){
TCNT1H = 0xC2;
TCNT1L = 0x4C;
state = !state;
}
int main(void)
{
DDRB = 0x01;
PORTB = 0x00;
TCCR1B |= (1 << CS12) | (1 << CS10); // 1024 분주
TIMSK |= (1 << TOIE1);
TCNT1H = 0xC2;
TCNT1L = 0x4C;
sei();
while (1) {
if(state) PORTB = 0x01;
else PORTB = 0x00;
}
return 0;
}
14.1) 16비트 타이머/카운터
16 비트 타이머/카운터 구조
그림 14-1
14.2) 오버플로 인터럽트
TCNTn (n= 1,3) register
TCCR1B register
분주비 설정(TCNT reg 활성화), 입력 캡처, 파형생성 비트 등이 있다.
WGM의 경우, TCCR1A의 WGM10, WGM11까지 합쳐 4 bit 로 컨트롤한다.
CS1n (n=0, 1, 2) Bit
제목의 CS0n 은 CS1n의 오타이다
TIMSK register
2번 비트는 오버플로
3, 4 bit = A, B 비교 출력
5 bit = 입력 캡처
비교 일치 Interrupt PIN
ETIMSK register
1번 T/C 비교 출력 C 인터럽트
TIFR register
오버플로 인터럽트의 조건을 만족하면 TIFR reg의 해당 bit가 세트된다. 해당 비트가 세트된 상태에서 TIMSK의 해당 bit도 세트 되어있다면 인터럽트가 발생된다.
ETIFR register
1번 타이머/카운터 관련 인터럽트
ISR(”벡터 이름”) { 인터럽트 내용 } 으로 사용함
14.3) 비교 일치 인터럽트
OCR1x (x= A, B ,C) register
14.4) 파형 출력
비교 일치 인터럽트 시 파형 출력 핀
표 14-4.
TCCR1A register
TCCR1B register
WGM1n (n= 0, 1, 2, 3) 은 TCCR1A & B에 나눠져 있으며 4 bit 로 출력 파형을 결정
WGMn (n= 0, 1, 2, 3) Bit
COM1An (n= 0, 1) Bit
PWM 모드 이외의 경우에는 다음과 같이 일치 출력 모드를 결정한다
TCCR1C register
FOC1x Bit 는 일회성으로 필요할 때마다 1을 세트해야 한다. 쓰기 전용이지만 읽기를 했을 경우 0을 반환한다.
14.5) 입력 캡처
ICRn (n = 1, 3) register
14.6) 요약
'MCU > ATmega128a' 카테고리의 다른 글
29. 적외선 통신 (0) | 2022.06.07 |
---|---|
13. 8 bit 타이머 (0) | 2022.06.02 |