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 © 瓶詰堂 all rights reserved.