본문 바로가기
임베디드/Atmega128

atmega128 timer/counter0 normal LED깜빡이기

by sj0020 2021. 1. 6.
/*
 * 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