[AVR] UART(1)

sparkle1299·2022년 2월 4일
0

AVR

목록 보기
1/2
post-thumbnail

(1) UART(Universal Asynchronous Receiver/Transmitter

(Initialize)

UART란 해석 그대로 범용 비동기 송수신기를 말한다.

(I2C)
예전 사용했던 I2C는 동기 통신(클럭 사용)으로 전송 속도를 맞출 필요가 없었다. UART는 비동기 통신이기 때문에 디바이스간 데이터 전송 속도를 맞춰야한다. 비동기는 별도의 클럭신호가 없기 때문에 start bit와 stop bit를 통해 데이터 동기화가 이루어진다. 서로의 통신 속도를 맞춰줄 Baudrate를 정해놓고 통신을 한다. Baudrate를 정해놓지 않으면 111을 보낸건지 1을 보낸건지 모를 것이다.
(동기/비동기에 관해 설명을 잘해놓은 곳이 있어 첨부 : https://gdnn.tistory.com/65)
I2C는 SCL, SDA 두 선을 가지고 여러 개의 슬레이브 장치와 통신을 했다. UART는 Tx와 Rx만 사용한다. 만약 라즈베리파이와 연결한다고 하면, 칩의 Tx 선과 파이의 Rx선을 연결하고 칩의 Rx는 파이의 Tx 선과 연결하면 된다.

현재 사용하고 있는 ATmega 종류는 ATmega32a로 datasheet(p.147)를 보면 USART로 되어있는 것을 확인 할 수 있다.

밑의 그림은 datasheet(p.148)에 나오는 USART관련 Block Diagram인데 Clock 생성 부분, Tx 부분, Rx부분 그리고 나머지 레지스터들 UCSRA, UCSRB, UCSRC로 나눠져 있다.

<동작모드>

USART는 S(Synchronous)가 추가된 것으로 동기식을 추가로 지원하는 것을 말한다. 동기/비동기의 차이는 디바이스간에 클럭을 공유하느냐인데 USART는 동기/비동기를 모두 지원한다. 자세한 내용은 datasheet(p.149)의 'AVR USART vs AVR UART - Compatibility' 부분에 나온다.
datasheet(p.151)의 표를보면 동작 모드 3가지를 확인할 수 있다.

순서대로 비동기일반모드(U2X=0), 비동기 2배속모드(U2X=1), 동기 마스터 모드가 있다. 3가지 중 동작모드를 결정하여 동작 속도를 설정하도록 한다.

<동작속도>

위의 표에서 보이는 것과 같이 baudrate(bits per seconds)는 fosc값과 UBRR값에 영향을 받는 걸 확인 할 수 있다. 주파수는 수정이 가능하다. Atmel Studio에 다운로더를 연결하고 Tools-Device programming을 접속한다.
Fuses에서 SUT_CKSEL을 찾는다. SUT_CKSEL은 사용클럭이 내부인지, 외부인지 주파수를 어떻게 할 것인지 설정 가능하다. 뒤에 0ms, 4ms, 64ms는 리셋되는 시간으로 느릴수록 시스템에 안정적이다.

다음은 나의 설정상태로 8MHz, 64ms로 설정되어있다. 따라서 다시 datasheet(p.174)로 가서 Baudrate와 UBRR을 확인한다.

fosc는 8MHz, 모드는 비동기일반모드였다. baudrate 9600과 UBRR 51을 확인한다.(내가 사용하는 칩은 불안정한건지 52로 설정했다.fosc가 정확하게 8MHz가 아닌 7.9xx이기 때문에51 근처 값들을 넣어보며 찾았음)

Q. Baudrate 9600은 어떻게 정해진것인지? 다른 값도 가능하다. 앞에 말했듯이 fosc가 정확하지 않아 UBRR 값을 찾을때 편하게 찾기 위해 9600을 사용하였다.

< C code Example>

datasheet(p.154~) 19.5 USART Initialization 부분에 C code 예제들이 많이 있다. 예시로 몇개 가져왔다.

다음 포스팅에서는 위의 코드에 나온 Register들에 대해 분석해보려고 한다.

참고 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=nkkh159&logNo=220815549072

profile
이제 막 프로그래밍 공부를 시작한 대학생입니다.

0개의 댓글

관련 채용 정보