본문 바로가기
Embedded System/AVR

[AVR] USART 통신

by goatlab 2022. 7. 15.
728x90
반응형
SMALL

USART 통신

 

USART는 동기식 모드를 의미한다. USART는 UART 모드로 동작 시킬 수 있으며, 대부분 UART로 사용한다. 따라서, USART개념을 UART개념으로 사용해도 무방하다 (동기통신은 대규모 고속전송에 주로 사용).

 

 
  • ATmega128은 2개의 USART 내장 → USART0, USART1
  • 전 이중 방식
  • 동기 및 비동기 통신 모드
  • 데이터 비트 (5~9비트), 정지 비트(1~2비트) 및 패리티 비트
  • 고 분해능의 보레이트 발생기
  • 노이즈 필터링
  • 3개의 인터럽트 소스 (전송완료, 수신완료, 전송데이터 레지스터)
  • 멀티-프로세서 통신모드
  • 2배속 비동기 통신모드

 

송신할 때 UDRn 레지스터가 출발점이 된다.

 

http://gasiri.egloos.com/337796

 

UDRn의 Description을 보면 RXBn과 TXBn으로 나누어져 있다. 두 레지스터는 동일한 I/O address를 공유한다.

 

TXBn (USARTn Transmit Data Buffer Register)는 송신할 때 데이터의 출발 지점이 되고 RXBn (USARTn Receive Data Buffer Register)는 수신을 할 때 데이터의 도착지점이 된다. 다시 말해, TXBn에 데이터를 Write해주면 데이터를 전송하고 RXBn에 담긴 데이터를 Read하면 데이터를 수신하는 셈이다.

 

https://m.blog.naver.com/sindh718/221113392708

 

1. 0100 1010이라는 데이터를 전송하기 위해 UDR0에 써주면 이 데이터는 시프트 레지스터로 전달된다.

2. 전달된 데이터는 설정된 전송 속도에 따라 1비트씩 전송된다.

3. 데이터 전송 중에 UDR0에 새로운 데이터를 써주더라도 시프트 레지스터에서 아직 데이터가 전송중이라면 잠시 대기한다.

4. 시프트 레지스터에 있던 데이터가 전송 완료되고 비어있으면 UDR0에서 대기하던 데이터가 시프트 레지스터로 전달되고 새로운 전송을 시작한다.

 

이 과정 속에서 새로운 데이터를 연속적으로 보내려면 UDR0이 비어있는지 체크할 수 있어야 한다.그것은 UCSRnA 레지스터의 UDREn 비트를 통해 가능하다.

 

UDRE0=1 → UDR0가 비어있으며 새로운 데이터를 전송할 준비가 되어있음을 나타낸다.
UDRE0=0 → UDR0에 아직 시프트 레지스터로 전달되지 못한 데이터가 대기하고 있다.

 

문자 통신

 

#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
 
void USART0_init(unsigned int UBRR0)  // 8bit, no parity, 1 stop bit, TX enable
{
    UBRR0H=(unsigned char)(UBRR0>>8);
    UBRR0L=(unsigned char)UBRR0;
    UCSR0B=(1<<TXEN0);
}
 
void TX0_ch(unsigned char data) // 데이터 송신 함수
{
    while(!(UCSR0A&(1<<UDRE0)));
    
    UDR0=data; 
}
 
int main(void)
{
    USART0_init(103);  // 9600bps
    while(1)
    {
        TX0_ch('A');  // A 전송
        _delay_ms(1000);
    }
}

 

문자열 통신

 

#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
 
void USART0_init(unsigned int UBRR0) 
{
    UBRR0H=(unsigned char)(UBRR0>>8);
    UBRR0L=(unsigned char)UBRR0;
    UCSR0B=(1<<TXEN0);
}
 
void TX0_ch(unsigned char data) 
{
    while(!(UCSR0A&(1<<UDRE0)));
    
    UDR0=data; 
}
 
void TX0_STR(unsigned char *str)
{
    while(*str){TX0_ch(*str++);} 
}
 
 
int main(void)
{
    unsigned char str1[]="t has passed.\n\r";
    USART0_init(103);  // 9600bps
    
    while(1)
    {
        TX0_STR(str1);  // t has passed. 전송
        _delay_ms(1000);
    }
}

728x90
반응형
LIST

'Embedded System > AVR' 카테고리의 다른 글

[AVR] 터미널 (Terminal Window)  (0) 2022.07.19
[AVR] 타이머 세팅  (0) 2022.07.08
[AVR] 스위치 (Switch)  (0) 2022.06.23
[AVR] 부저 (Buzzer)  (0) 2022.06.14
[AVR] FND (Flexible Numeric Device)  (0) 2022.06.14