ATmega328PB USART example code

본 글은 ATmega328PB USART 드라이버 소스를 싣고 있다.
uart를 이용한 디버그 메세지 출력이나, 다른 디바이스와의 통신에도 사용할 수 있다.

USART_Init을 호출하여 baudrate를 설정한 후, USART_Read,USART_Write,USART_Rx, USART_Tx의 함수를 사용하여 데이터를 읽고 쓰면된다.


[소스 코드]

#define F_CPU 8000000UL
//#define F_CPU 16000000UL 

#include <math.h>
#include <stdlib.h>
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>


#define usart_waittime_ms 100


void USART_Init(unsigned int baudrate)
{
/**/
unsigned int ubrr = (((F_CPU / (baudrate * 16UL))) - 1);
/*Set baud rate */
UBRR0H = (unsigned char)(ubrr>>8);
UBRR0L = (unsigned char)ubrr;
/*Enable receiver and transmitter */
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
/* Set frame format: 8data, 2stop bit */
UCSR0C = (1<<USBS0)|(3<<UCSZ00);
}



int USART_Tx(char data, int time_out_ms)
{
int tick = 0;
do
{
if(UCSR0A & (1<<UDRE0))
{
UDR0 = data;
return 0;
}
_delay_ms(1);
tick++;
} while (tick < time_out_ms);
return -1;
}

char USART_Rx(int time_out_ms)
{
int tick = 0;

if(UCSR0A & (1<<RXC0))
{
return UDR0;
}
do
{
if(UCSR0A & (1<<RXC0))
{
return UDR0;
}
if(time_out_ms == 0)
{
return 0;
}
_delay_ms(1);
tick++;
} while (tick < time_out_ms);
return 0;
}

int USART_Write( char *data, int len )
{
int i = 0;
if(!data) return 0;
for(i = 0; i<len;i++)
{
if(USART_Tx(data[i],usart_waittime_ms) < 0)
{
return i;
}
}
return len;
}

int USART_Read(char *data, int len, int wait_time_out)
{
int rx_len = 0;
if(!data || len <= 0)
{
return 0;
}
for(rx_len = 0; rx_len<len;rx_len++)
{
char rx = USART_Rx(wait_time_out);
if(rx == 0)
{
break;
}
data[rx_len] = rx;
rx_len++;
}
return rx_len;
}

[관련 포스트]

댓글

이 블로그의 인기 게시물

base64 인코딩 디코딩 예제 c 소스

바로 프로젝트 적용 가능한 FIR Filter (low/high/band pass filter )를 c나 python으로 만들기

간단한 cfar 알고리즘에 대해

쉽게 설명한 파티클 필터(particle filter) 동작 원리와 예제

windows에서 간단하게 크롬캐스트(Chromecast)를 통해 윈도우 화면 미러링 방법