제
6 장 인터럽트 (주관식 연습문제)
43. 인터럽트 발생시 되돌아 올 주소를 기억하는 데 사용되는 레지스터는? (풀이) 스택 포인터(Stack Pointer) 44. 인터럽트의 우선순위를 결정하는 하드웨어 방법인 데이지 체인이 무엇인지 설명하여라. (풀이) 하드웨어 방법으로 입·출력 장치의 우선순위를 결정하는 방식이며, 모든 입·출력 장치들을 직렬로 연결하여 CPU 와 전기적으로 가까운 장치가 높은 우선순위를 갖는다. 응답속도가 빠르지만 우선순위 변경이 어려 운 단점이 있다. 45. 타이머/카운터 0 을 모드 1 의 카운터로 설정하고 20 개의 펄스가 T0 핀에 입력되면 인터럽트가 발생 되는 프로그램을 작성하여라. (풀이) #include <reg51.h>void TMR0_int(void) interrupt 1 // 타이머/카운터 0 인터럽트 벡터번호 = 1 { TH1=0xff; // (65536-20)=FFECH TL1=0xec; return; } void main(void) { TMOD=0x05; // 타이머/카운터 0 을 카운터 모드 1 로 설정 TH1=0xff; // (65536-20)=FFECH TL1=0xec; ET0=1; // 타이머 0 인터럽트 인에이블 EA=1; // 전체 인터럽트 인에이블 PT0=1; // 타이머 0 인터럽트 우선순위 High TR0=1; // 타이머 0 run while(1); // 인터럽트 대기 } 46. 타이머/카운터 1 을 모드 2 의 타이머로 설정하고 200s 마다 인터럽트가 발생되는 프로그램을 작성 하여라. 단, 발진기의 주파수는 12MHz 임을 가정한다. (풀이) TMOD=0x20; // 타이머/카운터 1 을 타이머 모드 2 로 설정 TH1=0x38; // 256-200=38H TL1=0x38; IE=0x88; // 타이머/카운터 1 인터럽트 인에이블, 전체 인터럽트 인에이블 PT1=1; // 타이머/카운터 1 을 높은 우선순위로 설정 TR1=1; // 타이머 1 run 47. 타이머/카운터 0 을 모드 2 의 타이머로 설정하고 P1.0 핀에 duty cycle 이 30%인 10KHz 구형파를 발생시키는 프로그램을 작성하여라. 단, 발진기의 주파수는 12MHz 임을 가정한다. (풀이) 10KHz 는 주기가 100s(=1/104)이므로 duty cycle 이 30%인 구형파를 발생시키기 위해서는 30s 동안은 P1.0 핀에 High 를 인가하고, 70s 동안에는 Low 를 인가하면 된다. 발진주파수를 12 분주한 클 록이 카운터 입력이 되기 때문에 1s(=12/12MHz)마다 카운트된다. 기본적으로 10s 마다 인터럽트를 발생한다. P1.0 핀을 High 로 하고 이를 3 회 반복하고, 다시 P1.0 핀을 Low 로 하고 이를 7 회 반복하면 duty cycle 이 30%인 10KHz 구형파가 발생된다. #include <reg51.h> sbit duty = P1^0; // 구형파 출력 핀
void TMR0_int(void) interrupt 1 // 타이머/카운터 0 인터럽트 벡터번호 = 1 {
unsigned char count;
duty=1; // P1.0 핀에 High 인가 count=3; do { while(!TF0); TF0=0; count--; } while(count); duty=0; // P1.0 핀에 Low 인가 count=7; do { while(!TF0); TF0=0; count--; } while(count); return; } void main(void) { TMOD=0x02; // 타이머/카운터 0 을 타이머 모드 2 로 설정 TH0=0xf6; // 시정수 설정(10us) TL0=0xf6; // 256-10=F6H ET0=1; // 타이머 0 인터럽트 인에이블 EA=1; // 전체 인터럽트 인에이블 PT0=1; // 타이머 0 인터럽트 우선순위 High TR0=1; // 타이머 0 run while(1); // 인터럽트 대기 } 48. 타이머/카운터 1 을 모드 2 의 타이머로 설정하고 TH0=56 으로 하였을 경우의 인터럽트 요청 주파수 는? 단, 발진기의 주파수는 24MHz 임을 가정한다. (풀이) 발진주파수를 12 분주한 클록이 카운터 입력이 되기 때문에 0.5s(=12/24MHz)마다 카운트된다. 따라 서 인터럽트 요청 주기는 0.5s×200(=256-56)=100s=0.1ms 가 되므로 주파수는 10KHz 가 된다. 49. 발진기의 주파수가 12MHz 일 때, 타이머/카운터 1 을 이용하여 50ms 마다 인터럽트가 발생되도록 하고, 이것을 이용하여 800ms 마다 포트 1 에 연결된 LED 가 이동되도록 프로그램을 작성하여라. (풀이) #include <reg51.h> unsigned char led;
void TMR1_int(void) interrupt 3 // 타이머/카운터 1 인터럽트 벡터번호 = 3 {
unsigned char count; count=16; do { while(!TF1); TF1=0; TH1=0x3c; // 시정수 설정(0.05 초) TL1=0xb0; // 65536-50000=3CB0H
count--; } while(count); P1=led; led=(led << 1) | 0x01; if (led == 0xff) led=0xfe; return; } void main(void) { TMOD=0x10; // 타이머 1 을 모드 1 로 설정 TH1=0x3c; // 시정수 설정(0.05 초) TL1=0xb0; // 65536-50000=3CB0H ET1=1; // 타이머 1 인터럽트 인에이블 EA=1; // 전체 인터럽트 인에이블 PT1=1; // 타이머 1 인터럽트 우선순위 High TR1=1; // 타이머 1 run led=0xfe; // 초기 데이터 설정 while(1); // 인터럽트 대기 } 50. RS-232C 통신방식에서 필요한 최소 통신 선의 수는? (풀이) 3 개(Tx, Rx, GND)