엄지왕 블로그

[AVR] USART 직렬통신 본문

Study/AVR

[AVR] USART 직렬통신

ThumbKing 2018. 11. 9. 17:51

시스템을 구현하다 보면 통신을 해야 할 일이 자주 발생합니다.

AVR의 기본적인 통신방법인 USART를 사용해 컴퓨터에 데이터를 전송해 보는 방법을 정리해보았습니다.

ATmega128을 사용하였고 좀 더 자세한 내용이 필요하신 분은 ... (더보기)를 클릭하시면 됩니다.

내용 대부분은 윤덕용 박사님의 AVR ATmega128 정복에서 발췌하였으며, 데이터시트를 참고하였습니다.


USART(Universal Synchronous and Asynchronous Receiver and Transmitter)


레지스터 사용

송신하려는 데이터와 수신한 데이터가 저장되는 레지스터입니다.

송신할때는 레지스터에 데이터를 저장하고,

수신할때는 레지스터에 저장된 값을 읽습니다.

EX)

UDRn=data; // data의 값을 송신

data=UDRn; // UDRn로 수신된 값을 data에 저장


송수신 동작을 제어하거나 송수신 상태를 저장하는 레지스터입니다.

RXCn값을 통해 데이터가 수신된 사실을 확인하고,

UDREn값을 통해 UDRn이 송신 데이터를 받을 준비가 되었는지 확인합니다.

EX)

while(!(UCSRnA&0x80)); // 수신완료될때까지 대기(=수신 버퍼가 채워질때까지 대기)

data=UDRn; // data에 수신 버퍼 값을 저장

while(!(UCSRnA&0x20)); // 송신 데이터를 받을 준비가 될때까지 대기(=송신 버퍼가 피워질때까지 대기)

UDRn=data; // 송신 버퍼에 data 값을 저장(=data 값을 송신)


포트의 송수신 동작을 제어하는 레지스터입니다.

송수신 관련 인터럽트를 허용하거나, 송수신부가 동작하도록 허용합니다.

EX)

UCSRnB=(1<<RXCIEn) | (1<<RXENn); // 수신완료 인터럽트 허용, 수신부 동작 허용


포트의 송수신 동작을 제어하는 레지스터입니다.

전송 문자의 데이터 비트수를 설정할 수 있습니다.

EX)

UCSRnC=(0<<UCSZn2) | (1<<UCSZn1) | (0<<UCSZn0); // 전송 데이터 길이 8-bit


포트의 송수신 속도를 설정하는 레지스터입니다.

EX)

UBRRnH=0; // 16비트 레지스터를 라이트하는 경우에는 항상 상위 바이트를 먼저 라이트합니다.

UBRRnL=51; // 보레이트를 19,200으로 설정하였습니다.


위의 내용을 바탕으로 '1'을 받으면 ON을 내보내고

'0'을 받으면 OFF를 내보내는 프로그램을 짜보겠습니다.

ASCII table을 참고하여 USART_Transmit을 할 수도 있습니다.

이제 컴퓨터와 통신을 하기위해 시리얼 프로그램을 사용합니다.

http://withrobot.com/data/?uid=12&mod=document&pageid=1

위 링크에서 아래와 같은 파일을 받을 수 있습니다.

comportmaster.zip

프로그램을 다운받아 ComPortMaster를 실행하면

이러한 화면이 나오는데 Baudratem, Data bits, Stop bits, Parity는 설정해준대로 맞춰주면 됩니다.

Device의 경우 연결한 포트마다 다르기때문에 장치관리자를 들어가 확인해 주어야 합니다.

저는 포트가 COM4에 물려있어서 저렇게 적었습니다.

Baudrate는 19200으로 설정하였기 때문에 19200을 선택하고,

0과 1만 보내면 되기 때문에 Sand에 0과 1을 입력했습니다.

이상으로 ATmega128을 이용한 USART통신이었습니다.

'Study > AVR' 카테고리의 다른 글

[AVR] CP2102 USB-TO-UART 사용하기  (260) 2018.12.02
[AVR] AVR 시작하기  (371) 2018.11.11
Comments