임베디드/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 부분에 숫자만 바꿔서는 안된다