9월 16일 usart복습
usart에 관한 다이어그램. 검은색 굵은 선은 bus라고 생각한다. 여기서는 굵은 선(화살)로 표시되었으나
8개의 bus선으로 이루어져 있다. 대문자 'A'를 생각해보자. 65의 아스키코드값을 갖는 'A'는 65를 2진수로
변환하여 해당숫자가 버스선을 타고 데이터가 이동된다.
저기서 주목할 부분은 UDR이다. UDR(tx), UDR(rx)는 화살표는 한 방향 밖에 없다. 말 그대로 transmit는 전송이니,
입력에 해당, receive는 수신이라 읽는(수신)밖에 되지 않으므로 화살표의 방향이 하나뿐이다.
레지스터
아래는 수신부와 송신부의 관한 레지스터이다. 저번에도 언급했지만, 레지스터는 2개이나, 같은 주소를 가진다.
보통은 송신부와 수신부의 주소가 나누어져(arm의 경우)있으나, atmega는 그렇지 않다.
a컨트롤 레지스터 부분이다.
비트 하나하나를 살표보자.
비트 7번은 수신이 완료되었을 때 이 비트에 1로 채워진다.
비트 6번은 송신이 완료되었을 때 이 비트에 1로 채워진다.
비트 5번은 data레지스터가 비워져 있을 때 1로 채워진다. 이 레지스터가 중심이 된다.
우리가 쓰는 usart는 한 번에 한 비트씩 밖에 보낼 수 없다. 그래서 데이터 1110 0101의 데이터를 보내고자 한다면,
1을 먼저 보내고 ....마지막, 0, 1을 보내게 된다. 근데 문제점이 생긴다. 앞선 데이터가 1을 보내고 다음데이터 0을 보내야 한다고 가정했을 때, 앞선 데이터 1이 하이퍼터미널과 같은 수신하는 입장에서 데이터를 들고가서 비워져야 한다.
그러나, 들고 가기도 전에 0이 들어온다면, 앞에 데이터 1은 날아가버리고 그자리에 0이라는 데이터가 덮어써버린다.
그렇기 때문에 이 5번비트에 1이 들어왔는지 확인하여 데이터를 전송하거나, 수신하게끔 만든다.
이것은 레지스터 b이다. 같은 역할을 하는 레지스터이나, 기능이 많아서 추가된 레지스터. 참고로 control register는
3개가 존재한다.
앞서서 언급했듯이 비트3은 데이터를 덮었을때, 1이 되는 비트
비트 2는 패리티비트 이것은 패리티 비트에 이상이 생겼을 때 1이 되는 비트이므로 이것은 아래 레지스터설정 부분과도
연관이 있다. 짝수, 홀수, 사용하지 않음으로 보통 나뉜다.
10001110이라는 비트가 존재한다고 가정. 짝수 패리티로 설정했다면, 이것은 1이 짝수개인지 검사하여 틀리면, 나머지 9번째 비트에 0또는 1을 넣는다. 지금 10001110은 짝수개이므로 , 9번째 비트는 0이 된다. 홀수개이면, 9번째 비트에 1을 넣어 전송한다. 즉, 패리티 비트를 사용하게 된면, 실제로 8비트가 아니라 9비트가 전송하게 되는 셈이다.
b컨트롤 레지스터
비트 7은 수신 완료인터럽트이다. 수신이 완료되면, 1이 된다.
비트 6은 송신 완료인터럽트이다. 송신이 완료되면, 1이 된다.
5번비트는 데이터 레지스터 인터럽트이다.
이것은 비동기로 쓸건지 동기로 쓸건지 usart모드를 설정하는 부분. 우리는 비동기 usart를 사용할 예정.
따라서 해당비트에 0을 넣는다.
위 그림은 짝수 패리티로 할 것인지, 홀수 패리티로 설정할 것인지 설정하는 부분. 필자는 짝수 패리티를 위하여
UPM01=1, UPM00=0으로 설정함.
이 비트는 문자비트 크기를 의미한다. 8bit로 설정하기 위해 위 그림과 같이 각각 UCSZ02=0, UCSZ01=1, UCSZ00=1로 설정.