かなり昔に買うだけ買って放置していたストロベリーリナックスのAT90USBボードを使ってみました。
開発ソフトは以下をインストールしました。
- AVR Studioのページ
- WinAVRのページ
- FLIPのページ
以下のページを参考にしました。ありがとうございます。
ストロベリーリナックスさんのチュートリアル
製品ページ (組み立て済) キットと組み立て済の2種類の製品があります。
ジャンク宿さんの記事
AT90USB162マイコンボード開発メモ【1】
AT90USB162マイコンボード開発メモ【2】
AT90USB162マイコンボード開発メモ【3】
AT90USB162マイコンボード開発メモ【4】
AT90USB再び
SPI通信
すんさんの記事
Atmel USBマウスデモ
Atmel USB CDCデモ
Atmel
AT90USB162のページ
AVR USB Series2 Software Packages USB関連のデモがダウンロードできるページ
STK526ボードのページ デモはSTK526を前提にしている。
先人の偉業が色々あるので特に書くこともないのですが、とりあえず自分がやったことを記録に残しておきます。やったことはUSBシリアルのデモを動かしました。
(1) Atmelのページ(AVR USB Series2 Software Packages)からAVR272 USB CDC Demonstration(AVR272_USB_CDC_Virtual_Com_Port.zip)をダウンロードしました。
(2) AVR272_USB_CDC_Virtual_Com_Port.zipファイルを解凍すると、3つのzipファイルがあります。AT90USB162はシリーズ2(型番の末尾が2)なので、STK526-series2-cdc-2_0_3-doc.zipを適当な場所に解凍します。私はd:\work\avr\stk526-series2-cdc-2_0_3-docに解凍しました。
zipファイルの構造は次のようになっています。
(3) AVR StudioからSTK526-series2-cdc.apsというプロジェクトを開きます。このプロジェクトファイルはdemo\STK526-series2-cdc\gccにあります。
(4) すんさんのページにあるようにCPUの周波数の設定を8MHzから16MHzに変更します。具体的にはdemo\STK526-series2-cdc\confにあるconfig.hの
//! CPU core frequency in kHz
#define FOSC 8000
を
//! CPU core frequency in kHz
#define FOSC 16000
に書き換えます。
(5) buildします(私はいつもF7を押してます)。すると、エラーが出ています。
../main.c: In function 'main':
../main.c:107: error: expected expression before 'do'
../main.c: In function '__low_level_init':
../main.c:126: error: expected expression before 'do'
main.cを見てみると107行も126行もClear_prescaler();でした。探してみるとClear_prescaler()はpower_drv.hで定義されているマクロです。power_drv.hはlib_mcu\powerにあります。マクロの定義は次のようになっています。
というわけで、以下のように括弧を取り除いてエラーを修正します。
これで無事build完了です。私の環境(WinAVR-20100110)だと以下のようなサイズになりました。
Program: 5018 bytes (30.6% Full)
(.text + .data + .bootloader)
Data: 172 bytes (33.6% Full)
(.data + .bss + .noinit)
Build succeeded with 0 Warnings...
(6) Flipを使って、hexファイルを書き込みます。STK526-series2-cdc.hexはdemo\STK526-series2-cdcの下にできます(STK526-series2-cdc.apsと同じフォルダ)。Flipの使い方はストロベリーリナックスのチュートリアルに写真入りで解説されています(サンプルプログラムの書き込み)。
書き込みモードにするときは、リセットのジャンパをつける → ブートのジャンパをつける → リセットのジャンパをはずす → ブートのジャンパをはずす、という順番にします。
書き込みに成功して実行を開始すると、新しいデバイス(AT90USBxxx CDC USB to UART MGM)を認識してドライバをインストールします。ドライバはdemo\STK526-series2-cdcの下のat90usbxxx_cdc.infです。
(7) TeraTermで38400bpsに設定して通信した様子です(PB0とGNDをショートしたときのメッセージ)。
このデモ自体の機能は、以下の3つです。
- USB-UARTから受信した文字をUARTへエコーバックする。その際にPD5に接続されたLED3を反転する。
- ???なトリガーでPD5に接続されたLED2が反転する。cdc_task.cではusb_request_break_generationがTRUEのときに反転することになっています。
- STK526のジョイスティックを倒すと方向に応じたメッセージを出力する。実際は5個のボタンになっていて、上 PB5、下 PB7、左 PB4、右 PB6、push PB0に割りあたっています。STK526のHardware User Guideを見ると、このジョイスティックは押すとpull-downされるが、そうでないときはHi-Zであると書かれていて、AVRの内蔵pull-upを有効にしておく必要があるそうです。
STK526のLEDやジョイスティック関連の定義はstk_526.hの中でマクロとして定義されています。stk_526.h自体はlib_board\stk_526にあります。
ボタンに反応したりといったデモの機能自体はcdc_task.cの中のcdc_task()の中に定義されています。main()は初期化した後、scheduler()という関数を呼び出すだけです。conf_scheduler.hでschedulerが呼び出すタスクを定義していて、task2がcdc_taskということのようです。cdc関連のプログラムを開発するには、このデモを改造するのがよさそうな気がします。
一応、AVR USB Series2 software library templateというseries2-usb_software_library_template-2_0_0-doc.zipファイルもダウンロードできるようです。
試しにcdc_task()の中のUARTに出力しているところ
uart_putchar(uart_usb_getchar()); // loop back USB to USART
を、次のように書き換えてみると、USB-UARTにエコーバックするようになりました。
putchar(uart_usb_getchar()); // loop back USB to USART
というわけで、やってみたことは以上です。
schedule()は、taskを順に呼び出しているだけで、タイマー割り込みとかで時分割処理をしているわけではないので、cdc_task()の中ではあまり長い処理はしない方がよさそうです。結構、使い方は面倒そうな気もします。もっと手軽に使えればいいのにとか勝手なことを思いました。
開発ソフトは以下をインストールしました。
- AVR Studioのページ
- WinAVRのページ
- FLIPのページ
以下のページを参考にしました。ありがとうございます。
ストロベリーリナックスさんのチュートリアル
製品ページ (組み立て済) キットと組み立て済の2種類の製品があります。
ジャンク宿さんの記事
AT90USB162マイコンボード開発メモ【1】
AT90USB162マイコンボード開発メモ【2】
AT90USB162マイコンボード開発メモ【3】
AT90USB162マイコンボード開発メモ【4】
AT90USB再び
SPI通信
すんさんの記事
Atmel USBマウスデモ
Atmel USB CDCデモ
Atmel
AT90USB162のページ
AVR USB Series2 Software Packages USB関連のデモがダウンロードできるページ
STK526ボードのページ デモはSTK526を前提にしている。
先人の偉業が色々あるので特に書くこともないのですが、とりあえず自分がやったことを記録に残しておきます。やったことはUSBシリアルのデモを動かしました。
(1) Atmelのページ(AVR USB Series2 Software Packages)からAVR272 USB CDC Demonstration(AVR272_USB_CDC_Virtual_Com_Port.zip)をダウンロードしました。
(2) AVR272_USB_CDC_Virtual_Com_Port.zipファイルを解凍すると、3つのzipファイルがあります。AT90USB162はシリーズ2(型番の末尾が2)なので、STK526-series2-cdc-2_0_3-doc.zipを適当な場所に解凍します。私はd:\work\avr\stk526-series2-cdc-2_0_3-docに解凍しました。
zipファイルの構造は次のようになっています。
STK526-series2-cdc-2_0_3-doc
demo
STK526-series2-cdc ← at90usbxxx_cdc.inf、cdc_task.cはここにあります。
conf ← config.hはここにあります。
doc
fig
gcc ← STK526-series2-cdc.apsはここにあります。hexファイルはここにできます。
iar
Debug
Exe
doc
html
lib_board
stk_526 ← stk_526.hはここにあります。
lib_mcu
flash
pll
power ← power_drv.hはここにあります。
uart
usb
util
wdt
modules
scheduler
usb
device_chap9
(3) AVR StudioからSTK526-series2-cdc.apsというプロジェクトを開きます。このプロジェクトファイルはdemo\STK526-series2-cdc\gccにあります。
(4) すんさんのページにあるようにCPUの周波数の設定を8MHzから16MHzに変更します。具体的にはdemo\STK526-series2-cdc\confにあるconfig.hの
//! CPU core frequency in kHz
#define FOSC 8000
を
//! CPU core frequency in kHz
#define FOSC 16000
に書き換えます。
(5) buildします(私はいつもF7を押してます)。すると、エラーが出ています。
../main.c: In function 'main':
../main.c:107: error: expected expression before 'do'
../main.c: In function '__low_level_init':
../main.c:126: error: expected expression before 'do'
main.cを見てみると107行も126行もClear_prescaler();でした。探してみるとClear_prescaler()はpower_drv.hで定義されているマクロです。power_drv.hはlib_mcu\powerにあります。マクロの定義は次のようになっています。
#ifdef __GNUC__今回はWinAVRを使っているので__GNUC__というマクロが定義されています。したがって#ifdefは上の方のclock_prescale_set(0)を使ったマクロを定義しています。clock_prescale_set()ですが、avr/power.hで定義されています。このファイルはWinAVRをインストールしてフォルダの下のinclude\avrにあります。覗いてみると、clock_prescale_set()もマクロ定義になっていて、do~while(0)で囲まれていました。結局マクロを展開すると、(do ~ while(0));のようにdo~whileのまわりに括弧がいる形になってC言語の文法エラーになっていたということみたいです。たぶん元々は関数で定義されていたので括弧でくくっても問題がなかったんでしょうね。
#define Clear_prescaler() (clock_prescale_set(0))
#else
#define Clear_prescaler() (Set_cpu_prescaler(0))
#endif
というわけで、以下のように括弧を取り除いてエラーを修正します。
#ifdef __GNUC__ちなみに、もうちょっと下にSet_cpu_prescaler(x)のマクロ定義でも(clock_prescale_set(x))となっているので括弧を取り除いてやります。
#define Clear_prescaler() clock_prescale_set(0)
#else
#define Clear_prescaler() (Set_cpu_prescaler(0))
#endif
これで無事build完了です。私の環境(WinAVR-20100110)だと以下のようなサイズになりました。
Program: 5018 bytes (30.6% Full)
(.text + .data + .bootloader)
Data: 172 bytes (33.6% Full)
(.data + .bss + .noinit)
Build succeeded with 0 Warnings...
(6) Flipを使って、hexファイルを書き込みます。STK526-series2-cdc.hexはdemo\STK526-series2-cdcの下にできます(STK526-series2-cdc.apsと同じフォルダ)。Flipの使い方はストロベリーリナックスのチュートリアルに写真入りで解説されています(サンプルプログラムの書き込み)。
書き込みモードにするときは、リセットのジャンパをつける → ブートのジャンパをつける → リセットのジャンパをはずす → ブートのジャンパをはずす、という順番にします。
書き込みに成功して実行を開始すると、新しいデバイス(AT90USBxxx CDC USB to UART MGM)を認識してドライバをインストールします。ドライバはdemo\STK526-series2-cdcの下のat90usbxxx_cdc.infです。
(7) TeraTermで38400bpsに設定して通信した様子です(PB0とGNDをショートしたときのメッセージ)。
このデモ自体の機能は、以下の3つです。
- USB-UARTから受信した文字をUARTへエコーバックする。その際にPD5に接続されたLED3を反転する。
- ???なトリガーでPD5に接続されたLED2が反転する。cdc_task.cではusb_request_break_generationがTRUEのときに反転することになっています。
- STK526のジョイスティックを倒すと方向に応じたメッセージを出力する。実際は5個のボタンになっていて、上 PB5、下 PB7、左 PB4、右 PB6、push PB0に割りあたっています。STK526のHardware User Guideを見ると、このジョイスティックは押すとpull-downされるが、そうでないときはHi-Zであると書かれていて、AVRの内蔵pull-upを有効にしておく必要があるそうです。
STK526のLEDやジョイスティック関連の定義はstk_526.hの中でマクロとして定義されています。stk_526.h自体はlib_board\stk_526にあります。
ボタンに反応したりといったデモの機能自体はcdc_task.cの中のcdc_task()の中に定義されています。main()は初期化した後、scheduler()という関数を呼び出すだけです。conf_scheduler.hでschedulerが呼び出すタスクを定義していて、task2がcdc_taskということのようです。cdc関連のプログラムを開発するには、このデモを改造するのがよさそうな気がします。
一応、AVR USB Series2 software library templateというseries2-usb_software_library_template-2_0_0-doc.zipファイルもダウンロードできるようです。
試しにcdc_task()の中のUARTに出力しているところ
uart_putchar(uart_usb_getchar()); // loop back USB to USART
を、次のように書き換えてみると、USB-UARTにエコーバックするようになりました。
putchar(uart_usb_getchar()); // loop back USB to USART
というわけで、やってみたことは以上です。
schedule()は、taskを順に呼び出しているだけで、タイマー割り込みとかで時分割処理をしているわけではないので、cdc_task()の中ではあまり長い処理はしない方がよさそうです。結構、使い方は面倒そうな気もします。もっと手軽に使えればいいのにとか勝手なことを思いました。