2013.06.19

V-USB を AtmelStudio 6 でビルドする

V-USB を使った project を AtmelStudio 6 でビルドしようとしたが、、、うまくいかず。。
結局、V-USB 付属の Makefile を使ってしかビルドできなかったが、一応メモ。

以下、付属のサンプルの hid-data をまるごと持ってきて ATTiny45 で Internal RC Oscillator を使って動作するようにビルドする方法のメモ。

■V-USB を落とす
http://www.obdev.at/products/vusb/download.html
ここから、vusb-20121206.zip を落とす。

■Project の作成
AtmelStudio → File → New → Project...
→ C/C++ の一番上の GCC C Executable Project
→ Name, Location, Solution name を適当に入れる
(以下、Name を foo としたことにする)
→ OK → ATTiny45 → OK
[CTRL]+[SHIFT]+[b] でビルドできることを確認(Build: 1 succeded...が出ればOK)

■V-USB のコピー
vusb-20121206.zip の usbdrv ディレクトリと libs-device ディレクトリを
foo/foo/ の中にコピーする
foo/foo/usbdrv と foo/foo/libs-device となる

examples/hid-data/firmware/Makefile
examples/hid-data/firmware/usbconfig.h
も foo/foo/ の中にコピーする。

■Makefile の修正
foo/foo/Makefile の main. を foo. に全置き換えする(コメント内も含めて26箇所)
foo/foo/Makefile の先頭に
SHELL=C:/Windows/System32/cmd.exe
を追加。
一番下に、
all: foo.hex
を追加。

(make のバグが残っているらしく SHELL を指定しないと make clean の時にエラーが出るのでその対策と、make all の条件が書かれてなくて build できないのでその対策)

■Makefile を使って build するように変更
Project の Property で、
(Solution Explorer の foo ディレクトリで右クリックして properties を選択)
Build→Use External Makefile にチェックして、↑でコピーした Makefile を指定

image

image

■foo.c を修正
foo.c の中身を全部消して(or コメントアウト)して、
examples/hid-data/firmware/main.c の中身をコピペする。
[CTRL]+[SHIFT]+[b] でビルドすると const にしろと怒られるので、
usbHidReportDescriptor のところの先頭に const を付ける
const PROGMEM char usbHidReportDescriptor[22] = {    /* USB report descriptor */
これで、[CTRL]+[SHIFT]+[b] でビルドできればOK

■ATTiny45 用に修正
foo/foo/Makefile の3行を以下のように修正

# Salt changed from DEVICE  = atmega168
DEVICE  = attiny45


# Salt changed from F_CPU   = 16000000    # in Hz
F_CPU   = 16500000    # in Hz


# Salt changed from OBJECTS = usbdrv/usbdrv.o usbdrv/usbdrvasm.o usbdrv/oddebug.o foo.o
OBJECTS = usbdrv/usbdrv.o usbdrv/usbdrvasm.o usbdrv/oddebug.o libs-device/osccal.o foo.o

foo/foo/usbconfig.h の4ヶ所を以下のように修正

// Salt changed from #define USB_CFG_IOPORTNAME      D
#define USB_CFG_IOPORTNAME      B

// Salt changed from #define USB_CFG_DMINUS_BIT      4
#define USB_CFG_DMINUS_BIT      1

// Salt changed from #define USB_CFG_HAVE_MEASURE_FRAME_LENGTH   0
#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH   1

/* #define USB_RESET_HOOK(resetStarts)     if(!resetStarts){hadUsbReset();} */
/* This macro is a hook if you need to know when an USB RESET occurs. It has
* one parameter which distinguishes between the start of RESET state and its
* end.
*/
/* #define USB_SET_ADDRESS_HOOK()              hadAddressAssigned(); */
// Salt added {
#ifndef __ASSEMBLER__
#include <avr/interrupt.h>  // for sei()
extern void calibrateOscillator(void);
#endif
#define USB_RESET_HOOK(resetStarts)  if(!resetStarts){cli(); calibrateOscillator(); sei();}
// } Salt added

これで、[CTRL]+[SHIFT]+[b] でビルドできればOK
不可解なエラーが出る時は、*.o を全部消してみる。
GUI からは Makefile の clean をうまく呼び出せないみたいなので、手動で。

(ATTiny45 には PortB しかないので B に、
USB_CFG_DMINUS_BIT は、付属の回路図に合わせて 1 に、
USB_RESET_HOOK は libs-device/osccal.h の説明通りにコピペ
キャリブレーションを有効にするために USB_CFG_HAVE_MEASURE_FRAME_LENGTH を 1 にする)

■焼く
Memories はそのまま焼く。
Fuse は、HIGH=0xDD, LOW=0xE1 にして焼く。
internal rc oscillator を使うけど、INTRCOSC_xxx を使うとダメで、PLLCLK_1KCK_14CK_64MS にすることが重要。(ちょっと悩んだ^^;;)

image

■回路を作る
vusb-20121206/circuits/tiny45-rc.png の通りに作ればOK

tiny45-rc

これで、HID device として認識されるはず。

う~ん、、コードが見辛いなぁ。。このブログはコード貼り付けるのがムズイ。。

| | コメント (2) | トラックバック (0)

2009.04.22

AVR-USB is now V-USB

AVR-USB is now V-USB

AVR-USB が、いつの間にか V-USB になってた。
Atmel の商標とかぶってるから変えたっぽい。

4/15 に新しくなってるね。暇を見つけて使ってみよっと。

(←フリーソフトを作るモチベーションアップのために、ぜひ。)

| | コメント (0) | トラックバック (0)

2008.11.24

AVR-USB, hid-data

AVR-USB のサンプルの examples/hid-data のデータ転送速度を測ってみた。

サンプルのままだと、EEPROM の読み書きで遅すぎるので、単純に RAM 上の配列に読み書きするようにして測定してみた。
(ATTiny45 で内蔵OSC使って 16.5MHz 動作のもの。)


結果は、

128Byte * 1000回 の書き込みが 2652ms で 47.13KB/s
128Byte * 1000回 の読み込みが 5663ms で 22.07KB/s

8Byte * 1000回 の書き込みが 499ms で 15.66KB/s
8Byte * 1000回 の読み込みが 671ms で 11.64KB/s

でした。


理論的には、1.5Mbps / 8 = 187.5KB/s なので、実効で 100KB/s ぐらい出て欲しいと思っていたけど、ソフトだけでエミュレートしてるせいか、ちょっと遅かった。

コントロール転送で Feature Report を使ってデータ転送するという、ある意味裏技っぽい使い方してるのも遅い原因かな? 普通に、インタラプト転送すれば、もっと速いのかも???

まぁ、ちょっとしたパラメータを設定するだけなら、数バイト/s で転送できれば十分なので1000倍以上速いんだけどさ。

それにしても、書き込みの方が速いのが意外だったな。
読み出しは、「読み出すよ命令」を書き込んでから読み出してるってことなのかな?

(←フリーソフトを作るモチベーションアップのために、ぜひ。)

| | コメント (0) | トラックバック (0)

2008.11.08

AVR-USB、Tiny45 の internal RC oscillator で動作!

AVR-USB のサンプルの hid-data を、Tiny45 で internal RC oscillator を使って動作させる事ができた!

AVR-USB の HP に、
> New: Internal RC Oscillator Supported
と書かれている通り、avrusb-20081022 では、internal RC oscillato がサポートされているはずなのだが、libs-device フォルダに入っているソースを使おうとすると、コンパイルエラーが出たりして、ちょっとハマっていたのだった。

結局、EasyLoggerのソースから一部を持ってくることで動作させる事ができました。


以下、詳細。

■hid-data/firmware/Makefile
 □DEVICE=atmega168 → attiny45
 □F_CPU=16000000 → 16500000
 □FUSE_L= → 0xe1 (make fuse で書き込まないのであれば関係無い)
 □FUSE_H= → 0xdd (make fuse で書き込まないのであれば関係無い)

■hid-data/firmware/usbconfig.h
 □USB_CFG_IOPORTNAME D → B (Tiny45 には PortB しかないからね)
 □USB_CFG_DMINUS_BIT 4 → 0 (適当な port でいいはず)
 □USB_CFG_DPLUS_BIT 2 → 2 (INT0 の必要があるのでそのまま)

 □/* #define USB_RESET_HOOK(resetStarts) ... */
  の代わりに
  -----
  #ifndef __ASSEMBLER__
  extern void usbEventResetReady(void);
  #endif
  #define USB_RESET_HOOK(resetStarts) if(!resetStarts){usbEventResetReady();}
  -----
  を追加

 □USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0 → 1

■hid-data/firmware/main.c
 □以下の2つの関数を EasyLogger の main.c から持ってきて追加
  (libs-device フォルダの中にもあるが、
   /**/ が2重になっててエラーが出たので、面倒なのでコピペした。)
   
   -----
   static void calibrateOscillator(void)
   {
    ...
   }
   
   void usbEventResetReady(void)
   {
    ...
   }
   -----

これで、USB Device として認識されました。


あと残りは 3 pin だけだけど、ADC で温度取得、PWM で電力制御、GPIO で回転数検出、の3つは出来るので、USB 制御可能なファンコントローラが作れそうだね。

(←フリーソフトを作るモチベーションアップのために、ぜひ。)

| | コメント (0) | トラックバック (0)

2008.10.26

78K0 AVR Writer

78K0 AVR Writer
久しぶりに AVR を触った。
シリパラが無いPCになって、ずっと AVR を焼けなかったのだが、08/8 月号のトラ技の 78K0 を使った AVR Writer を見つけたので試してみたら、あっさり焼けました(^^)
でんし研さん、ありがと~。

自分の使い方では、秋月の ATMega88(250円) か、IT プラザの ATtiny45(4つで1100円) しか使わないので、この2つだけ専用の書き込み基板を作ってみた。
ヒューズビットで外付けクロックに設定してしまった後は、全く書き込めなくなって焦ったけど、たまたま持ってた 20MHz のセラロックを XTAL1/2 に付けることで、問題無く焼けるようになりました(^^)

AVR-USB の hid-data を焼いて、デバマネ的には HID Device として認識される事は確認できたけど、何故か PC アプリからだと見えなくてションボリ;;
続きは来週だな。。。

AVR-USB をコンパイルするには、cygwin のインストーラで、Devel→libusb-win32 を入れるのがミソだね。(あとは、gcc: と make: を選択すれば、関係する必要な物は入ってくれる。)

(←フリーソフトを作るモチベーションアップのために、ぜひ。)

| | コメント (0) | トラックバック (0)

2008.10.20

AVR-CDC

AVR-CDC というのを見つけた。ここ
なんかすごい!
#いったいこれはいつからあるのだろう?もっと早くに知りたかった。
#数年前からあったのだろうな^^;

マイコン使ったデバイスを、PCからカスタマイズできるようにしようとすると、普通は RS-232C で繋いでターミナルからコマンド叩いて設定できるようにすると思う。

でも、今時の PC には、RS-232C なんて付いてない;;
しょうがないから、CP2103 とか、FT232 とかで USB → RS232C 変換して、マイコンの UART/USART に接続して、コマンドのやりとりをすることになる。
でも、これらって1000円以上かかるのだよね。。。

それが、AVR-CDC を使うと、250円ぐらいATTiny45 や ATMega88 に実装できる!!!これはすごい!!!

なんかワクワクしてきたぞっ。

#これのベースになってる AVR-USB の HID Data を使う方が
#いいのかもしれないけどね。PC アプリも作る必要あるけど、
#PC 的には負荷が少ない気がする。

(←フリーソフトを作るモチベーションアップのために、ぜひ。)

| | コメント (0) | トラックバック (0)