Download presentation
Presentation is loading. Please wait.
1
6 인터럽트
2
인터럽트 관련 레지스터를 설정하는 방법을 이해한다. 인터럽트 종류에 따른 특성을 이해한다.
인터럽트 개념과 구조를 이해한다. 인터럽트 관련 레지스터를 설정하는 방법을 이해한다. 인터럽트 종류에 따른 특성을 이해한다. 실습을 통해 인터럽트를 적용하는 방법을 익힌다. 01. 인터럽트 구조와 동작 02. 외부 인터럽트 03. 타이머/카운터 인터럽트 04. 직렬 포트 인터럽트 05. 인터럽트 실습 1 : 외부 인터럽트를 이용한 LED 구동 06. 인터럽트 실습 2 : 타이머 인터럽트를 이용한 LED 구동 07. 인터럽트 실습 3 : 외부 및 타이머 인터럽트를 이용한 7-세그먼트 구동 08. 인터럽트 실습 4 : 직렬 포트 인터럽트를 이용한 데이터 송수신
3
1. 인터럽트 구조와 동작 1.1 인터럽트 개념 인터럽트(interrupt)는 외부 또는 내부로부터의 긴급 서비스 요청에 의하여 CPU가 현재 실행 중인 작업을 중단하고 그 요청한 서비스를 해주는 기법 사람 마이크로프로세서
4
1. 인터럽트 구조와 동작 인터럽트 종류 ① 외부 인터럽트 0 ( ) ② 타이머/카운터 0 인터럽트(TF0)
① 외부 인터럽트 0 ( ) ② 타이머/카운터 0 인터럽트(TF0) ③ 외부 인터럽트 1 ( ) ④ 타이머/카운터 1 인터럽트 (TF1) ⑤ 직렬 포트 인터럽트(RI+TI)
5
1. 인터럽트 구조와 동작 1.2 인터럽트 구조 인터럽트를 제어하는 레지스터 인터럽트 종류와 관련 레지스터
TCON, SCON 레지스터 : 인터럽트 발생 사실을 소스별로 보존 IE 레지스터 : 개별 또는 전체적으로 enable과 disable을 결정 IP 레지스터 : 각 인터럽트 소스간의 우선순위를 결정 인터럽트 종류와 관련 레지스터
6
1. 인터럽트 구조와 동작 Interrupt Enable(IE) Register
"0"이면 Interrupt Disable, "1"이면 Interrupt Enable [예 1] 외부 인터럽트 0의 요청을 받는 경우 EX0=1; // 외부 인터럽트 0 인터럽트 enable EA=1; // 전체 인터럽트 enable [예 2] 타이머/카운터 0 인터럽트의 요청을 받는 경우 ET0=1; // 타이머/카운터 0 인터럽트 enable EA=1; // 전체 인터럽트 enable [예 3] 직렬 포트 인터럽트의 요청을 받는 경우 ES=1; // 직렬 포트 인터럽트 enable EA=1; // 전체 인터럽트 enable
7
1. 인터럽트 구조와 동작 1.3 인터럽트 우선순위 Interrupt Priority Control (IP) Register
우선순위는 인터럽트가 둘 이상 동시에 발생할 때 먼저 서비스할 인터럽트를 결정하기 위한 것 8051에서는 소프트웨어 방법인 폴링 방법을 이용 Interrupt Priority Control (IP) Register "1"로 하면 인터럽트 우선순위가 높은 레벨로 된다.
8
1. 인터럽트 구조와 동작 인터럽트 우선순위 [예1] 외부 인터럽트 1의 우선순위 레벨을 높게 설정
인터럽트 소스 구분 외부 인터럽트 0 ( ) 1 타이머/카운터 0 인터럽트(TF0) 2 외부 인터럽트 1 ( ) 3 타이머/카운터 1 인터럽트(TF1) 4 직렬 포트 인터럽트(RI+TI) 5 타이머/카운터 2 인터럽트(TF2)(8052 only) [예1] 외부 인터럽트 1의 우선순위 레벨을 높게 설정 EX1=1; // 외부 인터럽트 1 enable PX1=1; // 외부 인터럽트 1의 우선순위 레벨을 높게 설정 EA=1; // 전체 인터럽트 enable [예2] 타이머/카운터 1 인터럽트의 우선순위 레벨을 높게 설정 ET1=1; // 타이머/카운터 1 인터럽트 enable PT1=1; // 타이머/카운터 1 인터럽트의 우선순위 레벨을 높게 설정 EA=1; // 전체 인터럽트 enable
9
1. 인터럽트 구조와 동작 1.4 인터럽트 동작 인터럽트가 발생하면 CPU는 각 인터럽트에 해당하는 특정 주소로 점프
이 특정 주소를 벡터 어드레스(vector address)라고 한다. 외부 인터럽트 0가 발생하면 CPU는 무조건 0003H 번지로 점프하고, 타이머/카운터 인터럽트 0 인터럽트가 발생하면 000BH 번지로 점프한다. 나머지 인터럽트도 각자의 벡터 어드레스로 점프하게 된다. 인터럽트가 발생하여 벡터 어드레스로 점프하기 전에 프로그램 카운터(PC) 값을 스택에 저장하고 점프한다. 점프하여 인터럽트 서비스 루틴을 마치면 스택에 저장되었던 PC 값은 다시 PC에 저장된다. 인터럽트 종류 벡터 어드레스 외부 인터럽트 0 ( ) 0003H 타이머/카운터 0 인터럽트(TF0) 000BH 외부 인터럽트 1( ) 0013H 타이머/카운터 1 인터럽트(TF1) 001BH 직렬 포트 인터럽트(RI+TI) 0023H
10
2. 외부 인터럽트 2.1 TCON(Timer Control Register)
[예] 외부 인터럽트 1을 Edge Trigger Mode로 설정 IT1=1; // 외부 인터럽트 1 에지 모드로 설정 EX1=1; // 외부 인터럽트 1 인에이블 PX1=1; // 외부 인터럽트 1의 우선순위를 높은 레벨로 설정 EA=1; // 전체 인터럽트 인에이블
11
3. 타이머/카운터 인터럽트 타이머 : 1머신 사이클(내부 시스템 클록을 1/12 분주한 것)을 카운트하는 것
카운터 : 외부 핀 T0, T1에 입력되는 클록 또는 이벤트(event)를 카운트하는 것 8051에는 독립된 16비트 타이머/카운터가 2개 내장 타이머/카운터 0에서는 TH0, TL0 레지스터가, 타이머/카운터 1에서는 TH1, TL1 레지스터가 사용된다. 이 레지스터들은 클록이 입력될 때마다 1씩 증가하는 상향 카운터다. 타이머/카운터 레지스터에 오버플로우(FFH00H)가 발생하면 TCON 레지스터에 있는 TF가 1이 된다. 타이머/카운터 인터럽트는TMOD, TCON, IE, IP 레지스터를 이용해 제어한다.
12
3. 타이머/카운터 인터럽트 3.1 TMOD 레지스터
13
3. 타이머/카운터 인터럽트 3.2 TCON 레지스터
14
3. 타이머/카운터 인터럽트 3.3 타이머/카운터 동작 모드 모드 0(mode 0) 타이머가 모드 0으로 설정된 경우 동작과정
32분주 prescaler가 있는 8비트 타이머/카운터 모드 TL 레지스터(TL0, TL1)의 하위 5비트를 32분주용으로 사용 TH (TH0, TH1)를 8비트 카운터로 사용 타이머/카운터 0, 1을 주기적인 인터럽트로 사용할 경우에는 인터럽트 처리 루틴에서 리턴하기 전에 시정수를 카운터 레지스터에 써넣어야 한다. 타이머가 모드 0으로 설정된 경우 동작과정 TL0나 TL1이 “11111”에서 “00000”으로 되면, TH0, TH1 레지스터가 +1 증가 TH0 혹은 TH1이 “FFH”에서 “00H”로 되면 TCON 레지스터의 인터럽트 플래그(TF0, TF1)가 세트되고 인터럽트가 인에이블 되어 있으면 인터럽트를 요청하고 인터럽트 처리루틴으로 들어가기 전에 TF0, TF1가 자동으로 클리어되고 인터럽트 처리루틴으로 들어간다.
15
3. 타이머/카운터 인터럽트 타이머/카운터 모드 0의 기능도
타이머/카운터가 타이머 모드 0으로 설정되면 13비트 카운터로 동작하므로 가장 긴 카운트는 8192(=213)다. 그러므로 발진 주파수가 12MHz면 가장 긴 시간은 8192s가 된다.
16
3. 타이머/카운터 인터럽트 [예] 타이머 모드 0을 이용하여 4ms(=4000s)마다 타이머 0 오버플로우
인터럽트가 발생하는 프로그램 TMOD=0x00; // 타이머/카운터 0은 타이머 모드 0으로 설정 TF0=0; // 타이머/카운터 0 인터럽트 플래그 TF0 클리어 TH0=0x83; // ( )/32 TR0=1; // 타이머/카운터 0 run 외부 발진 주파수가 달라지면 TH0값은 변경필요
17
3. 타이머/카운터 인터럽트 모드 1(mode 1) 16비트 타이머/카운터 모드 12MHz 동작시에는 1sec마다 카운트되며, 최대 동작주기는 65536sec 타이머/카운터 0, 1을 주기적인 인터럽트로 사용할 경우에는 인터럽트 처리 루틴에서 리턴하기 전에 시정수를 카운터 레지스터에 써넣어야 한다. [예] 타이머/카운터 0을 타이머 모드 1로 설정하여 0.05초(=50000s)마다 타이머 0 오버플로우 인터럽트가 발생하는 프로그램 TMOD=0x01; // 타이머/카운터 0는 타이머 모드 1 TF0=0; // 타이머/카운터 0 인터럽트 플래그 TF0 클리어 TH0=0x3c; // 0.05초를 위한 시정수 TL0=0xb0; // =15536=3CB0H IE=0x82; // 타이머/카운터 0 인터럽트 인에이블. 전체 인터럽트 인에이블 IP=0x02; // 타이머/카운터 0 인터럽트를 높은 우선순위로 설정 TR0=1; // 타이머/카운터 0 run
18
3. 타이머/카운터 인터럽트 타이머 모드 1의 기능도
19
3. 타이머/카운터 인터럽트 모드 2(mode 2) [예] 타이머/카운터 1을 모드 2로 설정하여 0.2ms(=200s)마다
Auto Reload 기능이 있는 8비트 타이머/카운터 모드 [예] 타이머/카운터 1을 모드 2로 설정하여 0.2ms(=200s)마다 타이머 1 오버플로우 인터럽트가 발생하는 프로그램 TMOD=0x20; // 타이머/카운터 1은 타이머 모드 2 TF1=0; // 타이머/카운터 1 인터럽트 플래그 TF1 클리어 TH1=0x38; // 0.2ms를 위한 시정수( = 56 = 38H) TL1=0x38; IE=0x88; // 타이머/카운터 1 인터럽트 인에이블. 전체 인터럽트 인에이블 IP=0x08; // 타이머/카운터 1 인터럽트의 우선순위를 높은 레벨로 설정 TR1=1; // 타이머/카운터 1 run
20
3. 타이머/카운터 인터럽트 타이머 모드 2의 기능도
21
3. 타이머/카운터 인터럽트 모드 3(mode 3) 타이머/카운터 0와 타이머/카운터 1의 동작이 다르다 .
타이머/카운터 0는 TH0과 TL0은 독립된 2개의 8비트 타이머/카운터로 동작 TH0의 제어는 TF1과 TR1을 사용하고, TL0의 제어는 TF0와 TR0를 사용
22
3. 타이머/카운터 인터럽트 타이머 모드 3의 기능도
23
4. 직렬 포트 인터럽트 동작모드 직렬포트 인터럽트에 관련된 레지스터 모드 0 : I/O 확장용의 동기식 통신모드
모드 1 : 10비트 프래임(frame)으로 보레이트(baud rate)를 변경할 수 있는 비동기식 통신모드 모드 2 : 11비트 프래임으로 보레이트가 고정된 비동기식 통신모드 모드 3 : 11비트 프래임으로 보레이트가 변경할 수 있는 비동기식 통신모드 직렬포트 인터럽트에 관련된 레지스터 SBUF (serial port buffer register) SCON (serial port control register) PCON (power control register)
24
4. 직렬 포트 인터럽트 4.1 SBUF 레지스터 송신할 데이터와 수신한 데이터를 일시적으로 저장하기 위한 레지스터
수신 시에는 RI=1을 확인하고 데이터를 읽어야 한다. [예1] 데이터를 송신하는 경우 SBUF = tran_data; // tran_data의 내용을 송신 [예2] 데이터를 수신하는 경우 reci_data = SBUF; // 수신된 데이터가 reci_data에 저장
25
4. 직렬 포트 인터럽트 4.2 SCON 레지스터 SCON (serial port control register) 레지스터는 직렬포트의 제어와 직렬포트의 상태를 감시하기 위한 레지스터
26
4. 직렬 포트 인터럽트 [예1] 인터럽트 없는 수신 함수 [예2] 인터럽트 없는 송신 함수
while(!RI); // RI가 “1”이 될 때까지 대기 RI=0; // RI clear reci_data = SBUF; // 수신된 데이터를 reci_data에 저장 [예2] 인터럽트 없는 송신 함수 while(!TI); // TI가 “1”이 될 때까지 대기 TI=0; // TI clear SBUF = tran_data; // tran_data 값을 송신
27
4. 직렬 포트 인터럽트 4.3 PCON 레지스터 보레이트를 제어하고 아이들 모드(idle mode)와 파워다운 모드(power down mode)를 제어하는데 사용
28
4. 직렬 포트 인터럽트 4.4 직렬포트의 동작 모드 Mode 0
동기식 통신모드, 8비트 데이터 통신, Baud Rate는 입력의 1/12로 고정됨. 시스템 클록이 12[MHz]인 경우, 전송 속도는 12[MHz]/12=1[MHz]이다. REN=0, SBUF에 데이터를 써 넣으면, 데이터 전송이 시작된다. 송신이 종료되면 TI는 1이 된다. 수신은 REN=1, RI=0인 조건에서 발생한다. RI=1이면 SBUF 값을 Read하면 된다. 데이터 송신 데이터 전송은 SCON 레지스터에 있는 REN를 "0"으로 하고, SBUF를 데이터를 써넣음으로써, 데이터 전송이 시작된다. 송신 이 끝나면 TI 플래그는 "1"이 된다. 데이터 수신 수신은 REN=1, RI=0 인 조건에서 일어난다. 사용자는 RI 플래 그를 검사해서 RI="1" 이면 SBUF의 값을 리드하면 된다.
29
4. 직렬 포트 인터럽트 Mode 1 10비트 Frame 데이터 통신이며 Baud Rate를 가변 TI=1이면, SBUF에 데이터를 써 넣으면, 데이터 전송이 시작된다. 송신이 종료되면 TI=1 이 된다. 수신은 REN=1이면 가능하다. 수신된 데이터가 SBUF에 저장되면 RI=1이 된다. 전송속도 (Baud Rate) 데이터 송신 TI 플래그를 검사해서 "1"이면, SBUF로 데이터를 써넣으면 데이터 전송이 시작된다. 전송 중에는 TI 플래그는 "0"이 되며, SBUF로 써 넣어진 데이터가 전송이 끝나면 다시 TI 플래그가 "1"이 된다. 수신 SCON 레지스터에 있는 REN="1"이면 수신이 가능하다. 수신된 데 이터가 SBUF에 저장되면, RI 플래그는 "1"이 된다. 사용자는 수신을 하고 RI 플래그를 Clear 한다.
30
4. 직렬 포트 인터럽트 Mode 2 Baud Rate는 System Clock의 1/32, 1/64로 설정 전송 시 TB8은 어떤 값으로도 할당 가능하며, 전송 완료 후 TB8=0이 된다. 수신 시 9번째 비트가 1이 아니면, RI는 1이 되지 않으며, RB8에 복사되지 않는다. 전송속도 (Baud Rate) 데이터 송신 TI 플래그를 검사해서 "1"이면 SBUF로 데이터를 써넣고, TB8을 "1" 혹은 "0"을 써넣음으로써 데이터 전송이 시작된다. 전송 중에는 TI 플래그는 "0"이 되며, SBUF로 써넣어진 데이터가 전송이 끝나면 다시 TI 플래그가 "1"이 된다. 수신 SCON 레지스터에 있는 REN="1"이면 수신이 가능하다. 수신된 데 이터가 SBUF에 저장되고 마지막 비트가 SCON 레지스터에 있는 RB8로 저장된다. 모드 2에서는 RB8=1이면 RI 플래그는 "1"이 되고, 모드 3에서는 RB8의 값에 관계없이 RI 플래그는 "1"
31
4. 직렬 포트 인터럽트 Mode 3 Baud Rate는 Timer/Counter의 Overflow를 이용해서 조정
전송 시 TB8은 어떤 값으로도 할당 가능하며, 전송 완료 후 TB8=0이 된다. 수신 시 9번째 비트는 RB8에 복사되고 RI는 무조건 1이 된다.
32
4. 직렬 포트 인터럽트 타이머/카운터 1에 의한 보레이트 Baud Rate 발진 주파수 SMOD 타이머/카운터 1 Mode
TH1 값 Mode 0, Max. 1MHz 12MHz Mode 2, Max. 375KHz 1 Mode 1,3, Max. 62.5KHz 2 FFH 19.2KHz MH z FDH 9.6KHz 4.8KHz FAH 2.4KHz F4H 1.2KHz E8H 137.5Hz 11.986MHz 1DH 110Hz 6MHz 72H FEEBH
33
4. 직렬 포트 인터럽트 모드별 보레이트 발생기
34
4. 직렬 포트 인터럽트 데이터를 9600bps로 전송할 경우, 시정수를 계산하라. 단, 시스템 클록
[예1] 데이터를 9600bps로 전송할 경우, 시정수를 계산하라. 단, 시스템 클록 MHz, 타이머/카운터 1 모드 2, 타이머 기능을 가정한다. TH1은 상향 카운터므로 시정수 = 256-3 = 253(=FDH)이다. [예2] 보레이트를 만들기 위한 함수 TMOD = 0x20; // 타이머/카운터 1, 타이머 모드 2로 설정 PCON = 0x00; // SMOD = 0 TH1 = 0xfd; // 9600bps 설정 TR1 = 1; // 타이머 1 run SCON = 0x52; // 직렬 포트 모드 1(8비트 비동기), 수신, 송신 인에이블
35
4. 직렬 포트 인터럽트 4.5 멀티프로세서 직렬통신 멀티프로세서 통신의 데이터 전송형식(모드 2, 3)
멀티프로세서 시스템 구성도
36
4. 직렬 포트 인터럽트 마스터 프로세서가 하나의 슬레이브 프로세서로 데이터를 전송
모든 프로세서의 동작모드를 2 또는 3으로 설정한다. 모든 슬레이브 프로세서는 SCON의 SM2 비트를 1로 세트한다. SM2=1이면 마스터 프로세서가 전송하는 데이터의 9번째 비트(TB8)가 1인 경우에 한하여 슬레이브 프로세서는 직렬포트 인터럽트를 발생시킨다. 이것은 9번째 비트가 1이면 슬레이브를 지정하는 주소정보이고, 0이면 데이터 정보이다. 따라서 SM2=1로 설정한 모든 슬레이브 프로세서는 마스터 프로세서가 주소정보를 전송할 때, 인터럽트를 발생시킨다. 마스터 프로세서가 TB8을 1로 설정하고 주소정보를 전송한다. 주소정보를 수신한 모든 슬레이브 프로세서는 인터럽트를 발생시키고 인터럽트 루틴에서 수신된 주소정보가 자신을 지정한 것인지를 판단한다. 수신된 주소정보가 자신을 가리키는 것으로 판단한 슬레이브 프로세서는 자신의 SM2 비트를 0으로 함으로써 데이터 정보를 받아들일 준비를 한다. 나머지 슬레이브 프로세서는 SM2=1인 상태를 유지하기 때문에 마스터 프로세서가 뒤이어 보내는 데이터정보를 수신할 수 없게 된다.
37
4. 직렬 포트 인터럽트 마스터 프로세서는 자신의 TB8을 0으로 함으로써 9번째 비트를 0으로 하여 1바이트의 데이터를 전송한다. 이 데이터는 모든 슬레이브 프로세서에서 수신하지만 지정된 슬레이브 프로세서만이 SM=0으로 설정되어 있으므로 이를 수신한다. 나머지 슬레이브 프로세서는 SM2=1이므로 이를 수신할 수 없다. 한 블록의 데이터 전송이 완료되면 마스터 프로세서는 자신의 TB8 비트를 1로 세트하고 지정된 슬레이브 프로세서도 SM2=1로 하여 초기상태로 돌아가서 주소정보가 들어오기를 기다린다.
38
5. 인터럽트 실습 1 : 외부 인터럽트를 이용한 LED 구동
5.1 실습 목적 에 연결된 스위치를 누를 때마다 포트 1에 연결된 LED가 하나씩 순차적으 로 점등하는 프로그램을 작성하고 회로를 동작시킨다. LED 점등 순서 외부 인터럽트를 이용한 LED 구동 회로도
39
5. 인터럽트 실습 1 : 외부 인터럽트를 이용한 LED 구동
5.2 소요 부품 번호 품명 규격 수량 비고 1 CPU AT89S51 AT89C51, Atmel 2 LED 빨간색 8 5 3 수정 발진기 12MHz 크리스털 4 세라믹 커패시터 20pF 발진용 5 0.47F 474 6 전해 커패시터 10F 16V 7 저항 100 1/4W 330 9 4.7K 10 10K 11 스위치 TACT 리셋용 1개, 입력용 1개, 소형 12 IC 소켓 40pin DIP형 13 만능기판 SYP-1108 114×79mm, phenol 14 DC 파워 잭 1.3 어댑터의 B, C형 잭과 호환 12~14번 : 기판에 제작 시 필요
40
5. 인터럽트 실습 1 : 외부 인터럽트를 이용한 LED 구동
부품 모양 AT89S51 LED(5) 수정진동자(12MHz) 20pF 0.47uF 10uF 100 330 4.7K 10K 스위치 IC소켓(40핀) DC 파워잭 만능기판
41
5. 인터럽트 실습 1 : 외부 인터럽트를 이용한 LED 구동
5.3 프로그램 P06_01.c #include <reg51.h> unsigned char led; void delay(unsigned char i) { while(i--); } void EXT0_int(void) interrupt 0 // 외부 인터럽트 0 벡터번호 = 0 EA=0; // 전체 인터럽트 디스에이블 led=(led<<1) | 0x01; // LED 상태 변경 if (led==0xff) led=0xfe; // 마지막인지 검사, 마지막이면 재설정 P1=led; // 포트 1로 출력 delay(200); // 스위치 디바운싱을 위한 지연 EA=1; // 전체 인터럽트 인에이블 return;
42
5. 인터럽트 실습 1 : 외부 인터럽트를 이용한 LED 구동
void main(void) { TCON=0x01; // INT0는 하강에지에서 인터럽트 발생 EX0=1; // 외부 인터럽트 인에이블 EA=1; // 전체 인터럽트 인에이블 PX0=1; // 외부 인터럽트 우선순위 High led=0xfe; // 초기 출력 데이터 P1=led; // 포트 1로 출력 while(1); } 5.4 과제 앞에서와 동일한 일을 수행하되, 인터럽트 자체가 아닌 인터럽트 플래그를 사용하여라. 실습 프로그램을 레벨 트리거 모드로 설정하여 실행한 후, 에지 트리거와 레벨 트리거의 차이점을 검토하여라.
43
5. 인터럽트 실습 1 : 외부 인터럽트를 이용한 LED 구동
44
6. 인터럽트 실습 2 : 타이머 인터럽트를 이용한 LED 구동
6.1 실습 목적 타이머 인터럽트를 이용하여 1초 간격으로 포트 1에 연결된 LED가 하나씩 순차적으로 점등하는 프로그램을 작성한다. LED 점등 순서 타이머 인터럽트를 이용한 LED 구동 회로도
45
6. 인터럽트 실습 2 : 타이머 인터럽트를 이용한 LED 구동
6.2 소요부품 번호 품명 규격 수량 비고 1 CPU AT89S51 AT89C51, Atmel 2 LED 빨간색 8 5 3 수정 발진기 12MHz 크리스털 4 세라믹 커패시터 20pF 발진용 5 전해 커패시터 10F 16V 6 저항 330 1/4W 7 4.7K 스위치 TACT Reset용, 소형 9 IC 소켓 40pin DIP형 10 만능기판 SYP-1108 114×79mm, phenol 11 DC 파워 잭 1.3 어댑터의 B, C형 잭과 호환 9~11번 : 기판에 제작 시 필요
46
6. 인터럽트 실습 2 : 타이머 인터럽트를 이용한 LED 구동
부품 모양 AT89S51 LED(5) 수정진동자(12MHz) 20pF 10uF 330 4.7K 스위치 IC소켓(40핀) DC 파워잭 만능기판
47
6. 인터럽트 실습 2 : 타이머 인터럽트를 이용한 LED 구동
6.3 프로그램 P06_02.c #include <reg51.h> unsigned char led; void TMR1_int(void) interrupt 3 // 타이머/카운터 1 인터럽트 벡터번호 = 3 { unsigned char count; count=20; do { // 1초가 경과할 때까지 이 루프를 순환 while(!TF1); TF1=0; TH1=0x3c; // 시정수 설정(0.05초) TL1=0xb0; // =3CB0H count--; } while(count); P1=led; // 포트 1로 출력 led=(led<<1) | 0x01; // LED 상태 변경 if (led==0xff) led=0xfe; // 마지막인지 검사, 마지막이면 재설정 return; }
48
6. 인터럽트 실습 2 : 타이머 인터럽트를 이용한 LED 구동
6.4 과제 인터럽트 자체가 아닌 인터럽트 오버플로우 플래그(TF1)을 사용하여 앞에서와 같은 실습을 수행하여라. void main(void) { TMOD=0x10; // 타이머 1을 모드 1로 설정 TH1=0x3c; // 시정수 설정(0.05초) TL1=0xb0; // =3CB0H ET1=1; // 타이머 1 인터럽트 인에이블 EA=1; // 전체 인터럽트 인에이블 PT1=1; // 타이머 1 인터럽트 우선순위 High TR1=1; // 타이머 1 run led=0xfe; // 초기 데이터 설정 while(1); // 인터럽트 대기 }
49
6. 인터럽트 실습 2 : 타이머 인터럽트를 이용한 LED 구동
50
7.1 실습 목적 7. 인터럽트 실습 3 : 외부 및 타이머 인터럽트를 이용한 7-세그먼트 구동
1초 단위로 0 ~ 9까지를 카운트하다가 키를 눌렀다 놓으면 0부터 다시 카운트하도록 프로그램을 작성한다. 외부 및 타이머 인터럽트를 이용한 7-세그먼트 구동 회로도
51
7.2 소요 부품 7. 인터럽트 실습 3 : 외부 및 타이머 인터럽트를 이용한 7-세그먼트 구동 번호 부품 규격 수량 비고 1
CPU AT89S51 AT89C51, Atmel 2 TTL 74LS47 디코더/드라이버, DIP 16핀 3 7-세그먼트 FND507 공통 애노드(CA) 4 수정 발진기 12MHz 크리스털 5 세라믹 커패시터 20Pf 발진용 6 0.47pF 7 전해 커패시터 10F 16V 8 저항 100 1/4W 9 330 10 4.7K 11 10K 12 스위치 TACT Reset용, 입력용, 소형 13 IC 소켓 40pin DIP형 14 16pin 15 만능기판 SYP-1108 114×79mm, phenol 16 DC 파워 잭 1.3 어댑터의 B, C형 잭과 호환 13~16번 : 기판에 제작 시 필요
52
부품 모양 7. 인터럽트 실습 3 : 외부 및 타이머 인터럽트를 이용한 7-세그먼트 구동 AT89S51 7447 7-세그먼트
수정진동자(12MHz) 20pF 0.47uF 10uF 100 330 4.7K 10K 스위치 IC소켓(40핀) IC소켓(16핀) DC 파워잭 만능기판
53
7.3 프로그램 7. 인터럽트 실습 3 : 외부 및 타이머 인터럽트를 이용한 7-세그먼트 구동 P06_03.c
#include <reg51.h> unsigned char segment_7; void TMR1_int(void) interrupt 3 // 타이머/카운터 1 인터럽트 벡터 번호 = 3 { unsigned char count; count=20; do { // 1초가 경과할 때까지 이 루프를 순환 while(!TF1); TF1=0; TH1=0x3c; // 시정수 설정(0.05초) TL1=0xb0; // =3CB0H count--; } while(count); segment_7++; if (segment_7==0x0a) segment_7=0x00; P1=segment_7; // 포트1로 데이터 출력 return; }
54
7. 인터럽트 실습 3 : 외부 및 타이머 인터럽트를 이용한 7-세그먼트 구동
void EXT1_int(void) interrupt 2 // 외부 인터럽트 1 벡터번호 = 2 { segment_7=0xff; return; } void main(void) TMOD=0x10; // 타이머 1을 모드 1로 설정 TH1=0x3c; // 시정수 설정(0.05초) TL1=0xb0; // =3CB0H ET1=1; // 타이머 1 인터럽트 인에이블 IT1=1; // 외부 인터럽트 1 인에이블 EA=1; // 전체 인터럽트 인에이블 EX1=1; // 외부 인터럽트 1의 우선순위 High TR1=1; // 타이머 1 Run segment_7=0x00; // 초기 출력 데이터 P1=segment_7; // 포트 1로 출력 while(1); // 인터럽트 대기
55
7. 인터럽트 실습 3 : 외부 및 타이머 인터럽트를 이용한 7-세그먼트 구동
56
7.4 과제 7. 인터럽트 실습 3 : 외부 및 타이머 인터럽트를 이용한 7-세그먼트 구동
7-세그먼트 디코더/드라이버인 7447을 제거하고, P1.0~P1.6을 7-세그먼트의 a~g에 직접 연결한다. 그리고 위 실습과 같은 일을 하도록 하드웨어와 프로그램을 수정하여 동작을 확인하여라.
57
8.1 기본 이론 8. 인터럽트 실습 4 : 직렬 포트 인터럽트를 이용한 데이터 송수신
RS-232C : 미국 전자공업협회(EIA, Electrical Industry Association)에서 제정한 직렬 통신 프로토콜 가장 보편적인 직렬통신방식으로 PC에서는 직렬통신을 위해 기본적으로 COM1과 COM2가 장착되어 있다. RS-232C는 전이중(full-duplex) 방식의 통신을 지원하며, 비동기 통신을 사용할 경우에는 3개 선(Rx, Tx, GND)만 있으면 가능하며, 1:1 통신모드만 지원된다.
58
8.2 실습 목적 8. 인터럽트 실습 4 : 직렬 포트 인터럽트를 이용한 데이터 송수신 직렬 포트 실습 회로도
8051의 TI와 RI의 기능을 이용한 직렬통신 이해 PC와 회로를 연결하기 위해 1m 이상의 케이블과 DB-9핀 커넥터를 사용하였으며, DB-9핀 커넥터는 PC의 COM1 또는 COM2에 연결한다. 직렬 포트 실습 회로도
59
8. 인터럽트 실습 4 : 직렬 포트 인터럽트를 이용한 데이터 송수신
커넥터와 케이블 연결 방법
60
8. 인터럽트 실습 4 : 직렬 포트 인터럽트를 이용한 데이터 송수신
하이퍼터미널 사용법 연결 설정화면 연결대상을 입력하는 화면
61
8. 인터럽트 실습 4 : 직렬 포트 인터럽트를 이용한 데이터 송수신
하이퍼터미널 동작 화면 직렬통신 등록정보 설정 화면
62
8.3 소요 부품 8. 인터럽트 실습 4 : 직렬 포트 인터럽트를 이용한 데이터 송수신 번호 부품 규격 수량 비고 1 CPU
AT89S51 AT89C51, Atmel 2 Linear IC MAX232 MAXIM, DIP 16핀 3 LED 빨간색 8 5 4 수정 발진기 MHz 크리스털 5 세라믹 커패시터 20pF 발진용 6 전해 커패시터 1F 16V 7 10F 저항 330 1/4W 9 4.7K 10 커넥터 DB-9 RS232, female 11 RS-232C 케이블 1m male, female 12 스위치 TACT Reset용, 소형 13 IC 소켓 40pin DIP형 14 16pin 15 만능기판 SYP-1108 114×79mm, phenol 16 DC 파워 잭 1.3 어댑터의 B, C형 잭과 호환 13~16번 : 기판에 제작 시 필요
63
8. 인터럽트 실습 4 : 직렬 포트 인터럽트를 이용한 데이터 송수신
부품 모양 AT89S51 MAX232 LED(5) 수정진동자 ( MHz) 20pF 1uF 10uF 330 4.7K 커넥터(DB-9) 스위치 IC소켓(40핀) IC소켓(16핀) DC 파워잭 만능기판
64
8.4 프로그램 8. 인터럽트 실습 4 : 직렬 포트 인터럽트를 이용한 데이터 송수신 P06_04a.c
8051에서 PC로 영문자(a~z, A~Z)를 전송, 인터럽트 사용하지 않음 P06_04a.c #include <reg51.h> #define LF 0x0a // LF의 ASCII 코드 = 0x0a #define CR 0x0d // CR의 ASCII 코드 = 0x0d void delay(unsigned int i) { while(i--); } void main(void) unsigned char i; TMOD=0x20; // 타이머 1를 모드 2로 설정 TH1=0xfd; // 보레이트 = 9.6Kbps(fosc= MHz) PCON=0x00; // SMOD=0 TR1=1; // 타이머 1 Run SCON=0x40; // 모드=1, REN=0, TI=0, RI=0
65
8. 인터럽트 실습 4 : 직렬 포트 인터럽트를 이용한 데이터 송수신
do { for (i=0; i<26; i++) { SBUF='a'+i; // 영소문자 a~z를 전송 delay(0x100); // 지연 } SBUF=LF; // 커서를 다음 행으로 내림 delay(0x100); // 지연 SBUF=CR; // 커서를 맨 앞으로 보냄 delay(0xb100); // 0.5초 지연 SBUF='A'+i; // 영대문자 A~Z를 전송 } while(1);
66
8. 인터럽트 실습 4 : 직렬 포트 인터럽트를 이용한 데이터 송수신
8051에서 PC로 영문자(a~z, A~Z) 전송, 인터럽트 사용 P06_04b.c #include <reg51.h> #define LF 0x0a // LF의 ASCII 코드 = 0x0a #define CR 0x0d // CR의 ASCII 코드 = 0x0d void transmit(unsigned char tx_data) { while(!TI); // 전송이 완료될 때까지 대기 TI=0; // 다음 입력을 기다리기 위해 TI=0으로 설정 SBUF=tx_data; }
67
8. 인터럽트 실습 4 : 직렬 포트 인터럽트를 이용한 데이터 송수신
void main(void) { unsigned char i; TMOD=0x20; // 타이머 1을 모드 2로 설정 TH1=0xfd; // 보레이트 = 9.6Kbps(fosc= MHz) PCON=0x00; // SMOD=0 TR1=1; // 타이머 1 Run SCON=0x42; // 모드=1, REN=0, TI=1, RI=0 do { for (i=0; i<26; i++) transmit('a'+i); // 영소문자 a~z를 전송 transmit(LF); // 커서를 다음 행으로 내림 transmit(CR); // 커서를 맨 앞으로 보냄 transmit('A'+i); // 영대문자 A~Z를 전송 } while(1); }
68
8. 인터럽트 실습 4 : 직렬 포트 인터럽트를 이용한 데이터 송수신
키보드로부터 값을 수신해 PC로 전송, 인터럽트 사용 안 함 P06_04c.c #include <reg51.h> #define LF 0x0a // LF의 ASCII 코드 = 0x0a #define CR 0x0d // CR의 ASCII 코드 = 0x0d void delay(unsigned int i) { while(i--); } void main(void) unsigned char temp; TMOD=0x20; // 타이머 1을 모드 2로 설정 TH1=0xfd; // 보레이트 = 9.6Kbps(fosc= MHz) PCON=0x00; // SMOD=0 TR1=1; // 타이머 1 Run SCON=0x50; // 모드=1, REN=1, TI=0, RI=0
69
8. 인터럽트 실습 4 : 직렬 포트 인터럽트를 이용한 데이터 송수신
do { SBUF='?'; // PC로 ?문자를 전송. 키보드를 눌러도 좋다는 의미로 사용 delay(0x100); // 지연 while(RI==0); // 문자가 수신될 때까지 대기 RI=0; // 다음 문자 수신을 위해 temp=SBUF; // 수신된 문자를 temp에 저장 SBUF=temp; // 수신된 문자를 송신 P1=~temp; // 수신된 문자를 P1 포트로 출력 SBUF=LF; // 커서를 다음 행으로 내림 SBUF=CR; // 커서를 맨 앞으로 보냄 } while(1); }
70
8. 인터럽트 실습 4 : 직렬 포트 인터럽트를 이용한 데이터 송수신
키보드로부터 값을 수신해 PC로 전송, 인터럽트 사용 P06_04d.c #include <reg51.h> #define LF 0x0a // LF의 ASCII 코드 = 0x0a #define CR 0x0d // CR의 ASCII 코드 = 0x0d void transmit(unsigned char tx_data) { while(!TI); // 전송이 완료될 때까지 대기 TI=0; // 다음 입력을 기다리기 위해 TI=0으로 설정 SBUF=tx_data; }
71
8. 인터럽트 실습 4 : 직렬 포트 인터럽트를 이용한 데이터 송수신
void main(void) { unsigned char temp; TMOD=0x20; // 타이머 1을 모드 2로 설정 TH1=0xfd; // 보레이트 = 9.6Kbps(fosc= MHz) PCON=0x00; // SMOD=0 TR1=1; // 타이머 1 Run SCON=0x52; // 모드=1, REN=1, TI=1, RI=0 do { transmit('?'); // PC로 ?문자를 전송. 키보드를 눌러도 좋다는 의미로 사용 while(RI==0); // 문자가 수신될 때까지 대기 RI=0; // 다음 문자 수신을 위해 temp=SBUF; // 수신된 문자를 temp에 저장 transmit(temp); // 수신된 문자를 송신 P1=~temp; // 수신된 문자를 P1 포트로 출력 transmit(LF); // 커서를 다음 행으로 내림 transmit(CR); // 커서를 맨 앞으로 보냄 } while(1); }
72
8. 인터럽트 실습 4 : 직렬 포트 인터럽트를 이용한 데이터 송수신
73
8.5 과제 8. 인터럽트 실습 4 : 직렬 포트 인터럽트를 이용한 데이터 송수신
① PC의 하이퍼터미널에서 키보드를 통해 대문자를 전송하면 8051에서 소문자로 변환하거나, 소문자를 전송하면 대문자로 변환하여 다시 PC의 하이퍼터미널로 1회 전송하는 프로그램을 작성하고 동작을 확인하여라. ② PC의 하이퍼터미널에 다음과 같은 소속 대학명, 학과, 학번, 성명을 디스플레이하는 프로그램을 작성하고 동작을 확인하여라. Hankook University, Dept. of Electronics, , Hong Gil-dong (대학명) (학과) (학번) (성명)
Similar presentations