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와의 관계
Bps는 Bit 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 통신 제어 레지스터 포스팅은 마치도록 하겠습니다.
준비되는데로, 간단한 통신 제어 소스를 들고 찾아 오겠습니다.^
'AVR > AVR 연습, Tutorial' 카테고리의 다른 글
AVR UART 비동기 통신 사용자 함수 문자열 비교 LED ON/OFF 제어하기 - AVR 연습 (17) | 2013.11.24 |
---|---|
AVR UART 비동기 통신 사용자 함수 문자 비교 LED ON/OFF 제어하기 - AVR 연습 (18) | 2013.10.14 |
AVR 타이머/카운터 응용 하드웨어 PWM 숨쉬는 LED 만들기 - AVR 연습 (22) | 2013.08.24 |
AVR 타이머/카운터 비교매치 인터럽트로 0.5초 마다 LED 깜박이기 - AVR 연습 (6) | 2013.04.07 |
AVR 타이머/카운터 인터럽트 응용 소프트웨어 PWM DC모터 속도 제어하기 - AVR 연습 (39) | 2013.02.28 |