출처 : http://eroom.korea.com/post/board.aspx?bid=bun_273698&mode=read&view=board&pid=504409&cate=1540717&page=1

 

AVR-GCC 에 내장된 함수들을 이용하여 시리얼 통신을 하는 프로그램을 작성합니다.


이번 강좌에서는 내장함수 putchar(), puts(), printf() 를 사용하겠습니다.

위의 함수들은 표준 (ANSI) C 에서는 표준출력장치(모니터) 로 문자와 문자열을 출력하는 함수입니다.

AVR-GCC 에서는 이 함수들을 시리얼 통신으로 문자와 문자열을 출력하는 함수로 사용하기 위하여 터미널 출럭 드라이버를 설정하여야 합니다.

아래의 프로그램에서 int uart_putchar(char c) 함수가 이 역할을 합니다.


main() 함수의 fdevopen(uart_putchar, 0, 0) 는 stdio.h 파일에서 다음과 같이 선언되어 있습니다.

extern FILE *fdevopen(int (*__put)(char), int (*__get)(void), int __opts);


fdevopen() 함수는 내장함수(putchar(), puts(), 등등) 와 출력 드라이버 함수 (uart_putchar()) 를 연결시켜 줍니다.


// I/O register definitions for ATmega8515
#include <avr/io.h>
#include <stdio.h>

int uart_putchar(char c)
{

    if (c == "\n")
        uart_putchar("\r");
    loop_until_bit_is_set(UCSRA, UDRE);
    UDR = c;
    return 0;
}

int main(void)
{       
    FILE *fp;

    fp = fdevopen(uart_putchar, 0, 0);

    outp(0x18,UCSRB);
    outp(5,UBRRL);        // X-Tal=11.0592MHz BAUD=115200

    printf("Hello ");
    putchar(" ");
    puts("World !!!\n\r");

    fclose(fp);
    while(1);
}

Posted by 노을지기