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.