AVR USART(RS232) 동기형/비동기형 직렬통신 제어 레지스터 - AVR 이론

2013.09.15 11:56




현재 군 복무중인 상태입니다.


USART란?


Universal Synchronous/Asynchronous Receiver Transmitter의 앞글자를 따왔고 범용 동기/비동기 송수신 방식입니다. 동기식과 비동기식의 차이는 비동기식도 동기를 취하지만, 비동기식은 문자 단위로 Start비트, 문자비트, Stop비트로 동기시키지만, 동기방식은 Sync문자, Start 문자, 문자열... , Stop 문자 순으로 전송하는 방식이 동기 하여 보내 특정 동기문자 전송 후 전송할 문자를 연속으로 보낸후 정지시켜 문자열 단위로 동기를 취하게 되는 방식입니다.


AVR에서는 주로 USART에서 동기방식을 뺀 UART라고 부르는 비동기 통신을 주로 이용하는데, 통신시 3선 RX(수신), TX(송신), GND(공통접지)로 통신하게 됩니다. 공통접지를 사용하는 이유는 통신하는 두 기기 사이에 전압레벨의 기준이 서로 다른데 전압의 기준이 되는 GND를 공통으로 사용함으로서 전압차이문제를 해결합니다.


 동기방식에서는 RX, TX, GND 이외에도 XCK 핀이 추가됩니다. 일반적으로 동기방식이라 하면 문자동기 방식을 말하는데, AVR에서는 클럭을 동기하기 때문에 XCK로 동기되는 클럭을 입력해 주어야 하는 것 같습니다.


통신구조 및 사용처


먼저 직렬통신에서는 Bps, Baud rate, Bit라는 용어들이 사용되는데요.

각각 용어를 설명하고 들어가도록 하겠습니다.


Bps와 Baud, Bit와의 관계


BpsBit Per Second로 초당 전송되는 비트의 수를 의미하는데요. 대부분의 통신의 속도를 나타내는데 사용됩니다. 사용하고 있는 인터넷도 마찬가지구요. 100Mbps 초당 100메가비트의 통신속도를 나타낸 것입니다. (100M바이트로 오해하시는 분 있으시지는 않으시겠지요? ㅎ)


Baud rate는 우리말로 보율이라 해서 초당 변조된 회수를 의미하는데요. 디지털 전송에서는 한번에 0또는 1로 변조되기 때문에 Bps랑 같은 값이 나온답니다. 아날로그 변조라 하여 4위상 변조, 8위상변조, QAM :< 뭐 이런거 나오면.... 복잡해 집니다.


Bit 이것은 그 디지털에서 사용되는 0또는 1을 나타내는 그 비트가 맞습니다.^^



이런관계를 가지고 있습니다. 가령 Baud rate를 9600buad rate를 갖고 디지털신호를 변조하는 경우 디지털은 0, 1의 1비트만 변화하므로 1Bit * 9600Baud rate = 9600Bps의 통신속도를 가지게 되는 것입니다.



통신 프레임 및 기타




데이터 시트에는 다음과 같은 사진이 있습니다.이 이상한 그래프 같은 것은 송신하는 일련의 데이터의 타이밍 차트 인데요. 송신하는 쪽에서는 다음과 같은 구조의 2진수 비트를 차례로 보냅니다.

IDLE은 아무런 신호 송수신하고 있지 않을 때 HIGH상태로 5V출력 상태로 있습니다.

그러다 St 시작비트 데이터 전송 시작 논리0 (0V)를 만나면 데이터 전송의 시작으로 0~8비트 까지 데이터를 전송하게 됩니다. 0~8번 비트는 그래프가 이상하게 겹쳐있는데요. 이것은 사용자의 설정에 따라 논리0 도 될수 있고, 논리1도 될수 있기때문에 저렇게 해놓은 것 같습니다. 그리고 [P] 부분은 옵션으로 패리티 비트를 활성화 했다면 프레임에 포함됩니다. 이 후 Sp1로 스톱비트 논리1이 출력되면서 전송되게 되는데요. 데이터 전송이 끝났다. 정도의 신호입니다. 이 후 수신하는 쪽에서는 만약 송신측에서 송신하는 속도가 9600bps의 속도로 전송 되었다면.. 초당 9600비트가 전송되는 것이므로, 1/9600 = 약 104uS로 104uS 정도 마다 ST비트, SP1비트를 제외하고 그때의 논리(전압) 상태를 샘플링하여 조합하여 UDR 레지스터에 저장하게 됩니다. 



USART제어 레지스터



 USART I/O Data Register


UDR레지스터는 USART 설정이후에 실제로 전송되어 오는 데이터나 송신시 데이터를 입력하는 레지스터 입니다. UCSR 레지스터에서 수신모드 설정시 UDR 읽기(수신)가 활성화 되고, UCSR 레지스터에서 송신모드 설정시 UDR 쓰기(전송)가 활성화 됩니다.


 USART Control and Status Register A



비트

명칭

기능 설명

7

RXC

 수신시 1로 SET되는 비트로 이값을 비교해서 데이터를 수신할수 있습니다.

6

TXC

 UDR에 쓰기한 데이터가 송신이 완료되면 1로 SET되어 전송 완료를 알립니다.

5

UDRE

 UDR 레지스터가 비어있을 때 1로 SET되는데요. 이 값을 비교해서 UDR 레지스터에 쓰기해주시면 데이터를 전송 할 수 있게 됩니다.

4

FE

 프레임(일련의 전송된 총 비트에서의) 에러 발생시 1로 SET되는 레지스터입니다.

3

DOR

 데이터 OverRun에러 발생시 1로 SET되는 레지스터 입니다.

2

UPE

 USART통신으로 에러 확인을 위해서 패리티 비트를 추가로 전송해서 보냈는데 수신측 데이터가 짝수 패리티 혹은 홀수 패리티값에 부합하는 값을 가지고 있지 않아 에러가 발생하면 이 비트가  1로 SET 됩니다.

1

U2X

 비동기 2배 전송 기능으로 클록의 분주를 기존 16에서 8로 나눠 즉 1/2로 나누어 전송속도를 2배로 끌어올리도록 설정하는 레지스터입니다.

0

MPCM

 멀티프로세서 통신모드로 설정하는 레지스터입니다.


OverRun 에러란? 이미 UDR레지스터에 수신된 정보가 있는데 이것을 읽지 않은 상황에서 새로운 다음 데이터들이 송신되어 읽지 못한 정보가 날아가 버리는 경우의 에러입니다.


 USART Control and Status Register B



비트

명칭

기능설명

7

RXCIE

 UDR레지스터에 데이터가 수신완료되었을 때 수신인터럽트를 발생을 허용합니다.

6

TXCIE

 UDR레지스터에 쓰기한 데이터가 송신완료되었을 때 송신인터럽트 발생을 허용합니다.

5

UDRIE

 UDR레지스터의 버퍼가 비었을 때 UDRE레지스터가 SET될때 발생하는 인터럽트를 허용합니다.

4

RXEN

 USART통신 기능에서 수신기능을 활성화합니다.

3

TXEN

 USART통신 기능에서 송신기능을 활성화합니다.

2

UCSZ2

 UCSZ1, 0과 함께 동시에 결정하는 비트로 전송할 데이터 비트 수를 결정합니다.

1

RXB8

 수신 데이터 비트가 9비트로 설정되었을 경우에 UDR레지스터에 추가 1비트로 사용하는 비트입니다.

0

TXB8

 송신 데이터 비트가 9비트로 설정되었을 경우에 UDR레지스터에 추가 1비트로 사용하는 비트입니다.


 USART Control and Status Register C



비트

명칭

기능설명

7

-

예약비트

6

UMSEL

 동기식과 비동기식 전송을 결정합니다. 이 비트가 1이면 동기식전송 0이면 비동기식 전송으로 설정

5

UPM1

 송 수신시 패리티비트에 대한 옵션을 결정하는 비트5, 6입니다. 하단 참조

4

UPM0

3

USBS

 스톱비트의 비트수를 결정합니다. 이 비트가 0이면 1bit, 1이면 2bit 스톱비트로 설정됩니다.

2

UCSZ1

 UCSR 레지스터B의 UCSZ2와 같이 사용되는 비트로 전송할 데이터 비트 수를 결정합니다.

1

UCSZ0

0

UCPOL

 동기전송에서 슬레이브 모드에서 동작하고, 해당 비트가 0일 경우 XCK 동기클럭의 하강에지에서 새로운 데이터가 출력되고 상승에지에서 데이터 검출, 비트가 1일 경우 XCK 동기클럭의 상승에지에서 새로운 데이터가 출력되고, 하강에지에서 데이터 검출되는 기능을 한답니다. (사용해 보지 않았습니다.)


 USART Control and Status Register 공용설정부분


UPM1

UPM0

패리티모드

UCSZ2

UCSZ1

UCSZ0

데이터 전송 비트수

0

0

패리티 기능 설정안함

0

0

0

데이터 비트 5비트 사용

0

1

예약

0

0

1

데이터 비트 6비트 사용

1

0

짝수 패리티 비트방식 기능 설정

0

1

0

데이터 비트 7비트 사용

1

1

홀수 패리티 비트방식 기능 설정

0

1

1

데이터 비트 8비트 사용

 

1

0

0

예약

1

0

1

예약

1

1

0

예약

1

1

1

데이터 비트 9비트 사용



 USART Baud rate register


총 12비트로 통신속도를 설정하는데 사용하는 레지스터 인데요, 8비트 AVR이기 때문에 상위4비트와 하위 8비트로 상 하위로 분리되어서 만들어 져있습니다. 다른 레지스터의 경우에는 기능설정이라 크게 중요하지 않은데 반해 통신을 하는데 가장 중요한 레지스터라고 할 수 있겠네요.

UBRR레지스터 값을 잘못 입력하게 되면 에러율이 크게 증가하거나 아예 통신이 되지 않을 수 있고, 계산하는데 수식이 들어가기 때문에 조금 짜증날수도 있겠네요.ㅎㅎ


위 수식은 데이터 시트에 포함 되어있는 UBBR 계산 수식인데요, 비동기 통신을 주로 사용하기 때문에 Asynchronous Normal mode와 Double speed mode만 위 UCSR A 레지스터에서 U2X비트의 설정값에 따라서 계산해 주시면 되겠습니다. 그럼 계산해보도록 하겠습니다.!


STEP 1 UBRR 먼저 계산을 통해 구하기

먼저 사용하고자 하는 통신속도를 결정하고 AVR에 입력받는 주파수를 알고 있어야 합니다. 그리고 U2X비트가 0일 때 제 경우 8Mhz 크리스탈을 사용하고 원하는 통신속도를 9600bps로 가정하고 계산하겠습니다. 그럼 UBRR = (8000000 / (16*9600)) - 1 해주시면 51.08333333333 이 결과로 나오게 되는데.. 레지스터의 입력 값에 소수는 사용할 수 없으므로 0.08333333333은 버리고 51만 사용합니다. 에러율 계산이 필요하지 않으시다면, 여기에서 계산을 끝내고, UBRR레지스터에 입력하시면 된답니다.ㅎ


STEP 2 AVR에서 실제로 내는 통신속도 구하기

Baud = 8000000 / (16*(51+1)) 를 계산해 주시면 9,615.38461538462로 9600bps에 근접한 값이 나오지만 15.38461538462 만큼은 오차로 작용하게 됩니다.


STEP 3 오차율 계산하기



이제 STEP 2 에서 계산된 결과를 바탕으로 에러율을 계산하게 되는데 수식에 BaudRate값이 두개 있습니다. 이 때 분자의 BaudRate Closest Match는 AVR에서 가장 근접하게 구할수 있는 Baud Rate를 의미합니다. STEP 1과 2에서 보셨다 싶이 크리스탈을 7.3728Mhz같은 딱 떨어지는 클럭을 입력받지 않는 이상 소수가 무진장 많이 나와서 근접하게는 되어도 딱떨어지는 값이 나오지 않습니다. 그럼 그 오차율도 구해보도록 하겠습니다.^

Error[%] = (9615.38461538462 / 9600 - 1) * 100 해주시면 0.16025641026라는 결과 값이 도출됩니다. 아래 하단의 도표를 보시면 8Mhz에서 9600bps를 사용하면 0.2%에러율을 가진다고 기재 되어있는데 반올림 하게 되면 0.2% 에러율을 가지게 되는 것이 맞습니다.

이렇듯 계산해서 구하셔도 되지만 웬만한 값은 아래 전송 에러율 도표에 U2X 상태에 따라 UBRR값과 에러율이 구해져 있기 때문에 참고하셔서 쉽게 구현하시기 바랍니다.^



레지스터 설정에 따른 전송 에러율 도표













USART (UBBR, U2X) 레지스터 설정에 따라서 통신속도 및 에러율, 통신속도 도표인데요, 이것을 참고해서 설정하셔도 편리하게 사용하실수 있을 것 같습니다. 그런데 표를 보시면 1.0000Mhz , 2.0000Mhz, 4.0000Mhz..... 처럼 딱 떨어지는 입력받는 주파수는 에러율이 거의 필히 존재하는 것이 보입니다만, 그렇다고 꼭 7.3728Mhz같은 크리스탈을 사용하실 필요는 없습니다. 오히려 이런 경우 타이머/카운터와 같이 사용하실 경우 시간계산이 어려워 질수 있으니까요. 그럼 이것으로 USART 통신 제어 레지스터 포스팅은 마치도록 하겠습니다.

준비되는데로, 간단한 통신 제어 소스를 들고 찾아 오겠습니다.^






BinGoon AVR/AVR 연습, Tutorial , , , , , ,

  1. Blog Icon
    wook

    많은 도움이 됐습니다 감사합니다~

  2. 해당 포스팅에 첫 댓글 감사드립니다.^
    계속해서 좋은 정보 올리도록 하겠습니다.~^

  3. Blog Icon
    charles

    점점 어려워 지네요.. 좋은 글 잘 보고 있습니다. 수고하세요

  4. 안녕하세요^ 연말이 다가오네요.. ~~
    정신없이 시간을 보내다 보니, 포스팅을 좀 못했지만, 늦게 나마 계속 봐주셔서 감사드립니다. 자주는 못해도 계속 포스팅 해 나갈 예정이니 가끔 방문해 주시기 바랍니다. :-)

  5. Blog Icon
    KY.Y

    도움이 많이 됐습니다. 고3이 이정도면 나중에 대단 하시겠어요^^

  6. 감사합니다^ 계속 도움되는 포스팅 하도록 노력하겠습니다. :D

  7. Blog Icon
    yj

    최근 이 내용을 배우고 있는데 너무 어렵더라구요..ㅜㅜ 우연히 검색하고 들어와서 읽는데 도움이 많이 되었습니다 감사합니다^^

  8. 최근들어 정신없어 답글이 늦었습니다.^
    가끔 계속해서 도움되는 글 업데이트 하도록 하겠습니다.^

  9. Blog Icon
    DS.Choi

    정리 잘 해 놓으셨네요. 많은 도움 됐습니다.

  10. 블로그에 방문해 주셔서 감사드립니다.^^

  11. Blog Icon
    yjh

    아니 어떻게 고딩이 이런 정보를 접하고 정리할생각을 하지;
    심지어 사용도 해본거 같넹..ㄷㄷ;

  12. 여러곳에서 정보를 접하고 정리한 다음 적용해 보고 다시 정리하는 방식으로 운영하고 있습니다.^^ 그리고 부족한 점이 많으나 감탄해주셔서 감사드립니다.

  13. Blog Icon
    Micael Son

    도움 많이 되고 있습니다.
    아들이 중3인 아저씨 입니다. 지금은 대학생이 되셨나요??
    크게 될 젋은이 입니다. 앞으로도 가끔 들려야 할것 같은 블로그 네요!!

  14. 안녕하세요.^^
    먼저 저는 대학을 가지 않았고, 관련된 기업에서 근무하고 있습니다. 추후에 기회가 된다면 대학교 까지 생각하고 있습니다. 그리고 블로그는 근무지 쪽으로 이동을 한 상태라서 집에서 부품을 뭔가를 만들정도로 챙겨오지를 못했습니다. 그래서 조금씩 가지고 올라와서 준비가 어느 정도 된다면, 다시 블로그 작업 재개하니 그 때 찾아 주세요.^^

    그럼 부족한 글에도 댓글달아주시고 방문해 주셔서 감사드립니다.^^

  15. Blog Icon
    Sacho

    좋은 글 감사합니다. 정리를 잘하시네요.

티스토리 툴바