#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에는 아무 문제가 없는데 말이죠.
어떤 분이 남기신 글인데.
그렇군요.
2008 버전에서 오류를 찾아 내지 못하던 문제점이 있어 2009년도 부터 해결된 것이었군요.
#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년도 부터 해결된 것이었군요.
'Embedded system > AVR' 카테고리의 다른 글
소프트웨어로 AVR 메모리 초기화 하기 (0) | 2011.02.11 |
---|---|
일광절약제(Daylight Saving) (0) | 2010.09.02 |
atmega128의 컴파일러 AVR-GCC의 모든 것 (0) | 2010.03.16 |
the problem of delay (0) | 2009.11.17 |
AVR studio optimization problem (0) | 2009.11.17 |