AVR_Monit

AVR_Monit って、いったい・・・。

バルク転送で遊ぶ。

  • ATtiny2313をPCから直接コントロールするにはどうしたらよいかという命題。

つまり、こういうことだ。

  • いちいちプログラムを書いてROMに焼くのは面倒だ。
  • 原始時代の大昔、ワンボードマイコンでやっていたような、メモリーを読み書きする簡易MONITORのイメージに近い。

それは何ですか?

    +------+
 /  PC  /| 
+-------+  |
|−=− |  |
+-------+  |
|       |  |  ________________
+-------+  |/  USB CABLE   /
|    □ |  |              /
|    ・ |  |          |AVRChip|
|       | /           ~~~~~~~
+-------+

へたれな絵

  • USBに繋がっているATtiny2313を制御するファームです。
  • AVR側の任意のメモリーやI/Oポートを読み書きできます。
  • USB LowSpeedバルク転送のスケルトンにもなっています。
  • 転送速度ベンチマークテスト用にも使えます。

LowSpeedなのにバルク転送を使っています。

  • 8バイトのコマンドパケットを送って、必要なら8バイトのリターンパケットを受け取ります。
  • コマンドパケットの内容
       0      1      2      3      4      5      6      7
    +------+------+-------------+------+------+-------------+
    | req  | cmd  |  address    | data0|data1 |   reserved  |
    +------+------+-------------+------+------+-------------+
  • address は読み書きしたいAVRの番地
  • data0 は書き込みたいデータ。
  • data1 はマスク書き込みする場合のマスクパターン。
    • data1 が0なら *address = data0;
    • data1 が0以外なら *address = (*address & data1) | data0;
  • 読み出しの場合は data0に長さを入れる(最大8バイトまで)
  • 読み出しの場合のアドレス空間は cmd の上位[6:5]bitの値で決める。(0=RAM 20=EEPROM 40=PGMEM)
  • reqはコントロール転送時の予約(bmRequestType)
  • リターンパケットの内容
       0      1      2      3      4      5      6      7
    +------+------+------+------+------+------+------+------+
    |  読み出したRAMの内容(最大8バイトまで)           |
    +------+------+------+------+------+------+------+------+

と、こんな感じで作ってみました。


DOWNLOAD

  • upload/AVRmonit.zip
    をダウンロードしてください。(ソース、HEX、EXE一式)

マニュアル


ハードウェア

配線はAVRUSB VUSB互換。

  • D+,D−はPD2,PD3に繋ぎます。
    http://www.obdev.at/Images/vusb/circuit-zoomed.gif

補足

  • R1,R2:75Ω程度でもOK。
  • R3: 1K5は1.5kΩのこと。5V駆動の場合は2.2kΩ。
  • C1: 4u7は4.7μFの電解コンデンサ。
  • C2,C3は省略しても一応動きます。ただし発振周波数12MHzからわずかに誤差が発生します。
  • D1,D2は一般の整流用シリコンダイオードです。これを入れるとAVRの動作電圧が5V-(0.6V*2)=3.7〜3.8V程度になります。
  • バリエーションとしては、普通の三端子レギュレータで3.3V〜3.5Vを作って供給する手もあります。


AVR側を5V動作にしたい場合は

  • D1,D2を省略して、かわりにUSBの(D+とGND間)と(D-とGND間)に青色LEDをそれぞれ入れることでUSB信号の電圧を3.3V程度にクランプします。
    • 5V動作かつ青色LEDを省略してもたいていは動作しますが、ホストPCとの相性によりUSB認識しない場合もあります。
  • win32側のビルドはmingw GCCを使います。(cygwinでも出来るはず)
  • Vendor ID , Product IDはPowerSwitchと同じになってます。PowerSwitchと同時に使うことは出来ません。(そのかわりlibusbドライバーの組み込みは1回で済む)
  • ToDo:
  • VendorID,ProductIDが重複していてもアプリ名称で区別してデバイスを認識させること。
  • スクリプトファイルをあらかじめ用意しておいて食わせるモードが欲しい。(-ifile) -済み
  • ファーム側のDDR設定のデフォルトをINかつPULLUPにしたい。
  • 全PORTのログを取れるデータロガーモードを付けたい。
  • PORTをビット単位でON/OFFするコマンド。
  • PORTに時系列データを食わせてON/OFFできるやつ。
  • 超低速だがロジアナにならんかな。

これをベースに、PCとAVRのコミュニケーションを行うつもり。

  • コントロール転送は使わない。
  • バルク転送メッセージは必ず8バイト単位。

と、書いたが、Vista対応の件もあり、コントロール転送版(但し遅い)と両立させようと思う。

  • 済み。
  • コントロール転送ではベンダーリクエストを送ることになるので、8バイトの先頭1バイトはbmRequestTypeを入れなければならない。
  • そうすると、使えるのは残り5バイト(最後の2バイトはwLength)
  • しかたなく、コマンド構造体を変更。
  • 面倒なのでコントロール転送では常にリターンパケット8バイトを受信しようと思う。
  • ほぼPowerSwitchと同じつくりになる。

操作例

F:\avr\AVRmonit\win32> monit -c
found 3 busses
AVR> help
* AVR_Monit Ver 0.1
Command List
 d  <ADDRESS1> <ADDRESS2>    Dump Memory(RAM)
 dr <ADDRESS1> <ADDRESS2>    Dump Memory(EEPROM)
 dp <ADDRESS1> <ADDRESS2>    Dump Memory(PGMEM)
 e  <ADDRESS1> <DATA>        Edit Memory
 f  <ADDRESS1> <ADDRESS2> <DATA> Fill Memory
 p ?                         Print PortName-List
 p .                         Print All Port (column format)
 p *                         Print All Port (dump format)
 p <PortName>                Print PortAddress and data
 p <PortName> <DATA>         Write Data to PortName
 sleep <n>                   sleep <n> mSec
 bench <CNT> <PACKET_SIZE>   Bulk(or ctrl) Write Speed Test
 q                           Quit to DOS
AVR> p .
 DIDR = 0000_0000  PORTD = 0111_0011 WDTCSR = 0000_0000 TCCR1A = 0000_0000
UBRRH = 0000_0000 GPIOR0 = 0000_0000 TCCR1C = 0000_0000 TCCR0A = 0000_0000
UCSRC = 0000_1110 GPIOR1 = 0000_0000  GTCCR = 0000_0000 OSCCAL = 0110_0010
 ACSR = 0001_0000 GPIOR2 = 0000_0000  ICR1L = 0000_0000  TCNT0 = 0000_0000
UBRRL = 1001_1011   PINB = 1111_1111  ICR1H = 0000_0000 TCCR0B = 0000_0000
UCSRB = 0001_1000   DDRB = 0000_0000  CLKPR = 0000_0000  MCUSR = 0000_0001
UCSRA = 0110_0010  PORTB = 1111_1111 OCR1BL = 0000_0000  MCUCR = 0000_0011
  UDR = 0000_0000   PINA = 0000_0000 OCR1BH = 0000_0000  OCR0A = 0000_0000
  RXB = 0000_0000   DDRA = 0000_0000  OCR1L = 0000_0000 SPMCSR = 0000_0000
  TXB = 0000_0000  PORTA = 0000_0000  OCR1H = 0000_0000   TIFR = 0000_0000
USICR = 0000_0000   EECR = 0000_0000 OCR1AL = 0000_0000  TIMSK = 0000_0000
USISR = 0000_0000   EEDR = 0000_0000 OCR1AH = 0000_0000   EIFR = 0000_0000
USIDR = 0000_0000   EEAR = 0101_1101 TCNT1L = 0000_0000  GIMSK = 0100_0000
 PIND = 0111_1011  EEARL = 0101_1101 TCNT1H = 0000_0000  OCR0B = 0000_0000
 DDRD = 0111_0011  PCMSK = 0000_0000 TCCR1B = 0000_0000
AVR> p
   PIND(30) 73 0111_0011
  PORTD(32) 73 0111_0011
   PINB(36) ff 1111_1111
  PORTB(38) ff 1111_1111
   PINA(39) 00 0000_0000
  PORTA(3b) 00 0000_0000
AVR> p portb aa
  portb(38) aa 1010_1010
AVR> p portb 55
  portb(38) 55 0101_0101
AVR> p
   PIND(30) 7b 0111_1011
  PORTD(32) 73 0111_0011
   PINB(36) ff 1111_1111
  PORTB(38) 55 0101_0101
   PINA(39) 00 0000_0000
  PORTA(3b) 00 0000_0000
AVR> q
Bye.
F:\avr\AVRmonit\win32>

起動オプション

-c       コントロール転送で接続する。
-i<file> モニターコマンドを記述したスクリプトファイルを読み込んで実行する。

作った後で気づいた、驚愕の事実

  • いしかわさんが、2005年10月の日記 にて、汎用 USB-IO 互換ファームウェアをすでにAT90S2313で実現されておりました。
  • いやー恥ずかしい。
  • またやっちまったぜ、車輪の再発明・・・。

English Translation

dream.cgi?id=HIDasp&name=a.gif