#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#define LED1 PB6 // 타이머카운터0
#define LED2 PB7 // 타이머카운터2
volatile unsigned long timer0; //오버플로마다 1씩 증가될 변수
volatile unsigned long timer2;
ISR(TIMER0_OVF_vect)
{
timer0++; // 오버플로마다 1씩 증가
if(timer0 % 100 == 0){
PORTB ^= 1 << LED1; // PORTB의 LED 위치 비트를 반전시킴
}
}
ISR(TIMER2_OVF_vect)
{
timer2++; // 오버플로마다 1씩 증가
if(timer2 % 100 == 0){
PORTB ^= 1 << LED2; // PORTB의 LED 위치 비트를 반전시킴
}
}
int main(void)
{
DDRB |= (1 << LED1) | (1 << LED2); // LED 출력 핀으로 설정
TCCR0 |= (1 << CS02) | (1 << CS01); //256 prescaler
TCCR2 |= (1 << WGM21) | (1 << WGM20); // 8bit fast pwm
TCCR2 |= (1 << CS22) | (1 << CS20); // (1024 prescaler x 256 pulse) / 16mhz = 0.016384초 = 16.384ms
TIMSK |= (1 << TOIE0) | (1 << TOIE2); //타이머/카운터 0, 2 인터럽트 활성화
timer0 = 0;
timer2 = 0;
sei(); // 모든 인터럽트 활성화
while (1);
return 0;
}
타이머카운터0 과 2는 프리스케일러 설정부분이 다름을 주의.. CSn1 의 n 부분에 숫자만 바꿔서는 안된다
'임베디드 > Atmega128' 카테고리의 다른 글
AVR 내부 flash memory 구조, atmega128 bootsz 퓨즈상태와 부트로더 섹션 크기 조정, AVR 부트로더 동작 (0) | 2021.01.29 |
---|---|
analog (0) | 2021.01.29 |
8비트 + 16비트 섞어 써보기 (0) | 2021.01.29 |
인터럽트(Interrupt) 개요 (0) | 2021.01.24 |
ATmega128 인터럽트방식 p247 (pdf246) (0) | 2021.01.22 |