마이크로 프로세서 실험 I

-- 마이크로 프로세서를 이용한 BIT I/O --

1. 실험 목적

이 실험의 목적은 V25 마이크로 프로세서가 장착된 실험 세트를 이용하여 간단한 외부	장치와 bit 수준의 입출력을 행하여 보는 것이다. 또한 이러한 입출력 기능을 이용하여	다양한 목적의 프로그램을 행하여 봄으로서 마이크로 프로세서의 동작 및 외부장치와	의 인터페이스 기법등을 이해할수 있다.

2. 배경 이론

1) 실험의 개요

본 실험에서는 V25 마이크로 프로세서가 장착된 실험세트를 이용하여 bit 수준의	입출력을 행하고 이를 이용 여러 가지 다양한 기능의 프로그램을 작성해 본다.

입력을 위한 장치로 Keypad 가 사용되며, 입력된 값에 따라 여러 가지 동작을	수행하고 그결과를 1세트의 8bit LED 를 통하여 출력하게 된다.

이러한 실험을 위하여 V25 마이크로 프로세서의 동작방식 및 특수기능 레지스터	(SFR: Special Function Register) 그리고 인터럽트 처리기능 등을 숙지하고 있	어야한다.

2) 하드웨어 구성

① Keypad 의 구성과 기능

실험세트에서 Keypad 의 구성은 다음 그림1 과 같다.

<그림1. Keypad 의 구성>

그림에서 보는것처럼 11개의 Key로서 Keypad 는 구성된다. 각각의 Key는	마이크로 프로세서의 bit 입력 신호로 전달되는데 Key 별로 고유의 입력	값을 갖게된다. 본 실험세트에서는 X 라고 이름붙여진 3개의 Key는 어떤	입력도 마이크로 프로세서에 전달할수 없는데, 그 이유는 회로도 상에서	각 Key 에 대한 입력을 8bit 버퍼만을 사용하여 마이크로 프로세서로 전달	하기 때문이다. 다음 그림 2. 는 이러한 Keypad의 회로도를 보여준다.

<그림 2. Keypad 의 회로도>

회로도에서 보듯이 Keypad의 모든 key는 push 버튼으로 연결되어있다.	push 버튼의 한쪽은 접지되어있고 다른 한쪽은 풀업저항을 거쳐서 8bit	버퍼 (74LS540) 의 입력으로 연결되어있다. 그러므로 임의의 key 를 눌렀	을 때 해당 key의 버퍼입력은 0V (로직 0) 가 된다. 버퍼의 출력이 반	전되어 있으므로, 결국 해당 key에 대한 bit만이 5V (로직 1) 로 출력된다.

각 key 에 대한 스캔코드는 다음과 같다.

< 표 1. Key 스캔 코드>

Key	Key_A	Key_B	Key_C	Key_D	Key_E	Key_F	Key_G	Key_H
값	1	2	4	8	10	20	40	80

Keypad 로 부터 데이터 값을 읽어 들이기 위하여 먼저 74LS540 이 enable	되어야하는데 이는 회로도에서 KEY_CS (Key chip select)가 로직 0 가	됨으로서 가능하다.

결국, Keypad 에 해당하는 I/O 주소에서 데이터를 읽으면 KEY_CS 가	enable 되고 그때 눌려진 key 에 대한 스캔코드가 데이터로서 입력되어진	다. Keypad 를 동작시키는 KEY_CS 는 보드를 설계한 사람이 I/O map 을	구성함으로서 결정되는데 본 실험 세트에서 Keypad 의 주소는 0X7B80 이	다.

② LED 의 구성

본 실험세트에는 2개의 10bit LED 가 있다. 그러나 Keypad 와 비슷하게	각각의 LED 는 8bit D Flip Flop을 사용하여 동작시킴으로 8bit 씩 16개의	LED만이 동작 가능하다. 그러므로 특정한 LED 에 불을 켜기 위해서는 해	당 LED 에 대한 I/O 주소로 해당 LED bit 를 Logic 1 로 함으로서 가능	하다.  두 개의 LED 중 하나는 출력용이고 다른 하나는 입력용이다. 본 실	험세트에서는 출력용 LED 포트주소가 0X7880 이다. 그러므로 프로그램을	이용하여 0X7880 에 8bit 데이터를 써줌으로서 8bit 데이터를 표시할 수 있	다.

③ 마이크로 프로세서의 입력 방식

마이크로 프로세서는 외부 장치와 입력을 행하는데 있어서 두가지 방식을	사용한다. 첫 번째 방식은 외부장치에서 데이터가 발생했을 때 이를 인터럽	트 (interrupt) 로 처리하는 방식이다. 즉 외부장치에서 데이터가 발생하면	해당 장치를 제어하는 소자에서 마이크로 프로세서로 인터럽트를 걸어주고,	인터럽트를 받은 마이크로  프로세서는 어떤 외부장치에서 인터럽트가 들어	왔는지를 알아내 해당 인터럽트 서비스 루틴으로 점프하여 일을 처리하는	방식이다. 이러한 방식은 마이크로 프로세서가 외부장치로 부터 언제 데이	터가 들어오는지를 계속적으로 살펴볼 필요가 없으므로 마이크로 프로세서	의 효율을 높일수 있게된다. 또한 여러개의 외부장치에서 인터럽트가 들어	왔을 때 인터럽트 우선순위에 따라서 급한 일부터 처리할수 있으므로 외부	장치와의 원활한 동작을가능하게 한다.

그러나 이러한 인터럽트 방식은 외부 장치에 데이터가 발생 했을때마다  인	터럽트를 발생 시킬수 있는 제어기가 필요하게 되므로 회로가 복잡해지고	고가가 되는 단점이 있다.

두 번째 방식으로 외부장치에서 데이터가 발생했는지를 계속적으로 살펴보	는 폴링 (polling) 방식이 있다. 이는 외부장치에서 데이터가 발생했는지를	마이크로 프로세서가 계속 살펴보는 방식이다. 외부장치는 데이터가 발생했	음을 특정한 레지스터 값으로 알려줄수 있는데, 마이크로 프로세서는 이 레	지스터를 참조해 데이터가 있음을 알고 데이터를 입력하는 방식이다.

④ Keypad 에서의 데이터 입력

IBM-PC 와 같은 고급 기종의 장치에서는 입력장치로 Keyboard 를 이용	한다. Keyboard 는 하나의 마이크로 컨트롤러에 의하여 제어되는데 이러한	컨트롤러는 keyboard가 눌렸을 때 인터럽트를 마이크로 프로세서에게 걸게	되고, 마이크로 프로세서는 인터럽트 서비스 루틴에서 해당 스캔코드를 읽	어 가서 입력된 key 를 알게된다.

그러나, 본 실험세트의 Keypad 의 경우 인터럽트를 발생시키는 장치가 없	으므로 폴링 방식을 이용하여 데이터의 입력을 수행해야만 한다. 또한 데이	터가 발생 했는지를 알리는 레지스터가 없으므로 이를 소프트웨어 적으로	처리해야한다.

이를 프로그램으로 처리할 때 현재의 데이터값이 유효한 데이터인지를 나타	내는 레지스터가 없으므로 비록 key 가 한 번 눌려졌어도 폴링 타임이 너	무 짧으면 같은 key 가 여러번 입력된 것으로 프로그램이 해석할수 있게된	다. 또한 폴링 타임이 너무 길면 데이터를 잃어버릴수가 있다.

이는 사람이 key 를 눌렀을 때 보통 몇 msec 정도를 유지하게 되기 있기	때문인데, 매 폴링시마다 똑같은 데이터가 들어온 것으로 처리될수 있다.

이는 디지탈 로직에서 level trigger 와 비슷한 상황이 된다. 즉 한 상태	(예로 눌린 상태) 를 유지하는 시간이 길면 매 sampling 마다 같은 데이터	가 들어오는 것으로 처리가 되는 것이다. Key 가 한 번 눌렸다 떼었을 때	하나의 데이터가 들어온 것으로 처리하기 위하여 소프트웨어 적으로 edge	trigger 처럼 동작되게 해야한다. 이렇게 해서 유효 데이터를 구별할 수가	있다.

폴링하는 방식에는 무한 loop 를 돌면서 각 장치의 데이터값을 살피는 방식	이 있다. 이러한 방식은 데이터가 들어왔을 때 해당 데이터에 대한 처리가	모두 끝나야 만이 다시 데이터의 입력을 살펴볼수 있으므로 입력된 데이터	를  잃어버릴수가 있게 된다.

이는 데이터에 대한 처리도중 데이터의 입력을 행할수 없게 만든다. 이는	장치가  인터럽트를 발생시킬수 없기 때문에 발생되는 문제이다. 이를 해결	하기 위하여 무한 loop 방식을 사용하지 않고 timer 인터럽트를 사용하여	주기적으로 입력데이타를 폴링하는 방식을 사용할 수 있다. 즉 주기적으로	인터럽트가 걸리는 타이머 인터럽트 서비스 루틴을 수정하여 타이머 인터럽	트 서비스 루틴에서 입력데이타를 가져오는 방식이다. 이렇게 데이터를 입	력할 때 에도 만약 타이머 인터럽트 주기가 너무 길면 입력 데이터를 잃어	버릴수가 있다. 이를 위해 타이머 인터럽트 주기는 사람이 key 를 누르는	것보다  충분히 짧아야한다. 또한 여러 입력이 빠르게 들어왔을 경우 입력	데이터를 하나의 저장 장소에 보관하면 전에 들어온 입력 데이터가 파괴가	됨으로 이를 여러개의 버퍼에 저장시켜 놓고 차례로 프로그램이 사용할수	있게 해야한다.

⑤ 타이머 인터럽트

V25 CPU 는 2개의 16bit 및 1개의 20bit 내부 타이머 를 가지고 있다. 이	는 프로그램에서 특정 주기의 타이머 인터럽트를 발생시키는데 사용할수도	있고 TOUT 단자를 이용하여 외부의 장치에게 신호를 인가할수도 있다.

2개의 16bit 타이머의 제어는 각각 SFR 에서 ([eqn: TM_0], [eqn: MD_0], [eqn: TMC_0]) ([eqn: TM_1],	[eqn: MD_1], [eqn: TMC_1]) 를 이용하여 행한다. (SFR 및 각 레지스터 입출력은 V25	마이크로 프로세서 데이터 북을 참조하기 바람)

[eqn: TM] 레지스터는 일정주기로 카운트 다운하다가 값이 0이 되면 타이머 인터	럽트를 발생하고, 동시에 [eqn: MD] 레지스터의 값을 새로 로드하여 카운트 다운	을 시작한다. 그러므로 [eqn: MD] 레지스터 값을 주기로 하여 타이머 인터럽트가	걸리게된다. 타이머 인터럽트의 주기를 바꾸려면 이[eqn: MD] 레지스터의 값을	바꾸면 된다. [eqn: TMC] 레지스터는 각 타이머의 동작 모드를 결정하게 된다.

다음 그림은 각 16bit 타이머의 [eqn: TMC] 레지스터의 모드를 나타낸다.

각 bit 별 기능은 다음과 같다.

MOD1	MOD0	동작모드
0	0	인터벌 타이머 모드
0	1	원셋 타이머 모드
1	X	사용 금지

ALV	0		TOUT 단자의 동작레벨을 "L" 레벨로 지정
	1		TOUT 단자의 동작레벨을 "H" 레벨로 지정
ENTO	0		TOUT 단자레벨을 ALV비트에 고정
	1		TOUT 단자레벨을 TMF0의 세트 타이밍에 반전
MCLK0	0		MD0 레지스터의 카운터 클럭으로 Fclk/12 를 지정
	1		MD0 레지스터의 카운터 클럭으로 Fclk/128 를 지정
MS0	0		카운트 정지 (MD0 유지)
	1		MD0 의 카운트 다운 개시
TCLK0	인터벌	0	TM0 카운트 클럭에 Fclk/6 을 사용
		1	TM0 카운트 클럭에 Fclk/128 을 사용
	원셋	0	TM0 카운트 클럭에 Fclk/12 을 사용
		1	TM0 카운트 클럭에 Fclk/128 을 사용
TS0	인터벌	0	카운트 정지 (TM0, MD0 유지)
		1	TM0에 MD0의 내용을 로드
	원셋	0	카운트 정지
		1	TM0 카운트다운 개시

TS1	0	카운트 클럭에 Fclk/6 을 사용
	1	카운트 클럭에 Fclk/128 을 사용
TCLK2	0	카운트 정지 (TM1, MD1 유지)
	1	TM1에 MD1의 내용을 로드하여 카운트 다운

본 실험 세트에서는 ROM-DOS 에 의하여 다음과 같이 기본값이 설정되어	있다.

레지스터	MD0	TMC0	MD1	TMC1
값	0x271	0xFC	0x271	0xC0

그러므로 내부 타이머 1, 2는 인터벌 타이머로 동작한다. 수정 발진자 클럭	이 16M 이고, 이를 내부에서 2분주하므로 시스템 클럭 (Fclk) 는 8M 가	된다. TMC 값에 의하여 타이머 클럭은 Fclk/128 이되며 MDn 값이 625	(0x271) 이므로 타이머 인터럽트의 인터벌은 다음과 같이 계산된다.

8M / (128 * 625) = 100 hz

결국 타이머 인터럽트는 0.01 초 (10ms) 마다 걸리게 된다. 타이머 인터벌	을 바꾸려면 MDn 의 값을 적당한 값으로 바꾸어서 구현할 수가 있다.

⑥ Keypad 와 LED 의 포트 주소 (port address)

마이크로 프로세서는 외부 장치와의 입출력을 행하기 위하여 먼저 외부 장	치중 하나를 선택해야한다. 이를 선택하는 방법은 시스템 설계자가 각각의	장치에 대한 주소를 다르게 설정하여 특정한 주소가 지정되었을 때 특정한	외부 장치가 선택되게 하는 방식을 사용한다. 그러므로 외부장치와 입출력	을 행하기 위해서는 실험 시스템의 I/O 포트 주소를 알아야만 한다.

본 실험세트에서는 keypad 가 0x7B80 그리고 LED 가 0x7880 으로 포트	주소가 할당되어 있다. 그러므로 입출력시 이 포트주소를 이용하여 행한다.

3) 샘플프로그램

① 입출력 함수 (Turbo-C 중심)

Turbo-C에서 byte 및 word 데이터를 외부 장치와 입출력하게 해주는 함	수는 각각 inp(), inpw() 와 outp(), outpw() 가 있다.

각각의 함수 사용법은 다음과 같다.

- inp()/inpw() : 인수로 외부장치의 포트 주소를 넘겨주면 byte/word 로	포트 데이터가 리턴 된다.

예) Keypad 에서 byte 데이터 입력

unsigned char in_data ;

in_data = inp(0x7B80) ;

- outp()/outpw() : 인수로 포트 주소와 byte/word 데이터를 넘겨주면 해	당 외부장치로 데이터가 출력된다.

예) LED 로 byte 데이터 출력

unsigned char out_data;

outp(0x7880, out_data);

② RS-232 포트를 통하여 PC 화면 (K232.exe 화면) 에 문자 출력

실험보드에서 동작하는 프로그램은 실험세트와 연결된 RS-232 포트를 통	하여 PC 화면에 문자를 출력할수 있다. 물론 이때 PC에서는 K232 통신 프	로그램이 올바르게 동작하고 있어야만 한다.

본 실험 환경에서는 한문자 출력시나 문자열 출력시 PC에서와 동일하게	putchar()와 printf() 함수를 사용할수 있다.

③  메모리 데이터 입출력

특정한 메모리 세그먼트:오프셋에 byte/word 데이터를 입출력을 행하는데	사용하는 함수는 Turbo-C 에서 각각 peekb()/peek() 와 pokeb()/poke()	이다. V25의 512K byte의 내부데이타 영역 (IDA: Internal Data Area)은	이함수를 이용하여 데이터를 쓰고 읽을수 있다. 내부데이타 영역중	SFR(Special  Function Register) 로 사용되는 256byte 도 역시 이 함수들	로 데이터를 쓰고 읽을 수 있다.

예) 내부데이타 영역의 주소를 7FE00 ~ 7FFFF 로 잡고, TM0 레지스터	값을 읽는다.

#define V25_IRAM	0x7F00

#define V25_TM0	0xF80

main()

{

unsigned char in;

pokeb(0XFF00,0X0FFF,0x7F); /* IDB레지스터에 7F를 씀 */

in = peekb(V25_IRAM, V25_TM0); /*TM0의 값을 읽음 */

}

* 리셋시 IDB 레지스터의 값은 0XFF 로 고정되어 있고 IDB 레지스	터의 오프셋 주소는 0xFFF 이므로 리셋후 IDB 레지스터의 주소는

FF00:0FFF 이다.

- pokeb()/poke() : 인수로 세그먼트와 오프셋 그리고 byte/word 데이터를	받아서 해당 메모리에 쓴다.

- peekb()/peek() : 인수로 세그먼트와 오프셋을 받아서 해당 메모리의	byte/word 데이터를 리턴한다.

④  새로운 타이머 인터럽트 서비스 루틴 설정

타이머 인터럽트가 걸렸을 때 이를 서비스하는 루틴은 ROM-DOS 가 기본	적으로 제공하고 있다. 그러나 실험자가 타이머 인터럽트를 자기 고유의 기	능으로 사용하기 위하여는 새로운 타이머 인터럽트 서비스 루틴을 작성하고	프로그램 초기에 이를 새로운 서비스 루틴으로 등록시켜야만 한다.

그러면 실험자의 프로그램이 동작되는 동안에는 타이머 인터럽트가 걸렸을	때 새로운 타이머 인터럽트 서비스 루틴이 동작하게 된다. 실험자의 프로그	램이 끝났을때에는 반드시 이전 타이머 인터럽트 서비스 루틴을 복귀해야만

한다.

예) 새로운 타이머 인터럽트 서비스 루틴을 만들고 프로그램 초기에 이를	설정하고 프로그램 종료시 원래의 서비스 루틴을 복귀한다.

#define INTVEC_TMR	0x1C

int tmr_count = 0;

void interrupt new_tmr_isr(void)

{

tmr_count++;

}

void tmr_test(void)

{

printf("\n Timer count = %d ", tmr_count);

}

main()

{

void interrupt (*old_tmr_isr)();

old_tmr_isr = getvect(INTVEC_TMR);

setvect(INTVEC_TMR,new_tmr_isr);

for(;;) tmr_test();

setvect(INTVEC_TMR,old_tmr_isr);

}

- getvect() 함수: 인자로 인터럽트 번호를 넣어주면 인터럽트 번호에 해당	하는서비스 루틴의 주소를 리턴한다.

- setvect() 함수: 인자로 인터럽트 번호와 인터럽트 서비스 루틴의 주소를	넣어주면 해당 인터럽트의 서비스 루틴으로 등록한다.

4) 관련 데이터 북

본 실험을 행하기 위하여는 외부 장치가 단순한 관계로 외부장치에 대한 데이터	북은 필요가 없다. 실험 하는데 필요한 내용은 하드웨어 구성에서 설명한 것으로	충분하다.

단 V25 마이크로 프로세서의 내부구조 및 내부 램구조 그리고 여러 가지 동작방	식은 숙지하고 있어야만 한다. 특히 타이머의 동작과 인터럽트 관련 부분 그리고	SFR 의 입출력 부분은 자세히 이해하고 있어야 한다.

5) 기타 사항

3. 실험 방법

① 실험 절차

- PC 와 실험세트 간을 RS-232 케이블로 연결한다. (COM1, COM2 가능)

- PC 상에 필요한 프로그램을 설치한다 (K232.exe 프로그램)

- K232 프로그램을 수행하고 COM 포트와 보드레이트를 알맞게 설정한다.

* 연결한 COM 포트로 맞추고 보드레이트는 9600으로 한다.

- 실험세트의 전원을 공급한다.

* 이때 K232 통신 프로그램 화면에 초기화면이 나타나야 한다.

* 초기화면 뒤 화면에는 A:\> 의 프롬프트가 나타난다.

- B: 드라이브가 올바르게 초기화 되었는지 확인한다.

* B: 리턴을 입력하면 B: 드라이브로 이동한다.

* B: 드라이브는 일반 드라이브처럼 동작한다.

- 실험 프로그램을 작성한다 (Turbo-C 나 MS-C 이용)

* PC 상에서 프로그램을 디버깅하여 최종적으로 실행파일을 만든다.

- 실행 파일을 실험보드로 다운로딩한다

* 메뉴모드에서 다운로드를 선택한다.

* 빈칸이 나타나는데 실험프로그램의 실행 파일이름을 선택한다.

* 다운로딩이 진행되며 전송된 데이터의 byte가 화면 밑에 나타난다.

* 다운로딩된 프로그램은 B: 드라이브에 파일로 존재한다.

- B: 드라이브로 가서 실험 프로그램을 수행한다.

* B: 리턴하고 나서 DIR 해보면 다운로딩된 프로그램의 목록이 보인다.

* 일반 PC에서 처럼 프로그램을 수행한다.

* 수행되는 결과를 보고 프로그램을 수정 위의 작업을 반복한다.

② 실험할 목록

-  시작메모리 주소와 끝 메모리 주소를 주면 해당 메모리의 내용을 K232 화면	에 출력하는 프로그램을 작성하시오

* 프로그램 디버깅시 필요하다.

* 인터럽트 벡터 테이블이나 특정 메모리 주소 및 SFR 값을 읽는데 필요	하다.

- keypad 에서 데이터를 받아서 해당 스캔코드를 K232 통신화면에 나타나	게 하시오. (폴링 모드로 작성)

* 이때 key가 한 번 눌렸다 떨어졌을 때 오로지 하나의 데이터만 입력된	것으로 처리하시오.

- LED 를 구동하는 프로그램을 작성하여 각 key 가 눌렸을 때 해당 bit의 LED	를 켜는 프로그램을 작성하시오.

- 각 key 별로 다음의 동작을 하는 프로그램을 작성하시오

Key_A : LED 가 lsb 로 부터 msb 로 한비트씩 옴겨 가며 켜짐을 100회	반복한다.

Key_B : LED 가 lsb 에서 msb 로 msb 에서 다시 lsb 로 옴겨가며 켜짐	을 100회 반복한다.

Key_C : LED 가 lsb 에서 부터 차례로 msb 까지 켜졌다가 다시 msb 부	터 차례로 꺼져서 lsb 까지 꺼지게 하는 것을 100회 반복한다.

Key_D : LED 가 짝수비트와 홀수비트가 번갈아 가며 점멸함을 100회 반	복한다.

- keypad 에서 데이터 받는 루틴을 타이머 인터럽트를 사용하여 처리하시오.

* 이때 버퍼를 사용하여 입력된 데이터를 차례로 저장하여 데이터를 잃어	버리지 않게한다.

* 특정한 프로그램이 수행중에 있을때라도 key 를 입력하면 바로 해당 key

의 동작을 하게 끔 프로그램을 작성한다.

- key 로 해당 스캔코드 값을 받아서 사칙연산을 수행하고 그 결과를 LED 로	표시하는 프로그램을 작성하시오.

4. 실험 결과

본 실험의 결과로서 다음과 같은 것을 제시해야만 한다.

① 폴링 모드로 각 key 별 특수기능이 잘 수행됨을 보인다.

② 타이머 인터럽트를 이용한 key 입력으로 각 key 별 특수기능이 잘 수행됨을 보인	다.

* 이때 다른 key 가 눌리면 바로 해당 key의 기능으로 넘어갈 것.

③ key 로 입력을 받아서 사칙연산을 수행하고 결과값이 2진수로 LED에 잘표시됨을	보인다.