Jul 23, 2008

GAINER

今更ながら、GAINERで遊んでみようかと思いGAINER I/Oモジュールを購入。
これだけのために、PSoCの開発環境を整備しようとは思わなかったので、キットを購入することに。
載ってる部品が大したことない割には\7,500とちょい高。\3,500位でいいんじゃない?
足が片方1ピン足りなかったけど、in側は未使用ピンがあるので、とりあえずは使えるから許してあげよう。
Posted at 22:34 in embedded

Mar 23, 2008

RCプロポ Joystick(その4)

AT90USB162版完成。あっさり動作。
昨日作ったファームをちょっと書き換えただけなので、ちゃんとしたものは別途作成予定。
#USBN9604は気が向いたらまたやろう。
Posted at 21:30 in embedded

Mar 22, 2008

AVR AT90USB162

デバイス自体はちょっと前に入手済みだったけれど、ようやく実装して動かしてみた(5V専用)。
このデバイスは、USB経由でプログラムの書き込みが出来るので、結構お手軽。
Atmelのサンプル(at90usb162-hidgen-1_0_1.zip)を改造し、1ボタンのみのジョイスティックとして動作するファームウェアを作成(ディスクリプタ上は8ボタン)。
開発環境はWinAVR(20071221)とAVRWikiで配布している修正版のavr-libc-bin-1.6.1+20080115.zip。
Atmelのコードは汎用的に使えるようにかなりモジュール分割されているので、ちょっと扱い辛い。Cypressの様にもう少しソースを集約してやろうかと思う。
(USBのディスクリプタなんかはアセンブラコードの方が書きやすい)


Posted at 23:02 in embedded

Feb 11, 2008

RCプロポ Joystick(その3:苦戦中)

USBN9604の制御が思うようにいかず苦戦中。
DeviceDescriptorの要求受付~送信までは動いているように見えるが、送信完了後に受信許可するとリセットイベントが発生する。
何度やっても同じ。
プログラムは正しいように見えるし、ディスクリプタの内容にも問題は無いので原因不明。
挫折しそうなので、USB付きAVRの「90USB162」に乗り換え検討中。値段も700円とそんなに高くないし。
Posted at 20:08 in embedded

Jan 20, 2008

RCプロポ Joystick(その2:途中経過)

USBコントローラをUSBN9604に変更して製作中。
ハードはとても簡単なのですぐに出来たが、ソフトで苦戦中。
デバイスの初期化までは出来たので、Windowsから「不明なデバイス」として認識されることまでは確認。AVRにも割り込みが発生してデータが読めるので恐らくそれなりに正しく動作している模様。
ただ、あまりにプリミティブなコントローラなのと、EndPoint0のFIFOが8バイトしかないのでディスクリプタの送信が1回で出来ないなど、かなり面倒。たぶんもう使わない。
NSのサイトを見ると「Not recommended for new designs (as of 14-Nov-06)」なので、使っちゃダメみたいだけど。
次はMAX3420あたりを使ってみよう。
Posted at 21:38 in embedded

Jan 06, 2008

RCプロポ Joystick(その1)

とりあえず、AVRに受信機を接続してデータを読み取ることはできたので、そのままEZ-USBに接続してJoystick化。

この程度の処理であれば、EZ-USB単体でも出来そうだけど、まずは動くことを優先にしたので、こういう仕様(最終的にはUSBN9604で接続か、AVRUSBを取り込んで単体動作か、にする予定)。

EZ-USBでのHIDデバイス作成方法については、CypressのHIDサンプル(creating_a_sample_ez_usb_composite_hid_device_9.zip)を、JoystickのReport Descriptorについてはusb.orgのHID Usage Tables(Hut1_12.pdf)を参考にしてみた。
HIDデバイスのReport Descriptorの書き方がイマイチわかんないなあと思っていたけど、同じくusb.orgにあるHID Descriptor Tool(Win32用)を使うとバイナリ値が取得できるので、これを利用した。

2CHプロポなので、X,Y軸しかないアナログジョイスティックをでっち上げ、ひとまずWindowsPCに接続してみたところ、ちゃんと認識出来た。
コントロールパネルの「ゲームコントローラ」でキャリブレーション後、適当なゲームを実行して操作出来ることも確認。


今回の作りだと、好きな送信機と受信機の組み合わせで使用できるし、改造も不要。
ただ、送信機の電池は必要だし、常に電波を送信するのでちょっと気持ち悪いか。
Posted at 10:54 in embedded

Dec 16, 2007

カメレオンUSB故障

ちょっと前から、カメレオンUSBを使ったロジアナで波形が拾えないような気がしてならないので、本気で調べてみた。
最初は回路の問題で出力が出てないと思っていたが、もしやと思い別のポートを使ってみると取れたので。
→ ちょうど、最下位2ポートが死んでいた。
念のため、バウンダリスキャンで全ポートを確認したが、この2ポートのみINTESTで読めなかった。
CPLDだけ換装すれば直りそうだけど、ちょっと作業が厳しいのでもう一個買うか。
Posted at 23:45 in embedded

Dec 02, 2007

PS/2キーボード

今更ながら、PS/2キーボードをAVRに接続してみた。
他の人がやっていることを真似しても意味が無いのだけれども、仕組みを理解する上では「車輪の再発明」も有用なので。
ホストからキーボードへのコマンド送出部分は実装していないけれど、キーボードから送られてくるデータを変換してUARTに送出する部分までは何とか完成。

キーボードと本体間のケーブルをそれなりに長くできるように2線式のシリアル通信にしたのだろうけれど、そのデータの内容がやっぱり気持ち悪いですな。
#プログラム400バイト位に対してキーコード変換テーブルが264バイトにもなってしまった。

次はSDカードの読み書きをやってみる予定。
Posted at 17:33 in embedded

Jan 14, 2007

CPLD版TD4

「CPUの創りかた」CPUのTD4をCPLDにて実装してみた。
(CPLDというよりはVHDL)
CPU本体だけで、リセット&クロック回路はオリジナルそのまま。
→1Hzクロックとか手動クロックの外付け回路を作ると、結局HC14を使うので、そのままでいいやということで。実装面積を1/3も占めるのはいかがなものかとは思ったけど。

ゲートっぽい書き方ではなくてソフトっぽい感じで書いてみたけれどかなり簡単にできてしまった。
VHDLが完全に習得できていないので、process内の信号代入が最後にまとめて同時実行されるということに気づくまで、うまく動かない理由がわからなくて困ったというのはあったけれども。
だいぶVHDLで書けるようになって来たので、今度はVerilogを覚えてみよう。(こっちの方が書き易そう)
Posted at 23:43 in embedded

Dec 31, 2006

一年終わって

今年の目標は半分くらい達成したつもり。
USB関連はJTAGプローブに終始した。それなりの成果があったと思う。
HDL関連は、CPLDで2つばかり機器を製作し、動作させるまで出来た。本当は、CPUの創りかたCPUをCPLD上で動作させたかったのだけれども、VHDLのソースを記述してシミュレーションするところまでしか出来なかった。
LAN関連はAVR+SPIイーサモジュールとH8/3069F+Toppers/JSPで遊んだだけ。実用的なものは作らなかった。
基本的なことは一通りやってみたので、来年はもう少し踏み込んだ領域まで行ってみる予定。
Posted at 20:46 in embedded

AN213xとFX2共用化

ここまでで、AN213xとFX2の両方でJTAGプローブを動かしてみたものの、両方のメンテをするのも面倒なので、EZ-USBアクセス用関数群で吸収するよう修正。
デバイスオープン後にデバイスデスクリプタを取得しデバイスを判別することで対応。
更に、F/Wダウンロード済みの場合は自F/W以外はスキップするようにして、複数のEZ-USBデバイスが接続されていてもそれなりに動作するように修正。
ホストアプリもUSBバージョンによって、バルク転送時のパケットサイズだけ意識してやれば問題なし。
一応、playxsvfとJTAGゴッコツールの両方で動作を確認。
F/Wだけはどうしようも無いので、別々に管理することになるけども。
Posted at 20:39 in embedded

Dec 13, 2006

FX2版JTAGプローブ

5月にEZ-USB(AN213x)で作ったJTAGプローブをFX2版で作り直し。
ファーム自体はそれほど変更無く移植でき、割とあっさり完成。 (今回もFenrirさんのサイトを参考にさせて頂きました)
クロックが倍になったのと、I/Oポートが内部メモリ領域にマップされたため、3倍速の性能が出た。

これだけあってもあんまり使い道が無いので、playxsvfをこのJTAGプローブ用に改修してみることに。
最初はport.cだけ修正し、動作することを確認。タップ操作ごとにバルクライトするので非常に遅い。(XC9572への書き込みに443秒)
チューニングしてなんとか29秒まで短縮できたものの、パラレルポート経由の17秒には及ばず。
まあ、USB経由で書き込みが出来るメリットの方が大きいので、良しとしよう。
Posted at 18:41 in embedded

Jul 19, 2006

AVR uIP on ATmega128

Optimize氏のSPIイーサネットモジュールを入手したので、遊んでみた。
まずはお手本どおりmega168でやってみたものの、メモリが少なすぎて面白くないので、買ったまま放置してあったmega128にメモリ増設をして再挑戦。
ベースをuIP0.6からuIP0.9に変更し、Webサーバのサンプルを動作させることが目標。
uIPの使い方自体が非常に簡単なのと、すでにENC28J60のドライバがあるので、ビルドはすんなりと出来た。
しかし、ブラウザからアクセスしてみると応答なし。pingの応答はあるので、動作しているはず。
仕方がないので、Wireshark(旧ethereal)にてパケットキャプチャとデバッグコードを埋め込んでシリアルポートからモニタリングを実施。
perlスクリプトからリクエストを投げて実験してみると、パケットサイズが240バイト位までであれば応答を返すことが判明。それ以上だと、ACKすら返さないので、送信側が再送を繰り返していた。
結局はenc28j60.hに定義してあったMAX_FRAMELEN(イーサネットフレーム長)が300に設定されていることが原因。これを1518に設定することで解決。
さて、これで何を作るかな。
Posted at 23:38 in embedded

ATmega128と増設メモリ

SPIイーサネットモジュールで遊ぶために、ATmega128にメモリ増設をしてみる。
データシートによれば、データバスとアドレスバスの下位8bitは共通で、ラッチを使って実装せよとのこと。AVRは高速に動作するため、74HCシリーズでは遅くて使えないよという注記あり。
そもそも、手元にあるメモリで16MHz(62.5ns)でアクセスできるものもほとんど無いなあと思ってパーツボックスを物色していると、486マザーに搭載されていた2次キャッシュ用SRAM(15ns)を発見。容量も丁度512kbit(64KB)。とっておいて良かった。
で、ラッチは74VHC573を購入。これならば5nsで動作可能なので問題なし。
回路が決まれば、あとは淡々と半田付け。せっかく多ピンのAVRなのにメモリ接続に食われる(19pin!!)とほとんど使えないのね。

さて動作確認という段階でライタで認識されないという問題に直面。配線間違いなのかとためしにJTAG接続でIDCODEやらシグネチャバイトやらを取得すると正常に動作している模様。
データシートをもう一度見直していると、なんとmega128はISP用のピンがSPIではなく、PD0/PD1を使うとの記述が。今まで使っていたAVRは皆SPIと共用だったので、なんの疑いも持たずに配線していたが、ちゃんと確認しないとイカンですね(フューズビットの出荷時の状態ではmega103互換モードというところは気付いて注意していたんだけどね)。
配線を直して、メモリチェック用プログラムを稼動。問題無いことを確認。
ハードが完成したので、次はソフト。uIPで遊ぶことにしたが、ここでまたしても問題発生。アセンブラで書いていたときには問題なかったXMEMのハンドリングがCでは困難に。
具体的には、
  • dataセクションの開始アドレスの設定方法がわからない。
  • スタートアップルーチン内で、プログラムメモリからデータメモリへの転送がされるため、それより前にXMEMを有効化しなければならない。
の2点。
1点目は、gccの引数でldのオプションが指定出来るので、これを利用し、"-Wl,-Tdata,0x801100"としてみるが、gccが先に標準値を指定してしまうため、効かない。(ldは同じオプションを複数指定した場合、最後に指定したオプションを生かすのではなく、無視してしまう)
仕方が無いので、gccに頼らず、ldを直接起動して必要な引数を指定することで回避した。
2点目は、スタートアップルーチンのソースを修正し、データコピーをする前にXMEMを有効化するようにした。
(ちなみに、スタートアップルーチンのソースはavr-libcに含まれるので、これを展開すれば入手可能)
小規模組み込み環境でもCでプログラムを書けるようになったのは良いことなんだけれども、小回り効かすのは大変ですな。

Posted at 22:09 in embedded

Jun 29, 2006

TD4モニタ

TD4実行中のアドレス等の値を表示するモニタを作成。
H8/3694 + LCDとCPLD + 7セグLEDの2パターンを検討したが、 I/O数も多いのでとりあえずCPLDで実装することに。
初VHDLコーディングだったものの、トラ技2006/5の電卓を参考に なんとか完成にこぎつけた。
XC9572は内蔵クロックが無いので、外部クロックが必要なのだけれども、 手元にあるクロックオシレータで最低のものでも14.318MHz。 面白半分でそのままつなげてみたらまともに点灯しなかった(当然)。
見よう見まねで、分周ロジックを記述し、ひとまずは動作を確認。 こんなに簡単に書けてしまうものかと関心。

Posted at 23:34 in embedded