안녕하세요 저번게시글에 이어서 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 |