시리얼 통신
마이크로컨트롤러는 비트 단위의 데이터를 핀 단위로 전송한다.
출처 : Atmega128로 배우는 마이크로컨트롤러 프로그래밍
병렬과 직렬이 있는데 이번에 다룰 UART 통신은 시리얼/직렬 통신의 한 종류이다.
UART 통신
출처 : Atmega128로 배우는 마이크로컨트롤러 프로그래밍
UART통신은 비동기식 통신이다.
즉 별도의 클록을 사용하지 않고 약속된 속도로 송수신을 진행해야 한다.
통신 단위로는 보율을 사용한다.
출처 : Atmega128로 배우는 마이크로컨트롤러 프로그래밍
보율은 변조 속도, 즉 위에서는 총 4번 변화가 있었기에 보율이 4이다.
bps의 경우 2비트씩 4번이기에 8이다.
출처 : Atmega128로 배우는 마이크로컨트롤러 프로그래밍
아무 통신이 없을 때 기본적으로 항상 1을 가지는데,
0비트가 되면 시작을 의미하고 그 후로 8비트는 데이터 비트, 1비트는 정지 비트를 의미한다.
그래서 총 10비트 데이터를 전송하는 것이 일반적이다.
출처 : Atmega128로 배우는 마이크로컨트롤러 프로그래밍
UART는 전이중 통신으로 송, 수신을 동시에 진행할 수 있다.
이를 위해 2개의 범용 입출력 핀을 필요로 한다.
기본적으로 송,수신을 위해서 RX와 TX를 교차하여 연결해야 한다.
하드웨어로 지원되는 2개의 UART 통신에는
PE0,PE1과 PD2,PD3가 있다.
출처 : Atmega128로 배우는 마이크로컨트롤러 프로그래밍
컴퓨터와 ATmega128의 연결을 위해서는 중간에서 변환하는 장치가 위와 같이 필요하다.
출처 : Atmega128로 배우는 마이크로컨트롤러 프로그래밍
기본적으로 이전에 배웠던 업로더를 위한 USB와 방금 배운 시리얼 연결을 위한 USB를
포함해 총 2개의 USB연결이 필요하다.
UART 레지스터
- UCSRnA : UART 시리얼 통신의 상태를 확인하고 제어하기 위한 레지스터이다.
출처 : Atmega128로 배우는 마이크로컨트롤러 프로그래밍
2배속 모드를 위해서는 1번 비트인 U2Xn비트를 1로 설정해 주면 된다.
RXCn과 UDREn은 각각 수신과 송신을 확인할 수 있다.
출처 : Atmega128로 배우는 마이크로컨트롤러 프로그래밍
2. UCSRnB : 데이터 송수신을 가능하도록 설정, 기본값은 송수신 금지 상태
출처 : Atmega128로 배우는 마이크로컨트롤러 프로그래밍
RXEN1과 TXENn은 4번과 3번 비트를 의미한다.
이 값이 1이면 송신 혹은 수신이 가능하다는 것을 알 수 있다.
출처 : Atmega128로 배우는 마이크로컨트롤러 프로그래밍
UCSRnB의 레지스터 중 위와 같이 8비트로 구성되어있다.
3. USCSRnC : UART에서 사용하는 데이터 형식 및 통신 방법 결정
출처 : Atmega128로 배우는 마이크로컨트롤러 프로그래밍
6번째 비트인 UMSELn은 통신 모드를 결정하고,
4,5번째 비트는 패리티 비트를 결정하며,
USBSn은 정지 비트를 결정한다.
출처 : Atmega128로 배우는 마이크로컨트롤러 프로그래밍
UCSZn은 데이터 비트의 수를 결정할 때 사용한다.
출처 : Atmega128로 배우는 마이크로컨트롤러 프로그래밍
예시로 위와 같이 UCSR1B와 UCSR1C의 비트의 값에 따라
송, 수신, 비동기, 패리티, 정지 비트, 데이터 비트 등의 값이 결정되는 것을 볼 수 있다.
4. UBRRn : 12비트로 통신 속도인 보율을 결정한다.
(UBRRn = UBRRnH + UBRRnL)
출처 : Atmega128로 배우는 마이크로컨트롤러 프로그래밍
UBRRnH는 4비트, UBRRnL은 8비트이다. 전자의 경우 상위 4비트는 사용하지 않는다.
출처 : Atmega128로 배우는 마이크로컨트롤러 프로그래밍
동기와 비동기, 배속에 따라 보율을 계산하는 식이 달라진다.
ATmega128은 16MHz를 사용하기에 분자의 값은 16이다.
이를 통해 계산한 지표는 오른쪽의 표와 같다.
예시로 비동기 2배속 ATmega128에서 9600보율을 설정하기 위한 UBRRN 값은 207이다.
실제 계산값과 사용값에 차이가 있어 약간의 오차가 발생할 수 있다.
5. UDRn : 송수신 데이터 저장
출처 : Atmega128로 배우는 마이크로컨트롤러 프로그래밍
TXB와 RXB가 있는데, 각각 데이터 전송과 수신을 위한 버퍼이다.
이는 동일한 입출력 주소를 사용하기에 UDRn 레지스터에 같이 묶여있다.
예제
출처 : Atmega128로 배우는 마이크로컨트롤러 프로그래밍
init으로 설정을 해주고 main에서는 tansmit을 통해 데이터를 송신해 전송한다.
출처 : Atmega128로 배우는 마이크로컨트롤러 프로그래밍
문자열 출력을 위해서는 위 함수와 같이 바이트 단위로 여러 번 진행해야 한다.
UP, DOWN의 입력을 받아 숫자를 증가, 감소하는 역할을 하는 코드이다.
이는 strcmp를 통해 문자열 비교를 해 UP인지 DOWN인지 확인할 수 있다.
또한 \R을 추가로 전달해 문자열의 끝을 알 수 있게 했다.
'대학교' 카테고리의 다른 글
한국 근현대사 - (4) 대한제국 (2) | 2023.10.11 |
---|---|
한국 근현대사 - (3) 조선 - 2 (1) | 2023.10.11 |
마이크로프로세서 - (5) 데이터 입력 (2) | 2023.10.07 |
파이썬 - (3) 객체와 메서드 (1) | 2023.10.07 |
자바 - (5) 참조 타입 (1) | 2023.10.06 |