2월 152010
ATmega128보드에 간단하게 외부 인터럽트가 발쌩할 때마다 현재 Count를 나타내는 2진수 값을 LED로 출력하는 코드를 연습삼아 만들어 보았다.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
typedef unsigned char Byte;
volatile Byte count;
ISR(INT0_vect)
{
count++;
}
void Interrupt_init(void)
{
EICRA = 0x02; // 트리거 방식설정
EIMSK = 0x01; // 인터럽트 Enable
DDRD = 0x00;
SREG |= 0x80;
}
int main(void)
{
Interrupt_init();
DDRB = 0xff;
count = 0;
while(1)
{
PORTB = ~count;
if (count >= 0xff) count = 0;
}
return 0;
}
여기서 중요한 점은 전역변수로 선언되어 있는 ‘count’변수는 ‘volatile’이라는 키워드가 설정되어 있어야 한다는 것이다.
volatile 키워드는 레지스터 변수로 사용되지 않아야한다는 것을 알리는 키워드이다. 보통 하드웨어 주소 또는 다른프로그램과 공유되는 데이터에 지정한다고 한다.
Reference
[1]이응혁 외 2명, “AVR ATmega128 마이크로컨트롤러”, ITC, 2009