타이머를 이용하여 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

+ Recent posts