#include "stdio.h" static int uart_putchar(char c, FILE *stream); static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE); static int uart_putchar(char c, FILE *stream) { if (c == '\n') uart_putchar('\r', stream); loop_until_bit_is_set(UCSRA, UDRE); UDR = c; return 0; } int main(void) { init_uart(); stdout = &mystdout; printf("Hello, world!\n"); return 0; }winavr의 설명에 의하면 위의 예제가 printf를 사용하기 위한 초기화라고 나와있다.
(일단 설명서는 잘 읽어야 제맛)
위의 예제는 범용적인 것이고,
실제로 적용하기 위해서는 두부분을 수정해야 한다.
loop_until_bit_is_set(UCSRA, UDRE); UDR = c; |
초기화해준 포트에 따라서
UART0를 했다면 UCSR0A / UDR0
UART1을 했다면 UCSR1A / UDR1
로 수정을 해주면된다.
UDRE는 선언상, 비트플래그의 순서로 배열되어 있으므로
굳이 UDRE0 / UDRE1 로 수정해주지 않아도 이상은 없었다.
참고로 stdio.h를 포함하면 3KB 정도 크기가 증가한다(ELF 기준)
"사본"은 아래 소스에서 printf 관련을 전부 삭제한것이다.
"사본"은 아래 소스에서 printf 관련을 전부 삭제한것이다.
atmega128 에서 uart0 를 115200-N-8-1로 16MHz 클럭에서 초기화한 뒤 printf() 하는 예제
'embeded > AVR (ATmega,ATtiny)' 카테고리의 다른 글
타이머 하나당 서보 제어 가능 갯수 8개 (2) | 2010.01.04 |
---|---|
AVR에 스위치를 달자 (0) | 2009.10.28 |
7 segment font (4) | 2009.10.16 |
winAVR 판올림 이후 AVR Studio 에서 컴파일러를 못 찾는 경우 (0) | 2009.10.09 |
winAVR outp/inp 매크로 (0) | 2009.10.09 |