はじめてAVRについて書くのにいきなりプログラムですいません。
開発環境などについては今後書く事にします。
今回はUSARTが搭載されているAVR(今回はATTiny2313)を利用してシリアル通信する方法を紹介します。
送受信とも割り込みを利用しているので他の作業と平行してシリアルの送受信ができます。
WinAVR(GCC)を利用したAVRの開発について詳しく説明されているAVR Wikiの情報を元に実験しました。
内蔵RC発振クロックを利用した場合、パソコンと通信速度をあわせても文字化けする場合があります。これは規定のクロック周波数からおおきく外れている場合があるからです。そのような場合はこちらのページを参考にOSCCALレジスタを用いてクロックの校正をしてください。クロックの校正にはオシロスコープあるいは周波数カウンタなどの計測機器が必要です。できればセラロックや水晶などの外部クロックを利用することをおすすめします。
ソースコード
利用方法
シリアル通信を利用するプログラムで”uart.h”及び<avr/interrupt.h>をインクルードしてください。また、F_CPUに正しく周波数が定義されている必要があります。
初期化
init_uart関数を読んでください。引数には通信速度を指定します。また、割り込みを許可しておく必要もあります。
例(19200bpsで初期化)
init_uart(19200);
sei();
送信
一文字の送信にはuart_putchar関数を、文字列の送信にはuart_putstr関数を利用します。ただ、定型文を送る場合にはpgmspace.hを利用して、Flash領域に定数を宣言しuart_putstr_p関数を利用する事をおすすめします。こうしないとSRAMを大量に消費してしまいます。
この場合<avr/pgmspace.h>もインクルードしてください。
また1バイトを16進数で送信するuart_puthex関数も用意しています。
例(一文字送信)
uart_putchar(‘a’); //aを送信
例(文字列送信)
uart_putstr(“Serial”); //「Serial」と送信
例(SRAMを節約して文字列送信)
const char str[] PROGMEM = “chibiegg”; //Flash上に定数を配置
uart_putstr_p(str); //「chibiegg」と送信
例(16進数でバイトを出力)
uart_puthex(76); //「0x4C」と出力
受信
受信するときにはまず受信されているデータの量をuart_rcv_size関数を利用して確認し、受信されているデータがあればuart_getch関数で一文字受信できます。
if(uart_rcv_size()>0){ //受信データがあれば
uart_putchar(uart_getch()); //1バイトエコーバック
}