Top
HIDaspx
DownLoad
HIDasp高速化
制作
AVR関係
AVR_Monit
AVR_term
W32_term
HIDmon88
HIDtester
usbRS232
Arduino2313
デジタルテスター
ATmega88生活
KeyBoardマニア
KeyBoardマニアII
Arduino400
PICライター
ARMライター
赤外線リモコン
ARM
STM32ブートローダー
STM8S-Discovery改造
STM8S-OpenOCDライター
LPCXpresso
LPC用ブートローダー
NXP用LPCUSB
NXP用ブートローダー
MARY基板
LPC1114FN28
OpenOCD JTAGアダプター
OpenOCDビルド方法
arm-gccビルド方法
mapleIDEの改造
libmapleで仮想COM
PIC32
PIC32MX
Pinguinoで遊ぼう
ブートローダーを作る
シリアルブートローダー
USB仮想シリアル
USBカスタムデバイス
USB簡易モニター
USBオシロスコープ
USBホスト
PIC32でBluetooth
USBAudio
USBStudy
VGA出力に挑戦
BASICを動かす
WinUSB
勝手に改蔵*PIC32
PIC18F
HIDブートローダー
AVR/PIC両用ライター
ARMライター
usb汎用クラス
usbシリアル変換
usbキーボード変換
sdccを使いこなす
mcc18を使いこなす
HIDmon-2550
HIDmon-14K50
PICmonitor
試行錯誤の記録
UBWを試す
旧HIDboot
PIC18F2550試用記
PIC18F4550試用記
その他マイコン
NEC78K
RX62N
SH2A
H8
FM3
XPからubuntuに乗り換え
Android
Xen-hypervisor
Windows8カスタマイズ
開発日記
2015-04
ノウハウ
AVRUSB_Tips
HIDasp情報
汎用USB-IO
・
リンク
フリースペース
ゲストブック
旧コンテンツ
WinVista
インターフェース考
最新の20件
2022-07-25
2008-10
HIDasp高速化
H8/3048F
AutoTicketLinkName
2021-12-11
FormattingRules
2021-12-08
PukiWiki/1.4/Manual/Plugin/O-R
PukiWiki/1.4/Manual/Plugin/L-N
PukiWiki/1.4/Manual/Plugin/V-Z
PukiWiki/1.4/Manual/Plugin/A-D
PukiWiki/1.4/Manual/Plugin/E-G
PukiWiki/1.4/Manual/Plugin/S-U
PukiWiki/1.4/Manual/Plugin/H-K
2020-02-23
YukiWiki
PHP
PukiWiki
WikiWikiWeb
2018-12-19
SandBox
InterWiki
2015-05-07
2015-04
2015-05-02
MenuBar
編集
差分
AVRUSB_Tips の編集
-- 雛形とするページ --
(no template pages)
*Tips [#o2d0d7f6] #contents ---- **AVR-GCC(WinAVR)のバージョンはどれが良いの? [#s41ded8c] -とりあえず、GCC3ベースの2006-0421というのを使ってます。 ---- **USBのD+、D−の配線を下図[[AVRUSB:http://www.obdev.at/products/avrusb/index.html]]と同じにしたい [#vd6a545d] http://www.obdev.at/Images/vusb/circuit-zoomed.gif -(1)usbconfig.hを編集します。 #define USB_CFG_IOPORTNAME D /* This is the port where the USB bus is connected. When you configure it to * "PORTB", the registers PORTB, PINB (=PORTB-2) and DDRB (=PORTB-1) will be * used. */ #define USB_CFG_DMINUS_BIT 3 /* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected. * This MUST be bit 0 or 7. All other values will result in a compile error! */ #define USB_CFG_DPLUS_BIT 2 /* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected. * This may be any bit in the port. Please note that D+ must also be connected * to interrupt pin INT0! */ オリジナルはB,0,1ですが、これをD,3,2にします。 -(2)ポート方向の初期化を変更します。 int main(void) { DDRD = ~(1 << 2); DDRB = ~(USBMASK|(1<<5)); /* all outputs except USB data */ のDDRDの設定を、以下のように書き換えます。 DDRD = ~(3 << 2); // D2,D3を入力に。他は出力。 DDRB = ~( (1<<5)); //PB5は入力(SPIの'MOSI') -実は(2)の変更に気づかなかったため、HIDaspが動かない''動かない''とずっと悩んでいたのは秘密。 -こうすることで、I/Oピン1本と配線1本が節約できますが、 -HIDaspはじめいくつかのアプリはたいていB,0,1がデフォルトになっています。 -何故そうなのかはいまだ不明です。(別の品種ではPORT Dが無いとか???) ---- **コードを縮めたい。(ATtiny2313限定) [#zd510700] -Cランタイムのスタートアップを自分で書きます。 -といっても、WinAVRのLIBCソースからcrt1.Sを取り出して改造するだけです。~ http://psp.dip.jp/web/upload.cgi/crt_S.zip -自分のソース(main.c)のMakefileにcrt.oを追加する。 OBJECTS = usbdrv/usbdrv.o usbdrv/usbdrvasm.o usbdrv/oddebug.o main.o ↓追加する OBJECTS = crt.o usbdrv/usbdrv.o usbdrv/usbdrvasm.o usbdrv/oddebug.o main.o -リンク時にデフォルトのcrt.oを使わないようにする。 # file targets: main.bin: $(OBJECTS) $(COMPILE) -o main.bin $(OBJECTS) ↓追加する。 $(COMPILE) -o main.bin $(OBJECTS) -nostdlib 注意: - .data .bss セクションのサイズが非ゼロであることを前提にしています。 - どちらかがゼロのときは、.data , .bssそれぞれに対して、コピーループ、クリアループそのものを削除します。 ---- **さらに縮めたい。(機種限定なし) [#nb0a495b] -[[AVRUSB:http://www.obdev.at/products/avrusb/index.html]]のPowerSwitchアプリケーションに含まれているusbdrvは、12MHz版のみでなく、16MHz、16.5MHz版が存在します。 usbdrv/usbdrvasm12.S usbdrv/usbdrvasm16.S usbdrv/usbdrvasm165.S -これを切り替えるには、main.cディレクトリに置かれている usbconfig.h を編集します。 /* #define USB_CFG_CLOCK_KHZ (F_CPU/1000) */ -これを有効にして、F_CPUを16000000 などとします。 -どこかでCPUクロック定数=F_CPUを定義していないときは 直接 #define USB_CFG_CLOCK_KHZ 16000 としても有効ですが、usbdrv/oddebug.h にF_CPUのデフォルト定義があるので、出来れば oddebug.hをインクルードする前で #define F_CPU 16000000 もしくはMakefile中に-Dオプションで -DF_CPU=16000000UL としたほうが良いでしょう。 -PowerSwitch のファームサイズは、クロック別で以下のようになりました。 ATtiny2313 ROM RAM 12MHz 1706 56 16MHz 1582 56 16.5MHz 1710 56 16MHzの時は12MHz時に比べて224バイトも縮んでいます。~ これは''美味しい''かも。 -ソースコードのサイズも usbdrv/usbdrvasm16.S が小さいですね。 -クロック数に余裕があるので、8ビットの処理全部をアンロール展開せずにループ処理で対応出来ているみたいです。 ---- **AVRUSBドライバーの16.5MHzモードとは? [#ibb44150] -クリスタルに限らず内蔵RCやセラミック発振の精度を許容する。 -12MHz、16MHzはどちらもクリスタル発振の精度が必要です。 -16.5MHz±1.0%の精度は必要です。 -詳細は-[[AVRUSB:http://www.obdev.at/products/avrusb/index.html]]のEasyLoggerアプリケーションにあります。 -8ピンのATtiny45などで内蔵RC発振を選択するとピン数が節約出来るので有効。 -main.cの先頭で、校正済内蔵RCの8MHzをわずかだけオーバークロック調整して8.25MHzにしています。 -内蔵RCの後の1/2プリスケーラを通さずに×8PLL(その後1/4されCPUに入る)に入れることでCPUクロックを16.5MHzにしています。(Fuseで設定する HF PLL) -残念ながらATtiny2313では16.5MHzモードを使うことは出来ません。 --tiny45とはクロックSELの回路が異なっており、x8PLLは存在しないためです。 -参考:ATtiny2313で選択できるクロック |CKSEL3-0|意味| |1111-1000|外部クリスタル/セラミック発振子| |0110|128kHz内部(WDT)発振器| |0100|8MHz校正付内蔵RC発振器| |0010|4MHz校正付内蔵RC発振器| |0000|外部クロック信号| |0xx1|予約| ちなみに8MHz校正付の校正値はOSCCALの値を1〜127まで書き換えることで 約4MHzから12MHz程度まで可変できるようです。(出荷時は8MHzに校正された値になっています) ---- **ところで、どうして16.5MHzなんていう半端なクロックなの? [#kcb75054] -それは、1.5MHzの11倍だから。 -つまり、LowSpeed USBのベースクロックが1.5MHzなので、1ビットを送受する時間がCPUの命令数で数えてちょうど11ステップになるようにコーディングしてあるわけ。 -12MHzの場合はそれが8ステップになるので、超絶技巧プログラミングになるのだけれど、16.5MHzの場合は3ステップの余裕があるから、受信時の同期取りコードを入れることが出来るということらしい。 -だけど送信時は完全にこっちのペースで送信することしか出来ないので、1%以内の精度は必要らしい。 **では、1.5MHzの整数倍になってない16MHzで動くのは何故? [#s391b31b] -そう、16MHzだと、10+(2/3)クロックなんだ。 -usbdrv/usbdrvasm16.Sのソースを読んでいるが、読解出来ないっす。 -コメントには凄いことが書いてある。 --何をやろうとしているか本当に理解してないならコードに触ってはだめだ。 --とにかく、これ書いた奴ら、凄すぎ。 --全部アセンブラなigorさんも凄いけど、この16を書いた人はもっと尊敬する。というかチャレンジャーだ。 //--→[[usbdrvasm16.S解読>2007-10#if7e6d57]] --→[[usbdrvasm16.S解読>http://psp.dip.jp/web/log/2007-10.html#if7e6d57]] ---- **その他のTopic [#e25d3515] -[[USB転送モードについてのまとめ>なんちゃってシリアル#uf936d7d]] -[[USB転送速度ベンチマーク>今後の目標#l07b1d63]]
タイムスタンプを変更しない
*Tips [#o2d0d7f6] #contents ---- **AVR-GCC(WinAVR)のバージョンはどれが良いの? [#s41ded8c] -とりあえず、GCC3ベースの2006-0421というのを使ってます。 ---- **USBのD+、D−の配線を下図[[AVRUSB:http://www.obdev.at/products/avrusb/index.html]]と同じにしたい [#vd6a545d] http://www.obdev.at/Images/vusb/circuit-zoomed.gif -(1)usbconfig.hを編集します。 #define USB_CFG_IOPORTNAME D /* This is the port where the USB bus is connected. When you configure it to * "PORTB", the registers PORTB, PINB (=PORTB-2) and DDRB (=PORTB-1) will be * used. */ #define USB_CFG_DMINUS_BIT 3 /* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected. * This MUST be bit 0 or 7. All other values will result in a compile error! */ #define USB_CFG_DPLUS_BIT 2 /* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected. * This may be any bit in the port. Please note that D+ must also be connected * to interrupt pin INT0! */ オリジナルはB,0,1ですが、これをD,3,2にします。 -(2)ポート方向の初期化を変更します。 int main(void) { DDRD = ~(1 << 2); DDRB = ~(USBMASK|(1<<5)); /* all outputs except USB data */ のDDRDの設定を、以下のように書き換えます。 DDRD = ~(3 << 2); // D2,D3を入力に。他は出力。 DDRB = ~( (1<<5)); //PB5は入力(SPIの'MOSI') -実は(2)の変更に気づかなかったため、HIDaspが動かない''動かない''とずっと悩んでいたのは秘密。 -こうすることで、I/Oピン1本と配線1本が節約できますが、 -HIDaspはじめいくつかのアプリはたいていB,0,1がデフォルトになっています。 -何故そうなのかはいまだ不明です。(別の品種ではPORT Dが無いとか???) ---- **コードを縮めたい。(ATtiny2313限定) [#zd510700] -Cランタイムのスタートアップを自分で書きます。 -といっても、WinAVRのLIBCソースからcrt1.Sを取り出して改造するだけです。~ http://psp.dip.jp/web/upload.cgi/crt_S.zip -自分のソース(main.c)のMakefileにcrt.oを追加する。 OBJECTS = usbdrv/usbdrv.o usbdrv/usbdrvasm.o usbdrv/oddebug.o main.o ↓追加する OBJECTS = crt.o usbdrv/usbdrv.o usbdrv/usbdrvasm.o usbdrv/oddebug.o main.o -リンク時にデフォルトのcrt.oを使わないようにする。 # file targets: main.bin: $(OBJECTS) $(COMPILE) -o main.bin $(OBJECTS) ↓追加する。 $(COMPILE) -o main.bin $(OBJECTS) -nostdlib 注意: - .data .bss セクションのサイズが非ゼロであることを前提にしています。 - どちらかがゼロのときは、.data , .bssそれぞれに対して、コピーループ、クリアループそのものを削除します。 ---- **さらに縮めたい。(機種限定なし) [#nb0a495b] -[[AVRUSB:http://www.obdev.at/products/avrusb/index.html]]のPowerSwitchアプリケーションに含まれているusbdrvは、12MHz版のみでなく、16MHz、16.5MHz版が存在します。 usbdrv/usbdrvasm12.S usbdrv/usbdrvasm16.S usbdrv/usbdrvasm165.S -これを切り替えるには、main.cディレクトリに置かれている usbconfig.h を編集します。 /* #define USB_CFG_CLOCK_KHZ (F_CPU/1000) */ -これを有効にして、F_CPUを16000000 などとします。 -どこかでCPUクロック定数=F_CPUを定義していないときは 直接 #define USB_CFG_CLOCK_KHZ 16000 としても有効ですが、usbdrv/oddebug.h にF_CPUのデフォルト定義があるので、出来れば oddebug.hをインクルードする前で #define F_CPU 16000000 もしくはMakefile中に-Dオプションで -DF_CPU=16000000UL としたほうが良いでしょう。 -PowerSwitch のファームサイズは、クロック別で以下のようになりました。 ATtiny2313 ROM RAM 12MHz 1706 56 16MHz 1582 56 16.5MHz 1710 56 16MHzの時は12MHz時に比べて224バイトも縮んでいます。~ これは''美味しい''かも。 -ソースコードのサイズも usbdrv/usbdrvasm16.S が小さいですね。 -クロック数に余裕があるので、8ビットの処理全部をアンロール展開せずにループ処理で対応出来ているみたいです。 ---- **AVRUSBドライバーの16.5MHzモードとは? [#ibb44150] -クリスタルに限らず内蔵RCやセラミック発振の精度を許容する。 -12MHz、16MHzはどちらもクリスタル発振の精度が必要です。 -16.5MHz±1.0%の精度は必要です。 -詳細は-[[AVRUSB:http://www.obdev.at/products/avrusb/index.html]]のEasyLoggerアプリケーションにあります。 -8ピンのATtiny45などで内蔵RC発振を選択するとピン数が節約出来るので有効。 -main.cの先頭で、校正済内蔵RCの8MHzをわずかだけオーバークロック調整して8.25MHzにしています。 -内蔵RCの後の1/2プリスケーラを通さずに×8PLL(その後1/4されCPUに入る)に入れることでCPUクロックを16.5MHzにしています。(Fuseで設定する HF PLL) -残念ながらATtiny2313では16.5MHzモードを使うことは出来ません。 --tiny45とはクロックSELの回路が異なっており、x8PLLは存在しないためです。 -参考:ATtiny2313で選択できるクロック |CKSEL3-0|意味| |1111-1000|外部クリスタル/セラミック発振子| |0110|128kHz内部(WDT)発振器| |0100|8MHz校正付内蔵RC発振器| |0010|4MHz校正付内蔵RC発振器| |0000|外部クロック信号| |0xx1|予約| ちなみに8MHz校正付の校正値はOSCCALの値を1〜127まで書き換えることで 約4MHzから12MHz程度まで可変できるようです。(出荷時は8MHzに校正された値になっています) ---- **ところで、どうして16.5MHzなんていう半端なクロックなの? [#kcb75054] -それは、1.5MHzの11倍だから。 -つまり、LowSpeed USBのベースクロックが1.5MHzなので、1ビットを送受する時間がCPUの命令数で数えてちょうど11ステップになるようにコーディングしてあるわけ。 -12MHzの場合はそれが8ステップになるので、超絶技巧プログラミングになるのだけれど、16.5MHzの場合は3ステップの余裕があるから、受信時の同期取りコードを入れることが出来るということらしい。 -だけど送信時は完全にこっちのペースで送信することしか出来ないので、1%以内の精度は必要らしい。 **では、1.5MHzの整数倍になってない16MHzで動くのは何故? [#s391b31b] -そう、16MHzだと、10+(2/3)クロックなんだ。 -usbdrv/usbdrvasm16.Sのソースを読んでいるが、読解出来ないっす。 -コメントには凄いことが書いてある。 --何をやろうとしているか本当に理解してないならコードに触ってはだめだ。 --とにかく、これ書いた奴ら、凄すぎ。 --全部アセンブラなigorさんも凄いけど、この16を書いた人はもっと尊敬する。というかチャレンジャーだ。 //--→[[usbdrvasm16.S解読>2007-10#if7e6d57]] --→[[usbdrvasm16.S解読>http://psp.dip.jp/web/log/2007-10.html#if7e6d57]] ---- **その他のTopic [#e25d3515] -[[USB転送モードについてのまとめ>なんちゃってシリアル#uf936d7d]] -[[USB転送速度ベンチマーク>今後の目標#l07b1d63]]
テキスト整形のルールを表示する
ログインまたはアカウント作成