Atemga128 UART
by RileyKim
Atmega128 UART
항상 데이터시트의 중요성을 강조하고싶다.
데이터시트는 기본 중에 기본이다.
단지, 많은 요약어와 설명이 있기 때문에 보기 불편할 뿐이다. 모든 것은 데이터시트 안에 답이 있다.
uart를 사용하기 위해선 mcu의 uart핀을 파악하고 register 설정을 할 줄 알아야한다.
먼저 atmega128의 PinMap를 살펴보자.
PORTE의 bit 0,1과, PORTD의 bit 2,3이 rx,tx 지원 가능한 것을 알 수 있다.
uart register를 살펴보자.
시스템 클록과 원하는 baud rate를 이용하여 USART Baud Rate Register(UBRR)을 계산한다.
UBRR0은 12비트 레지스터이기 때문에 나누어서 넣어야 한다.
- UDRn : 데이터 버퍼 기능을 수행하는 8bit 레지스터
- UCSRnA : 송수신 데이터가 남아있는 지 확인하는 레지스터
- UCSRnB : rx, tx 송수신 허용 레지스터
- UCSRnC : Async, parity, stop 등을 설정하는 레지스터
- UBRRn : baudrate 설정 레지스터
5가지 레지스터를 다뤄서 uart를 사용한다.
n은 번호이다.
예를 들어 n에 1이 들어간 UART 레지스터는 RXD1, TXD1과 관련있다.
UDRn
UCSRnA
bit7- RXCn
RXCn = 1 : UDRn의 수신 버퍼에 아직 안 읽은 데이터가 존재하는 상태
RXCn = 0 : UDRn의 수신 버퍼를 읽어서 비워져 있는 상태
bit5 - UDREn
UDREn = 1 : 송신 버퍼가 비어있어서 새로운 송신 데이터를 받을 준비가 된 상태
UCSRnB
UCSRnC
UBRRnL and UBRRnH
소스 작성시 설정 순서
-
UBRR을 통하여 baudrate설정
Baudrate가 9600일 경우, (14745600/(16*9600)) -1 = 95 95 = 0x5f이다.
#define CPUCLK 14745600UL ///baudrate 9600은 하위 8비트 안에 들어가므로 상위 비트는 비워준다. //UBRR0L = (uint8_t) ((F_CPU / (16*baudrate))-1); UBRR1L = 0x5f; // baudrate 9600 UBRR1H = (uint8_t) (UBRR1L >> 8);
-
UCSRA
default 설정
-
UCSRB
// tx UCSR0B = (1<<TXEN0);
-
UCSRC
default 설정
-
UDR0에서 데이터 설정(tx)
//The UDREn flag indicates if the transmit buffer (UDRn) is ready to receive new data. If UDREn is
//one, the buffer is empty, and therefore ready to be written.
// 송신 버퍼가 비어있을 떄 새로운 송신 데이터를 받을 준비. udre0 = 0일 때 데이터를 받는다.
#if 1
void TX_ch_rs232(uint8_t data){
while(!(UCSR0A&(1<<UDRE0)));
{
UDR0 = data;
}
}
#endif
참고 코드
Subscribe via RSS