임베디드 마이크로프로세서 프로그래밍 실전 제작 : 네 로 테 크 강의 : 김 종 형
Embedded AVR Programming
ATMEGA128 USART 직렬통신
1. 2. 3.
20062006-0404-05
-2-
USART의 개요 USART의 레지스터 USART 실습
Embedded AVR Programming
1-1 USART의 개요 ⊙ 2개의 USART(Universal Synchronous and Asynchronous Receive and Transmitter) 구성 - 외부 디바이스와 직렬로 인터페이스를 통해 데이터를 송수신할 수 있게 해 줌 (외부 디바이스는 다른 마이컴 혹은 PC) ⊙ USART0, USART1 ⊙ 전이중 통신 및 멀티 프로세서 통신가능 ⊙ 동기식 전송 모드 - 마스터 동작의 경우 전송속도는 내부 클럭사용 - 슬레이브 동작의 경우 XCKn 단자로 입력되는 외부 클럭신호에 의해 동작한다. ⊙ 비동기식 전송 모드에서는 항상 내부의 시스템 클럭에 의하여 보레이트가 결정된다. ⊙ 송신 완료(TX Complete), 송신 데이터 레지스터 준비완료(TX Data Register Empty), 수신 완료(RX Complete) 등 3가지의 인터럽트 사용 가능
20062006-0404-05
-3-
Embedded AVR Programming
1-2 USART의 레지스터 ⊙ USART I/0 데이터 레지스터 (UDR0, UDR1) : USART0 또는 USART1 포트의 송수신 데이터 버퍼의 기능 BIT
7
6
5
4
UDR0 (READ)
RXB0[7..0]
UDR0 (Write)
TXB0[7..0]
2
1
0
Init Value
0
0
0
0
0
0
0
0
BIT
7
6
5
4
3
2
1
0
0
0
0
0
UDR1 (READ)
RXB1[7..0]
UDR1 (Write)
TXB1[7..0]
Init Value
20062006-0404-05
3
0
0
0
0
-4-
Embedded AVR Programming
1-2 USART의 레지스터 ⊙ USART 제어 및 상태 레지스터 A (UCSR0A, UCSR1A) : USART0, USART1 포트의 송수신 동작제어 ,송수신 상태 저장 기능 BIT
7
6
5
4
3
2
1
0
UCSRnA
RXCn
TXCn
UDREn
FEn
DORn
UPEn
U2Xn
MPCMn
Init Value
0
0
0
0
0
0
0
0
-
RXCn (USARTn Receiver Complete): 수신버퍼의 상태 플래그 TXCn (USARTn Transmit Complete): 송신버퍼의 상태 플래그 UDREn (USARTn Data Register Empty) : 새로운 송신 데이터를 받기 위한 상태 플래그 FEn (Frame Error) : 수신 프레임 에러 상태 플래그 DORn (Data Overrun Error) : 수신동작 오버런 에러 상태 플래그 UPEn (USARTn Parity Error) U2Xn (Double the USARTn Transmission Speed) : 비동기 모드에서만 유효하며, 클럭의 분주비를 16에서 8로 낮추어 전송속도를 2배 높이는 기능 - MPCMn (USARTn Multi-Processor Communication Mode)
20062006-0404-05
-5-
Embedded AVR Programming
1-2 USART의 레지스터 ⊙ USART 제어 및 상태 레지스터 B (UCSR0B, UCSR1B) : USART0, USART1 포트의 송수신 동작제어, 전송데이터를 9비트로 설정한 경우에 전송 데이터의 9번째 비트값을 저장하는 기능을 수행
-
BIT
7
6
5
4
3
2
1
0
UCSRnB
RXCIEn
TXCIEn
UDRIEn
RXENn
TXENn
UCSZn2
RXB8n
TXB8n
Init Value
0
0
0
0
0
0
0
0
RXCIEn (USARTn RX Complete Interrupt Enable): 수신완료 인터럽트 TXCIEn (USARTn TX Complete Interrupt Enable): 송신완료 인터럽트 UDRIEn (USARTn Data Register Empty Interrupt Enable) : 송신 데이터 레지스터 준비완료 인터럽트 RXENn (USARTN Receiver Enable) : 수신부 동작허용, 직렬 데이터 수신단자로 동작하도록 설정하며, FEn , DORn, UPEn 의 동작을 유효하게 함 TXENn (USARTn Transmitter Enable) : 송신부 동작허용 UCSZn2 (USARTn Character Size) : UCSRnC 레지스터의 UCSZn1~0 비트와 함께 전송 문자의 비트수를 설정 RXB8n (USARTn Receiver Data 8Bit) : 전송문자가 9비트로 설정된 경우 수신된 문자의 9번째 비트 (MSB)를 저장. 반드시 UDRn 레지스터 보다 먼저 읽어야 함 TXB8n (USARTn Transmit Data 8Bit) : 전송문자가 9비트로 설정된 경우 송신할 문자의 9번째 비트 (MSB)를 저장. 반드시 UDRn 레지스터 보다 먼저 라이트되어야 함
20062006-0404-05
-6-
Embedded AVR Programming
1-2 USART의 레지스터 ⊙ USART 제어 및 상태 레지스터 C (UCSR0C, UCSR1C) : 송수신 동작 제어 BIT
7
6
5
4
3
2
1
0
UCSRnC
-
UMSELn
UPMn1
UPMn0
USBSn
UCSZn1
UCSZn0
UCPOLn
Init Value
0
0
0
0
0
0
0
0
- UMSELn (USARTn Mode Select) : 동기전송모드 시 1, 비동기 전송모드 시 0 - UPMn1~0 (USARTn Parity Mode) : 패리티 모드 설정 UPMn1
UPMn0
PARITY MODE
0
0
NO PARITY MODE
0
1
RESERVED
1
0
EVEN PARITY MODE
1
1
ODD PARITY MODE
- USBSn (USARTn Stop Bit Select) USBSn = 0 , Stop Bit 1 USBSn = 1, Stop Bit
20062006-0404-05
-7-
Embedded AVR Programming
1-2 USART의 레지스터 ⊙ USART 제어 및 상태 레지스터 C (UCSR0C, UCSR1C) - UCSZn1~0 (USARTn Character Size) : UCSRnB 레지스터의 UCSZn2 비트와 함께 전송 문자의 데이터 비트수를 설정 UCSZn2
UCSZn1
UCSZn0
Character Size
0
0
0
5bit
0
0
1
6bit
0
1
0
7bit
0
1
1
8bit
1
0
0
Reserve
1
0
1
Reserve
1
1
0
Reserve
1
1
1
9bit
- UCPOLn (USARTn Clock Polarity) : 동기 전송모드의 슬레이브 동작에서만 유효 UCPOLn = 0, 송신데이터는 XCKn 클럭의 상승 에지에서는 새로운 값이 출력되고, 수신 데이터는 XCKn 클럭의 하강 에지에서 검출 UCPOLn = 1 이면 송신 데이터는 XCKn 클럭의 하강 에지에서 새로운 값이 출력되고 수신 데이터는 XCKn 클럭의 상승 에지에서 검출
20062006-0404-05
-8-
Embedded AVR Programming
1-2 USART의 레지스터 ⊙ USART BAUD RATE REGISTER (UBRR0H/L , UBRR1H/L) : 16비트 중 12비트 만 유효, 송수신 속도를 설정, 클럭의 분주비로 작용하여 직렬포트의 전송속도인 보레이트를 결정 BIT
7
6
5
4
UBRRnH
-
-
-
-
UBRRnL Init Value
Baud Rate (bps) / 16MHz
20062006-0404-05
3
2
1
0
UBRRn[11:8]
UBRRn[7:0] 0
0
0
비동기 일반모드 (U2Xn=0)
0
0
비동기 2배속 모드 (U2Xn=1)
UBRRn
Error
UBRRn
Error
2400
416
-0.08%
832
+0.04%
4800
207
+0.16%
416
-0.08%
9600
103
+0.16%
207
+0.16%
14,400
68
+0.64%
138
-0.08%
19,200
51
+0.16%
103
+0.16%
28,800
34
-0.79%
68
+0.64%
38,400
25
+0.16%
51
+0.16%
57,600
16
+2.12%
34
-0.79% -9-
0
0
0
Embedded AVR Programming
1-3 USART0 실습 1 ☞ 송신은 폴링 방식, 수신은 인터럽트 방식으로 PC와 연결하여 USART0로 데이터를 받으면 그 받은 데이터를 전송하는 프로그램 #include <mega128.h> #include <delay.h>
void main(void) {
#define UDRE0 5 void TxData(char data) { while(!(UCSR0A & (1<
// USART0 initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART0 Receiver: On // USART0 Transmitter: On // USART0 Mode: Asynchronous // USART0 Baud rate: 9600 UCSR0A=0x00; UCSR0B=0x98; UCSR0C=0x06; UBRR0H=0x00; UBRR0L=0x67; //16MHz일 때 //UBRR0L=0x33; //8MHz일 때
interrupt [USART0_RXC] void usart0_rx_isr(void) { char status,data; status=UCSR0A; data=UDR0;
#asm("sei") while (1) ; // do nothing
TxData(data); } }
20062006-0404-05
-1010-