본문 바로가기

atmega128

Atmega128 uart 통신을 해보자2

안녕하세요 저번게시글에 이어서 uart통신 코드를 조금 수정해보았습니다.

#define F_CPU 16000000UL

//baud rate
#define UART_BAUDRATE 19600

//UBRR 계산식
#define UBRR_VALUE (((F_CPU / (UART_BAUDRATE * 16UL))) -1)

#include <avr/io.h>

void UART_Init(void)
{
	UCSR0A = 0x00; // 초기화
	UCSR0B = (1<<RXEN0)|(1<<TXEN0); // Rx, Tx 활성화
	UCSR0C = (1<<UCSZ00)|(1<<UCSZ01); // 8-bit, no parity, stop bit 1
	UBRR0H= (uint8_t)(UBRR_VALUE>>8);
	UBRR0L= (uint8_t) UBRR_VALUE;
}

unsigned char UART_Receive(void)
{
	while(!(UCSR0A & (1<<RXC0))); // RXC0, 수신 데이터를 받을 준비가 되어있을때
	
	return UDR0; //
}

void UART_Transmit(unsigned char data)
{
	while(!(UCSR0A & (1<<UDRE0))); // UDRE0 송신 데이터를 받을 준비가 되어있을때
	UDR0=data; //
}

int main(void)
{
	unsigned char data;
	
	UART_Init();
	
	while (1)
	{
		data=UART_Receive();
		if(data=='1') {
			UART_Transmit('O');
			UART_Transmit('\r');
			UART_Transmit('\n');
		}
		
		if(data=='0') {
			UART_Transmit('X');
			UART_Transmit('\r');
			UART_Transmit('\n');
		} 
	}
	return 0;
}

 

가장크게 변한건 

1. UBRR 계산식을 #define을 활용하여 레지스터값 설정하는데있어 가독성을 올려준점

1. Init함수에서의 레지스터값 초기화를 비트연산자를 활용해서 설정해주는점
2. 그리고 레지스터의 각비트명을 사용할수있다라는점
3. 마지막으로 문자 '\r''\n'을 순서대로 송신하면 Enter 처럼 사용할수있다는 점
3가지로 요약할수있습니다.

 

'atmega128' 카테고리의 다른 글

Atmega128 UART 통신을 해보자  (0) 2021.09.12
Microchip Studio 설치와 atmega128 GPIO 제어 해보기  (0) 2021.09.09