AVR::シリアルポート

UARTでPCと通信.

動作未確認.

#include <avr/io.h>
#include <avr/interrupt.h>

#define CLOCK 8000000 // マイコンのクロック
#define BAUD 9600 // 通信速度

// 受信バッファ
volatile uint8_t data[8];
volatile int data_pos = 0;
volatile int data_posr = 0;

// 受信は割り込みで処理
SIGNAL(SIG_USART_RECV) {
    if(bit_is_clear(UCSR0A,FE0)){// エラーが無し
        data[data_pos++] = UDR0;
        data_pos%=8;
    }
}

// w : 約1ms単位
void wait(uint16_t w){
    while(w--){
        volatile uint16_t i=200;
        while(i--);
    }
}

// 1バイト送信 (送信までブロッキング)
void send_byte(char a)
{
    while (bit_is_clear(UCSR0A,UDRE0)); // 送信可能になるまでまつ
    UDR0 = a;
}

// 1バイト受信 (完了までブロッキング)
char recv_byte()
{
    while (data_posr == data_pos);
    char d = data[data_posr++];
    data_pos%=8;
    return d;
}


//
int main()
{
    // UART初期化 (送受信有効,割り込みON)
    UCSR0B = _BV(TXEN0) | _BV(RXEN0) | _BV(RXCIE0);
    UBRR0H = (CLOCK/16/BAUD-1)>>8;
    UBRR0L = (CLOCK/16/BAUD-1); // ボーレート

    sei();//割り込み許可
    send_byte('H');
    send_byte('e');
    send_byte('l');
    send_byte('l');
    send_byte('o');
    send_byte('\r');
    send_byte('\n');
    for(;;) {
        send_byte(recv_byte()); // echo
    }
}

stdioを使う

#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>

#define CLOCK 8000000 // マイコンのクロック
#define BAUD 9600 // 通信速度

// 受信バッファ
volatile uint8_t data[8];
volatile int data_pos = 0;
volatile int data_posr = 0;

// 受信は割り込みで処理
SIGNAL(SIG_USART_RECV) {
    if(bit_is_clear(UCSR0A,FE0)){// エラーが無し
        data[data_pos++] = UDR0;
        data_pos%=8;
    }
}

// 1バイト送信 (送信までブロッキング)
static int uart_putchar(char c, FILE *stream)
{
    while (bit_is_clear(UCSR0A,UDRE0)); // 送信可能になるまでまつ
    UDR0 = c;
    return 0;
}

// 1バイト受信
static int uart_getchar(FILE *stream)
{
    while (data_posr == data_pos);
    char d = data[data_posr++];
    data_pos%=8;
    return d;
}

static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, uart_getchar,
                                             _FDEV_SETUP_WRITE);

// w : 約1ms単位
void wait(uint16_t w){
    while(w--){
        volatile uint16_t i=200;
        while(i--);
    }
}


//
int main()
{
    // UART初期化 (送受信有効,割り込みON)
    UCSR0B = _BV(TXEN0) | _BV(RXEN0) | _BV(RXCIE0);
    UBRR0H = (CLOCK/16/BAUD-1)>>8;
    UBRR0L = (CLOCK/16/BAUD-1); // ボーレート

    stdin = stdout = &mystdout;
    sei();//割り込み許可

    printf("Hello, world!\r\n");


    for(;;) {
        fputc(fgetc(stdin),stdout); // echo
    }
}
Copyright © binzume all rights reserved.