UBRRnH and UBRRnL은 뭘까
서로 통신 하고자하는 장치끼리 데이터를 전달받고 전달할 때 서로 간에 통신속도는 같아야한다.
윈도우 BPS설정
우리는 윈도우와 ATMEGA를 이용해 통신을 한다.
윈도우에는 921600까지 bps를 지원한다.
ATMega는 2M bps를 제공한다.
115200 이 제일 빠른 bps다
왜냐하면 아트메가는 아무리 빠른 pbs를 설정해봣자 2M이고
윈도우에서 지원하는 pbs인 115200 다음에는 230400이기때문에 2M를 넘는다
그러므로 115200이 가장 근접하므로 제일 빠른 속도 일 수 밖에 없다.
ATMEGA BPS설정
데이터 시트의 p177에 비동기 통신방식에 대한 BAUD 구하는 공식이 나온다.
UBRR에 대한 통신속도를 제어하기 위해서 그 값을 알고자 한다.
해당공식을 위와 같이 보면 UBRR = (fosc/(BAUD*16)-1)인데 문제는 fosc의 값과 BAUD의 값을 어디서 가져오느냐이다. fosc는 Oscillator를 의미한다. 따라서 기본적인 ATMega의 속도는 16MHz이다.
고로 16000000의 값이 들어가게 되는 것이며 BAUD는 통신속도를 의미하는데 이는 ATMega와 Window의 각각 속도를 비교해주고 정해주면 된다.
ATMega와 윈도우의 bps를 맞추고 비교하는 방법은 시작->보조프로그램->통신->하이퍼터미널에서 비교해보면 된다.
코딩에 의해 ATMega통신을 설정해보면
UBRR0L = 0x08;
UBRR0H = 0x00;
보면 계산해서 구한 UBRR의 값은 7.680556 데이터에 들어가면서 반올림되어 8이 입력된다.
UBRR0H |
UBRR0L | ||||||||||
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
하지만 위의 소스는 bps를 바꿔줄 때 속도에 따라 값을 바꿔야해서 비효율적이다.
USART.c
위와 같이 USART.c에서 UCSR의 세팅값을 바꾸기위한 각각의 비트를 만든거라고 보면 된다.
각 레지스터들의 bit역할에 대해 알아보려면 데이터 시트에 잘 설명 되어있다.(p.193)
A, B, C중 오늘은 A, B만 알아보자.
RXC(bit7) : 데이터의 수신이 완료되면 완료되었다는 신호를 보내기 위해 1의 값을 돌려주는 비트이며 Read Only이기 때문에 프로그래머가 건들수는 없다.
TXC(bit6) : 데이터의 전송왈료를 확인하는 비트이다. 해당 값이 0으로 되어있으면 끝나지 않음을 뜻하므로 초기값을 0으로 설정.
UDRE(bit5) : 송신버퍼로써 새로운 데이터를 받을 준비가 되었는지를 확인하는 bit이다.
FE(bit4) : 에러가 발생할 때 1이된다.
DOR(bit3) : 기존 데이터가 있는 번지에 다음 데이터가 오면 계속해서 덮어쓰며 사용할 것인지에 대한 bit.
UPE(bit2) : 패리티 에러를 검출하는 bit.
U2X(Double the USART Transmission Speed bit1) : 통신속도를 2배로 설정할 것인지에 대한 사용 bit (ATMega는 실제 1Mbps까지 가능하지만 해당 bit사용 여부로 2Mbps까지 사용가능 하다.)
MPCM(Mlti-Processor Communication Mode bit0) : ATMega를 2개로 연결해서 통신장비로 설정하는지에 대해서 세팅하는 bit이다. 해당 비트를 사용하고 ATMega를 여러 개로 연결해서 사용한다면 연결된 장치수만큼 속도가 배로 빨라진다.
위의 소스와 같이 우리가 설정가능한 bit는 6번 1번 0번만 세팅이 가능하므로
UCSR0A = (0>>TXC)|(0>>U2X)|(0>>MPCM)
다음 Register B를 알아보면,
bit 7~5번 까지는 interrupt에 해당하는 bit이다. 현재는 사용하지 않으니 언급 안하겠다.
RXEN(bit4) : 데이터를 수신하기 위한 수신기를 켜는 bit이다. 당연히 사용해야하므로 1값이다.
TXEN(bit3) : 데이터를 송신하기 위한 송신기를 켜는 bit이다. 당연히 사용해야하므로 1값이다.
UCSZn2(bit2) : 해당 bit는 홀로 사용되는 것이 아니라 UCSRnC의 2bit와 함께 사용하는 bit이다. UCSRnC에 내용과 함께 관련 표가 나온다. 문자열 사이즈를 bit로 사용하려고 하기에 해당 bit는 2번 bit이므로 0의값을 넣는다.
RXB8(bit1) : 데이터를 받을 때 9번 bit의 값을 사용하기 위한 bit이다. 실제 ATMega는 8bit 밖에 사용할 수 없다. 고로 해당 bit를 사용하므로 8번 bit자리를 의미
TXB8(bit0) : RXB8과 마찬가지로 데이터를 송신할 때 사용하는 bit이다. 송신 시 8번 bit의 자리를 의미한다.
UCSR0B = (1>>RXEN)|(1>>TXEN)|(0>>UCSZ2);