이 블로그는 임베디드 컴퓨터를 이용한 장치(시스템) 개발과 원격제어에 필요한 지식을 공유 하기 위한 블로그 입니다.
실제 개발과 프로그램 예를 위하여 Microchip 사의 ATmega128를 사용한 보드와 Arduino Mega 보드(ATmega2560), Raspberry Pi, Raspberry Pi Pico, WiFi 모듈을 사용 합니다.

avr-uart-2560

AVR UART
  Serial I/O(UART) Communication

    Serial 통신은 병렬 형태의 데이터(보통 Byte 단위)를 직렬(Bit 단위)로 전환 하여 전송하고 수신 하기 때문에 병렬 통신에 비교 하여 속도는 느리다.

    그러나 여러 개의 통신선(Bus)을 필요로 하는 병렬 통신에 비교 하여 최소 3개의 통신선(Tx, Rx, GND)만을 필요로 하기 때문에 서로 떨어져 있는 장치 사이에 용이하게 통신 선로를 구축 할 수 있다.

    또한, 비동기 방식 통신은 서로 다른 Clock를 사용 하는 장치 사이에도 별도의 Clock 신호 없이(Clock를 사용 하지 않기 때문에 두 장치에서 미리 서로 약속한 속도(Baud Rate)로 송수신 하여야 한다.) 통신 할 수 있기 때문에 대부분의 Embedded Computer에서 기본 통신 장치로 제공(ATmega2560에는 4개의 UART 통신 장치가 제공 됨) 된다.





  • 두 장치(DCT와 DTE ) 사이에 UART(Universal Asynchronous Receiver/Transmitter) 통신을 하기 위한 구성도
    • 쌍방향 통신(Full Duplex)을 위하여 DTE 의 Tx 신호와 DCE의 Rx 신호를 연결 하고, DTE의 Rx 신호와 DCE의 Tx 신호, 양측의 GND 신호를 연결 한다.
    • 비 동기(Asynchronous) 방식 통신인 경우 Clock 신호는 필요 없다.
    • 아래에 있는 UART 통신 프로그램 예(cho_uart_basic_i_o.c)에서는 PC를 DTE(PC에 직렬 통신을 위한 Console 프로그램을 설치 하여 사용 함) 장치로 사용 하고, 실험용 Embedded Computer에 통신 프로그램을 설치 하여 DCE로 이용 하였다.
    • DTE(Data Terminal Equipment)
    • DCE(Data Communication Equipment)

  • ATmega2560의 USART(Universal Synchronous and Asynchronous Receiver/Transmitter) Block Diagram
  • USART Block은 Baud Rate 발생을 시키는 Block과, 병렬 Data를 직렬로 변환 하여 전송 하는 Transmitter Block, 직렬로 수신된 Data를 병렬로 변환 하여 수신 하는 Receiver Block으로 구성 되어 있고, 여기에 USART의 기능을 다양 하게(Programmable) 설정 할 수 있도록 하고, USART의 동작 상태(Status)를 표시 하는 기능 제어 및 상태 표시 Rg(Control and Status Register)가 포함 되어 있다. 이 페이지 에서는 비동기 통신(Asynchronous) 모드 만을 설명 하기 때문에 USART에서 동기 통신(Synchronous)을 뺀 UART 통신 모드에 데하여만 설명 한다.


    • Baud Rate Generation Block
      • Baud Rate Generation Block은 Baud Rate 설정 값을 저장 하고 있는 UBRR Rg(8 Bits Rg 2개(UBRRH, UBRRL)와 Baud rate 발생 회로로 구성 되어 있다.
      • Baud Rate에 따른 UBRR Rg의 설정은 아래(UBRR register 값과 baud rates 예)를 참고 하기 바람.
      • Baud Rate 설정(UART1) Coding 예
        • #define FOSC 16000000 // Clock Speed

          #define BAUD 19200      // Baud rate 값(상수)

          #define MYUBRR FOSC/16/BAUD-1 // UBRR Rg에 설정 할 값(상수) 계산


          unsigned int ubrr;

          ubrr = MYUBRR; // ubrr 변수에 상수 값 대입

          UBRR1H = (unsigned char)(ubrr>>8); // 1번 UART의 Baud rate 상위 8 Bits 값 설정

          UBRR1L = (unsigned char)ubrr;    // 1번 UART의 Baud rate 하위 8 Bits 값 설정


    • Transmitter Block
      • Transmitter Block은 CPU로 부터 전송 할 Data를 받는 UDR(Transmit) Rg와 직렬 전송을 위하여 병렬로 받은 Data를 직렬로 변환 하는 Transmit shift Rg, Error 검출을 위한 Parity Bit를 발생 시키기 위한 Parity Generator로 구성 되어 있다.
      • Data 전송을 위한 Coding 예
        • uart1를 초기화 하는 함수

          #define FOSC 16000000 // Clock Speed

          #define BAUD 19200    // Baud rate 값(상수)

          #define MYUBRR FOSC/16/BAUD-1 // UBRR Rg에 설정 할 값(상수) 계산


          void uart1_init(void)

          {

             unsigned int ubrr;

             // Set baud rate

             ubrr = MYUBRR; // ubrr 변수에 상수 값 대입

             UBRR1H = (unsigned char)(ubrr << 8); // 1번 UART의 Baud rate 상위 8 Bits 값 설정

             UBRR1L = (unsigned char)ubrr; // 1번 UART의 Baud rate 하위 8 Bits 값 설정

             // Enable receiver and transmitter

             UCSR1B = (1 << RXEN1) | (1 &<< TXEN1);

             // Set frame format: 8 bit data, 2stop bit

             UCSR1C = (1 << USBS1) | (3 << UCSZ10);

          }


          uart1를 이용 하여 하나의 문자를 전송 하는 함수

          void tx1_char(unsigned char data)

          {

             // Wait for empty transmit buffer

             while ( !(UCSR1A & (1 << UDRE1)));

             // Put data into buffer, sends the data

             UDR1 = data;

          }


    • Receiver Block
      • Receiver Block은 Rx Pin으로 부터 수신한 Data(Bit 단위로 수신)를 병렬로 변환 하는 Receive shift Rg와 병렬로 변환된 Data를 CPU 내의 Rg로 전송하는 UDR(Receive) Rg, 수신한 Data의 Error 발생 여부를 체크 하는 Parity Checker 회로로 구성 되어 있다.
      • Data 수신을 위한 Coding 예(초기화 함수는 윗 void uart1_init(void)를 이용)
        • uart1로 부터 하나의 문자를 수신 하는 함수

          unsigned char rx1_char(void)

          {

             // Wait for data to be received. UCSR1A Rg의 RXC1 Bit 가 1로 Set 될 때 까지 기다린다.

             while ( !(UCSR1A & (1 << RXC1)));

             // Get and return received data from UDR1 Rg

             return UDR1;

          }


    • Control and Status Register
      • ATmega2560 Chip은 UCSRA, UCSRB,UCSRC 3개의 Control and Status Register(Control Rg)를 갖고 있다. Control Rg 에 대한 설명은 아래 COntrol Rg 부분을 참고 하기 바람.

  • ATmega2560 Asynchronous Communication(UART)
    • Serial frame format
      • Every frame will have at least
        • 1 start bit
        • data bits (5,6,7,8 or 9)
        • 1-2 stop bit
      • Parity is optional

    • Asynchronous Clock Recovery
      • 비 동기 모드에서 정확한 Data 수신을 위한 Clock Recovery와 Start Bit Sampling
        • Start Bit 를 Sampling 하기 위하여 16배(or 8배)(Normal mode 인 경우 16배, Double Speed mode 인 경우에는 8배) 속도의 내부 Clock를 사용 한다.
        • 중간 부분에서 3번 Sampling 하여 2개 이상이 0 이면 0, 2개 이상이 1이면 1로 결정 한다.

    • Error detection
      • Parity Error
        • Data bits의 XOR에 의하여 Parity Bit를 생성 한다.
        • Parity는 Even 과 Odd Parity 로 구분 한다.
        • Peven= dn XOR dn-1 XOR dn-2 ........ XOR d0 XOR 0
        • Podd = dn XOR dn-1 XOR dn-2 ........ XOR d0 XOR 1
      • Frame Error
        • Stop Bit 가 발견 되지 않는 경우
          • 첫 번째 Stop bit가 0으로 검출되는 경우
      • Data Overrun Error
        • 수신 버퍼에 현재 읽지 않은 데이터가 들어있는 상태에서 새로운 데이터가 수신 완료되고, 그 다음 수신 데이터인 Start bit가 검출된 경유

    • 외부 장치와 UART 통신 구현에 필요한 Interface IC 예(MAX232)
      • Logic(0,1)의 전압 발생
        • TTL Logic : 0V, 5V
        • RS-232 : -12V, +12V
        • MAX232 : Negative와 Positive 전압을 발생 시키는 Charge pump 기능을 포함 함.

    • Serial Communication에 사용하는 Connector 예
      • 간단한 RS232 Cable 연결 예

    • ATmega2560 USART
      • USART : UART 의 기능과 Synchronous Communication을 포함 하고 있다.
        • Asynchronous USART: Universal Asynchronous Receiver and Transmitter
          • 두 장치간에 clock 을 공유 하지 않는다.
        • Synchronous USART: Universal Synchronous Receiver and Transmitter
          • 두 장치간에 Synchronous: clock 을 공유 한다.
      • Baud rate : 매 초간 전달(수신, 송신)되는 Symbol의 수
      • Data rate : 매 초간 전달(수신, 송신)되는 Data 수
        • Data rate = Baud rate / Frame Bits(Data Bits + Start,Stop, Parity Bits)
      • ATmega2560 USART Pin
        • USART0 : Port E 사용
          • PE0: RXD0(Receive Pin)
          • PE1: TXD0(Transmit Pin)
          • PE2: XCK0(External Clock)
        • USART1 : Port D 사용
          • PD2: RXD1(Receive Pin)
          • PD3: TXD1(Transmit Pin)
          • PD5: XCK1(External Clock)
        • USART2 : Port H 사용
          • PH0: RXD2(Receive Pin)
          • PH1: TXD2(Transmit Pin)
          • PH2: XCK2(External Clock)
        • USART3 : Port J 사용
          • PJ0: RXD3(Receive Pin)
          • PJ1: TXD3(Transmit Pin)
          • PJ2: XCK3(External Clock)

  • ATmega2560 USART에 시용되는 Register
    • USART I/O Data Registers
      • UDRn: 8-bit I/O Data Register
      • UDRn(Usart 0,1 I/O Data Register)
        • UDRn(n은 UART 번호) 레지스터는 송/수신되는 데이터 값을 저장하는 버퍼 역활을 하게 된다.
        • UDRn은 TXBn(송신버퍼)/RXBn(수신버퍼) 레지스터로 구성되고, 같은 I/O 주소를 갖는다.
        • 송신할 때는 UDRn(Read)에 데이터를 Write 하고,
        • 수신할 때는 UDRn(Write)의 테이터를 Read 한다.
        • UDRn(Read)와 UDRn(Write)은 같은 이름을 사용 하지만 별개의 Rg 이다. Read 동작에서는 UDRn(Read) Rg를 읽고, Write 동작에서는 UDRn(Write) Rg에 Data를 Write 한다.

    • Baud Rate Registers
      • UBRRnH and UBRRnL: Baud Rate Registers
        • 2개의 8-bit registers를 사용 한다.(n은 USART 번호)

      • USART internal clock 은 UBRR register에 의하여 설정 된다.
      • 12 bits Baud Rate Rg UBRR의 값은
        • UBRR = (System Clock / 16XBaud Rate) – 1 식으로 구한다.
        • 주의 : UBBRnH Write 후 UBBRnL를 나중에 Write 하여야 한다.

      • UBRR register 값과 baud rates 예

    • UCSRnA(USART Control and Status Register A)
      • Bit 7 – RXCn(USART Receive Complete Flag)
        • Receive Buffer에 읽지 않은 Data가 있을 때 Set 되고,
        • Receive Buffer 가 비어 있을 때 Clear 된다.
        • Receive Disabled 되면 이 Buffer는 Flushed 되고,
        • RXCn Flag는 Clear(Zero) 된다.
        • RX Complete Interrupt Enable 상태 일 경우 이 Flag 가 Set 되면 RX Complete Interrupt 가 발생 된다.
      • Bit 6 – TXCn(USART Transmit Complete Flag)
        • Transmit buffer(UDRn)에 전송된 Data 가 Transmit Shift Register에서 shifted out 되어 전송을 위한 새로운 Data를 받을 수 있는 상태가 되면 이 Flag 가 Set 된다.
        • TX Complete Interrupt Enable 상태에서 Transmit complete interrupt 이 실행 되면 이 Falg는 자동으로 Clear 된다.
        • TX Complete Interrupt를 사용 하지 않는 경우에는 이 Bit에 1을 쓰는 방법으로 이 Flag를 Clear 할 수 있다.
        • TX Complete Interrupt Enable 상태 일 경우 이 Flag 가 Set 되면 TX Complete Interrupt 가 발생 된다.
      • Bit 5 – UDREn(USART Data Register Empty Flag)
        • Flag는 Transmit buffer(UDRn)의 상태를 표시 한다.
        • 이 Flag가 1(Set)인 경우 Transmit buffer(UDRn)가 Empty 상태이기 때문에 전송을 위하여 새 Data를 받을 수 있다.
        • Data Register Empty Interrupt Enable 상태 일 경우 이 Flag 가 Set 되면 Data Register Empty Interrupt 가 발생 된다.
      • Bit 4 – FEn(USART Frame Error)
      • Bit 3 – DORn(USART Data Overrun Error)
      • Bit 2 – UPEn(USART Parity Error)
      • Bit 1 – U2Xn(Double the USART Transmission Speed)
        • U2Xn = 1 : 비동기 모드에서 클럭의 분주비를 16에서 8로 낮추어 전송속도를 2배 높이는 기능.
      • Bit 0 – MPCMn(USART Multi-Processer Communication Mode)

    • UCSRnB(USART Control and Status Register B)
      • Bit 7 – RXCIEn(USART RX Complete Interrupt Enable)
        • SREG의 Global interrupt flag 가 Set 되고,
        • 이 Bit가 Set된 상태(RX Complete Interrupt Enable)에서,
        • RXC flag가 Set 되면 RX Complete Interrupt가 발생 한다.
        • RX Complete Interrupt Routine에서 UDRn(Read) Data를 읽어서 사용 할 수 있다.
      • Bit 6 – TXCIEn(USART TX Complete Interrupt Enable)
        • SREG의 Global interrupt flag 가 Set 되고,
        • 이 Bit가 Set된 상태(TX Complete Interrupt Enable)에서,
        • TXC flag가 Set 되면 TX Complete Interrupt가 발생 한다.
        • TX Complete Interrupt Routine에서 UDRn(Write)에 전송 할 Data를 쓸 수 있다.
      • Bit 5 – UDRIEn(USART Data Register Empty Interrupt Enable)
        • SREG의 Global interrupt flag 가 Set 되고,
        • 이 Bit가 Set된 상태(Data Register Empty Interrupt Enable)에서,
        • UDREn flag가 Set 되면 Data Register Empty Interrupt가 발생 한다.
        • Data Register Empty Interrupt Routine에서 UDRn(Write)에 전송 할 Data를 쓸 수 있다.
      • Bit 4 – RXENn(USART Receiver Enable)
        • 이 Bit가 Set 되면 USARTn Receiver가 Enable(사용 할 수 있는 상태) 된다.
        • 이 Bit가 Set 되면 RxDn와 공통으로 이 Pin을 사용 하는 I/O Port는 이 Pin을 사용 할 수 없다.
        • 이 Bit을 Clear(Receiver Disable) 하면 Receive buffer(UDRn(Read))는 Flush 된다.
      • Bit 3 – TXENn(USART Transmitter Enable)
        • 이 Bit가 Set 되면 USARTn Transmitter가 Enable(사용 할 수 있는 상태) 된다.
        • 이 Bit가 Set 되면 TxDn와 공통으로 이 Pin을 사용 하는 I/O Port는 이 Pin을 사용 할 수 없다.
        • 이 Bit을 Clear(Transmitter Disable) 하여도 현재 전송 중인 Data는 전송이 완료 된다.
      • Bit 2 – UCSZn2(USART Character Size)
        • UCSTnC 의 UCSZn1:0 와 함께 사용 함.
      • Bit 1 – RXB8n(USART Receive Data Bit 8)
      • Bit 0 – TXB8n(USART Transmit Data Bit 8)

    • UCSRnC(USART Control and Register C)
      • Bit 7:6 – USMSELn1:0(USART Mode Select)
        • USARTn의 동작 Mode를 선택 한다.
        • UMSELn Bits Settings Table
      • Bit 5:4 – UPMn1, UPMn0(USART Parity Mode)
      • Bit 3 – USBSn(USART Stop Bit Select)
        • USBSn = 0 : 1 Stop bits
        • USBSn = 1 : 2 Stop bits
      • Bit 2, 1 – UCSZn1, UCSZn0 : 아래 "Character Size" 참고요
      • Bit 0 – UCPOLn(USART Clock Polarity)
        • 동기 전동 모드에서만 사용.
        • UCPOLn = 1 : 송신데이터는 XCKn Clock Falling Edge에서, 출력 수신데이터는 XCKn Clock Rising Edge 에서 검출
        • UCPOLn = 0 : 송신데이터는 XCKn Clock Rising Edge 에서, 출력 수신데이터는 XCKn Clock Falling Edge에서 검출
      • Character Size : UCSZn2(UCSRnB: Bit2 ), UCSZn1(UCSRnC: Bit2), UCSZn0(UCSRnC: Bit1)
        • UCSZn2, UCSZn1, UCSZn0의 설정에 따라 5-9Bits 로 결정 된다.

  • UART 통신에 자주 이용 되는 Circular Buffer
    • (Circular Buffer는 UART 통신과 직접적인 관계는 없지만 통신 프로그램에서 자주 사용 하는 I/O Buffer 이기 때문에 이 페이지에서 설명 한다.)

      Circular Buffer는 FIFO(First in first out) Buffer로 통신용 I/O Buffer에 자주 사용 되는 Buffer 이다. 이 Buffer는 Data I/O 시 Data를 다시 배열 할 필요가 없기 때문에 FIFO Buffer를 구현 하는데 효과 적이다.

      아래 그림은 Circular Buffer의 동작을 설명 하기 위한 그림이다. 이 예에서는 현재 유효한 3개의 Data(‘a’ ‘b’ ‘c’)가 Buffer에 저장 되어 있는 상태 이다.


    • Circular Buffer의 구현(구성 요소)
      • Circular Buffer는 일정한 크기의 연속된 Memory 공간(Buffer size)을 필요로 한다.
      • Circular Buffer는 2개의 정수(Address)와 2개의 Index pointer로 실현 된다.
        • Buffer starting address: Buffer의 시작 번지를 가르 킨다.
        • Buffer ending address: Buffer의 끝 번지를 가르 킨다.
        • Write pointer(wp): 새로 입력되는 Data가 저장 될 위치를 Pointing 한다.
        • Read pointer(rp): 현재 유효한 Data의 시작 번지를 Pointing 한다.
    • Circular Buffer의 동작
      • Buffer에 Data 쓰기: wp Pointer가 Pointing 하는 번지에 Data를 쓰고 wp Pointer를 1 만큼 증가 시킨다. 만약 wp 가 Buffer ending address 보다 크게 되면 wp를 Buffer start에 위치(wp <- Buffer starting address)하게 한다.
      • Buffer로 부터 Data 읽기: rp Pointer가 Pointing 하는 번지로 부터 Data를 읽고 rp Pointer를 1 만큼 증가 시킨다. 만약 rp 가 Buffer ending address 보다 크게 되면 rp를 Buffer start에 위치(rp <- Buffer starting address)하게 한다.
      • Buffer empty 상태: rp와 wp가 일치 하게 되면 Buffer는 Empty 상태가 되고 새로운 Data가 쓰여질 때 까지 Data를 읽을 수 없다.

  • ATmega2560 UART 프로그램 예:
    • UART 통신를 위한 설정과 문자 Input/Output 프로그램 예: cho_uart_basic_i_o_2560.zip
    • UART 통신 실험을 위한 회로 구성 예

      • cho_uart_basic_i_o_2560_main.c
      • 
        // cho_uart_basic_i_o_2560.c
        // S/W Environment : AVR Studio 7 + WINAVR Compiler
        // Target : ATmega2560
        // Crystal: 16Mhz
        //
        //Author : chowk
        
        // 이 프로그램은 UART 통신을 위한 초기화와 이해를 위한 예 이다.
        // 실험을 위한 준비:
        //   모니터 프로그램(예: OC-Console, Tera Term)을 설치하고 실행 한다.
        //   모니터 프로그램의 설정에서 Serial Port, Baudrate 등을 설정 한다.
        //     Serial Port 설정: 개발 보오드를 연결 하고 제어판 -> 장치관리자에서 번호 확인 후 설정
        //     Baudrate: 이 프로그램에서는 19200으로 설정 되었다.
        
        // 동작 설명:
        //   프로그램을 실행 하면 모니터에 "UART1 Testing..." 메세지가 출력 된다.
        //   Kwyboard의 문자를 입력(타이핑)하면 모터터에 문자가 출력 된다.
        
        #define FOSC 16000000 // Clock Speed
        #define BAUD 19200
        #define MYUBRR FOSC/16/BAUD-1
        
        #define CR 0x0d
        #define LF 0x0a
        
        #include <avr/io.h>
        #include <avr/interrupt.h>
        #include <stdio.h>
        
        void init_devices(void);
        static int put_char(char c, FILE *stream);
        void uart1_init(void);
        unsigned char rx1_char(void);
        void tx1_char(unsigned char data);
        
        // UART1 initialize
        // char size: 8 bit
        // parity: Disabled
        void uart1_init(void)
        {
        	unsigned int ubrr;
        	// Baud rate 설정
        	ubrr = MYUBRR;
        	UBRR1H = (unsigned char)(ubrr >> 8);
        	UBRR1L = (unsigned char)ubrr;
        	// Enable receiver and transmitter
        	UCSR1B = (1 << RXEN1)|(1 << TXEN1);
        	// Set frame format: 8data, 1stop bit
        	UCSR1C = (0 << USBS1)|(3 << UCSZ10);
        }
        
        // UART1로 부터 입력
        unsigned char rx1_char(void)
        {
        	// Wait for data to be received
        	while ( !(UCSR1A & (1 << RXC1)) );
        	// Get and return received data from buffer
        	return UDR1;
        }
        
        // UART1으로  출력
        void tx1_char(unsigned char data)
        {
        	// Wait for empty transmit buffer
        	while ( !(UCSR1A & (1 << UDRE1)));
        	// Put data into buffer, sends the data
        	UDR1 = data;
        }
        
        static int put_char(char c, FILE *stream)
        {
        	tx1_char(c);
        	return 0;
        	
        }
        
        // Initialize all peripherals
        void init_devices(void)
        {
        	cli();                // Disable all interrupts
        	uart1_init();         // UART 1 초기화
        	fdevopen(put_char,0);
        	sei();                // Re-enable interrupts
        }
        
        int main (void)
        {
        	unsigned char data;
        
        	init_devices();
        	
        	printf("UART1 Testing...\n\r");
        	while(1){
        		// 모니터에서 입력한 문자를 UART 통신을 이용하여 받는다.
        		data = rx1_char();
        		// 입력된 문자를 UART 통신을 이용하여 모니터에 출력 한다.
        		tx1_char(data);
        		if(data == CR)tx1_char(LF);
        	}
        	return 0;
        }
          

      • 실험을 위한 준비
        • Arduino Mega 2560를 사용하는 경우 2560 Pin name과 Mega board pin name mapping table을 참고하여 신호선을 연결한다.

          참고자료: Arduino Mega 2560 PIN mapping table

        • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 RXD와 Mega board의 TXD1(PD3)를 연결한다.
        • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 TXD와 Mega board의 RXD1(PD2)를 연결한다.
        • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 GND와 Mega board의 GND를 연결한다.
        • 주: UART1은 "USB --> UART(RS232) 변환 모듈"를 사용(USB Port를 Serial Port로 변환)하여 연결한다. Mega board의 UART0는 개발 Tool에서 사용하기 때문에 이 예서는 UART 통신 실험에 UART1을 사용한다.

          참고자료: USB - Serial 변환 모듈

      • 실험 방법
        • cho_uart_basic_i_o_2560.zip 파일을 Download하여 압축을 해제한다.
        • cho_uart_basic_i_o_2560.hex를 개발 보드에 Upload 한다.
        • 모니터 프로그램(예: OC-Console, Tera Term)을 설치(이미 설치되어 있는 경우에는 실행만 하면됨)하고 실행 한다.
        • 모니터 프로그램에서 필요한 설정(Serial Port와 Baudrate 등을 설정)을 한다.
        • 실험:
          • 개발 보드의 Reset SW를 누르면 모니터에 "UART1 Testing..." 메세지가 출력된다.
          • 모니터에서 문자를 입력하면 입력된 문자는 UART 통신을 이용하여 개발보드에 전송된다.
          • 개발보드에 전송된 문자는 다시 UART 통신을 이용하여 모니터에 출력된다.
    • UART Rx Interrupt를 이용한 제어 문자 입력과 LED shift 제어 프로그램 예: cho_led_shift_uart_Rx_int_2560.zip
      • 실험을 위한 준비
        • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 RXD와 Mega board의 TXD1(PD3)를 연결한다.
        • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 TXD와 Mega board의 RXD1(PD2)를 연결한다.
        • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 GND와 Mega board의 GND를 연결한다.
        • PORTL에 저항(330Ω)과 LED Array(8Bits)를 연결한다.
        • 참고자료: 8Bit-LED-array-module 제작 예

      • 실험 방법
        • cho_led_shift_uart_Rx_int_2560.zip 파일을 Download하여 압축을 해제한다.
        • cho_led_shift_uart_Rx_int_2560.hex를 개발 보드에 Upload 한다.
        • 모니터 프로그램(예: OC-Console, Tera Term)을 설치(이미 설치되어 있는 경우에는 실행만 하면됨)하고 실행 한다.
        • 모니터 프로그램에서 필요한 설정(Serial Port와 Baudrate 등을 설정)을 한다.
        • 실험: USART1 Rx Interrupt를 이용하는 예 이다.
          • 개발 보드의 Reset SW를 누르면 모니터에 "UART1 Interrupt: LED Shift."와 "SHIFT_LEFT: L SHIFT_RIGHT: R" 메세지가 출력된다.
          • 모니터 프로그램에서 문자 "L"를 입력하면 LED 가 좌측으로 회전하고, 문자 "R"를 입력하면 LED 가 우측으로 회전한다.
          • 개발보드는 모니터 프로그램으로 부터 UART Interrupt를 이용하여 명령 문자를 받는다.
    • UART Rx Interrupt를 이용한 Buffered I/O 프로그램 예: cho_uart_Rx_interrupt_buffer_2560.zip
      • 실험을 위한 준비
        • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 RXD와 Mega board의 TXD1(PD3)를 연결한다.
        • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 TXD와 Mega board의 RXD1(PD2)를 연결한다.
        • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 GND와 Mega board의 GND를 연결한다.
      • 실험 방법
        • cho_uart_Rx_interrupt_buffer_2560.zip 파일을 Download하여 압축을 해제한다.
        • cho_uart_Rx_interrupt_buffer_2560.hex를 개발 보드에 Upload 한다.
        • 모니터 프로그램(예: OC-Console, Tera Term)을 설치(이미 설치되어 있는 경우에는 실행만 하면됨)하고 실행 한다.
        • 모니터 프로그램에서 필요한 설정(Serial Port와 Baudrate 등을 설정)을 한다.
        • 실험: USART1 Rx Interrupt와 Circular Buffer를 이용하는 예 이다.
          • 개발 보드의 Reset SW를 누르면 모니터에 "UART1 Interrupt: Circular Buffer." 메세지가 출력된다.
          • 모니터 프로그램에서 문자를 입력하면 Circular Buffer에 저장되고 모니터에 출력된다. 만약 CR(Carriage Return) 코드(Enter key)가 입력되면 모니터의 다음 줄에 Circular Buffer에 저장된 문자열을 대문자로 변환하여 출력한다.
          • 개발보드는 모니터 프로그램으로 부터 UART Rx Interrupt를 이용하여 문자를 받는다.
    • UART Rx와 Tx Interrupt를 이용한 Buffered I/O 프로그램 예: cho_uart_Rx_Tx_interrupt_buffer_2560.zip
      • 실험을 위한 준비
        • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 RXD와 Mega board의 TXD1(PD3)를 연결한다.
        • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 TXD와 Mega board의 RXD1(PD2)를 연결한다.
        • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 GND와 Mega board의 GND를 연결한다.
      • 실험 방법
        • cho_uart_Rx_Tx_interrupt_buffer_2560.zip 파일을 Download하여 압축을 해제한다.
        • cho_uart_Rx_Tx_interrupt_buffer_2560.hex를 개발 보드에 Upload 한다.
        • 모니터 프로그램(예: OC-Console, Tera Term)을 설치(이미 설치되어 있는 경우에는 실행만 하면됨)하고 실행 한다.
        • 모니터 프로그램에서 필요한 설정(Serial Port와 Baudrate 등을 설정)을 한다.
        • 실험: USART1 Rx와 Tx Interrupt 그리고 Circular Buffer를 이용하는 예 이다.
          • 개발 보드의 Reset SW를 누르면 모니터에 "UART1 Interrupt: Circular Buffer." 메세지가 출력된다.
          • 모니터 프로그램에서 문자를 입력하면 Circular Buffer에 저장되고 모니터에 출력된다. 만약 CR(Carriage Return) 코드(Enter key)가 입력되면 Tx Interrupt가 Enable되고 모니터의 다음 줄에 Circular Buffer에 저장된 문자열을 대문자로 변환하여 출력한다.
          • 개발보드는 모니터 프로그램과 UART Rx와 Tx Interrupt를 이용하여 문자를 주고 받는다.
    • UART Rx Buffer와 Tx Buffer를 이용한 Interrupt I/O 프로그램 예: uart_Rx_Tx_interrupt_io_buffer_2560.zip
      • 실험을 위한 준비
        • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 RXD와 Mega board의 TXD1(PD3)를 연결한다.
        • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 TXD와 Mega board의 RXD1(PD2)를 연결한다.
        • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 GND와 Mega board의 GND를 연결한다.
      • 실험 방법
        • uart_Rx_Tx_interrupt_io_buffer_2560.zip 파일을 Download하여 압축을 해제한다.
        • uart_Rx_Tx_interrupt_io_buffer_2560.hex를 개발 보드에 Upload 한다.
        • 모니터 프로그램(예: OC-Console, Tera Term)을 설치(이미 설치되어 있는 경우에는 실행만 하면됨)하고 실행 한다.
        • 모니터 프로그램에서 필요한 설정(Serial Port와 Baudrate 등을 설정)을 한다.
        • 실험: USART1 Rx와 Tx Interrupt 그리고 Circular Buffer(Rx Buffer 와 Tx Buffer)를 이용하는 예 이다.
          • 개발 보드의 Reset SW를 누르면 모니터에 "UART1 Interrupt: Circular Buffer." 메세지가 출력된다.
          • 모니터 프로그램에서 문자를 입력하면 Rx Buffer에 저장되고 모니터에 출력된다. Rx Buffer의 문자를 읽어 대문자로 변환하여 Tx Buffer에 Write 하면 Tx Interrupt service routine에서 Tx Buffer를 읽어 모니터에 출력한다.
          • 개발보드는 모니터 프로그램과 UART Rx와 Tx Interrupt를 이용하여 문자를 주고 받는다.
    • UART Calculator 프로그램 예: cho_uart_calculator_pointer_2560.zip
      • 실험을 위한 준비
        • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 RXD와 Mega board의 TXD1(PD3)를 연결한다.
        • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 TXD와 Mega board의 RXD1(PD2)를 연결한다.
        • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 GND와 Mega board의 GND를 연결한다.
      • 실험 방법
        • cho_uart_calculator_pointer_2560.zip 파일을 Download하여 압축을 해제한다.
        • cho_uart_calculator_pointer_2560.hex를 개발 보드에 Upload 한다.
        • 모니터 프로그램(예: OC-Console, Tera Term)을 설치(이미 설치되어 있는 경우에는 실행만 하면됨)하고 실행 한다.
        • 모니터 프로그램에서 필요한 설정(Serial Port와 Baudrate 등을 설정)을 한다.
        • 실험:
          • 개발 보드의 Reset SW를 누르면 모니터에 "USART Calculator"와 "Input Format 예 : 12 + 23 = " 메세지가 출력된다.
          • 모니터 프로그램에서 Input Format 예와 같이 "정수" "연산자(+, -, *, /)" "정수" "=" 를 입력하면 입력 문자와 연산 결과가 모니터에 출력된다.
          • 모니터 프로그램과 개발보드는 UART 통신을 이용하여 문자를 주고 받는다.