임베디드/Atmega128

atmega128 (timer/counter0 normal) + (timer/counter2 fast pwm) LED깜빡이기

sj0020 2021. 1. 29. 14:32
#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 부분에 숫자만 바꿔서는 안된다