AVR 마이크로컴퓨터를 통한 UART(직렬) 통신

개시하다


AVR 마이크로컴퓨터에 준비된 USART를 사용하여 UART 직렬 통신을 합니다.
USART는 Universal Synchronous Receiver Transmitter의 약칭입니다.
비동기식 통신의 UART 뿐만 아니라 동기식 통신도 가능한 기능입니다.
이번에는 비동기식 통신의 UART만 기술했다.
기본적으로 데이터 표에 기재된 내용을 간결하게 서술해야 한다.
※ 샘플 코드에 대한 태그
U16과 F32는 각각 unsigned short(16비트), flat(32비트)를 의미한다.

차리다


AVR 마이크로컴퓨터에서 UART 사용
  • 전송 속도 설정
  • 수신기와 송신기의 유효성
  • 프레임 형식 설정

  • 1. 전송 속도 설정


    설정하고자 하는 전송 속도(통신 속도)에 따라 통신용 내부 시계를 생성하기 위해
    레지스터 UBRR의 값은 다음 표 공식에 따라 계산됩니다.
    BAUD: 전송 속도
    FSC: 마이크로컴퓨터 클록
    /* Set baudrate parameter */
    UBRR0 =  (U16)(((F32)F_CPU / (F32)BAUDRATE / 16.0) - 1.0 + 0.5);    //RoundOff
    
    표와 공식이 다르다
    직접 계산하면 정수 반올림의 오차가 커지기 때문에 반올림의 오차가 작아진다.
    UBRR의 샘플 값도 데이터 테이블에 기재되며 지정된 상수를 참조할 수 있습니다.
    예를 들어 마이크로컴퓨터 시계 8MHz의 경우 전송 속도 19.2kbps를 설정하려면 UBRR는 25이다.

    오차가 커지면 코드가 흐트러지기 때문에 적당한 테스트에서 정확한 통신 속도를 찾아보세요.

    2. 수신기와 송신기의 유효성


    수신기와 송신기의 유효성은 USART의 제어 레지스터를 타격할 수 있다.
    /* Enable receiver and transmitter */
    UCSR0B = (1 << RXEN0) | (1 << TXEN0);
    

    3. 프레임 형식 설정


    직렬 통신에서는 신호선을 시간 순서에 따라 0이나 1을 보내서 통신한다.
    따라서 어떤 형식으로 데이터를 보내는지 미리 정의해야 한다.
    직렬 통신의 프레임 형식은 다음과 같은 요소로 구성된다.
    이름:
    비트 수
    의향
    시작 비트
    1
    프레임 시작 비트임을 나타냅니다.
    데이터 비트
    5 ~ 9
    전송된 데이터입니다.5~9비트 범위에서 자유롭게 설정할 수 있다.
    패리티 비트
    0 or 1
    비트가 잘못된 비트인지 확인합니다.없어도 돼.
    정지 비트
    1 or 2
    프레임 끝을 나타내는 비트
    시작 비트는 항상 1비트이므로 나머지 3개 항목의 자릿수를 설정합니다.
    /* Set frame format: 8data, 1stop bit : 8N1 */
    UCSR0C = (0 << USBS0) | (3 << UCSZ00);
    
    일반적으로 말하면
    주로 데이터 비트 8비트, 패리티 비트 없음, 정지 비트 1비트, 통칭 8N1이다.

    사용법


    UDDR0 레지스터를 사용하여 1byte 데이터를 보내고 받습니다.
    왜냐하면 한 번에 1byte만 할 수 있으니까.
    여러 byte 처리를 원할 때 같은 동작을 간단하게 반복합니다.

    발송 방법


    송신 버퍼가 비어 있을 때 1byte 데이터를 UDR0 레지스터에 기록합니다.
    void Uart::Transmit1Byte(char data)
    {
        /* Wait for empty transmit buffer */
        while ( !(UCSR0A & (1 << UDRE0)))
        {
            /* Do Nothing */
        }
    
        /* Put data into buffer, sends the data */
        UDR0 = data;
    }
    

    수신 방법


    데이터를 수신할 때까지 대기(폴링)하고 UDR0 레지스터를 읽습니다.
    char Uart::Receive(void)
    {
        /* Wait for data to be received */
        while ( !(UCSR0A & (1 << RXC0)) )
        {
            /* Do Nothing */
        }
    
        /* Get and return received data from buffer */
        return UDR0;
    }
    

    최후


    간단하지만 AVR 마이크로컴퓨터를 통한 UART 통신을 설정하는 방법과 사용법을 아래에 기술했다.
    이번에는 인터럽트 기술은 사용하지 않았지만 인터럽트도 사용할 수 있다
    수신 전에 다른 처리를 먼저 할 수 있고, 수신 후 데이터를 읽는 등 프로그램도 제작할 수 있다.
    기본적으로 데이터표에 사용법이 기재되어 있으니 흥미가 있으면 꼭 해 보세요.

    참고 자료


    ATmega328p Datasheet
    http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Datasheet.pdf

    좋은 웹페이지 즐겨찾기