목차
마이크로프로세서 응용 및 실험 - Interrupt(인터럽트)
1. 설계과제의 목표 및 제한조건
2. 서론
3. 본론
4. 결론
1. 설계과제의 목표 및 제한조건
2. 서론
3. 본론
4. 결론
본문내용
C = 0xff;
}else if(int0_count%2==1){
PORTA = 0x00;
PORTC = segment[n];
}
delay(500,500);
GIFR = 0x80;
}
인터럽트 2번이 실행될 때 마다 n값이 1씩 작아진다. n이 0보다 작아지면 다시 7로 되돌린다.
int0_count가 짝수일 때 led[]의 n번째 값이 led에 출력되도록 하고, int0_count가 홀수일 때 segment[]의 n번째 값이 출력되도록 한다.
bounce방지를 위해 딜레이를 주고 비트클리어를 위해 GIFR=0x20(INTF2)을 준다.
SIGNAL(SIG_INTERRUPT2)
{
n--;
if(n<0)
n=7;
if(int0_count%2==0){
PORTA = led[n];
PORTC = 0xff;
}else if(int0_count%2==1){
PORTA = 0x00;
PORTC = segment[n];
}
delay(500,500);
GIFR = 0x20;
}
핀A, C를 출력으로 설정.
맨 처음의 7-segment는 꺼진 상태로 설정.
int main()
{
initialize();
DDRA = 0xff;
DDRC = 0xff;
PORTC = 0xff;
while(1);
}
void initialize(void)
INT0,1,2를 모두 사용하므로 GICR = 0xe0
INT0,1이 rising 할 때 인터럽트를 발생시키게 하기 위해 MCUCR=0x0f
INT2 또한 Rising edge로 설정
Global interrupt Enable은 sei()로 인터럽트사용을 가능하게 한다.
마지막으로 delay문 넣어준다.
{
GICR = 0xe0;
MCUCR = 0x0f;
MCUCSR = 0x40;
sei();
}
void delay(int d1,int d2)
{
int i,j;
for(i=0;i
for(j=0;j
}
}
◎ 결과
1) Decoder 설계
아무것도 누르지 않았을 때 첫 번째 led에 불이 들어오는 것을 볼 수 있다.
1번 Push switch만 누르고 있을 때 1칸을 이동한 두 번째 led 에 불이 들어오고, 세 개의 push switch를 누르고 있을 때 마지막 칸인 8번째 led에 불이 들어오는 것을 볼 수 있다.
2) LED 또는 7-segment로의 선택적 점등
맨 처음 작동시켰을 때 led의 첫 번째 칸에 불이 들어온다. 2번 push switch를 누를 때마다 led의 불이 한칸씩 증가되는 것을 볼 수 있었다.
1번 push switch를 눌렀을 때 led가 소등되고 7-segment에 led에 출력되는 수에 해당하는 숫자가 표시되는 것을 볼 수 있었다. 3번 push switch를 누를 때마다 7-segment에 표시되는 숫자가 하나씩 작아지는 것을 확인하였다.
4. 결론
1) Decoder 설계
각 인터럽트에 a=1, b=2, c=4 값을 주고 main에서 n=a+b+c를 하여 led=0x01의 값을 n만큼 시프트하는 방법을 사용하였다.
INT0, INT1의 설정은 MCUCR의 logic change 옵션을 사용하여 어렵지 않게 했지만 INT2의 MCUCSR는 logic change 옵션이 없어서 애를 많이 먹었다. 그래서 logic change를 임의로 코딩해주었다.
if((MCUCSR&0x40)==0x40)
MCUCSR = 0x00;
else if((MCUCSR&0x00)==0x00)
MCUCSR = 0x40;
인터럽트가 실행되고 rising edge가 설정되어 있으면 falling edge로 바꾸어 버튼을 뗄 때 인터럽트가 다시 한 번 실행되게 하여 interrupt_count2와 c의 값을 0으로 바꾼 후 인터럽트가 종료되기 전 위의 else if문으로 다시 rising edge로 설정해주는 방법을 사용하였다.
또한 딜레이를 이용하여 debounce 해주었다.
2) LED 또는 7-segment로의 선택적 점등
INT0로 int0_count라는 변수를 증가시키고 if문을 사용하여 int0_count가 짝수인지 홀수인지 판단하여 led를 출력할지 7-segment를 출력할지 결정하는 방법을 사용하였다.
INT1과 INT2에는 n이라는 변수를 증가, 감소시키도록 해놓고 led와 7-segment의 출력값을 미리 배열시켜놓고 난 후 n번째의 값을 출력하도록 하였다.
여기서는 모든 interrupt를 rising edge로 설정하였다.
이 실험도 역시 딜레이를 이용하여 debounce 해주었다.
}else if(int0_count%2==1){
PORTA = 0x00;
PORTC = segment[n];
}
delay(500,500);
GIFR = 0x80;
}
인터럽트 2번이 실행될 때 마다 n값이 1씩 작아진다. n이 0보다 작아지면 다시 7로 되돌린다.
int0_count가 짝수일 때 led[]의 n번째 값이 led에 출력되도록 하고, int0_count가 홀수일 때 segment[]의 n번째 값이 출력되도록 한다.
bounce방지를 위해 딜레이를 주고 비트클리어를 위해 GIFR=0x20(INTF2)을 준다.
SIGNAL(SIG_INTERRUPT2)
{
n--;
if(n<0)
n=7;
if(int0_count%2==0){
PORTA = led[n];
PORTC = 0xff;
}else if(int0_count%2==1){
PORTA = 0x00;
PORTC = segment[n];
}
delay(500,500);
GIFR = 0x20;
}
핀A, C를 출력으로 설정.
맨 처음의 7-segment는 꺼진 상태로 설정.
int main()
{
initialize();
DDRA = 0xff;
DDRC = 0xff;
PORTC = 0xff;
while(1);
}
void initialize(void)
INT0,1,2를 모두 사용하므로 GICR = 0xe0
INT0,1이 rising 할 때 인터럽트를 발생시키게 하기 위해 MCUCR=0x0f
INT2 또한 Rising edge로 설정
Global interrupt Enable은 sei()로 인터럽트사용을 가능하게 한다.
마지막으로 delay문 넣어준다.
{
GICR = 0xe0;
MCUCR = 0x0f;
MCUCSR = 0x40;
sei();
}
void delay(int d1,int d2)
{
int i,j;
for(i=0;i
}
◎ 결과
1) Decoder 설계
아무것도 누르지 않았을 때 첫 번째 led에 불이 들어오는 것을 볼 수 있다.
1번 Push switch만 누르고 있을 때 1칸을 이동한 두 번째 led 에 불이 들어오고, 세 개의 push switch를 누르고 있을 때 마지막 칸인 8번째 led에 불이 들어오는 것을 볼 수 있다.
2) LED 또는 7-segment로의 선택적 점등
맨 처음 작동시켰을 때 led의 첫 번째 칸에 불이 들어온다. 2번 push switch를 누를 때마다 led의 불이 한칸씩 증가되는 것을 볼 수 있었다.
1번 push switch를 눌렀을 때 led가 소등되고 7-segment에 led에 출력되는 수에 해당하는 숫자가 표시되는 것을 볼 수 있었다. 3번 push switch를 누를 때마다 7-segment에 표시되는 숫자가 하나씩 작아지는 것을 확인하였다.
4. 결론
1) Decoder 설계
각 인터럽트에 a=1, b=2, c=4 값을 주고 main에서 n=a+b+c를 하여 led=0x01의 값을 n만큼 시프트하는 방법을 사용하였다.
INT0, INT1의 설정은 MCUCR의 logic change 옵션을 사용하여 어렵지 않게 했지만 INT2의 MCUCSR는 logic change 옵션이 없어서 애를 많이 먹었다. 그래서 logic change를 임의로 코딩해주었다.
if((MCUCSR&0x40)==0x40)
MCUCSR = 0x00;
else if((MCUCSR&0x00)==0x00)
MCUCSR = 0x40;
인터럽트가 실행되고 rising edge가 설정되어 있으면 falling edge로 바꾸어 버튼을 뗄 때 인터럽트가 다시 한 번 실행되게 하여 interrupt_count2와 c의 값을 0으로 바꾼 후 인터럽트가 종료되기 전 위의 else if문으로 다시 rising edge로 설정해주는 방법을 사용하였다.
또한 딜레이를 이용하여 debounce 해주었다.
2) LED 또는 7-segment로의 선택적 점등
INT0로 int0_count라는 변수를 증가시키고 if문을 사용하여 int0_count가 짝수인지 홀수인지 판단하여 led를 출력할지 7-segment를 출력할지 결정하는 방법을 사용하였다.
INT1과 INT2에는 n이라는 변수를 증가, 감소시키도록 해놓고 led와 7-segment의 출력값을 미리 배열시켜놓고 난 후 n번째의 값을 출력하도록 하였다.
여기서는 모든 interrupt를 rising edge로 설정하였다.
이 실험도 역시 딜레이를 이용하여 debounce 해주었다.
추천자료
tyler의 <교육과정과 학습지도의 기본원리> 요약정리 및 느낀점
'교육과정'에 관한 전반적 개괄
저항기 색 코드와 저항값 측정(결과보고서)
사회중심 교육과정
(노딩코드 독후감) 노딩코드를 읽고
[분할][텍스트 분할][코드 분할][공개키 암호][코프로세서 분할][파장 분할]텍스트 분할, 코...
[컴퓨터의이해] 1.스마트폰의 최신동향을 A4 용지 2페이지 내외로 서술하라_스마트폰최신동향...
방통대 1학년 1학기 중간과제물 스마트폰 최신동향, QR코드(Quick Response Code)의 유용성 ...
[CDMA]CDMA(코드분할다중접속방식)의 정의, 역사, CDMA(코드분할다중접속방식)의 관련용어, ...
[2016 컴퓨터의이해] 1. 본인사용중또는 최신스마트폰을 1개선정, 스마트폰 운영체제 이름 기...
[컴퓨터의이해] 본인이 사용 중이거나 또는 최신 스마트폰을 1 개 선정하고, 스마트폰의 운영...
[컴퓨터의이해] 본인이 사용 중이거나 또는 최신 스마트폰을 1 개 선정하고, 스마트폰의 운영...
소개글