마이크로 프로세서 실험 III

-- RS-232C Serial Communication --

1. 실험 목적

본 실험의 목적은 PC 와 실험세트간을 연결하는 직렬통신라인을 이용하여 직렬통신을	수행하는 프로그램을 작성해봄으로서 직렬통신방법 및 개념을 이해하는 것이다.

2. 배경 이론

1) 실험의 개요

본 실험세트에서는 사용자의 PC 와 실험세트간의 데이터 전송을 위하여 직렬통	신을 이용한다.  직렬통신은 한 번에 한비트씩 전송하는 것으로서 가격이 저렴하	다는 장점이 있음으로 많은 응용분야에 사용된다. 그러나 직렬통신에서는 한 번	에 한비트씩 전송함으로 속도가 느리다는 단점이 있다. 이러한 단점 때문에 빠른	속도를 필요로 하지 않는 분야에 적용되어진다. 일반적으로 PC 에서는 마우스와	모뎀이 직렬 통신을 이용하게 된다. 그리고 본 실험세트에서와 같이 다른 시스템	과의 통신에도 사용되어 진다. 빠른 통신이 요구되는 곳에는 한번에 여러비트를	전송할수 있는 병렬통신이 이용되는데 보통 PC 에서는 프린터에 병렬통신을 사	용한다. 그림 1 은 직렬 및 병렬 통신에서 데이터의 흐름을 나타낸다.

<그림 1. 직렬 및 병렬 통신>

직렬통신을 수행하기 위해서는 직렬통신 규약에 알맞는 신호를 발생시키는 제어	기가 있어야만 한다. PC 에 사용되는 마이크로프로세서에서는 일반적으로 직렬통	신용 제어기가 내장되어 있지 않음으로 따로 제어기가 설치되어 있다. 그러나	V25 마이크로 프로세서는 두포트의 직렬통신용 제어기가 내장되어 있음으로 따	로 제어기를 둘 필요가 없다.

본 실험에서는 V25 와 PC 간을 연결하는 직렬통신 프로그램을 작성한다. 먼저	실험세트에서 직렬통신용 프로그램을 작성하고 나서 PC 에 직렬통신용 프로그램	을 작성하여 두 프로그램을 이용 PC의 키보드로 실험세트의 ROM-DOS 에게 명	령을 내리고 그 결과를 PC의 화면으로 볼 수 있게한다. 이 프로그램을 확장하면	PC 와 실험세트간의 파일을 업로딩하고 다운로딩하는 기능도 구현할 수가 있다.

본 실험에서는 파일전송 및 수신기능은 구현하지 않는다.

① 직렬통신의 기초

직렬통신은 한 번에 한비트씩 전송하거나 수신한다. 그러므로 데이터 전송	이나 수신을 위하여 각각 한 개의 연결선이 필요하다. 직렬통신에는 비동기	직렬통신과 동기 직렬통신이 있다. 비동기 직렬통신은 하나의 데이터 (보통	8 비트)를 단위로 통신하는 것으로서 두 개의 데이터 사이에 시간이 얼마나	지나든지 문제가 되지 않는다. 반면 동기 직렬통신은 통신용 sync 데이터를	보내고 나서 한 번에 많은 데이터를 보내는 방법이다. 그림 2. 는 비동기 직	렬통신에서의 데이터 전송 타이밍 도이다.

<그림 2. 비동기 직렬통신에서의 데이터 타이밍도>

비동기 직렬통신 데이터의 구성은 그림2 처럼 시작 비트 (start bit) 그리고	설정된 데이터의 크기에 따라서 해당 비트의 데이터가 실리고 그 다음 전송	에러를 검출할 수 있게 만드는 패리티 비트가 첨가된다. 마지막으로 데이터	의 끝을 알리는 정지 비트 (stop bit) 가 설정상태에 따라서 한 비트 내지는	두 비트로 실리게 된다. marking 이란 비동기 직렬통신에서 전송하는 데이	터가 없음을 가리키는  상태 (High 상태) 이다. 데이터가 발생하여 보낼 때	에는 실제 데이터를 싣기 전에 데이터의 시작을 알리는 시작 비트 (start	bit) 이 첨가된다. 이 시작 비트는 데이터의 한 비트에 해당하는 길이로	Low 상태를 유지한다. 수신측에서는 이 신호를 보고 나서 데이터의 시작임	을 알고 수신 상태로 들어간다. 데이터의 수신은 수신측 설정된 상태에 따	라서 데이터 비트의 길이 만큼 받아들이고 나머지는 한 비트는 짝수및 홀수	패리티 설정에 따라서 패리티 검사를 위해 사용한다. 그 다음 데이터의 끝	을 알리는 정지 비트가 실리게 되는데, 이는 설정에 따라서 하나 내지 두	개의 데이터 비트 길이로 실리게 된다. 정지 비트는 High 상태로서 두 개의	데이터 사이에 시작 비트를 구별하기 위하여 반드시 필요하다.

② RS-232C 표준 신호와 의미

데이터를 발생하거나 수신하는 최종 장치를  DTE (Data Terminal	Equipment) 라고 하고 발생된 데이터를 송수신하는 최종장치를 DCE	(Data Circuit-terminating Equipment)라고 한다. DTE는 보통 단말기가

이에 해당하는데 본 실험에서는 PC 와 실험세트가 이에 해당하고 DCE 는	보통 모뎀이 이에 해당하는데 두 DTE 사이에 거리가 짧을 경우 모뎀을 사	용 하지 않는다 (이를 널모뎀 (NULL MODEM) 이라고 함). 본 실험에서도	널모뎀이 사용된다. DTE 와 DCE 사이의 직렬통신을 위하여  송수신 데이	터 이외에 여러 가지 제어 신호가 필요한데, 이러한 신호의 의미와 각 신호	별 기능 및 인터페이스 등을 표준안으로 정의해 놓은 것중 하나가 RS-232	표준이다. 그리고 RS-232 표준안을 개정한 것이 RS-232C 이다. 그 이외에	RS-422, RS-423 등의 표준이 있다. RS-232C 표준이 많이 사용된다.

그림 3은 모뎀이 전화선을 이용하여 정보를 송수신하는 과정을 보이는 그림	이다.

< 그림 3. 모뎀을 이용한 정보 송수신>

CPU 에서 발생된 데이터는 보통 8비트로 직렬통신제어기로 넘어간다. 직렬	통신 제어기는 이 8비트 데이터를 직렬로 바꾸어 한비트씩 모뎀으로 데이터	를 전송한다. 이때 제어기와 모뎀사이에는 모뎀이 통신할 준비가 되어 있는	지 또는 통신할 준비가 되었으면 제어기에서 보내는 데이터를 수신할 수 있	는지를 점검하여 데이터를 보내야만 제대로 데이터 통신이 이루어진다. 마	찬가지로 모뎀에서 수신한 한 비트 데이터를 제어기로 넘겨줄때도 제어기의	상태를 보고 전송을 해야만이 제대로된 전송을 수행할 수있다. 이렇게 DTE	와 DCE 와의 데이터 및 제어신호를 주고 받기 위하여 커넥터를 사용한다.	커넥터에는 25핀 커넥터와 9핀 커넥터가 있다. 다음 표1은 RS-232C	표준안에 따른 25핀 커넥터의 핀별 신호들을 나타낸다.

<표 1. RS-232C 25핀 커넥터 신호>

핀 번 호	기 능
1	PROTECTIVE GROUND	보안용 접지 (GN)
2	TRANSMITTED DATA	송신 데이터 (TXD)
3	RECEIVED DATA	수신 데이터 (RXD)
4	REQUEST TO SEND	송신 요구 (RTS)
5	CLEAR TO SEND	송신 허가 (CTS)
6	DATA SET READY	데이터 세트 허가 (DSR)
7	SIGNAL GROUND (COMMON RETURN)	신호용 접지 (GND)
8	RECEIVED LINE SIGNAL DETECTOR	데이터 캐리어 검출(DCD)
20	DATA TERMINAL READY	데이터 단말 준비 (DTR)
22	RING INDICATOR	벨 검출 (RI)

그림에서 보는 것처럼 이들 25핀중 몇 개의 핀만이 의미가 있다. 각 신호의	의미가 간단하게 표에 기재되어 있다. 이중 중요한 몇가지를 설명하면 다음	과 같다. 2번과 3번핀은 각각 송신데이타 및 수신데이터 핀이다. 앞에서 설	명한 것처럼 직렬통신이므로 송수신에 각각 하나의 데이터선만이 필요하다.	그리고 7번은 두 개의 시스템의 접지전위를 맞추어주는 접지선이다. 1번 보	안용 접지선은 내부적으로 7번의 GND 와 연결이 되어 있음으로 따로 연결	하지 않아도 된다. 데이터 통신시 받을 시스템이 받을 준비가 되어 있지 않	은 상태에서 데이터를 보내면 데이터 수신이 제대로 이루어지지 않는다. 이	를 위해서 하드웨어 핸드쉐이킹을 사용한다. 하드웨어 핸드쉐이킹에는 RTS	와 DTS 신호가 사용된다. RTS (Request To Send) 는 출력신호로서 이	신호를 출력하는 시스템이 출력을 하겠다고 상대편 시스템에게 요청하는 것	이다. 이러한 요청에 대하여 상대편 시스템은 만약 받을 준비가 되면 요청	한 시스템의 CTS (Clear To Send) 입력신호를 통하여 준비가 됐음을 알	린다. 그러므로 송신측 시스템은 RTS 를 보내고 나서 CTS 가 1이 되기	전에는 송신을 해서는 안된다. 상대편 시스템에서도 마찬가지의 방법으로	데이터를 전송한다.  DTR (Data Terminal Ready) 는 출력신호로서 DTR	을 출력하는 시스템이 통신할 준비가 모두 끝났음을 알린다. 상대편 시스템	이 통신할 준비가 끝난는지를 아는 것은 DSR (Data Set Ready) 입력신호	가 1이 됨으로서 알 수있다.

<그림 4. RS-232C 의 신호와 접속>

그림 4는 여러 방식의 접속을 보여준다. 그림 4 (a) 가 보여주는 것처럼	PC 가 모뎀과 연결될 때는 PC의 신호선을 모뎀의 동일 신호선에 연결을	해야한다. 즉 PC의 RTS 는 모뎀의 RTS 단자에 연결하고 나머지 신호	도 같은 신호에 연결한다. 모뎀을 이용하여 통신할때는 모뎀과 대부분의 신	호를 연결하여 사용한다. 그러나 모뎀을 사용하지 않고 직접 상대편 시스템	과 통신하는 널모뎀 일경우는 여러 가지 접속방법이 가능하다. 그림 4 (b)	는 IBM PC 와 프린터와의 접속이다. 프린터가 받을 준비가 되었는지만을	PC 는 체크하고 하드웨어 핸드쉐이킹은 사용하지 않는다. 즉 상대편의 상	태를 보지 않고 바로 전송할 데이터가 발생하면 전송한다. 그림 4 (c) 는	PC 와 다른 DTE 간의 접속이다. 그림 4 (b) 와 마찬가지로 하드웨어 핸드	쉐이킹은 사용하지 않으나 서로가 상대편이 통신할 준비가 되어있는지를 체	크한다. 그림 4 (d) 는 (c) 를 더욱 간략화 한것으로서 하드웨어 핸드쉐이킹	도 하지 않고 상대편이 통신할 준비가 되었는지 수신할 준비가 되었는지를	점검하지 않고 바로 통신한다. 보통 거리가 아주 가까운 두 개의 PC 사이	에서 이러한 약식접속을 사용한다.

2) 하드웨어 구성

① PC 에서 직렬통신

PC 에서는 RS-232C 로 직렬통신을 수행할 수 있도록 비동기 통신 어댑터	를 제공하고 있다. 직렬통신 기능을 수행하는데는  표준안에 따른 제어신호	및 데이터신호를 생성하는 제어기 칩을 사용하게 된다. 이러한 직렬통신 기	능을 수행하는 특별한 집적회로는 UART (Universal Asynchronous	Receiver/Transmitter) 이다.  다음 그림은 PC 에서 직렬통신용 제어기칩	의 회로도를 블록단위로 그린 것이다.

<그림5. PC 에서 비동기 직렬통신의 블록 다이아그램>

그림에서 보듯이 주소를 사용해서 CS (chip select) 와 제어기의 내부	Register를 선택한다. 그러므로 직렬 포트 COM1, COM2, COM3 등은 각	각 다른 주소의 값을 가져야만 한다. 마찬가지로 하나의 직렬포트에서 여러	제어기의 내부 레지스터는 다른 주소의 값으로 접근할 수있다. 이러한 직렬	포트 주소는 표준안을 정하여 PC 생산메이커마다 똑같은 주소를 할당하여	사용한다.  다음 표는 PC 에서 각 직렬포트에 대한 주소이다.

<표 2. 포트 주소>

포트	주소
COM1	0x3F8
COM2	0x2F8
COM3	0x3E8
COM4	ox2E8

직렬통신으로 송신할 데이터는 데이터 버스를 통하여 직렬통신 제어기로 넘	어가고, 직렬통신을 통하여 수신된 데이터는 데이터 버스를 통하여 제어기	로부터 받을수 있다. 직렬통신의 속도는 보레이트 (baudrate) 에 의하여	결정되는데 이는 초당 전송되는 신호의 변화율이다.  그러므로 두 개의 전	송신호를  갖는  모뎀에서 9600 보레이트는 초당 9600 비트가 전송됨을	의미한다. 만약 모뎀이 2비트의 값을 4개의 신호값으로 사용하여 신호를 출	력한다면 9600 보레이트로 19200bps 의 통신속도를 낼수가 있게 된다. 보	레이트를 결정하기 위해서는 클럭이 필요한데 이를 위하여 1.8432 MHz 의	오실레이터를 입력해준다. 이	러한 주파수의 오실레이터를 사용하는 이유는	각각의 보레이트 예로 9600, 19200, 38400 등과 같은 보레이트와 정수배로	일치하게 하기 위한 것이다.  보레이트 설정은 뒤에서 좀더 자세히 다룬다.	데이터가 전송되었다든지 수신된 데이터가 있다든지 전송중 에러가 있으면	제어기는 CPU로 인터럽트를 걸어서 알려준다. 인터럽트 서비스루틴에서는	제어기의 내부 레지스터의 값을 읽어서 인터럽트가 걸린 이유를 분석하고	분석된 결과에 따라 적당한 동작을 수행하게 된다.

일반적으로 장거리를 직렬 통신하려면 디지털 신호를 직접 보낼 수가 없다.	이는 디지털 신호는 주파수가 낮아서 장거리 전송선상에서 감쇄가 커서 신	호가 거의 전달이 안된다.  그러므로 장거리 직렬전송을 위하여 디지털 신	호를 높은 주파수의 전송신호에 싣게되는데 이를 변조 (modulation) 라고	한다. 이런 변조된 신호는 수신측에서 다시 원래의 디지털신호로 복원되어	야하는데 이를 복조 (demodulation) 라고한다. 그러므로 변복조를 수행하는	것을 변조 복조의 앞글자를 따서 모뎀 (mo + dem) 이라고 한다. 그러나 짧	은 거리에서는 직접 디지털 신호를 보내고 받을수가 있다. 변조를 하지 않	고 직접 디지털 신호로 어느 정도 거리의 두 시스템을 통신하기 위해서는	0V 와 5V 보다는 신호가 너무 약하다 (0V, 5V 를 이용하여 통신을 수행할	수 있는 최대거리는 70cm 이하이다). 또한 직렬통신시 섞이는 에러에도	강하지 못하다. 이런 문제점을 해결하기 위하여 실제 직렬 통신 라인에는	-12V 와 +12 V 혹은 -15V 와 +15V 를 사용하는 경우가 많다. 이때 제어	기에서 출력된 0V, 5V 의 신호를 [eqn: +-]12V 나 [eqn: +-]15V 로 만들어주기 위하여	driver 가 필요하다. 또한 입력된  [eqn: +-]12V 나 [eqn: +-]15V 를 0V, 5V의 신호로	만들어 주기 위하여 receiver 가 필요하다. 이러한 역할을 수행하는 칩들도	나와 있는데 그러한 것들로 Motorola 의 MC1488 과 MC1489 가 각각 드	라이버와 리시버로 사용된다.

직렬통신 제어기는 내부 레지스터들로 여러 가지 파라메터들이 설정된다.	이러한 레지스터의 주소 및 의미는 부록 A. 를 참조하기 바란다.

② V25 에서의 직렬통신

V25 에서의 직렬통신은 TB-V250 보드 사용자 매뉴얼을 참고하기 바란다.	단 여기서는 중요한 몇 가지만 언급한다. 현재 실험세트와 PC 간은 직렬포	트 1 이 연결되어 있다. 그러므로 V25 에서 직렬통신 프로그램시 직렬포트	1 을 사용해야만 한다. 또한 실험세트에서는 ROM-DOS 와 PC의 MSDOS	와의 인터럽트 호환성을 유지하기 위하여 직렬통신 포트 1의 수신 에러인터	럽트 (벡터 번호 0x10) 와 송신 인터럽트 (벡터 번호 0x12) 를 각각 비디오	와 메모리크기 인터럽트 서비스로 사용하고 있다. TB-V250 보드 매뉴얼에	도 자세히 나와있듯이 이렇게 인터럽트 번호가 충돌이 일어나는 것을 해결	하기 위하여 레지스터 뱅크 전환식 인터럽트 방식을 사용할수 있다. 그러나	본 실험에서는 복잡성을 피하기 위하여 비디오와 메모리크기 인터럽트는 무	시하고 수신에러 인터럽트, 수신인터럽트 및 송신 인터럽트를 모두 벡터 방	식으로 설정하여 각각의 인터럽트 서비스를 받는 것으로 한다. 단 프로그램	을 빠져 나올때는 반드시 원래의 인터럽트 서비스 루틴으로 설정을 변경하	고 나와야만 한다. ROM-DOS 상태에서 수신에러 인터럽트와 송신인터럽	트는 벡터 방식으로 각각 비디오와 메모리크기 서비스를 지원한다. 그리고	ROM-DOS 상태에서 수신 인터럽트는 레지스터 뱅크 전환 인터럽트로 설	정되어 있다. 그러므로 수신인터럽트는 벡터방식 인터럽트로 먼저 전환을	해야만 한다. 또한 서비스 루틴뿐만 아니라 포트 1의 3개의 인터럽트 레지	스터 값들도 프로그램 종료시 원래의 값으로 환원 시켜 놓아야만 한다. 만	약 다운로드 및 업로드 기능을 수행하게 하려면 데이터를 받아 놓은후 메모	리 크기 서비스 루틴으로 복원하고 나서 파일을 저장해야만이 올바르게 동	작한다. 이는 파일조작을 할 때 메모리크기 서비스를 지원 받기 때문이다.

본 실험에서는 다운로그 및 업로드 기능은 구현하지 않는다.

PC 와 실험세트간에 직렬통신이 원할 히 수행되려면 두시스템 간에 데이터	전송 포맷이 같아야만 한다. 본 실험에서는 9600 보레이트에 8비트 데이터	1 정지비트 그리고 패리티 비트는 첨가하지 않는 것으로 세팅한다. 보레이	트 의 설정은 BRG1 데이터의 값으로 설정하는데 BRG1 에 써넣은 데이터	값은 각 보레이트에 따라서 다음과 같이 설정한다.

[eqn: BRG_1 = F_clk over {2^{m+1} TIMES baudrate}]

여기서  [eqn: F_clk] 는 8M 이고 baudrate 는 설정하려는 보레이트다.

수신 에러 인터럽트는 데이터 수신중 에러가 있을 때 불려진다. 수신 인터	럽트는 데이터가 수신된 것이 있을 때 불려진다. 그러므로 수신 인터럽트	내에서는 수신된 데이터를 읽어 오면 된다 (포트1 의 수신버퍼 레지스터를	읽으면 됨) . 이때 수신된 데이터는 버퍼에 저장해 놓고 사용하는 것이 안	전한다. 왜냐하면 수신인터럽트보다 높은 인터럽트 서비스 루틴에서는 수신	인터럽트가 걸리지 않고 이는 데이터를 잃어버릴수 있게 만든다. 송신은 포	트1의 송신버퍼 레지스터에 송신할 데이터를 써넣으면 된다. 이때 송신이	끝나면 송신 인터럽트가 걸리게 된다. 송신시 주의할 것은 전에 보낸 데이	터의 송신이 끝나기 전에 다른 데이터를 송신버퍼에 쓰면 전 데이터가 사라	진다는 것이다. 그러므로 반드시 새로운 데이터를 보내기전에 바로 전에 보	낸 데이터가 송신이 끝난는지를 확인해야만 한다.

이렇게 하여 기본 송수신 루틴의 프로그램이 끝나면 TB-V250 매뉴얼의 84	페이지 프로그램을 참조하여 myputch() 및 myputs() 그리고 myprintf()	함수를 구현한다. 또한	mygetch() 함수를 구현하여 키보드로부터 입력받은	문자를 그대로 PC 의 K232 화면으로 보내는 프로그램을 구현한다.

3) 샘플프로그램

① PC 에서의 직렬통신 프로그램

다음은 PC 의 직렬통신시 설정해주어야할 레지스터 값들이다. 이러한 값은	프로그램 종료시 반드시 복귀되어야만 한다.

#define   COM1  0

#define   COM2  1

#define   DATA  0x3f8   /* com2 : 0x2f..    */

#define   IER   0x3f9

#define   IIR   0x3fa

#define   MCR   0x3fc

#define   LSR   0x3fd

#define   ONMSK  0xe7   /* Turn IRQ4/IRQ3 On    */

#define   OFFMSK 0x18   /* Turn IRQ4/IRQ3 Off   */

#define   PICMSK 0x21   /* 8259 mask register   */

#define   PICEOI 0x20   /* 8259 EOI instr.  */

#define   IRQ4   0x0c   /* interrupt vector for com1    */

#define   IRQ3   0x0b   /* interrupt vector for com2    */

#define   DATA7 0x02    /* Data is 7 bit    */

#define   DATA8 0x03    /* Data is 8 bit        */

#define   STOP1 0x00    /* Stop Bit is  one      */

#define   NOPA  0x00    /* No Parity         */

#define   ODDP  0x08

void init_port()

{

old_com_isr=getvect(IRQ4);

setvect(IRQ4,new_com_isr);

/* port parameter initialze */

bioscom(0,DATA8|STOP1|NOPA|B9600,COM1);

/* MCR set */

outportb(MCR,0x0b);

/* COM Interrupt enable */

outportb(IER,0x01);

/* 8259 PIC mask bit set */

outportb(PICMSK,(inportb(PICMSK)&(ONMSK)));

}

다음은 원래의 값으로 복원시키는 프로그램이다.

void close_port()

{

/* MCR reset */

outportb(MCR,0x0);

/* COM Interrupt disable */

outportb(IER,0);

/* 8259 PIC mask bit restore */

outportb(PICMSK,(inportb(PICMSK)|OFFMSK));

setvect(IRQ4,old_com_isr);

}

② V25 에서의 직렬통신 프로그램

다음은 V25 의 직렬통신시 송수신 및 수신에러 인터럽트를 벡터 방식으로	설정하고 현재의 레지스터 값을 저장해 놓는 프로그램이다. 이는 프로그램	이 종료시 다시 원래의 상태로 복귀하기 위하여 필요하다.

/* 레지스터 설정 함수 */

#define INTVEC_SIO1_E   0x10

#define INTVEC_SIO1_R   0x11

#define INTVEC_SIO1_T   0x12

void

init_regs(void)

{

/* save old ISRs */

old_sio1e_isr = getvect(INTVEC_SIO1_E);

old_sio1r_isr = getvect(INTVEC_SIO1_R);

old_sio1t_isr = getvect(INTVEC_SIO1_T);

/* set new ISRs */

setvect(INTVEC_SIO1_R,new_sio1r_isr);

setvect(INTVEC_SIO1_E,new_sio1e_isr);

setvect(INTVEC_SIO1_T,new_sio1t_isr);

/* save old SRIC1 and set vector interrupt of SRIC1 */

old_sric1 = peekregb(V25_SRIC1);

pokeregb(V25_SRIC1,old_sric1 &  0x0F); /* set vector INT */

/* save old STIC1 and SEIC1 */

old_stic1 = peekregb(V25_STIC1);

old_seic1 = peekregb(V25_SEIC1);

V25_serial_init();

/* interrupt enable */

pokeregb(V25_SEIC1,peekregb(V25_SEIC1) & ~0x40);

pokeregb(V25_STIC1,peekregb(V25_STIC1) & ~0x40);

pokeregb(V25_SRIC1,peekregb(V25_SRIC1) & ~0x40);

}

/* V25 직렬 포트 초기화 함수 */

void

V25_serial_init(void)

{

pokeregb(V25_SCC1,0x2);

pokeregb(V25_BRG1,104);     /*baudrate decision 9600*/

pokeregb(V25_SCM1,0xC9);   /* 1start+8data+1stop,  mode set */

}

4) 관련 데이터 북

다음과 같은 책을 참고하면 도움이 될 것이다. 실험자료와 TB-V250 매뉴얼을	읽어보아도 잘 모를 경우에 참조하기 바란다.

- TB-V250 보드 사용자 매뉴얼

- IBM PC Technical Reference Manual

- 8086/88 마이크로 프로세서와 그 주변 소자들, 조순복 김광회, 집문당

- IBM PC 와 센서의 인터페이스,박귀태, 임영철 공역,대영사

3. 실험 방법

① 실험 절차

- V25 SIO 채널 1 의 송수신 인터럽트를 벡터 인터럽트로 설정하여 실험보드와	통신하는 프로그램을 작성하시오

* 이때 myprintf(), myputs(), myputch(), mygetch() 등을 작성하여 이용	하시오

- PC 에서 COM1 으로 들어오는 데이터를 PC 화면으로 출력하고 키보드에서 입	력된 문자를 실험세트로 전송하는 프로그램을 작성하시오

② 실험 목록

- V25 에서 송수신 인터럽트 방식을 이용하여 keyboard 에서 입력한 글자를 바	로 PC의 k232 화면으로 보내는 프로그램을 작성하시오.

- PC 에서 송수신 인터럽트 방식을 이용하여 keyboard 에서 입력한 글자를 실험	세트로 보내고 실험세트에서 수신된 데이터를 화면에 출력하는 프로그램을 작	성하시오.

* 이 프로그램이 동작하면 더미 터미날로 실험세트의 ROM-DOS 를 조작할 수	있는 프로그램이 된다. 단 다운로드 업로드 기능은 아직 없다.

4. 실험 결과

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

① PC 의 keyboard 에서 입력한 글자를 실험세트가 제대로 수신하고 이 문자를 다시	PC 로 전송해서 화면에 잘 나타나는지를 보인다.

② PC 의 keyboard 에서 입력한 글자가 실험세트에 제대로 전송되어 해당 명령이 실	행되는 것과 실행결과가 화면에 잘 나타나는지를 보인다.

부록

A. PC 제어기의 내부 레지스터들

PC 의 직렬통신 제어기는 내부에 다음과 같은 레지스터가 있다. 이러한 레	지스터를 이용하여 파라메터를 설정하고 데이터 입출력을 행한다. 앞의 두	XX 는 표2에 있는 각 통신포트 주소이다.

<표 3. PC 의 직렬통신 제어기 레지스터>

I/O Address	Register Selected	DLAB State
XX8	TX buffer	0 (write)
XX8	RX buffer	0 (read)
XX8	Divisor Latch LSB	1
XX9	Divisor Latch MSB	1
XX9	Interrupt Enable Register	0
XXA	Interrupt Identification Register
XXB	Line Control Register
XXC	Modem Control Register
XXD	Line Status Register
XXE	Modem Status Register
XXF	Reserved

만약 COM1 을 사용한다면 COM1 의 TX/RX buffer 의 주소는 3F8 이 된	다. TX/RX buffer 에는 송신/수신 데이터가 들어가 있는곳이다. DLAB	(Divisor Latch Access Bit) 이 0 이면 송수신 데이터를 의미하고 DLAB	(Line Control Register 의 msb 값) 이 1 이면 Divisor Latch LSB 의 의	미를 갖는다. Divisor Latch LSB 와 MSB 는 합쳐서 16비트로 보레이트	생성기에서 사용된다. 그러므로 보레이트를 바꾸려면 이 레지스터를 이용해	야 한다. 다음은 각 레지스터별 간단한 설명이다.

- Transmitter Holding Register (THR) : 송신용 버퍼

- Receiver Buffer Register (RBR) : 수신용 버퍼

- Divisor Latch LSB (DLL)/MSB (DLM) : 보레이트 생성기용 카운터값

[eqn: 카운터 값 = 1.8432M over { 보레이트 * 16}]

* 여기서 16 은 메이져 보팅에서 사용하는 것으로 보레이트 보다 16	배 높은 클럭을 메이져 보팅에 사용함을 의미

- Interrupt Enable Register (IER)

bit 0 : Enable Data Available Interrupt

bit 1 : Enable TX Holding Register Empty Interrupt

bit 2 : Enable Receive Line Status Interrupt

bit 3 : Enable Modem Status Interrupt

bit 4 ~ bit 7 : always logic 0

- Interrupt Identification Register (IIR)

bit 0 : 0 if Interrupt Pending

bit 1 : Interrupt ID Bit 0

bit 2 : Interrupt ID Bit 1

bit 3 ~ bit 7 : always logic 0

<표 4. IIR 레지스터 기능>

Bit 2	Bit 1	Bit 0	Priority	Interrupt Type	Interrupt Source	Interrupt Reset Control
1	1	0	Highest	Receiver Line Status	Overrun Error or Parity Error or Framing Error or Break Interrupt	Reading the Line Status Register
1	0	0	Second	Received Data Available	Receiver Data Available	Reading the Receiver Buffer Register
0	1	0	Third	Transmitter Holding Register Empty	Transmitter Holding Register Empty	Reading the IIR
0	0	0	Fourth	Modem Status	Clear to Send or Data Set Ready or Ring Indicator or Received Line Signal Detect	Reading the Modem Status Register

- Line Control Register (LCR)

bit 0 : Word Length Select Bit 0

bit 1 : Word Length Select Bit 1

bit 2 : Number of Stop Bits --> 0 (one bit), 1 (two bit)

bit 3 : Parity Enable

bit 4 : Even Parity Select

bit 5 : Stuck Parity

bit 6 : Set Break

bit 7 : Divisor Latch Access Bit (DLAB)

<표 5. 데이터 길이>

Bit 1	Bit 0	Word Length(Bits)
0	0	5
0	1	6
1	0	7
1	1	8

<표 6. 패러티 설정>

Bit 4	Bit 3	Meaning
0	0	None
0	1	Odd Parity
1	0	None
1	1	Even Parity

- Modem Control Register (MCR)

bit 0 : Data Terminal Ready (DTR) --> 소프트웨어로 DTR 을 셋/리셋

bit 1 : Request to Send (RTS) --> 소프트웨어로 RTS 을 셋/리셋

bit 2 : Out 1

bit 3 : Out 2

bit 4 : Loop --> 제어기 내부적으로 loopback 을 만듦 : 패스 테스트시

bit 5 ~ bit 7 : always 0

- Line Status Register (LSR)

bit 0 : Data Ready --> 수신데이타 있음

bit 1 : Overrun Error

bit 2 : Parity Error

bit 3 : Framing Error

bit 4 : Break Interrupt

bit 5 : Transmitter Holding Register Empty --> 새로 송신할 수 있음

bit 6 : Tx Shift Register Empty

bit 7 : always 0

- Modem Status Register (MSR)

bit 0 : Delta Clear to Send (DCTS)

bit 1 : Delta Data Set Ready (DDSR)

bit 2 : Trailing Edge Ring Indicator (TERI)

bit 3 : Delta Data Carrier Detect (DDCD)

bit 4 : Clear to Send (CTS)

bit 5 : Data Set Ready (DSR)

bit 6 : Ring Indicator (RI)

bit 7 : Data Carrier Detect (DCD)

* Delta 가 붙은 것은 그 해당 핀의 상태가 바뀌었음을 나타냄