* 인터럽트 : 방해하다, 훼방놓다의 뜻, 긴급하거나 불규칙적인 사건의 처리, 외부와의 인터페이스, 폴링(polling)으로 처리하기에는 프로세싱 타임 낭비
HOW
- 현재 수행중인 일을 잠시 중단하고 급한 일을 처리
- 일이 끝나면 본래의 일을 다시 이어서 수행
- 이때, 급한 일을 해결하는 작업을 인터럽트 서비스 루틴이라 하는데, 각 인터럽트마다 고유의 인터럽트 서비스 루틴 존재
- 인터럽트가 여러 개 동시에 걸리면 우선 순위에 따라 조치
* 인터럽트 서비스 루틴
- 인터럽트가 발생하면 프로세서는 현재 수행중인 프로그램을 멈추고 상태 레지스터와 PC 등을 스택에 잠시 저장 후 인터럽트 서비스 루틴으로 점프, 인터럽트 서비스 루틴을 실행한 후에는 이전의 프로그램으로 복귀하여 정상적인 절차를 실행한다.
* 인터럽트 스위치로 1/100 스톱워치 만들기
- 메인
1. 초기설정
2. state 변수 값 설정 : stop
3. 인터럽트 활성화
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 16000000UL
#define __DELAY_BACKWARD_COMPATIBLE__
#include <util/delay.h>
#define STOP 0
#define GO 1
volatile int cur_time = 0;
volatile int stop_time = 0;
volatile int state = STOP;
unsigned char digit[]= {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67};
unsigned char fnd_sel[4] = {0x01, 0x02, 0x04, 0x08};
SIGNAL(SIG_INTERRUPT4)
{
if (state == STOP)
state = GO;
else
{
state = STOP;
stop_time = cur_time;
}
}
SIGNAL(SIG_INTERRUPT5)
{
state = STOP;
cur_time = 0; stop_time = 0;
}
void init( )
{
DDRC = 0xff; // FND Data
DDRG = 0x0f; // FND Select
DDRE = 0xcf; // INT4, 5
PORTC = digit[0]; PORTG = 0x0f; EICRB = 0x0a; //falling edge
EIMSK = 0x30; //interrupt en
sei();
}
void display_fnd(int count) // 수행시간 = 약 10ms
{
int i, fnd[4];
fnd[3] = (count/1000)%10; // 천 자리
fnd[2] = (count/100)%10; // 백 자리
fnd[1] = (count/10)%10; // 십 자리
fnd[0] = count%10; // 일 자리
for (i=0; i<4; i++)
{
PORTC = digit[fnd[i]];
PORTG = fnd_sel[i];
_delay_ms(2+i%2);
}
}
int main()
{
init( );
while(1)
{
if (state == STOP)
display_fnd(stop_time);
else display_fnd(cur_time);
cur_time++;
}
}
'Project > j-kit-128-1실습' 카테고리의 다른 글
FND_Display with Timer/Counter (0) | 2018.10.01 |
---|---|
LED 제어 (0) | 2016.02.26 |
FND 실습 (0) | 2016.02.26 |
FND 실습 1/100초 스탑워치, 24시간 디지털 시계만들기 (0) | 2016.02.26 |
회로도 참고 (0) | 2016.02.26 |