シリアル通信をしよう(USART)

今回は USART 関係をやっていきます。

実行プログラムを作る

・以下のファイルをダウンロードして解凍する

追加ファイル

・前回のプロジェクトに解凍してできた6つのファイルをコピー
 (main.c で上書き確認のダイアログが出ますが上書きしてください)
・Solution Explorer の 328base を右クリック-[Add]-[Existing Item..] を選択
・Add Existing Item ダイアログで main.c 以外の追加したファイルを選択して [Add] ボタン
・[Rebuild 328base] でリビルド実行

以上で実行プログラムはできました。

PC とマイコン基板とデバッガを接続する

前回はシミュレーターで実行しましたが、今回はマイコン基板に Atmel-ICE を使用してプログラムを書き込んで実行します。
Atmel-ICE は秋月さんでも 1 万円ちょっととお高いですが、SAM にも対応しますし何よりデバッグ実行ができるのが良いです。
SAM には興味無い&デバッグは気合いで乗り切るという方は AVRDUDE FT232 Bitbang で検索すると良いです。

本当は BASIC のつかないフルセットの Atmel-ICE の方が 1.27mm ピッチに変換できる基板も付属するので良いのですが、それだけの為に 7 千円前後高くなってしまうのでお勧めしにくいです。 (しかも変換基板がごつくて使いにくそうなので、この辺は前の JTAGICE3 の方が良かった)
RS オンラインさんでたまにセールしているときがあるので(私の時は1万円ちょっとで買えました)それまでは Bitbang で乗り切るのも良いかもしれません。

・Atmel-ICE の AVR と書かれたコネクタにフラットケーブルを接続

・もう一方の 6 pin を ICSP コネクタに凸を内側にして接続

・Atmel-ICE とマイコン基板に USB ケーブルを接続
・Atmel-ICE の USB ケーブルを PC に接続
 (初回はデバイスドライバーのインストールが始まりますので終了まで待ちます)
・マイコン基板の USB ケーブルを PC に接続
 (こちらも初回はデバイスドライバーのインストールが始まりますので同様に待ちます)
・[Simulator] をクリックして [Selected debugger/programmer] 内の [Simulator] を [Atmel-ICE・XXXXXX] に変更(XXXXXX は Atmel-ICE のシリアル番号)

・[Interface] は [debugWIRE] を選択

接続確認とヒューズの設定

書き込んで実行だといきたいところですが、その前に接続確認と 328P のヒューズ設定をしましょう。

・[Tools]-[Device Programming] を選択
・Device Programming ダイアログが表示されるので [Tool]、[Device]、[Interface] が下画像の様に設定されていることを確認してから [Apply] ボタンを押す

・下画像の様にダイアログの表示が変化するので [Device signature] の [Read] ボタンを押す

・接続が正常ならば [Device signeture] と [Target Voltage] に値が入力される(エラーダイアログが出るようならコネクターの向きなど接続の確認をして下さい)

・[Fuses] を選択
・元に戻す時の為に [EXTENDED]、[HIGH]、[LOW] の設定値を記録
 ([Auto read] にチェックが入ってい無い場合には [Raad] ボタン押してから)
・記録したら以下の様に設定して [Program] ボタンを押して設定を書き込む

EXTENDED 0xFF
HIGH 0xD0
LOW 0xDF

これで接続確認とヒューズ設定は終わりました。
[Close] ボタンを押して Device Programming ダイアログを閉じます。

※ヒューズ設定の細かい話は重要な内容ですが長くなるし、上記設定でずっと進めるつもりなので今回はしません。(そのうち纏めるつもりです)

シリアル通信プログラム(Tera Term)の設定

PC 側のシリアル通信プログラムには有名処の Tera Termを使用しました。

・デバイスマネージャーを起動して [ポート(COM と LPT)] を開く
・マイコン基板を接続した COM ポートを確認します。(複数あって特定できなかったらデバイスマネージャーを開いたままマイコンに接続した USB コネクタを抜いてみて表示が消えた COM ポートがそれです)

・Tera Term を実行
・接続先の設定ダイアログが表示されるので Serial を選択して [Port] にデバイスマネージャーで確認した COM ポートを選択して [OK] ボタンを押す

・[Setup]-[Terminal] を選択して設定ダイアログを表示させて下図の様に設定して [OK] ボタンを押す

[New-line] の箇所以外は取り敢えずどうでも良いのですが、自分でプログラム改造したりして日本語文字列などの多バイト文字コードを使用する方は [Kanji(receive/transmit)] の方も目当ての文字コードにしておきましょう。
次は通信速度を設定します。

・[Setup]-[Serial port…] を選択して設定ダイアログを表示
・下図の様に Baud rate を 38400 にして [OK] ボタンを押す

やっと前準備が終わりました。

デバッグ実行する

Atmel Studio に戻って実行してみましょう。

実行は前回の様に緑色の右三角をクリックでも良いですし、[F5] キーでも実行されます。(最近のキーボードは特にノートパソコンで音量調整などの機能キーに割り当てられてしまっていてファンクションキーとして機能させるには [Fn] キーを押しながらとか面倒になってきました)

初回起動時には 328P のヒューズ設定が debugWIRE でデバッグ実行する様になって無いので以下のダイアログが表示されます。

[Yes] ボタン [OK] ボタンの順に押すと debugWIRE 設定されてプログラムが書き込まれた後に実行されます。
Tera Term 画面には下図の様に表示されるはずです。

これで 328P から PC への送信は確認できました。

次に Tera Term 上で 123 と入力してみましょう。
エコーバックされて下図の様になれば PC から 328P への送信も確認できたことになります。

プログラム本体の解説

さて本筋のプログラムの main.c を見ていきましょう。

01: /***************************************************************
02:  * Part     : 328 BASE
03:  * Author   : 2018/02/04    nauzou
04:  * Update   : 2019/01/14    nauzou
05:  *              USART 通信関係を追加
06:  */
07: 
08: #include "std.h"
09: #include "usart.h"
10: 
11: /********************************************************************
12:         ローカル変数
13: ********************************************************************/
14: const PROGMEM char  hello_str[]  = "Hello world !!\n";
15: 
16: /********************************************************************
17:         上位関数
18: ********************************************************************/
19: /*---------------------------------------------------------
20:  * Function :
21:  *   メインループ。
22:  */
23: int
24: main()
25: {
26:     char    c;
27:     
28:     init_usart();
29:     
30:     irq_enable( IRQ_ENABLE );
31:     
32:     usart_puts_p( hello_str );
33:     
34:     while( 1 ) {
35:         c = usart_getc();
36:         usart_putc( c );
37:     }
38: }

[8 行目]
本 HP で C 言語プログラムでよく使うものを定義した std.h をインクルードしています。
(現在は uint とかの符号無し整数型の省略形や割り込み制御関数のみですが、そのうち増えます)

[9 行目]
USART 通信ドライバーの定義が記述された usart.h をインクルードしています。
今回は細かく説明しませんが usart.h の各種設定で色々変えられます。(とりあえずデフォルトで良いです)

[28 行目]
USART ドライバーの初期化をします。

[30 行目]
割り込みを有効にします。(本 USART ドライバーは割り込みを使用していますのでこの行が無いと何も通信しなくなります)

[32 行目]
“Hello world !!” の文字列を送信します。
送信する文字列を宣言している 14 行目を見て下さい。
Windows プログラム等では見慣れ無いキーワード PROGMEM があります。
これは文字列を SRAM ではなくプログラム用フラッシュメモリ(Prog FLASH)上に置くためのキーワードです。
328P の SRAM はシリーズ最大の 2 Kbyte ですが、十分に大きいとは言い難いサイズですので書き換える必要の無い文字列はこの様に宣言をした方が良いです。

usart_purs_p() は Prog FLASH 上に宣言された文字列を送信する為のもので、SRAM 上の文字列の場合は usart_puts() を使用します。
同様に usart_vprintf() と usart_printf() にも Prog FLASH 用の _p() の関数が用意されていますので適宜使い分けて下さい。

ちなみに今回は説明用に文字列を別に宣言しましたが、普段は以下の様に書いた方が良いです。

usart_puts_p( PSTR("Hello world !!\n") );

[34 ~ 37 行目]
PC から送られた文字をそのまま PC へ送り返しています。(エコーバック)

usart.c、fifo.c 等の説明も書こうかと思っていたのですが前準備が長すぎて力尽きたので今回はご勘弁。
ソースにそこそこ分かり易くコメントを記入しておいたのでそれを参考に読んでみて下さい。
usart.c の割り込みの部分がちょっと大変かもですが、それ以外は変に凝った技法で書いていないはずですので読めるかと思います。

debugWIRE のヒューズ設定を戻す(必要な時だけ)

もう一つ重要な事として debugWIRE のヒューズ設定を無効に戻す必要があります。
debugWIRE が有効にされたままでは Device Programming ダイアログで何も設定できません。

無効にするにはデバッグ実行中のまま [Debug]-[Disable debugWIRE and Close] を選択すると debugWIRE が無効になりデバッグ実行も終了されます。

通常は debugWIRE を無効にする必要はありません。
ヒューズ設定を変更したいとかプログラムを書き換える必要がなくなった時などにやりましょう。

やっと終わり

これで USART 通信によってマイコンから PC へデータを送ることや、PC からマイコン基板へ指令を送ることも出来る様になりました。
取り敢えずプロジェクトフォルダーもサンプルとして置いておきます。

サンプル

次回はこれを踏まえて L チカをやってみます。