본문 바로가기

Embedded system/AVR

winavr 버전에 따른 문제점 20081205 vs 20090313

#define CPU_CLOCK        14745600

#define BAUD_RATE        9600
#define BAUD_RATE_L        (CPU_CLOCK / (16l * BAUD_RATE)) - 1
#define BAUD_RATE_H        ((CPU_CLOCK / (16l * BAUD_RATE)) - 1) >> 8

void uart_init(void)
{
    // baud rate 설정
    UBRR1H = (unsigned char)BAUD_RATE_H;
    UBRR1L = (unsigned char)BAUD_RATE_L;
    // no parity, 1 stop bit, 8bit 설정
    UCSR1C = (0 << UPM1) | (0 << UPM0) | (0 << USBS) | (1 << UCSZ1) | (1 << UCSZ0);
    // rx/tx interrupt 설정, 8bit 설정
    UCSR1B = (1 << TXEN) | (1 << RXEN) | (0 << UCSZ2);
}

위와 같은 구문을 썼을 때 UBRR1H에서 20090313 버전에서는 오퍼플로우 에러가 나서 자료가 다 깨지기에
    UBRR1H = 0;
    UBRR1L = 95;
로 변경을 해주어야만 했습니다.

20081205에는 아무 문제가 없는데 말이죠.

//통신속도의 결과 값을 입력하기 위해   상하위 비트로 구분
//161은 16+L이며, 연산 시  값이  너무 커져 overflow가 발생하므로
//32비트 연산을  위해 16에 Long을 의미하는 l을 붙인다.

어떤 분이 남기신 글인데.
그렇군요.
2008 버전에서 오류를 찾아 내지 못하던 문제점이 있어 2009년도 부터 해결된 것이었군요.