/*
* Ko_Timer_Counter.c
*
* Created: 2021-01-04 오후 5:29:39
* Author : User
*/
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#define LED PB7
volatile unsigned long timer0; //오버플로마다 1씩 증가될 변수
ISR(TIMER0_OVF_vect)
{
timer0++; // 오버플로마다 1씩 증가
if(timer0 % 100 == 0){
PORTB ^= 1 << LED; // PORTB의 LED 위치 비트를 반전시킴
}
}
int main(void)
{
DDRB |= 1 << LED; // PB7 LED 출력 핀으로 설정
TCCR0 |= 1 << CS02 | 1 << CS01; //256 분주 프리스케일러
TIMSK |= 1 << TOIE0; //타이머/카운터0 인터럽트 활성화
timer0 = 0;
sei();
while (1);
return 0;
}
hz: 1clock in 1sec
16MHZ / 256 = 62500 HZ (1초에 62500번을 튐)
1 / 62500 = 0.000016 = 16us (하나 튈때 시간은 16us)
16us * 256 = 0.004096 = 4.096ms (인터럽트 호출 주기)
a!=a; 토글시킴 ..0,1이 반복됨
정확한 시간계산을 위해서는 RTC를 사용해야 된다
위의 코드를 타이머카운터 2 로 쓰고싶다면 프리스케일부분을 다르게 줘야 한다. (0과 2 는 프리스케일 세팅 비트가 다름)
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#define LED1 PB6
#define LED2 PB7
volatile unsigned long timer2; //오버플로마다 1씩 증가될 변수
ISR(TIMER2_OVF_vect)
{
timer2++; // 오버플로마다 1씩 증가
if(timer2 % 100 == 0){
PORTB ^= 1 << LED1;
PORTB ^= 1 << LED2; // PORTB의 LED 위치 비트를 반전시킴
}
}
int main(void)
{
DDRB |= 1 << LED1; // PB7 LED 출력 핀으로 설정
DDRB |= 1 << LED2;
TCCR2 |= 1 << CS22; //| 1 << CS21; //256 분주 프리스케일러
TIMSK |= 1 << TOIE2; //타이머/카운터2 인터럽트 활성화
timer2 = 0;
sei();
while (1);
return 0;
'임베디드 > Atmega128' 카테고리의 다른 글
atmega128 timer/counter0 normal 모터 (0) | 2021.01.07 |
---|---|
고속pwm으로 똑같이 동작하게 (0) | 2021.01.06 |
pwm duty cycle (0) | 2021.01.06 |
atmega128A datasheet 데이터시트 (0) | 2021.01.04 |
04_HBridgeCircuit.c DC 모터 (0) | 2020.12.29 |