<<- 시리얼 통신 ->>
이번장은 가장 어렵다고 할수도 있지만 가장 유용하다고 할수도 있습니다.
이번 강좌를 통해서 home-automation을 구현 할수 있는 능력을 배양하고 다른 CPU와의 통신을 할수 있는 기초를 배우게 될 것입니다. 작품을 만들고 그것의 구동을 위해서 프로그램을 down-load할 때 컴퓨터와의 통신을 많이 사용하게 됩니다.
강좌의 마지막 부분에는 간단한 통신프로그램을 예로 들어 주석으로 설명 하겠습니다.
<직렬 통신>
개요 : 마이크로 컴퓨터와 마이크로 컴퓨터 사이, 또는 마이크로 컴퓨터와 주변 장치 사이의 데이터 전송은 직렬 통신 또는 병렬 통신에 의해 이루어진다.
보통 직렬 통신이 병렬 통신보다 저렴하기 때문에 많이 사용한다.
MCS-51 계열 마이크로 프로세서의 시리얼 포토는 동시에 송수신 할 수 있는 전 이중 시리얼 포트를 내장하고 있다.
이 시리얼 포트의 송수신은 io51.h(reg51.h) 에 선언되어 있는 sfr SBUF를 통하여 이루어진다.
데이터를 송신할 때는 보내려는 데이터를 SBUF에 써넣고 수신하고 받은 데이터를 SBUF에서 읽어들이면 된다.
따라서 MCS-51 계열의 마이크로 프로세서는 송수신 모두 SBUF레지스터를 거쳐서 이루어진다.
* 시리얼 포트는 sfr(Special Function Register) 내의 SBUF(Serial Port Buffer Register), SCON(Serial Port Control Register), PCON (Power Control Register)의 3개의 레지스터를 소프트웨어적으로 제어한다.
* 데이터 전송 방법에는 동기 신호의 유무에 따라서 동기 모드와 비동기 모드로 나눌수 있다.
동기 모드 : 클럭 펄스에 맞춰 데이터를 전송하는 방법.
클럭은 독립된 선으로 보낼수도 있고 또는 데이터에 끼워 데이터와 같은 선에 보낼 수도 있다.
동기 모드는 높은 전송 효율을 가지므로 선로에 잡음이 있거나 거리가 먼 경우에도 마이크로 컴퓨터와 마이크로 컴퓨터사이에서 대량의 데이터를 전송하는데 사용한다.
비동기 모드 : 기준 클럭 없이 데이터 비트의 유지 시간을 서로 약속해 전송하는 방법이다.
즉, 송신기가 약속된 주파수로 데이터를 보내면 수신기가 같은 주파수로 데이터를 읽는다
수신기의 클럭은 각각의 문자를 다시 동기 시키는 데 필요하다.
비동기 모드는 각각의 문자마다 제어 비트가 필요하기 때문에 동기 모드 보다 효율이 낮다.
비동기 모드는 보통 마이크로 컴퓨터와 터미널을 연결 하는데 사용된다.
<통신방식>
단방향(simplex) 방식 : 한쪽 방향으로만 데이터를 전송한다.
불안전 이중(half duplex) 방식 : 한 선만을 사용하여 보내기와 받기를 하는 방식으로 한 순간에 한쪽 방향으로 전송할 수 있다.
전송이 끝나면 반대 방향으로 전송할 수 있으므로 양방향으로 전송이 가능하나 동시에 전송할 수 없다.
* 예를 들자면 무전기 같은 것이 될수 있다.
무전기(군에 다녀온 사람들은 알텐데..)는 동시에 말을 할수 없다.
상대방의 무전이 끝나야 비로서 내가 말할수 있다.
그래서 영화에서 처럼 자신의 말이 끝났다는 것을 알리기 위해 over라는 말을 사용하는 것이다.
완전 이중(full duplex) 방식 : 2 선을 사용하여 동시에 보내기와 받기를 하는 방식으로 동시에 양방향 전송이 가능하다. (ex> telephone) 8051의 직렬 포트는 동기 모드와 비동기 모드 모두를 제공한다.
동기 모드는 모드 0으로 불완전 이중 방식이며 단일 보(baud)율로 동작한다.
baud(보율)은 타이머를 설명한 2장에서 볼수 있을 것이다.
비동기 모드는 3가지 모드가 있고 완전 이중 방식이며 보내기와 받기의 보속도를 서로 다르게 할 수 있다.
비동기 모드는 프레임 비트 오류 검출, 다중 프로세서 통신, 그리고 자동 주소인식 기능을 제공한다.
모드 |
전송비트수 |
비트내용 | |
동기모드 |
모드0 |
8 |
데이터(8) |
비동기모드 |
모드1 |
10 |
시작(1)+데이터(8)+정지(1) |
모드2 |
11 |
시작(1)+데이터(8)+9번째(1)+정지(1) | |
모드3 |
11 |
시작(1)+데이터(8) |
위의 표는 모드와 동기를 같이 나타낸 표이다.
SBUF 레지스터
SBUF는 송신할 데이터와 수신한 데이터를 일시적으로 저장하는 레지스터이다.
SBUF는 송신용과 수신용이 같은 번지를 지니고 있으나 서로 다른 두 개의 레지스터이다. 즉, WR(Write), RD(Read)명령으로 송수신 SBUF를 지정하게 된다.
SBUF = 'A' ; (송신용 SBUF 지정)
r = SBUF ; (수신용 SBUF 지정)
SBUF를 앞에 쓸 때와 뒤에 쓸 때와의 차이를 나타내고 있다.
송신 할 때는 데이터를 '' 사이에 둔다.
수신부의 XBUF는 2중 구조로 되어 있어서 다음 프레임의 수신 시작 전에 CUP가 수신 인터럽트에 응답하지 않아서 데이터를 읽어내지 못해도 Over Run에러를 방지할 수 있다.
SCON 레지스터
SCON 레지스터는 시리얼 포트를 제어하기 위한 레지스터로 각 비트의 기능은 다음과 같다.
SM0 |
SM1 |
SM2 |
REN |
TB8 |
RB8 |
TI |
RI |
* SM0, SM1 : 시리얼 포트의 모드를 설정할 수 있는 비트이다.
이 비트들의 조합에 따라 다음과 같이 네 개의 모드를 설명 할수 있다.
SM0 |
SM1 |
MODE |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
2 |
1 |
1 |
3 |
* SM2 : 모드 2, 3 의 멀티프로세서 통신에서는 SM2가 '1'로 설정되고 수신 데이터의 9번째 비트가 '1'이면 데이터를 수신할 수 있다.
SM2가 '0'으로 설정되고 수신 데이터의 9번째 비트가 '0'이면 데이터를 무시한다.
모드 1 에서는 SM2가 '1'이고 약속된 스톱 비트가 수신되지 않으면 수신 인터럽트(RI)가 발생되지 않는다.
모드 0에서는 'SM2 가 0'으로 설정되어야 한다.
* REN(D4) : 시리얼 포트의 수신을 가능하게 하는 비트이다.
'1'로 설정하면 수신을 가능하게 하고 '0'으로 설정하면 수신을 할 수 없다.
TB8 : 모드 2, 3에서 '1'로 설정하였을 때는 9번째 데이터 비트가 '1'인 어드레스 정보를 송신하고 '0'으로 설정하였을 때는 9번째 데이터 비트가 '0'으로 설정하였을 때는 9번째 데이터 비트가 '0'인 어드레스 정보를 전송한다.
* RB8 : 모드 2, 3에서 '1'로 설정하였을 때는 9번째 데이터 비트가 '1'인 어드레스 정보를 수신하고 '0'으로 설정하였을 때는 9번째 데이터 비트가 '0'인 어드레스 정보를 수신한다.
모드 1에서는 SM2가 '0'일 때는 RB8은 스톱 비트의 수신을 나타낸다.
모드 0에서는 사용되지 않는다.
* TI : 송신 완료 인터럽트 플래그이다.
이 비트는 반드시 송신 후 소프트웨어적으로 '0'을 만들어 주어야 한다.
* RI : 수신 완료 인터럽트 플래그이다.
이 비트는 반드시 수신 후 소프트웨어적으로 '0'을 만들어 주어야 한다.
PCON 레지스터
PCON 레지스터는 보레이트를 조정할 수 있는 레지스터이며 각 비트 기능은 다음과 같다.>
SMOD |
- |
- |
- |
- |
- |
- |
- |
SM0D : 2 배 보레이트 플레그 SM0D를 '1'로 하면 보레이트가 2배로 된다.
* 모드 설명
동기 모드(모드 0)
SM0 = 0 ; SM1 = 0
모드 0은 동기 모드로 불와전 이중 방식이다. 주로 shift-register를 사용해 칩의 I/O 기능을 확장하기 위해 사용한다.
TXD(CLK) 핀으로 동기 클럭 펄스를 출력하고 RXD(DATA) 핀으로 데이터 바이트를 보내거나 받는다.
데이터 바이트는 최하위 비트 LSB부터 보내진다. 받는 데이터도 마찬가지로 LSB부터 보내진다.
받는 데이터도 마찬가지로 LSB부터 받아진다.
모드 전송 속도(보속도)는 Fosc/12로 고정된다.
보내기 - 직렬 포트 제어 SCON 레지스터의 받기 허용 REN비트를 0으로 지워 보내기 모드로 설정하고 보내기 표시기 TI를 지운다.
REN = 0 (받기 허용 = 금지 => 보내기); T=0 (보내기 표시기를 지운다)
보낼 바이트를 직렬 버퍼 SBUF 레지스터에 쓴다. 쓰기 동작이 하드웨어에게 자동으로
보낼 것을 지시 한다.
SBUF = send ; (데이터를 보낸다)
데이터를 다 보내면 하드웨어가 보내기 표시기 TI를 1로 설정해 보내기가 끝났음을 표시 한다.
while (!TI) ; (다 보내질 때까지 기다린다)
그러면 프로그램에서 다음 데이터를 직렬 버퍼 SBUF 레지스터에 쓸 수 있다.
TI = 0 ; (보내기 표시기를 지운다)
SBUF = SEND ; (다음 데이터를 보낸다)
받기 - 직렬 포트 제어 SCON 레지스터의 받기 허용 REN 비트를 설정하여 받기 모드로 설정하고 받기 표시기 RI비트를 지운다.
REN = 1 ; (받기 허용 = 설정)
RI = 0 ; (받기 표시기를 지운다)
첫 번째 비트가 들어오면 자동적으로 받기를 시작한다.
데이터를 다 받으면 하드웨어가 받기 표시기 RI를 1로 설정해 받기가 끝났음을 표시한다.
while (!RI) ; (다 받을 때까지 기다린다)
그러면 프로그램에서 받은 데이터를 직렬 버퍼 SBUF레지스터로부터 읽을 수 있다.
recv = SBUF ; (데이터를 읽는다)
비동기 모드 (모드 1,2,3)
비동기 모드는 3가지의 동작 모드가 있다.
- 모드 1 : 완전 이중 방식으로 1:1 통신에 사용한다. 데이터 프레임은 10비트로 구성된다.
시작 비트 1 , 데이터 비트 8, 정지 비트 1.
보속도는 타이머1 또는 타이머2의 넘침에 의해 발생한다.
설정 SM1 = 0 ; SM0 = 1; (모드 1)
모드 1에서 데이터를 다 받았을 때, 정지 비트가 직렬 포트 제어 SCON 레지스터의 받기 RB8 비트에 저장된다.
- 모드 2,3 : 모드2 와 3은 완전 이중 방식으로 1 : n 통신에 사용한다.
데이터 프레임은 11비트로 구성된다 : 시작 비트 1, 데이터 비트 8(LSB가 첫 번째로 보내지고 받아진다) 프로그래머블 9번째 비트 1 정지 비트 1.
설정 SM1 = 1 ; SM0 = 0 ; (모드 2)
설정 SM1 = 1 ; SM0 = 1 ; (모드 3)
데이터를 다 받았을 때, 9 번째 비트 D8이 직렬 포트 제어 SCON 레지스터의 RB8 비트에 저장된다.
프로그램에서 직렬 포트제어 SCON 레지스터의 보내기 비트 TB8 비트에 한 비트를 써 넣으면 데이터를 보낼 때 9번째 비트 D8에 추가된다.
이 9번째 비트는 주소/데이터 표시기로 사용할 수 있다.
모드 2에서, 전송 속도(보속도)는 Fosc/32, 또는 Fosc64로 고정된다.
모드 3에서, 보속도는 타이머1 또는 타이머2의 넘침에 의해 발생한다.
보내기 - (모드 1,2,3)
보내기 표시기를 지운다.
모드 2/3의 경우 9번째 비트 D8을 직렬 포트 제어 SCON레지스터의 보내기 비트 TB8에 쓴다.
TI = 0 ; (보내기 표시기를 지운다)
RI = 1 ; (1 : 주소프레임 , 0 : 데이터 프레임)
이제 예제를 보면서 프로 그램에서 적용되는 것을 알아보자.
#include "reg51.h"
#define PASSWORD 0x55 // 통신상에서 사용할 password를 정의 data unsigned int buffer = 0; // buffer 라는 변수
serial() interrupt 4 // interrupt 함수 사용
{
if(RI) // 수신완료 확인
{
buffer = SBUF; // 수신용
RI = 0;
while(!TI); // 송신완료 확인
SBUF = buffer; // 송신용
TI = 0;
}
}
void main()
{
TMOD = 0x20; //통신 모드 설정 TMOD = 0010 0000
EA = 1; // 전체 interrupt Enable
ET1 = 0; // 타이머1 interrupt Disable
TH1 = 243; // 상위비트 설정
TL1 = 243; // 하위비트 설정
TR1 = 1;
SCON = 0x70 // SCON 설정 SCON = 0111 0000
PCON = 0x00 // PCON 설정 PCON = 0000 0000
ES = 1;
while(SBUF != PASSWORD)
SBUF = 0x00;
RI = 0;
TI = 0;
SBUF = PASSWORD;
ES = 1;
while(1);
}
<< 전자기기 개발 --- 건강기기, 통신기기,각종 전자회로 개발, PCB ARTWORK >>
http://cafe.daum.net/elecom-rnd
출처 : 민이 여행
'Programming > 8051' 카테고리의 다른 글
RS232/RS422/RS485 (0) | 2009.11.30 |
---|---|
8051 타이머 모드1 (0) | 2009.11.30 |
8051의 타이머 0 (0) | 2009.11.30 |
8051타이머 모드설정 (0) | 2009.11.30 |
8051( 중급 12부 - serial 통신 2 ) (0) | 2009.11.29 |