Chapter. 8 UART HBE-MCU-Multi AVR Jaeheug, Lee
목차 1. UART와 RS232 개요 2. ATMega128의 USART 포트 3. UART로 Hello 보내기 4. UART로 PC와데이터주고받기
UART 와 RS232 개요 UART(Uiversal Asychroous Receiver/Trasmitter) 시리얼기반의통신방식으로일반적으로 RS232 프로토콜을통해원격지와통신을지원하는방식 UART 는컴퓨터에게 RS-232C DTE 인터페이스를제공함으로써, 모뎀이나기타다른직렬장치들과통신하거나데이터를주고받을수있게한다. UART 의동작 병렬데이터를하나의단일직렬비트스트림으로변환 직렬비트스트림을컴퓨터가처리할수있도록바이트로변환 패리티비트처리 시작비트와정지비트처리 키보드나마우스로부터들어오는인터럽트처리
UART 와 RS232 개요 RS-232C 직렬전송을위한규격 1969 년미국의 EIA (Electric Idustries Associatio) 에의해서정해진표준인터페이스 " 직렬 2 진데이터의교환을하는데이터터미널장비 (DTE) 와데이터통신장비 (DCE) 간의인터페이스의제반을규정하는것 " RS-232C 의동작 병렬을직렬로직렬을병렬로바꾸어주는작업 스타트비트와스톱비트포함하여 10 비트를 1 바이트로보냄 RXD, TXD 라인을통해신호를송수신 RS232 Trasceiver 를통해전송전압을끌어올려보다먼거리까지전송
UART 와 RS232 개요 RS-232C 를이용한비동기식전송시규약 통신속도 시간당데이터를전송할수있는양 baud rate : 1초당전송되는변조된신호의수 스톱비트 데이타의시작과끝을알리는스타트와스톱비트를사용전송을시작할경우 1을내보내고 8비트를전송한후스톱비트를전송 스타트비트는고정 / 스톱비트는 1 과 1.5, 2 비트중하나를선택. 패리티 오류검출을위해사용 패리티의종류는짝수및홀수방식과사용하지않는경우가있다. 데이타길이가 7 인경우에 8 번째비트를패리티비트로이용 자료길이 하나의데이타를전송하는데필요한데이타길이 ( 비트수 ) 보통 7과 8 비트가있다.
ATMega128 의 USART 포트 ATmega128 의직렬통신포트 직렬통신포트 USART(Uiversal Sychroous ad Asychroous Recei ve ad Trasmitter) 2 개내장 USART0 USART1 완전이중방식 (Full-Duplex) 동기및비동기전송가능 멀티프로세서통신모드로동작가능 높은정밀도의보레이트발생기내장 인터럽트 송신완료 (TX Complete) 송신데이터레지스터준비완료 (TX Data Register Empty) 수신완료 (RX Complete)
ATMega128 의 USART 포트 ATMega128 USART 데이터프레임포맷 최소 7 비트최대 13 비트로구성 (1 비트의스타트비트 ) +(5,6,7,8,9 비트의데이터비트 ) + (0, 1 비트의패리티비트 ) + (1,2 비트의스탑비트 ) 프레임 USART 통신의데이터프레임
ATMega128 의 USART 포트 ATMega128 USART 데이터프레임포맷 스타트비트 1 비트로이루어졌으며항상 0 레벨이다. 송신시에자동적으로생성된다. 데이터비트 5,6,7,8,9 비트가가능하다. 패리티비트 패리티를사용하지않을수도있고사용하는경우홀수혹은짝수패리티 1 비트를사용한다. 스톱비트 1,2 개의비트가가능하며항상 1 레벨이다. 송신시에자동적으로생성된다.
ATMega128 의 USART 포트 ATMega128 USART 레지스터 UDR(Usart i/o Data Register ) USART I/0 데이터레지스터 (UDR0, UDR1) UCSRA(Usart Cotrol ad Status Register A) USART 제어및상태레지스터 A UCSRB(Usart Cotrol ad Status Register B) USART 제어및상태레지스터 B UCSRC(Usart Cotrol ad Status Register C) USART 제어및상태레지스터 C UBRRH/L (USART BAUD RATE REGISTER) : USART baud Rate 레지스터
ATMega128 의 USART 포트 UDR(Usart i/o Data Register ) USART I/0 데이터레지스터 (UDR0, UDR1) USART 모듈의송수신데이터버퍼의기능을수행하는 8 비트레지스터 (= 0, 1) 송신데이터를 UDR 에 write 하면, 송신데이터버퍼 TXB 에저장 수신데이터를 DR 에서읽으면수신데이터버퍼 RXB 에수신되어있는값이읽힘 7 6 5 4 3 2 1 0 RXB7 RXB6 RXB5 RXB4 RXB3 RXB2 RXB1 RXB0 TXB7 TXB6 TXB5 TXB4 TXB3 TXB2 TXB1 TXB0
ATMega128 의 USART 포트 UCSRA(Usart Cotrol ad Status Register A) USART 제어및상태레지스터 A USART 모듈의송수신동작을제어하거나송수신상태를저장하는기능을수행하는 8 비트레지스터 7 6 5 4 3 2 1 0 RXC TXC UDRE FE DOR PE U2X MPCM 비트 7 : RXC (USART Receiver Complete) 수신버퍼의상태플래그수신버퍼에수신문자가있으면 1 로세트수신버퍼가비어있는상태라면 0 으로클리어
ATMega128 의 USART 포트 UCSRA(Usart Cotrol ad Status Register A) 비트 6 : TXC (USART Trasmit Complete) 송신버퍼의상태플래그 송신시프트레지스터에있는송신데이터가모두송신되고 UDR 의송신버퍼에아직새로운데이터가저장되지않은상태이면 1 로세트 비트 5 : UDRE (USART Data Register Empty) 새로운송신데이터를받기위한상태플래그 UDR 의송신버퍼에새로운송신데이터를받을준비가되어있으면 1 로세트 비트 4 : FE (Frame Error) 수신프레임에러상태플래그 UDR 의수신버퍼에현재저장되어있는데이터를수신하는동안에프레임에러가발생했음을나타냄
ATMega128 의 USART 포트 UCSRA(Usart Cotrol ad Status Register A) 비트 3 : DOR (Data Overru Error) 수신동작오버런에러상태플래그 수신동작에서오버런에러가발생했음을나타내는상태플래그 비트 2 : UPE (USART Parity Error) UDR 의수신버퍼에현재저장되어있는데이터를수신하는동안에패리티에러가발생하였음을나타내는상태플러그 비트 1 : U2X (Double the USART Trasmissio Speed) 비동기모드에서만사용가능, 클록의 분주비를 16 에서 8 로 1/2 만큼낮추어전송속도를 2 배높이는기능 비트 0 : MPCM (USART Multi-Processor Commuicatio Mode) USART 을멀티프로세서통신모드설정
ATMega128 의 USART 포트 UCSRB(Usart Cotrol ad Status Register B) USART 제어및상태레지스터 B USART 모듈의송수신동작제어 / 송수신상태저장 USART0, USART1 포트의송수신동작제어, 전송데이터의 9 번째비트값저장 7 6 5 4 3 2 1 0 RXCIE TXCIE UDRIE RXEN TXEN UCSZ2 RXB8 TXB8 비트 7 : RXCIE (USART RX Complete Iterrupt Eable) 수신완료인터럽트를개별적으로 eable 이비트를 1 로설정하고 SREG 레지스터의 I 비트가 1 이고, UCSRA 레지스터의 RXC 비트가 1 로설정되어있으면수신완료인터럽트가발생
ATMega128 의 USART 포트 UCSRB(Usart Cotrol ad Status Register B) 비트 6 : TXCIE (USART TX Complete Iterrupt Eable) 송신완료인터럽트를개별적으로 eable 이비트를 1 로설정하고 SREG 레지스터의 I 비트가 1 이고, UCSRA 레지스터의 RXC 비트가 1 로설정되어있으면송신완료인터럽트가발생 비트 5 : UDRIE (USART Data Register Empty Iterrupt Eable) 송신데이터레지스터준비완료인터럽트 (Data Register Empty) 를개별적으로 Eable 1 로설정하고 SREG 레지스터의 I 비트가 1 이고, UCSRA 레지스터의 U DRE 비트가 1 로되면, USART Data Register Empty 인터럽트가발생 비트 4 : RXEN (USARTN Receiver Eable) USART 모듈의수신부가동작하도록 eable RXD 핀이병렬 I/O 포트가아니라직렬데이터수신단자로동작하도록설정
ATMega128 의 USART 포트 UCSRB(Usart Cotrol ad Status Register B) 비트 3 : TXEN (USART Trasmitter Eable) USART 모듈의송신부가동작하도록 eable TXD 핀이병렬 I/O포트가아니라직렬데이터송신단자로동작하도록설정 비트 2 : UCSZ2 (USART Character Size) UCSRC 레지스터의 UCSZ1~0 비트와함께전송문자의데이터비트수를설정 비트 1 : RXB8 (USART Receiver Data 8Bit) 수신문자가 9 비트로설정된경우에수신된문자의 9 번째비트를저장 비트 0 : TXB8 (USART Trasmit Data 8Bit) 송신문자가 9 비트로설정된경우에송신된문자의 9 번째비트를저장
ATMega128 의 USART 포트 UCSRC(Usart Cotrol ad Status Register C) USART 제어및상태레지스터 C USART 모듈의송수신동작을제어하거나송수신상태를저장 7 6 5 4 3 2 1 0 - UMSEL UPM1 UPM0 USBS UCSZ1 UCSZ0 UCPOL 비트 6 : UMSEL(USART Mode Select) USART 모드설정 1 이면 USART 모듈을동기전송모드로설정하고, 0 이면비동기전송모드로설정
ATMega128 의 USART 포트 UCSRC(Usart Cotrol ad Status Register C) 비트 5,4 : UPM1,0 (USART Parity Mode) 패리티모드설정 UPM1비트를 1 로설정하면패리티를발생오류가발생하면 UCSRA 레지스터의 PE플래그가 1 로세트 패리티모드설정표 UPM1 UPM0 Parity모드 0 0 Disable 0 1 예약 1 0 Eabled, Eve Parity 1 1 Eabled, Odd Parity
ATMega128 의 USART 포트 UCSRC(Usart Cotrol ad Status Register C) 비트 2,1 : UCSZ1,0(USART Character Size) UCSRB 레지스터의 UCSZ2 비트와함께전송문자의데이터비트수를설정 UCSZ 에의한 character Size 설정표 UCSZ2 UCSZ1 UCSZ0 Character Size 0 0 0 5-bit 0 0 1 6-bit 0 1 0 7-bit 0 1 1 8-bit 1 0 0 예약 1 0 1 예약 1 1 0 예약 1 1 1 9-bit
ATMega128 의 USART 포트 UCSRC(Usart Cotrol ad Status Register C) 비트 0 : UCPOL (Usart Clock POLarity ) 동기전송모드의슬레이브동작에서만유효 1 로설정하면송신데이터는클럭의하강에지에서새로운 XCK 값이출력되고, 수신문자는 XCK 의상승에지에서얻어진다. 0 로설정하면반대로된다.
ATMega128 의 USART 포트 UBRRH/L (USART BAUD RATE REGISTER) USART baud Rate 레지스터 USART 모듈의송수신속도를설정 16비트중에서 12비트만사용 비트 11~0 : UBRR11~0 15 14 13 12 11 10 9 8 - - - - UBRR UBRR UBRR UBRR 7 6 5 4 3 2 1 0 UBRR7 UBRR6 UBRR5 UBRR4 UBRR3 UBRR2 UBRR1 UBRR0 12 비트를이용하여 USART 의 Baud Rate 을결정 UBRRH 의 4 비트와 UBRRL 의 8 비트가조합을이룸.
ATMega128 의 USART 포트 UBRRH/L (USART BAUD RATE REGISTER) UBRR 에의한 Baud Rate 설정표 비동기일반모드비동기 2배속모드 Baud Rate (U2X = 0) (U2X=1) (bps)/7.3728mhz UBRR Error UBRR Error 2400 191 0.0% 383 0.0% 4800 95 0.0% 191 0.0% 9600 47 0.0% 95 0.0% 14,400 31 0.0% 63 0.0% 19,200 23 0.0% 47 0.0% 28,800 15 0.0% 31 0.0% 38,400 11 0.0% 23 0.0% 57,600 7 0.0% 15 0.0% 76.800 5 0.0% 11 0.0% 115,200 3 0.0% 7 0.0% 230,400 1 0.0% 3 0.0% 250,000 1-7.8% 3-7.8% 500,000 0-7.8% 1-7.8% 1,000,000 - - 0-7.8%
실습 11 : UART 로 Hello 보내기 실습개요 UART 를이용하여미리작성된문장 ( Hello World ) 을 PC 로전송하는실습 ATmega128 의 USART 포트를입력과출력으로선언하고이포트를 UART 모듈에연결. USB 케이블을이용하여 PC 와연결. 실습목표 UART 기능동작원리이해 ATMega128의 USART 제어방법의습득 ( 관련레지스터이해 ) UART를통해 PC와통신하는방법습득
실습 11 : UART 로 Hello 보내기 사용모듈 : MCU 모듈, UART 모듈 RS 232 포트 USB-to-Serial 포트 MCU 모듈포트 E MCU 모듈 UART 모듈 UART 모듈 Sigal
실습 11 : UART 로 Hello 보내기 사용모듈 : UART 모듈회로
실습 11 : UART 로 Hello 보내기 모듈결선방법 MCU 모듈포트 E의 PE0는 UART 모듈의 RX에연결 MCU 모듈포트 E의 PE1은 UART 모듈의 TX에연결 UART 모듈의 USB 포트를통해 PC의 USB 포트와연결.
실습 11 : UART 로 Hello 보내기 모듈결선방법 UART 모듈을 PC 와연결하면 USB Serial Port 로인식 UART 모듈의 COM 포트를확인연결
실습 11 : UART 로 Hello 보내기 구동프로그램 : 사전지식 미리정해주어야하는통신규약을결정 UART 제어레지스터세팅 Baud Rate 115200 패리티 Stop Bit 1 전송문자데이터비트수 8 흐름제어 비동기전송모드멀티프로세서통신모드 UART의 RX와 TX를 Eable No Parity 없음 UCSR0A 레지스터의플래그를보면서데이터를보낼수있는상태를기다렸다가 UDR0 레지스터에데이터를넣어주면 UART 로데이터가출력됨.
실습 11 : UART 로 Hello 보내기 구동프로그램 : 소스분석 UART_Hello.c 1) #iclude<avr/io.h> 2) void putch(usiged char data){ while((ucsr0a & 0x20) == 0); // 전송준비가될때까지대기 UDR0 = data; UCSR0A = 0x20; } /* UCSR0A 레지스터중에서 5 번째비트 (UDRE) 를 세트하여 UDRE0 를클리어함. */ it mai(){ 3) usiged char text[]="hello! Wolrd!! \r\"; usiged char i=0;
실습 11 : UART 로 Hello 보내기 4) DDRE = 0xfe; // Rx( 입력 0), Tx( 출력, 1) UCSR0A = 0x00; /* 0번째비트, 즉 MPCM 를 0으로세트 (USART을 멀티프로세서통신모드로설정 ) */ UCSR0B = 0x18; // Rx, Tx eable /* 3번째, 4번째비트세트 즉, TXEN (USART모듈의송신부동작 eable) RXEN (USART모듈의수신부동작 eable) 2번비트 UCSZ02 = 0으로세트 */ UCSR0C = 0x06; // 비동기방식, No Parity bit, 1 Stop bit /* 1번째, 2번째비트세트즉, UCSZ0(1:0) = 11 로세트 데이터비트수를 8비트로결정 */ UBRR0H = 0x00; UBRR0L = 0x03; // 7.3728 MHz -> 115200 bps /* USART모듈의송수신속도를설정 */ 5) while(text[i]!= '\0') putch(text[i++]); retur 0; }
실습 11 : UART 로 Hello 보내기 실행결과 하이퍼터미널을다음과같이설정한다음 MCU 를리셋하여문자열을확인한다. Baud Rate 115200 패리티 No Parity Stop Bit 1 전송문자데이터비트수 8 프로그램다운로드시에는 PC 의하이퍼터미널을연결해제상태로 흐름제어 없음
실습 11 : UART 로 Hello 보내기 실행결과
실습 12 : UART 로 PC 와데이터주고받기 실습개요 PC 로부터전송되는문자열을받아다시 PC 로되돌려전송하도록함. 설정은앞의예제와유사 프로그램의작성된문장을 PC 화면에뿌려주는역할과키보드를통해입력받은 ASCII 값을화면상에보여주는기능을함. 실습목표 16 비트타이머 / 카운터활용방법의습득 ( 관련레지스터이해 ) 버저의동작원리이해
실습 12 : UART 로 PC 와데이터주고받기 사용모듈 : MCU 모듈, UART 모듈 RS 232 포트 USB-to-Serial 포트 MCU 모듈포트 E MCU 모듈 UART 모듈 UART 모듈 Sigal
실습 12 : UART 로 PC 와데이터주고받기 모듈결선방법 ( 앞예제와동일 ) MCU 모듈포트 E의 PE0는 UART 모듈의 RX에연결 MCU 모듈포트 E의 PE1은 UART 모듈의 TX에연결 UART 모듈의 USB 포트를통해 PC의 USB 포트와연결.
실습 12 : UART 로 PC 와데이터주고받기 구동프로그램 : 사전지식 ATmega128 의 USART 포트를통해서 PC 와 UART 통신을연결하고, PC 로받은문자열을그대로되돌려전송. 설정 : 기본적인 UART 설정은이전예제와동일하게설정 데이터수신 : 모든설정이끝나면 UCSR0A 레지스터의플래그를보면서 PC 로부터데이터가도착했는지살펴보고있다가데이터가도착하면 UDR0 레지스터로부터데이터를가져오면된다. 데이터송신 : UCSR0A 레지스터의플래그를보면서데이터를보낼수있는상태를기다렸다가 UDR0 레지스터에데이터를넣어주면 UA RT 로데이터가출력될것이다.
실습 12 : UART 로 PC 와데이터주고받기 구동프로그램 : 소스분석 UART_Echo.c 1) #iclude<avr/io.h> void putch(usiged char data){ while((ucsr0a & 0x20) == 0); UDR0 = data; UCSR0A = 0x20; } 2) usiged char getch(){ usiged char data; while((ucsr0a & 0x80) == 0); data = UDR0; UCSR0A = 0x80; retur data; } it mai(){ // 전송준비가될때까지대기 /* UCSR0A 레지스터중에서 5 번째비트 (UDRE) 를 세트하여 UDRE0 를클리어함. */ // 데이터를받을때까지대기 /* UCSR0A 레지스터중에서 7 번째비트를세트하여 RXC0 를클리어함. */
실습 12 : UART 로 PC 와데이터주고받기 3) usiged char text[]="\r\welcome! HANBACK-ELECTRONICS\r\ USART 0 Test Pro gram.\r\"; usiged char echo[]="echo >> "; usiged char i=0; 4) DDRE = 0xfe; // Rx( 입력 0), Tx( 출력, 1) UCSR0A = 0x00; UCSR0B = 0x18; UCSR0C = 0x06; UBRR0H = 0x00; UBRR0L = 0x03; 5) while(text[i]!= '\0') putch(text[i++]); i=0; 6) while(1) while(echo[i]!= '\0') putch(echo[i++]); putch(getch()); retur 0; } // Rx, Tx eable // 비동기방식, No Parity bit, 1 Stop bit // 7.3728 MHz 에서 115200 bps
실습 12 : UART 로 PC 와데이터주고받기 실행결과