UART - 원리와 연결과 UART - 송신을 통해서 AVR의 UART 설정을 어떻게 하고 컴퓨터와의 통신은 어떻게 이루어 지는지 이미 설명하였다. 이번 글에서는 앞의 글에서 설정한 값들을 그대로 이용하여 AVR의 UART 수신에 대해서 설명하도록 하겠다. 이미 UART 송신을 위해서 UART설정은 해 둔 상태이므로 수신 코드만 구현하면 된다. 수신코드는 송신 코드와 유사하다. uint8_t uart_rx(void) { while (!(uart->ucsr_a & RXC)); return uart->udr; } UCSRA레지스터의 RXC 비트 값이 1이 되면 UDR레지스터에 데이터가 수신되었음을 알려주므로 RXC 비트가 1이 될때까지 UCSRA레지스터를 polling하고 있다가 RXC 비트값이 1이 되면 ..
위의 그림은 AVR에 있는 UART블럭의 블럭도이다. UART블럭은 크게 세부분으로 나누어 볼 수 있다. 데이터를 정확한 시간에 맞춰 내보내거나, 수신되는 데이터를 정확한 위치에서 샘플링할 수 있게 하기 위한 clock generator가 있고, 송신기능을 처리해 주는 transmitter가 있다. 그리고 수신기능을 담당하는 receiver블럭이 있다. 그림을 자세히 보면 알겠지만 UART 블럭에는 Data bus에 연결된 다섯개의 레지스터를 찾을수가 있다. 클럭 설정을 하기 위한 UBRR레지스터가 있다. UART에서 통신 속도를 baud rate라고 하는데 이 값은 아무값이나 설정해서 사용하는 것이 아니고 정해진 몇개의 값들이 있다. 예전에는 9600bps를 많이 사용하였다. 그러나 최근의 임베디드 시..
처음 계획은 AVR 내부 기능과 관련된 내용을 모두 설명한 다음, 이어서 다른 디바이스와의 정보를 교환하는 방법인 UART, TWSI, SPI에 대해서 설명하려고 하였다. 그러나 이미 앞에서 다룬 LED 온도계처럼 확인하고 싶은 내용을 LED를 이용하여 표시하다보니 보고싶은 결과를 한눈에 쉽게 알아볼 수 없는 불편함이 있었다. 앞으로 이어질 내용인 타이머/카운터나 ADC 등등 여러가지 기능을 설명하기 위하여 중간 중간 I/O 레지스터에 어떤 값이 들어가 있는지 수시로 확인하여야 한다. 이를 위하여 C에서 사용하는 가장 기본적인 printf()를 사용하고 싶은데, 이미 이 블로그의 앞 부분에서 printf()함수를 사용해도 아무것도 표시되지 않는것을 확인 하였다. 그렇다면 임베디드 환경에서는 어떻게 pri..