07
2016-Feb
[AVR] UART 통신
작성자: Blonix
IP ADRESS: *.148.87.98 조회 수: 1608
라이브러리는 첨부파일로 첨부함.
UART 통신이란 - 비동기직렬통신
주로 컴터 혹은 다른 임베디드 디바이스와 통신을 하는데 사용된다.
RXD, TXD 핀이 사용되는데, 각각 수신과 송신을 의미한다.
AVR의 RXD 핀과 타 디바이스의 TXD핀, AVR의 TXD핀과 타 디바이스의 RXD 핀을 연결해야 한다.
세부적인 이론은 알아서들 찾아보고..
아래 라이브러리를 컴파일하면 정의안됨 에러가 뜨는 사람들도 있을거다.
최근에 ATmega128L과 ATmega128이 통합되며 새로운 ATmega128A가 나왔는데, 이걸 반영하지 못한 까닭에 ATmega128A 칩을 사용하면 에러가 뜬다. 반영되지 않은 일부 칩들이 동일한 에러를 띄울 수 있다.
이럴때는 자신의 칩 기종을 uart.c 파일에서 적절한 위치에 추가해주면 된다.
예를 들어 ATmega128A 를 추가하고 싶으면 ATmega128A와 기존 ATmega128 은 동일한 레지스터 구조이므로
#elif defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__)
/* ATmega with two USART */
#define ATMEGA_USART0
#define ATMEGA_USART1
#define UART0_RECEIVE_INTERRUPT USART0_RX_vect
#define UART1_RECEIVE_INTERRUPT USART1_RX_vect
#define UART0_TRANSMIT_INTERRUPT USART0_UDRE_vect
#define UART1_TRANSMIT_INTERRUPT USART1_UDRE_vect
#define UART0_STATUS UCSR0A
#define UART0_CONTROL UCSR0B
#define UART0_DATA UDR0
#define UART0_UDRIE UDRIE0
#define UART1_STATUS UCSR1A
#define UART1_CONTROL UCSR1B
#define UART1_DATA UDR1
#define UART1_UDRIE UDRIE1
이 부분에 defined(__AVR_ATmega128A__) 를 추가해서
#elif defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__) || defined(__AVR_ATmega128A__)
/* ATmega with two USART */
#define ATMEGA_USART0
#define ATMEGA_USART1
#define UART0_RECEIVE_INTERRUPT USART0_RX_vect
#define UART1_RECEIVE_INTERRUPT USART1_RX_vect
#define UART0_TRANSMIT_INTERRUPT USART0_UDRE_vect
#define UART1_TRANSMIT_INTERRUPT USART1_UDRE_vect
#define UART0_STATUS UCSR0A
#define UART0_CONTROL UCSR0B
#define UART0_DATA UDR0
#define UART0_UDRIE UDRIE0
#define UART1_STATUS UCSR1A
#define UART1_CONTROL UCSR1B
#define UART1_DATA UDR1
#define UART1_UDRIE UDRIE1
이렇게 만들어주면 제대로 작동된다.
사용전에 이니셜라이즈 작업을 거쳐야 된다.
아래처럼 하면 된다.
#define UART_BAUD_RATE 9600 // 사용할 보더레이트
#define F_CPU 16000000UL // 사용하는 CPU 클럭
#include "uart.h"
~~~어쩌구 저쩌구 코드를 짠 뒤에
uart_init(UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU));