2009年5月 3日 (日)

HDDインジケーター

ゴールデンウィークである。
本日付けの記事は、4月上旬の出来事を思い出しながら書いている。で、やっとここからゴールデンウィークの出来事を書く。今までのは全部前振り。

何か、電子工作的な事をしたい。仕事ではC#だのASP.netだの使っていたので、是非とも連休にはAVRでアセンブリを書きたい!半田付けしてチープな回路を作りたい!
で、思いついたのが新調したPCのHDDインジケータ。ケースにはHDD用のLEDが付いているのだが、1個のLEDをチカチカさせるんじゃなく、複数のLED連続してチカチカさせたい。HDDのロードゲージ見たいのを作ろうと思う。

作るものはこうだ。
Tiny2313のPB0~PB7にLEDを8こ繋ぎ、フォトカプラを介してマザーボードのHDD_LEDのピンヘッダをPD6に繋ぐ。タイマ割り込みでPD6を定周期で監視して、LEDの点灯制御を行う。HDDのアクセスが連続して検出される場合、それに応じて複数のLEDを点灯させる。

幸い、部品は手持ちのストックで賄えそうだ。
早速、AVR Studioを立ち上げファームを書く。シミュレータで動作を確認、うまく動きそうだ。今回は思いつきで始めたので、手順を深く考えていない。思いつきでガンガン作業を進めることにする。

取り敢えず、次はPCケースの前面パネルを分解して、LEDの配置を考える。

2009050307  

 

 

 

 

 

 

 

 

 

 

 

 
ファンがむき出しの状態のケースも、サイバーな感じで何かカッコいいかもと思いつつ、パネルのLED配置を決める。

2009050308

 

 

 

 

 

 

 

吸気用の穴にLEDを突っ込んで見たら、ぴったりのサイズだったので、裏側からホットボンドで止めてみた。

2009050309  

 

 

 

 

 

 

LEDにフラットケーブルを半田付けし、熱収縮チューブで処理する。めんどくさ。
ユニバーサル基盤にTiny2313を配置、適時配線する。回路が単純なので、回路図も配線図も書いていない。

2009050310 

 

 

 

 

 

 

電源はマザーボードで未使用のUSB用ピンヘッダから頂戴する。これをケースに固定する。

2009050311  

 

 

 

 

 

 

この状態で動作チェック。おお!ちゃんと動いてる。実際の動作をみてLEDの点灯タイミングを修正する。

2009050312  

 

 

 

 

 

 

 

 

 

 

 

 
ここまで、まる1日かけて完成。
LEDが流れる様に点灯する。ギャラクティカのサイロンみたいでカッコいい。

回路図,ドキュメント類は書いていないが、ソースを見たい人はこちら

回路図描きました。

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

2008年8月17日 (日)

USB応用

パフォーマンス・インジケーター その4

お盆も終わった。
会社も今週は夏休みである。が、会社のイントラネット上にある
出勤簿を見ると、何かみんな出勤になってる。
おっかしいなぁ~?

まあ、日本の零細企業の下層技術者の待遇なんてそんなもんか。

で、ペンディング状態になっていたAVRでCPUゲージであるが、
細部のすり合わせと、おざなりではあるがドキュメントを書いて
完結とする。
これを作成する事で、色々と調べたり理解したりした事も多いが、
後日まとめたいと思う。
Piavr06_2  

 

 

 

 

 

 

 
ダウンロード 

  次もUSBデバイスを作る。つもり・・・である。

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

2008年7月28日 (月)

USB応用

パフォーマンス・インジケーター その2

驚いた事にまたヤフオクにBeBoxが出品されている!
幻のマシンだと思っていたのに、そんなにタマ数があるのかい?
当然、先週とは別の方が出品されているのだが、あるところにあ
るもんだ。ただ、スタート価格が6万円なんでやはり手が出ない。
2週連続で指を銜えるはめになるとは思わなかった。

BeBoxほしいな~。

さて、AVRでCPUゲージであるが、土日を利用してファームと
デバイスドライバを書いてみた。

AVRのプログラムとなるファームは、昨年作ったUSBCOMIOを
流用し、LED制御を組み込んで見た。肝となるのが、4つのI/O
ピンを使用して10個のLEDを制御する所だが、これはMicrochip社
にあるアプリケーションノートTB023を参考にしている。ダイナミック
点灯させて、見かけ上同時に複数のLEDが灯っているようにしてみた。

デバイスドライバは新規に書いて見た。USBCOMIOとは違い仮想
COMのフィルタが必要ないので、煩雑なI/Oコントロールが無い分
コンパクトに仕上がった。
にしても、カーネルモードプログラミングは驚きに満ちている。
単純なバグでタスクマネージャーからも終了できないプロセスを
作り出したり、時計が止まるほどのパーフェクトなハングアップを
作ったり、自由自在である。もちろんブルースクリーンも簡単に
引き出せる。

ほんとに単純なミスなんだけどなぁ。

解ってしまえばあっけないバグを修正しつつ、デバイスドライバ完成。
テストアプリケーションを書いて動作を確認。

Piavr03  

 

 

 

 

 

 

ちゃんと動作している見たい。
次はWindows上の常駐アプリケーションだ。

今回、昨年書いたUSBCOMIOのコードを久しぶりに読んだが
なんかコードが汚い、よくこんなもんを公開してたもんだと
思わず赤面!公開した事に後悔する。(オヤジギャグ)

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

2008年7月26日 (土)

USB応用

パフォーマンス・インジケーター その1

ヤフオクにて発見!
かつて憧れだったBeBoX!!
PPC603eをデュアルで搭載、正真正銘マルチメディアOS搭載。
ユーザーインターフェイスも筐体のデザインも、とってもイカす。
ずっとウォッチしてたんだが、最終的に価格は99,000円まで高騰。

流石に手が出ないなぁ~。

泣く泣く入札を見送る事に。中古コンピュータに10万円なんぞ払え
る訳が無い。何年か振りに、指をくわえて(オークションページの)
BeBoxを眺める事になった。
筐体の左右にLEDが並んでいて、チカチカと2つのCPUの稼働率を
表示している様がカッコいいんだよなぁ。と実物を見た事はないが、
BeBoxの代表的なギミックCPUゲージに思いを馳せる。

BeBoXは手に入らなかったが、このCPUゲージ電子工作の題材とし
ては、お手軽でいいかも知れない。WindowsマシンのCPUゲージを
AVRでもって作ってみようと思う。

Windowsマシンの場合CPU使用率はPDHと呼ばれるAPIで得られる
らしい。パフォーマンスモニタで表示されるヤツだ。PDHならCPU以外
にもディスクやメモリの使用量も得られる。
そこで、Windows上で動作する常駐アプリでCPU使用率を取得し、
AVRで作成したLED表示器を制御する。これらの装置間IFはUSBを
使う。作成するものは以下の通り。

  • AVRを使ったLED表示器。PCからの制御はUSBで行う。
  • Windowsで動作し、LED表示器を制御する常駐アプリケーション。
  • IFとしてUSBを使用するので、専用のデバイスドライバ。

LED表示器のファームウェアやWindowsのデバイスドライバは、
USBCOMIOを流用改造する。WindowsアプリケーションはMFCを
使ってお手軽に作ってみる事にする。それぞれの作業は大した
事はないが、AVRのファームはアセンブリ言語、デバイスドライバ
はC言語、WindowsアプリはC++言語という夢の言語コンボを味
わえる。

う~ん。

開発環境も、フレームワークもそれぞれバラバラ。
取り敢えずLED表示器のハードウェアから手を付ける事にする。

で、ちゃちゃっとレイアウトをでっち上げて、作ったのがこれ。

Piavrcircuit02

Piavr01 Piavr02

 

 

 

 

 

 

 
うぅっ!2箇所LEDの極性を間違えた。
幸いソフトで何となりそう。でも、美しくないなぁ。

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

2007年10月21日 (日)

USB入門

USBCOMIO

最初は日々色々な事を書き綴ろうと始めたブログだが、このブログなんか電子工作ブログになってしまった感がある。結果、その筋のネタがないと書き込むべき記事が無くて、更新する気が起きなくなる。

いかん。

で、昨年からだらだらと続けている"AVRでUSB"であるが、最近
http://hp.vector.co.jp/authors/VA000177/html/FrontPage.html
AVRUSBEasyLoggerというのを知る。

これが凄い!何が凄いかと言うと、内蔵CR発振源のクロックで動作するUSBファームを書き上げている。実際ロースピードのUSBパケット1つを拾うのに必要な精度を以前計算した事があるが、とてもCR発振源では必要精度を満足させる事は出来ない気がする。
実際セラロックを使ってUSBファームを書いて見たが、特定のハードウェアではうまく動作しなかった。大半のマシンでは動作するのが、PCIバスに挿したUSB拡張カードでは不安定で認識にしくじる事がある。やっぱりクリスタルは必須かと思っていたが、そこに、

「内蔵CR発振源!?」

である。早速ソースコードを読んで見る。

「なるほど!やられた。」

物凄い衝撃を受けた。脳天に特大の金たらいが落下したくらいの衝撃!正直妬ましいくらいのアイディア。

簡単に説明すると、私のシステムの場合20MHzのセラロックを発信源に使っている。この場合、ロースピード1.5MHzのパケットを送受信するには、1ビットを13.333・・・クロックのタイミングでサンプリングする必要がある。

Bitsamp1

 

 

 

ただし、AVRで少数を含む数値をカウント出来ないので、3ビットサンプリングする毎に13,13,14クロックでサンプリングすれば、小数部の誤差をカバー出来る。
この方法で、20MHzの発信源を使ったAVRでも1.5MHzで作動するパケットを送受信できるが、1パケット送受信する間サンプリングするタイミングがきちんと拾うビットの遷移期間に収まっている精度が発信源に求められる。セラロックでは非常に微妙だ。

そこにCR発信源である。どう考えても必要精度を満たしていない気がするし、実際満たしていない。で、EasyLoggerでは何をやっているかと言うと、NRZIのビット挿入を省いた8ビット分(つまり1バイト)をサンプリングするために、必要なクロックより少ないクロックでサンプリングするループを組む。必然的にサンプリングタイミングは前方にずれる事になる。
そこで、各ビットをサンプリングする際、ビットの遷移期間の前方境界直後とビットの中央部をサンプリングして、この値が異なればサンプリングタイミングを後ろにずらすという方法で同期を取っている。

Bitsamp2  

 

 

連続するビットが同じ値だと同期のずれを検出出来ないが、データはNRZIで符号化されていて、6ビット以上同じ値が続く事は無く、この方法は有効である。

「凄いわ。このコード」

このコードを読んで一気に発奮!同期補正を行うコードを組み込んで見る。
動作原理はこうだ。8ビット(1バイト)を1つのループで組み、各ビットを14,13,13,14,13,13,14クロックの周期でサンプリングする。これだと1バイトサンプリングする毎に0.333・・・クロック分サンプリングタイミングが後ろにずれる事になる。
そこで、1ビットサンプリングする際にビット中央部と後方境界を比較し同期を補正する。この方法で同期補正のついでに、0.333・・・のクロック誤差も補正する。

Bitsamp3  

 

 

この方法でファームを書いてテスト。

「おおぉ。認識する!」

今まで接続が不安定だったPCとでも、安定して通信できる。
気を良くしたので、一気にWindows側のドライバも書き上げて見る。
出来上がったのがこれ。

Avrusbcomio01 

 

 

 

 

 

  Avrusbcomio02  

 

 

 

 

 

 

 
AVR Tiny2313を使った汎用I/O。WindowsからはCOMポートとして見えるので、シリアル通信を行うアプリケーションからAVR Tiny2313のポートBを操作出来る。
senshuさんから紹介してもらったキットを参考にして、ブレッドボードに挿せるようにして見た。

Avrusbcomio03  

 

 

 

 

 

 

ブレッドボード上で実験。うまく動作しているようだ。
取り掛かってから約1年掛かったが、何とかAVRでUSBデバイスを作る事が出来た。
一応「車輪の再発明」完結。

AVR Tiny2313 USB 汎用 I/O:ダウンロード

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

2007年6月19日 (火)

USB入門

COMデバイス

ポチポチと Tiny2313 USB ファームの Windows ドライバを書いている。前回は(と言っても1月以上前になってしまったが)ほとんど「WindowsXPデバイスドライバプログラミング」のサンプル通りテストドライバを書いて見き動作を確認して見た。が、サンプル通りのコードを書いて見ても、今ひとつ WDM を自分の物にした気がしない。なので、1から自分で設計してみたい。

Usb04

 

 

 

 

 

 

 

 
作る物は Tiny2313 のBポートを USB を通して PC から入出力出する汎用 I/O みたいな物を作って見ようと思う。アプリケーションから WriteFile で出力した内容を Tiny2313のBポートに出力し、Bポートの内容を ReadFile で読み出す事が出来るシステム。
たったこれだけの事なのだが、実装を考えると意外とめんどくさい。まず、Write/Read するにはデバイスのハンドルを得る必要があり、ハンドルを得るにはデバイス名を指定して CreateFile を実行する必要がある。USB の様に同一デバイスが同時に接続される場合、デバイス名の重複やそれぞれの識別を考慮する必要がある。一般的には GUID を用いて、Windows側でデバイス名を作成し、アプリケーション側はこの GUID を用いてデバイス名に辿り着くコードを書く。

が、自分で書いてて何がなにやらよく解んない。

UUSBD や USBLIB などの汎用 USB デバイスドライバは、専用ライブラリを用意して、アプリケーション側でこのライブラリをリンクする事で、めんどくさそうなデバイス名の取得の問題を解決している。流石です。

が、もう少し簡単にデバイス名を取得できる方法を泥臭く考えて見る。
仮想COMデバイスである。かなりレガシーだし、アプリケーション側からどの COM?? なのか判別する方法はないが、GUID からデバイス名を生成するよりは簡単な気がする。

ということで、デバイスオブジェクトに COM ポートへのシンボリックリンクを張る方法を調べる。INF ファイルにデバイスをポートクラスとして記述する。この INF ファイルでデバイスをインストールするとレジストリのハードウェアキーに COM 名が作成されるので、この名前をこのデバイスオブジェクトの物理デバイスオブジェクトにリンクする。あとは、レジストリの

\HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOM

にデバイス名をキーとして、COM 名を登録すればいいらしい。

Usb05  

 

 

 

 

 

 

 
取り敢えず COM デバイスとして認識したようだ。
実際の Read/Write ルーチンはこれから書くよー。 

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

2007年5月 8日 (火)

USB入門

CRC16

AVR Tiny2313でUSBデバイスは出来ている。そこで、こいつを使う
ための Windows用デバイスドライバを書かないといけないのだが、
何分素人なんで、デバイスドライバプログラミングなんてやった事が
ない。

解説書として「WindowsXPデバイスドライバプログラミング[入門と
実践]浜田憲一郎著」を用意した。私の様な素人さんにも解りやす
いらしい。

毎度の事ながら、解説書を読む。
毎度の事ながら、

うぅ~っ、わかんね。

なので、
毎度の事ながら、解説書を何回も読む。
という「毎度の事」を繰り返し、何とか

うっすら分かって来ましたよーっ!

で、うっすらUSBデバイスドライバを書いて見る。何とか認識されて、
Tiny2313のソフトで書かれたエンドポイントに対し送信。

うっすら受信出来ましたよーっ!

とりあえずUSBの通信は成功したが、さすがにTiny2313のメモリ
容量/スペックではUSBを実装するだけで、リソースをの殆どを
使い切っていてるし、所詮ロースピードデバイス。機能もうっすら。

これで何が作れるか、うっすら考えてみよう。

話は変わるが、USBのCRC計算法をググったあげく、当ブログに辿り
着いてしまった、というお気の毒な方がいらっしゃっる様なので、
私の付け焼刃の知識を恥ずかしながら披露する。

"HERO'S Download"から"AVRusb.ZIP"をダウンロード出来る。
この中にUSBの詳しいドキュメントがある。
USBのCRC16を計算するには「ハードウェアCRC16計算回路」
("USBspcs.pdf"に載っている)をエミュレートする。

Cで書くとこんな感じ

WORD UsbCrc16( int count, unsigned char *data )
{
    int      i, j;
    WORD crc = 0xffff;

    for( i = 0; i < count; i++ )
    {
        for( j = 0; j < 8; j++ )
        {
            if( crc & 0x0001 )
                data[ i ] ^= 0x01;

            crc >>= 1;

            if( data[ i ] & 0x01 )
                crc ^=0xA001;

            data[ i ] >>= 1;
        }
    }
    crc ^=0xffff;
    return crc;
}

引数dataがデータの配列、countがデータ数で、戻り値が求めたCRC。

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

2007年4月23日 (月)

USB入門

USBデバイスを作る6

久々の記事だがやってる事は変わらない。多少人生観は変わった
気もするが、行いが進歩する程の事でもなかったらしい。

なので、昨年の続きをやる。

Mega88でUSBロースピードデバイスのファームをでっち上げて、
Windowsから認識させる事が出来た。何とか。
そこで、自作デバイスドライバをスクラッチビルドしようと思うの
だが、その前に、実験用基板を作って見た。

Mega88は別の物を作るのに使ってしまったので、格安Tiny2313を
使用した。電源はUSBバスから三端子レギュレータで降圧した3.3V
を使う。クロック源は20MHzのセラロック。あとデバッグ出力用に
ADM3202ANを付けた。
さっそく、Mega88のコードをTiny2313用にコンバート。

げっ、フラッシュメモリの残りが数10ワード!

USBのファームだけで、ほぼプログラムメモリ満載。
こんなファームでなにか面白い物がつくれるのだろうか?

0704230001

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

2006年12月21日 (木)

USB入門

USBデバイスを作る5

Usb03

 

 

 

エニュメレーション成功。何とか、辛うじて。

AVRでUSBデバイスを作ろうとしてから2月、やっとPCから
USBデバイスとして認識させる事が出来た。
USBの場合電気的なインターフェイス/プロトコルを実装し
ても、その上層のUSBプロトコルを実装しない限りPCとの
通信は出来ない。

いやぁ、悩ませて貰いました。

ハマッた所

  標準デバイスリクエストのSET_ADDRESを受け取っ
  ても、すぐにアドレスを変更してはいけない。
            ↓
  その後に続くシェイクハンド用入力指示PIDを受信
  出来なくなる。

  CRCの計算はハードウェア計算回路をエミュレート
  する。
            ↓
  良く見ると一般的なCRC計算とちょっと違う。

  GET_DESCRIPTORの前に大量の入力指示PIDを受信
  しても驚かない。
            ↓
  それは、同じロースピードデバイスであるマウスや
  キーボードの為のもの。ちゃんと自アドレスに向け
  てのパケットか確認する。

  バッファが空いているからといって、むやみにデータ
  パケットを受信し、ACKを勝手に返してはいけない。
            ↓
  データパケットはシェイクハンドにも用いられるので、
  得られるはずのデータパケットを受け損なう可能性大。

ほかにも色々あったが、どれもきちんとUSBプロトコルを
理解していないのが一番の原因だった。

時間は掛かったがなんとか動いた。よかった。
やって見れば出来るもんだと、一人で勝手に感動。

しかしAVRって凄い。20MHzのセラロックと抵抗3本だけで、
USBデバイスが出来るかもしれない。しかも、リアルタイムに
データをNRZI変調して送信。受信側もNRZIから復号しながら
データを取り込む(挿入ビットの削除までは出来なかった)
事が出来だけのパワーを持っている。PICでは無理だ。

さて、USBデバイスとして認識させることは出来たが、これだ
けではPCと任意の通信はできない。PC上のドライバが必要
だ。なので、次はデバイスドライバーを書いてみようと思う。
が、デバイスドライバーを書いた経験は無い。いつもの事だ
が出来るかどうか分からないが、取り敢えずやってみよう。

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

2006年11月 1日 (水)

USB入門

USBデバイスを作る3

AVRでUSBホストからのパケットを受信する事が出来たので、
次は送信部のコードといきたいところだが、その前に少し下準備
をする。

USBでは受信したパケットの誤りを検出するためCRCが用いられ
る。そこで用意したパケットに添付すべく、CRCを計算する必要が
ある。また、実際のUSBの信号線には、NRZIという方法で符号化
したデータが流れている。これは、送受信器間で同期を失う事を
防ぐために0や1が連続して送信する事を抑制する働きをする。
なので、HEXデータ(Decimalで表記してもいいが・・・)をNRZIで符
号化する事も必要になる。

まず、CRC計算部だが、実の所このCRC計算法にしてもNZRIに
しても、今回USBを調べて始めて知り得たにわか知識なので、こ
れらの事を調べる事から始めなければいけない。

CRC計算ルーチンを書くにあたって計算法を調べてみた。幸い幾
つかの説明とサンプルコードを掲載しているサイトを見つける事が
できたので、早速コードを書いてみる。先日のパケット受信実験で
得られたデータパケットのCRCを実際に計算し、そのパケットに添
えられていたCRCを比較してみたが、値が一致しない。この事で2
晩程悩んだが、HEROさんの所の "AVRusb.ZIP" に含まれる資料
から "ハードウェアCRC16計算回路" を見て納得。計算方法が違って
いた。この回路をエミュレートする形で計算部を実装してみると、
うまく値が一致した。

次に、データをNRZI符号化するコードを考える。こちらはそんなに
難しくはないのだが、バイト単位のデータをビットの連続として捕ら
えなければならないので、実装がちょっとめんどくさい。また、1が
6ビット連続するデータを変換する場合1ビットの0を挿入するので、
変換後のデータは必ずしも8の倍数にならない。故に変換後の
データはバイト単位ではなくビット単位で管理する必要があり、
ここら辺の実装も幾らか煩雑になる気がする。これらを踏まえて実
際のコードを書く。

しかし、それなりに思い悩んだ末に書き上げたたコードなのに、
エディタ上で眺めてみると、思っていたほど高度に見えないのは
なんでだろう。

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

2006年10月27日 (金)

USB入門

USBデバイスを作る2

ちょっとだけUSBに対する知識を得ることが出来たので、AVRで
実験をしてみる。
USB2.0では3種類のデータ転送スピードがあり、ハイスピード/
フルスピード/ロースピードというふうに区別されていて、それぞれ
の転送スピードは480Mbps/12Mbps/1.5Mbpsと規定されている。
当然AVRを使ってソフトウェアだけで送受信出来る可能性のある
転送スピードはロースピード/1.5Mbpsに限られる。
そこで、ロースピードで送られてくるデータをAVRで受信して見る
事にする。

USBポートには4個の端子が在って、そのうち1本は5Vを供給する
事が出来るVBusで1本がグランド。残りの2本がデータを送受信する
為に使用するD+とD-という信号線になっている。ロースピードで信号
を送受信する為にはD-をプルアップすればいいらしい。
USBホスト側(つまりPC側)はD-がプルアップされているデバイスが
接続されると自動的にロースピードデバイスとして認識する。
そこで、小さく切った基板にUSBコネクタを配置し、D-側をプルアップ
して見た。

Usb02 

 

 

 

 

 

 

これをブレッドボード上のATMega88に接続する。他にAVRのTxD
とRxDにAMD3202を繋ぎRS232Cを経由してPC上でAVRをモニタ
する事にする。

USBホスト側では、USBポートにデバイスが接続されると、まずバス
リセットを行い、それからその接続されたデバイスが何物であるかを
知る為に、そのデバイスを定義しているディスクリプタを要求する。
この動作をエニュメレーションと呼ぶ。また、USBホストとデバイス間
ではパケットを送受信して通信を確立する。そこで、エニュメーレー
ション時にホスト側から送られてくるパケットをAVRで受信してみる。

1.5MHzのタイミングでUSBのD-を読むプログラムを書いて、パケット
を受信すると、

0x4E 0x55 0xA5
0x14 0xD5 0xA8 0xAA 0x55 0x55 0x55 0x95 x0AA 0xE1 0x26

というパケットを数組受信した。これはNRZIという方式で符号化され
ているので、この受信したパケットを復号すると。

0x2D 0x00 0x10
0xC3 0x80 0x06 0x00 0x01 0x00 0x00 0x40 0x00 0xDD 0x94

になり、これはホストがそのデバイスを定義するデバイスディスク
リプタを要求するパケットであることが解る。なんとか、書き上げ
たパケットの受信部は無事動作しているようだ。

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

2006年10月24日 (火)

USB入門

USBデバイスを作る1

CPA02とATmega88を使ってUSBテスト基板を作った時、プログラム
的にはUSBを意識しない(しなくてよい)構造だった。なので、猛烈に
USBを意識したプログラムを書きたい。しかし、

USBって何?

正直、どうやってUSBを使いPC-デバイス間で通信をする事が出来る
のか解らない。USBと言っても様々なデバイスがあるし、そもそも各
デバイスごとに、専用のデバイスドライバーを必要としている様に見
える。RS232Cみたいに単純じゃない事が予想される。
なので、幾つかの解説書買い、他にとトラ技の記事やWEB上の情報
を読んで見る。

いゃーわかんねー。

ある資料を読む→用語が解らないので別の資料を読む→
さらに解らない定義が見つかる→次の資料を読む→
またまた解らない実装を発見する→最初の資料に戻る

という循環を際限なく繰り返す。何分、夜間仕事を終えてからという
事なので、必然的にアルコールを摂取しながらなという事になり、
その進行スピードはのろい。アルコールを摂取するとモチベーショ
ンは向上するのだが、作業効率は格段に下がる。

Usb00  

 

 

 

 

 

 

買った書籍の一部。その価格とページ数に畏怖の念を抱きながら、
結局購入してしまった「WindowsXPデバイスドライバプログラミング」

こんな事を繰り返し、なんとかUSBを俯瞰出来る位置に立つことが
出来た(気がする)。細部は全然理解していないが、取り敢えず
AVRを使って実験しながらUSBを理解する事にする。

Usb01   

 

 

 

 

 

 

ATmega88を使ってUSBホストから送られるパケットを拾う実験

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

2006年10月 1日 (日)

AVRのためのPIC再入門

PICでAVRライタを作る12

AVRStudioがバージョンアップしたらしい。

AVRからライタを使う時、ライタのファームウェアのバージョンを
チェックして、適合したバージョンではない場合ファームウェアの
更新を促すダイアログが表示される。

当然16F648A-AVRライタは純正AVRISPではないので、AVRStudio
からファームウェアの更新は出来ない。毎回このダイアログが表示
されるのは煩わしいので、16F648A-AVRライタのバージョン番号の
応答を変更することにした。
ただし、毎回AVRStudioの適合ファーム番号が変更されるたび
PICのプログラムを再アセンブルして書き込むのは、なおさら煩わし
いので、ターミナルソフトからファームのバージョン番号を変更できる
ようにしてみた。

Hterm

 

 

 

 

 

 

ハイパーターミナルなどのソフトから操作する。
決して使い安くはないが、取り敢えず機能すると思う。
AVRStudio-Build497の場合、SoftwareMinorVersioを0x0Aに
すればいいらしい。

しかし、このライタのネタでこんなに記事を書くとは思ってな
かったなぁ。

ソースとHEXファイル ダウンロード

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

2006年9月26日 (火)

AVRのためのPIC再入門

PICでAVRライタを作る11

先週は16F648A-AVRライタをavrdudeに対応させるという事をやっ
ていた。ことの始まりは

ひとりぶろぐ

moyashjさんのブログで、Mac OSXでAVRプログラム開発環境を
整える記事。実のところ、このライタはそのままのavrdude5.1では
動作しない。少しばかり手直しする必要がある。

まず、avrdude-5.1のソースを入手する。"stk500v2.c"というファイル
がある筈なので、このファイルの567行目と1098行目の

"page_size = 256 "の部分を
"page_size = 128"に変更する。

そしてビルド。それと、PIC 16F648A側のプログラムも密かに更新
してあるので、これをPICプログラマで書き込む。

ソースとHEXファイル ダウンロード

これでavrdudeから使うことができる(と思う)。

ちなみに、私が試したcygwin1.5.21-1の環境でビルドすると、
"gettimeofday"という関数が重複していると怒られるので、
avrdude側のこの関数の定義と宣言をコメントアウトする必要が
あった。

このライタに興味を持ち、且つavrdudeで使いたいという奇特な
方のために(いないと思いますが)一応記しておこうと思う。

ということで、senshuさんmoyashiさんお世話様でした。

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

2006年9月 9日 (土)

でんし研

8日はTAD師匠のでんし研ネタ披露更新日。
今回は何をやられているのかと見に行くと

AVRで作るPIC Writer509

!!!

まいりました、流石です。

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

2006年9月 6日 (水)

USB入門

テスト基板

CPA02とATmega88を繋ぐ基板を作って見た。

Avrispmega8801  

 

 

 

 

 

 

然るべきピンを繋いだだけの回路。
CP2102のRxdとTxdをAVRのTxdとRxdに繋ぎ、AVRのI/Oピンに
LEDが付いているだけ。

早速テストプログラムを書いて見る。PCからCP2102への入出力は
仮想COMデバイスを通して行うので、CreateFileでCOMデバイスを
開き、この時取得したハンドルに対しリード・ライトを行うという、
お約束のコードを書く。AVR側はUSARTモジュールを初期設定し、
UDR0に対し読み・書きをするというコードになる。

これで動作する。簡単と言うか便利と言うか、動作する様子を見て
最初は喜んでいた。が、

なんか違う。

書いたのは単なるシリアル通信のプログラムだけで、USBを意識した
コードは1行も書いていない。そこはかとなく 「これじゃない」 感が
込み上げてくる。何かもっと、こう、USBに触れたい。

もうちょっと、USBを勉強してみよう。

でも、CP210Xは便利ですた。

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

2006年9月 2日 (土)

USB入門

CPA02

CP2102変換アダプタを買った。DIP20ピンに変換して
くれるやつ。

基板にCP2102は実装されているのだが、コンデンサと
接続ピンは別に用意しないといけない。そして、この接続
ピンがピンヘッダじゃ代用出来ないことを知る。

ウェブ上の写真で見る限り、手持ちの1列ピンヘッダを
付けとけばいいやと勝手に思いこんでいたが、実際に
ピンヘッダをICソケットに突っ込んでみると・・・・・・

太くて入りません。

改めて接続ピンを買いなおす羽目になった。

Avrispmega8800_1

 

 

 

 

 

 

 
CPA02とせっかくスタンバっていたのに無駄に終わったピンヘッダの記念写真

そう言えば、以前もピンソケットを持っていなかったので、
ICソケットで代用できないかと、ICソケットにピンヘッダを
突っ込んで、入らないという事を確認した記憶がある。
しかも、電子工作歴1年未満の私にとって、そう遠い
過去の話ではないはず。

記憶力がないのか。>オレ

そんなお猿さんなみの知能で、CPA02の使い道を考える
事にする。うっきー。

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

2006年8月30日 (水)

AVRのためのPIC再入門

PICでAVRライタを作る10

先日作ったPIC16F648A-AVRライタで、RS232Cコネクタを外して
いた場合、Rxdピン(PICから見た)が浮くと senshu さんより指摘を
頂いた。確かにコネクタを外した状態の事まで気が及ばなかった。
なるほど、言われて見れば至極ごもっとも。

いやー、勉強になります。師匠と呼ばせて貰ってもいいですか?

AVRISPの場合、決まった形式のチェックサム付のパケットを
送受信するので、不定のデータを受信しても、デコードの前に
チェックサムエラーではじかれるし、そもそもパケットの形式が
正しくなければバッファリングを開始しないと思うので、SPI周りの
誤動作は防げるとは思うが、指摘をうけてから回路図を見直して
みると、なにやら気持ち悪い回路に見えるから不思議。

そんな訳で、回路図を修正してみた。
これでいいでしょうか?> senshu さん

あと、16F648Aのデータシートの電源電圧と動作周波数の
グラフを読むと、20MHz動作させる場合、電源に4.5V以上が
必要な様なので、このライタではブラウンアウトリセットをオンに
している。そのため、3.3V系の電源では動作しない。
試しにこのコンフィグレーションビットをオフにして、3.3V電源で
動作させて見たところ、なんか動いちゃったのでそのまま、
HEXファイルを差し替えて見た。

やっぱりBORオンにしました。ソースは公開してありますので、
(いらっしゃらないと思いますが)試して見たい奇特な方は、
ソースコードを弄って下さい。

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

2006年8月11日 (金)

AVRのためのPIC再入門

PICでAVRライタを作る9

お盆休みに入る前に、ある程度仕事を片付けなければいけない
ので、ちょっとだけ今週は忙しかった。

前回作ったPIC12F683で動くAVRISP互換ライタで、90S1200Aに
書き込む事が出来なかった事が少し悔しかったので、
PIC16F648Aを使ってまたAVRライタを作ってみた。
16F648Aを使ったのは、たまたま余り物があった事と、12F683の
コードを移植すれば簡単に作れるだろうと思ったからだ。

16F648AはSRAMを256バイト積んでいるので、AVRStudioから
128バイト+のメッセージを送られて来ても、受け取る事が出来る
プログラムが書ける。

が、やはりPICなのでSRAMは複数のバンクに分かれているし、
アクセスするためのポインタ周りもかなり貧弱。
それと、12F683は8MHzで駆動する内部クロックを持っていたの
だが、16F648Aの内部クロックは4MHz。処理能力が足りない。
やっぱり簡単にはいかない。

Picavr05  

 

 

 

 

 

発振源は20MHzのセラロックを付けた。あと、I/Oピンが増えた
ので、SPIアクセス表示用にLEDを付けて見た。これで手持ちの
Tiny26, Mega48/88/168, 90S1200 のすべてに書き込む事が
出来る。

ソースとHEXファイル ダウンロード

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

2006年8月 3日 (木)

AVR入門

AT90S1200A

秋月電子で買い物。
と行っても通販だが、神奈川県南西部のはずれに住む私には、
秋葉原までの交通費や、時間、手間を考えると通販で部品を
送って貰えるのは、大変ありがたい。

が、本当は数百円の部品が欲しかっただけなのに、送料/代引き
手数料が800円掛かるのがもったいなくて、せっかくならと
つい余分な部品を注文しがちになる。

今回は RTC \500 が欲しかったのだが、500円に送料/手数料
800円を払うのはいやなので、多分いつか使う日も来るだろうと、
2SC1815やコネクタの類や、その他の物と、AT90S1200Aも
買ってしまった。

20060803_1  

 

 

 

 

 

 

AT90S1200Aを買ったのは、先日作った PIC-AVRライタで
書き込めるかどうかのテストをして見たかったという事もある。

AVRStudioからAVRISPにどの様なコマンドが送られるかは、
各デバイスのXMLファイルに書かれていて、AT90S1200の場合
フラッシュメモリ書き込みは、

"ワード書き込み・1回のデータ転送量128バイト"

と言うことが読み取れる。なので、PIC-AVRライタの80バイトの
メッセージバッファでは、書き込みデータを受け取る事が出来ない
と言うことが解る。

実際にやって見ると、実際に書き込めない。
バッファオーバーでエラーが出る。自分で作っていて解っているが、
実際に起きると悲しい。メモリの大きいデバイスで大半のAVRを
書き込めるライタを作りたい衝動に駆られるが、その前に RTC を
ちょっといじってみたい。

ちなみに、PIC-AVRライタでAT90S1200AのEEPROMには書き込み
が出来た。ちょっとうれしい。

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

2006年7月31日 (月)

AVRのためのPIC再入門

PICでAVRライタを作る8

ブレッドボード上のPICのプログラムの作成が終わったので、
ユニバーサル基板に移し変えようと思う。

PCBEで実際の配線を考える。部品は8ピンのPIC、Dsub9ピン
コネクタ、ISPコネクタ、2本の抵抗とコンデンサ。この程度
楽勝、と良く考えずに配線を決め、小さく切った基板にハンダ
付けをする。一応ICソケットにPICを差し込む前に配線確認

をぉ?MISOとMOSIの接続が逆になってる。

GP3にMOSIが繋がっている。これはマズイ。GP3は入力専用で
出力に設定出来ない。一番近いコネクタとI/Oピンを接続して、
プログラム側でピンアサインを変更すればいいと思い、適当に
配線を決めたのがいけなかった。

以前も同じミスをやってたなぁ>自分

もう一度PCBEを起動して、最小の配線替えで出来る修正法を
考える。AVRならどのピンも入出力を切り替える事が出来るので、
この程度の失敗ソフト側でリカバー出来るんだが。

PICってやつぁ

と自分の失敗を棚に上げて思う、悪いのは自分だけれども。
基板を修正しMega48に書き込めるかテスト。無事動作を確認した
ので、PICで動くAVRISP互換ライタは完成とする。

Picavr04  

 

 

 

 

 

ソースとHEXファイル ダウンロード

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

2006年7月28日 (金)

AVRのためのPIC再入門

PICでAVRライタを作る7

一通りAVRISPもどきとしての機能を実装したので、前々から
やってみたかった抵抗2本のレベル変換をやってみる。

PIC-AVRライタを作るに当たって、PCとPIC間でシリアル通信を
行うのに ADM3203 を介してレベル変換を行っていたのだが、
PICの保護用クランプダイオード頼りの、抵抗のみのレベル
変換を試そうと思う。

取り敢えず、正論理で行っていたシリアル通信部のコードを
正/負論理が切り替えられるような、マクロを書き修正する。
抵抗値をどうしようかと考えたが、TADさんのでんし研DUAL
ライタを作ったときに買った100本100円の47KΩと330Ωを
使う事にした。

早速ブレッドボード上に抵抗を配置、DSub9ピンのコネクタを
接続してみた。8ピンのPIC1個と抵抗2本だけの冗談の様な
回路だが、AVRISP(互換)としてちゃんと動いている。

Picavr03  

 

 

 

 

 

 

秋月電子のUSB変換ケーブルで動作中のAVRISP互換
PICで動くAVRライタ図

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

2006年7月27日 (木)

AVRのためのPIC再入門

PICでAVRライタを作る6

AVRISP互換PIC-AVRライタで実装しなければいけないのは
残るところフラッシュメモリ/EEPROMの読み出しだけになった。

つくり始めの頃は「よぐわがんね」だったAVR068も、何度も読ん
だり、コマンド処理ルーチンを書いたりしている内に、大分理解
出来るようになったので、チャチャッとフラッシュメモリ/EEPROM
読み出し部書いてみよう。

AVRISPの場合、PCから送られてくるメッセージを受信して、
このメッセージに含まれるコマンドを実行し、成否を返答
メッセージとしてPCに送信する事で、コミュニケーションが
成り立っている。なので、必然的にプログラムは

メッセージをバッファに受信する
         ↓
コマンドを実行し、結果をバッファに書き出す
         ↓
バッファの内容を応答メッセージに整え送信する

という構造を成していて、いままで所はこれでうまくいっている。
しかし、フラッシュメモリ/EEPROM読み出し命令では、最大
256バイト分の読み出しデータをいっぺんに送らなければいけ
ないので、12F683で確保した80バイトのバッファ容量では不足
する。

なので、この命令に対する処理だけ、バッファリングしないで、
AVRから読み出したデータをいきなりPCに送信する事にした。
プログラム的に統一感が損なわれるので、なんか美しくない。

それでも、コードをゴリゴリと書き上げる。

一応完成。テストもうまく行っているみたい。
あと、作成中気になっていた部分を修正し、書き込み部を
チューニングして少しだけ書き込みスピードを上げた。

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

2006年7月25日 (火)

AVRのためのPIC再入門

PICでAVRライタを作る5

いよいよ、フラッシュメモリ書き込み部を作る。

AVRシリアルプログラミング自体を良く理解しない内に作り始めてし
まったのたが、ここに来て問題発生。

一概にAVRISPといっても、フラッシュ/EEPROMの書き込み方法は、
各デバイスによって異なるらしい。どうも、最近のモデルはページ
書き込みといって、内部バッファにメモリイメージを設定しておいて、
ページ単位で一気に書き込むらしい。また、このページのサイズも
デバイスによって異なる。フラッシュメモリの大きい奴はページサイ
ズもでかい。

フラッシュメモリ書き込み時には、このページサイズ分のデータが
送られてくるのだが、12F683のメモリ容量ではページサイズが
大きい場合、収まり切らないかも知れない。
12F683は128バイトのSRAMを持っているのだが、リニアに繋
がっていない。96バイトと32バイトを2つのバンクに分けて実装
している。また、0バンク目の96バイト中最上位16バイトは
各バンクでシェア出来るちょいと特別な領域になっている。
実質的にリニアにアクセスできるバッファの最大サイズは
80バイト程しか確保できない。

Mega168は1つのページサイズが64ワード(128バイト)のサイズを
持っているので、80バイトのバッファでは受け取る事ができない。
もっとも、SRAMの全てをバッファに出来たとしても、全容量
128バイトでは結局足りないのだが。

幸い手持ちのMega88/48とTiny26は対応できそうなので、
このライタでMega168を使う事は、あきらめる事にする。

気を取り直して、フラッシュ/EEPROM書き込み部を書く。
各種様々な書き込み方法や検査方法、フラッシュ/EEPROMの
違いを網羅しながら、1つのエントリーポイントに収める。
さすがに、込み入ったコードになってしまったので、後々の為に
大量のコメント入れる。

ブレッドボード上に12F683と仲良く並ぶTiny26をターゲットに実験。
フラッシュメモリ、EEPROMともに無事書き込めている様だ。

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

2006年7月21日 (金)

AVRのためのPIC再入門

PICでAVRライタを作る4

なんとか、AVRStudioから認識させる事ができたので、
各種命令に対する実行部をゴリゴリと書く。

一般命令に対する処理を書き上げ、ISPプログラミング命令の動作
を書き始めたところ、ISPプログミング動作移行命令の処理で
ハマる。PCから該当命令を送信するプログラムを書いて、テストする
ときちんと動作する様に見えるのだが、AVRStudioから操作すると
なぜかフェイルするというバグに悩まされる。

答えはディレイルーチンのバグにあった。
ISPプログラミング動作移行命令には多くの引数があるのだが、
この中にbyteDelayという、SPIで送受信する各バイトデータ間の
時間的間隔を定義する引数がある。テストプログラムでは適当に
5msを与えていたのだが、AVRStudioからの呼び出しでは、この
値が0msになっていた。

実際に実装したディレイルーチンでは、桁を間違えていただけで
無く、入力値が0の場合256値として働いていた。つまり1バイトを
送受信した後、0ミリ秒待機する事を期待されていたのに、2.56秒も
待機していたのでタイムアウトを喰らっていたようだ。

早速、この部分を修正して無事動作を確認。
ついで、ヒューズ/ロックビットの読み書き、識票/発振校正値の読み
出し部分を書く。

ヒューズ/ロックビットを操作出来るようになった。

Picavr2

 

 

 

 

 

 

 

 
ブレッドボード上で健気にAVRISPのフリをする12F683と、
ターゲットのTiny26

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

2006年7月19日 (水)

AVRのためのPIC再入門

PICでAVRライタを作る3

AVRISPコミュニケーションプロトコルVer.2の実装を考える。
HEROさん訳のAVR068を読む。

んー、よぐわがんね。

なので、何度も読む。取り敢えずPCとのやり取りをパケットの送
受信で行うという事は解った。パケットの構造は、0x1Bを先頭に
シーケンス番号、ボディ部のサイズ(2バイト)、トークン(0x0E)、
ボディ部本体と続き、最後にすべてのデータとの排他論理和の
チェックサムが続く。
実際の操作命令や応答はボディ部に埋め込まれ送られる。

よくわからないが、作って見ないことには理解が進まないので、
パケットの送受信部を書いて見る。

MPLAB上のシミュレータで動作を確認。うまく動いているような
ので、CMD_SIGN_ONの応答と、いくつかのコマンドに対する処理を
書いて、AVRStudioから接続して見る。

Picavr1  

 

 

 

 

 

 

 

 
おお、認識した。

ファームやハード/ソフトのバージョン取得に対する応答を
まだ、書いていないので、
"Getting revisions.. FAILED!"
になっている。まだまだ先は長い。

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

2006年7月17日 (月)

AVRのためのPIC再入門

PICでAVRライタを作る2

AVRのISPはSPIというシリアル通信でプログラムやデータを
読み書きするらしい。正直、SPIというものを今まで知ら
なかった。ので、まずSPIそのものを理解するところから始める。

AVRのドキュメントやトラ技の記事やそのサンプルコードを読む。
どうやら、2つのデバイスの8ビットレジスタを繋げて、8回分
ローテーションすると、互いのレジスタの内容が入れ替わる。
つまり、1バイト分の送受信をいっぺんに行ってしまう方式
らしい。なるほど、なんか凄い。

実際にPIC上での実装を考える。当然、12F683はSPIモジュール
を持っていないので、すぺてソフトウェアで行う必要がある。
頭の中で、GPIOの操作やSCKの周期をどうするかを悩む。

ここまで、自分としては結構な作業量なのだが、
実際にコードにしてみると、

                                                                                        

transferByteSpi
        movlw   8
        movwf   SpiTransBit
        clrf    TMR2
        bcf     PIR1, TMR2IF
        bsf     T2CON, TMR2ON ;タイマ2スタート

tb_lp   bcf     STATUS, C 
        rlf     SpiArg, F
        btfsc   STATUS, C ;SpiArg MSB を MOSI に出力
        goto    $ + 3
        bcf     GPIO, MOSI_PORT
        goto    $ + 2
        bsf     GPIO, MOSI_PORT

        btfss   PIR1, TMR2IF ;ディレイ用タイマ2フラグチェック
        goto    $ - 1
        bcf     PIR1, TMR2IF

        btfsc  GPIO, MISO_PORT ;MISO からの入力を SpiArg LSB にセット
        incf    SpiArg, F
        bsf     GPIO, SCK_PORT ;SCK 立ち上げ
 
        btfss   PIR1, TMR2IF ;ディレイ用タイマ2フラグチェック
        goto    $ - 1
        bcf     PIR1, TMR2IF
        bcf     GPIO, SCK_PORT ;SCK 立ち下げ

        decfsz  SpiTransBit, F ;8ビット分繰り返す
        goto    tb_lp

        bcf     T2CON, TMR2ON ;タイマ2ストップ 
        return 

                                                                                        

たったこんだけ。

取り敢えず、PC側とAVR側のインターフェイスが出来たんで、
次はPC-AVRISP間のプロトコルの話し方を考える。

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

2006年7月15日 (土)

AVRのためのPIC再入門

PICでAVRライタを作る1

一概にPICといっても結構なバリエーションがある。
8ピンの小さいヤツから、パワフルな40ピンのデカイやつとか・・
で、どのPICを使おうか悩んだ結果、12F683を使うことにした。

必要なピン数は、PCとの通信用に2本、AVRとの通信に4本の
6本が最低限必要だと思う。12F683はI/Oピン6本なので、
かろうじて条件をクリアする。何より8ピンのちっぽけなPICで
AVRライタが動作している姿を想像すると楽しいじゃないか。

早速、部品箱から12F683を取り出し眺める。あまりの小ささに
若干不安になる。しかし、こんな小さいパッケージに8ビットとは
いえコンピュータが詰まっていて、アマチュアがプログラミング
出来る、まさにデスクトップデベロップメント。

すごい時代になったもんだ。

さて、実際の実装を考える。
まず、PCとの通信部を作る。AVRISPの場合115.2KHzの
ボーレートでPCと通信をしている様だ。12F683には
USARTユニットが無いので、ソフトでこのボーレートを
作り出すしかない。また、外部発振でクロックを供給する
ためのI/Oピンの余裕は無いので、内臓8MHzのクロック
で動作させる。

これらの事を踏まえると、シリアル通信で送受信する各ビットは、
PICの17個分の命令サイクル間隔で操作しないといけない。
これでは、ディレイルーチンを呼んだり、タイマ割込を使ったり
する際のオーバーヘッドも無視できない。
逆に言うと各ビットの操作間隔をきっちり17命令サイクルに
あわせれば、うまく115.2KHzで通信出来るかも。

実際に書いた送信ルーチンが、これ。

                                                                                       

putByteUsart
        bcf     GPIO, TXD_PORT      ;スタートビット出力 
        movlw   3
        movwf   Counter
        decfsz  Counter, F
        goto    $ - 1 

        movlw   8                          ;8ビットを順次出力
        movwf   Counter
pb_lp   rrf     UsartArg, F
        btfsc   STATUS, C
        goto    pb_ct0
        nop
        bcf     GPIO, TXD_PORT
        goto    pb_ct1
pb_ct0  bsf     GPIO, TXD_PORT
        goto    $ + 1
pb_ct1  nop
        goto    $ + 1
        goto    $ + 1
        goto    $ + 1
        decfsz  Counter, F
        goto    pb_lp

        goto    $ + 1
        goto    $ + 1
        nop
        bsf     GPIO, TXD_PORT      ;ストップビット出力
        movlw   5
        movwf   Counter
        decfsz  Counter, F
        goto    $ - 1

       return

                                                                                             

1個1個命令数を数えて書いた。ポート操作間隔をきっちり
17命令サイクルにする為、"nop"やら"goto $+1"を挟んである。
パズルを解く様な感覚で少し楽しくもあったが、めんどくさくて
美しくないコードだ。

同じように受信側も書いて実験。一応動作はOK。

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

2006年7月14日 (金)

AVRのためのPIC再入門

今年始めにPICの入門書と秋月のPICプログラマを買い
電子工作を始めた。いくらかPICの楽しさが解り始めた頃、
AVRを知りAVRに夢中になった。

ネット上の情報を探り、HEROさんの翻訳したデータシートを
読み耽り、TADさんの感動的なAVR-RS書込み方法に出会い、
使い勝手の素晴らしいライタを作った。

ここらで、AVRの理解を深める為にも、自分でライタを設計
して見たくなった。いろいろ構想を練るうちにPICを使って
AVRISP互換ライタを作る事を思い立った。
ここのとこAVRばっかりで、PICの使い方を忘れかけているし、
それなりの金額で秋月のPICライタを購入したのだから、
遊ばせているのはもったいない。

出来るかどうかは解らないが、とにかくやってみよう。

Picavr0

 

 

 

 

 

 

 

 

↑すぺてはここから始まった。

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

2006年7月10日 (月)

AVR入門

相変わらず、ココログの反応が悪い。
明日から2日間のメンテにはいるらしので、改善される事に期待しよう。

先週やっていた事を簡単に遺しておく

秋月電子で12.8MHzの超高精度クリスタルモジュールを買ったので、
Tiny26にクロック元として繋ぎ、時刻を刻むプログラムを書いた。
その時刻を取り出すために、ソフトでPCと非同期シリアルで通信する
コードを書いて見た。

Avttest01

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

2006年7月 6日 (木)

AVR入門

超高精度クリスタルモジュール

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

2006年7月 4日 (火)

AVR入門

ICクリップ

ISPケーブル用にICクリップ買って見ました。
キャップ(?)部分をはずして見ると、中に羽状の端子が・・・

Icclip0  

 

 

何処に、どーやってコードを繋げれば良いのかと、しばし悩む。
これは、あれだな、羽の部分をU字に折ってコードプライヤーで・・・
と、勝手に解釈。

Icclip1  

 

 

どう見ても使い物にならなくしてしまいました。
本当にありがとございました。orz

これ、どこにハンダ付けすればいいのだろう。

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

2006年6月30日 (金)

AVR入門

USART

昨晩作った ADM3202AN 基板を使って、ブレッドボード上の
ATmega88 と PCを繋ぎ、ハイパーターミナルで通信して見た。

Avrusarttest0

 

 

Avrusarttest1

 

 

 

ボーレートを設定し、UCSR0Bレジスタの受信/送信許可ビット
を立てればOK!UDR0レジスタを読み/書きするだけ。
AVRって使いやすいかも。

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

2006年6月29日 (木)

AVR入門

ADM3202A

ATMega88のUSARTとPCをシリアルで繋ぐのに
レベル変換と論理反転をする必要があるらしい。

レベル変換は、抵抗2本があれば可能だということを
PICの時に学んだ。入力ピン保護用のクランプダイオードが
活躍する。最初この2本抵抗のレベル変換の回路図を
見たとき、この仕組みが理解できず衝撃を受けた。

かっこよくソフトウェアUSARTを書く技術があるなら、抵抗2本で
いいだろうが、お手軽内蔵USART機能を使うなら、レベル変換
以外にも信号の論理反転しないといけない。

そこで、正統派MAX232(互換)ICを使って基板を作って見た。

Rs_level_converter  

 
Dsub9ピンのコネクタとADM3202Aが載っているだけ。

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

2006年6月26日 (月)

AVR入門

キャラクタ型グラフィックLCD

ATmega48/88/168のデータシート上のUSARTの項目を読む。
お決まりのシリアル通信なので、比較的理解し易い。

早速PCと繋いでみたいところだが、ブレッドボード上でせっかく
AVRとLCD繋いでいるのだから、PCからのデータをLCDに表示
してみたい。
テストとしてPCからの入力をエコーバックするコードを書けば、
十分な気もするが、やはりそれだけじゃつまらない。

で、6×8ピクセルのフォントをでっち上げて、文字出力ルーチンを
書く。20文字×4行のキャラクタ表示器みたいになった。

これを使ってPCのターミナルソフトと通信してみたいと思う。

Avrlcdtest4

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

2006年6月23日 (金)

AVR入門

Hello World!

引き続き、グラフィックLCD制御。
必要な、及び必要になりそうなサブルーチンを実装する。
しかし、色々な用途に使えるようにと汎用性や再利用性を
求めすぎると冗長になり過ぎ、結局専用ルーチンを
書き直すはめになるので程々にする。

で、テスト表示用にグラフィックパターンを用意しようと、
PCのペイントでBMPファイルを作成した。
内容は「Hello World!」と文字が描かれた画像。
やっと、入門者御用達の"Hello World"にたどり着いた。

PC上でBMPデータを、AVRのアセンブリソースに変換する
プログラムを書く。C++コンパイラを使うが、書いたコードは、
どう見てもC言語。それでも拡張子は"CPP"。

出来上がったのがこれ。

Avrlcdtest2  

 

 

ん?なんかずれてるぞ?

AVR側のバグじゃなく、PC上の変換プログラムに問題が
あるくさい。ひとしきり悩んだが、BMPファイルをダンプした
ものと、変換後に生成されたデータを比較。
0x0Dというデータだけ抜け落ちている。

反射的に0x0Dがテキストファイルのリターンコードで
ある事に気づく。何の事は無い、変換プログラムで
タイプミス。BMPファイルをテキストモードで開いてました。

修正したのがこれ。

Avrlcdtest3  

 

 
orz

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

2006年6月21日 (水)

AVR入門

グラフィックLCD

今夜もグラフィックLCD。

今回はLCDの資料をみっちり読んだし、
昼間仕事中ちょいと頭の片隅でアルゴリズムを
考えといたし、何よりお酒が入ってないので、
ちゃんとコードが書ける。

ぱぱっと初期化/入出力ルーチンを書き上げ、テスト。

Avrlcdtest1  

 

 

なんか、出た。

0から60までの数値を LCD RAM に書き込んだだけだが、
プログラムに書いた通りの動作はしているみたい。

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

2006年6月19日 (月)

AVR入門

SG12232

秋月電子のグラフィック液晶モジュールを入手!
AVRに繋いで見ようと思う。

このLCDユニット、制御に EPSON S1D1520(準拠)という
チップを使っているらしい。早速ググッて、それらしい資料を
発見。この資料をダウンロードし、ハードコピーを眺めて
理解したことは、このLCDにくっついて来た、A3両面刷りの
紙ペラ1枚に、必要な事は全部載っていたということ。

さすが秋月電子、資料は良く確認しよう。>自分

一通り資料を眺めていると、昔弄っていた IBM ChipCard の
表示部に似ている部分があり、一瞬懐かしさのあまり思い出に
耽りそうになるが、気を取り直しAVRとの接続を考える。

使用するAVRは Mega88。LCDの表示部は左右61ドットで
分割されて、2つのコントローラが制御している。
全画面のデータを転送するには、それぞれのコントローラに
コマンド/データを送らないといけない。
この部分がプログラムを書く上で若干煩雑になる。
そこで、全画面分のフレームバッファを用意し、必要に応じて
フレームバッファからLCDにデータを転送するようにする。
こうする事で、フレームバッファには、リニアにアクセス出来き、
グラフィックの重ね合わせ等の処理が行いやすくなる。
ChipCard のアプリケーションはそうして書いた。
Mega88 なら SRAM を1KB積んでいるので、全画面分の
バッファを割り当てる事が出来る。

また、このLCDはデータ信号に8本分のI/Oピンを必要とする。
それと、約2KHzの液晶駆動クロックが必要。
これは、タイマ・カウンタ0をCTC動作させ、
OC0Aの出力を使う事にする。

これらを考慮して、ブレッドボード上に配置したのが

Avrlcdtest0 これ

 

 

写真では解りにくいが、LCDがコネクタ/ケーブルに
持ち上げられていて、宙に浮いている。
遠からず重力という物理法則に負けてしまうのでは
ないかという、とても不安な気分にさせるバランスを
保っている。

ユニバーサル基板にテスト回路を配線した方が、
良かったんじゃないかとも思うが、
以前(といっても3カ月前)、PICで16文字×2行の
キャラクター型LCDを駆動する基板を作った時に、
特定のI/Oポートが入力専用だったり、オープンドレイン
だったりすることを良く理解せず、痛い目を見た。

そんな程度の私は初心者。

今回はLCDを駆動するファームが出来るまで、
ブレッドボードを使って見たいと思う。

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

2006年6月16日 (金)

PIC

HDDインジケーター

週末、なんちゃってビール(その他の雑種2)を飲んで
酔っぱらっているんで、今夜は何もしない。
ので、PICで作った物の写真を遺しといておこうと思う。

マイクロチップ社のサイトにあった、IOピン4本で12個のLEDを
制御する
←これを知り、HDD LED bar graph←これを
8ピンのPICで作って見たくなった。

Pc1   

 

 

 

使ったPICは12F683、8ピンのヤツ

Pc2_1

 

 

 

これの動画

PICも好きだが、AVRを使い始めるとちょっとPICに戻れない
気がする。

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

2006年6月15日 (木)

AVRライタ その3

ISPコネクタ

今夜はでんし研(TADさん設計)のZIF式DUALライタに
ISPコネクタを付けてました。

Dualwriter  

 

ISPケーブルはこれから作ります。

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

2006年6月13日 (火)

AVR入門

割り込み

タイマの使い方が少し解ったので、タイマで割り込みを掛けて
見ようと思う。必要なのはインタラプト・マスク・レジスタで、
該当する割り込み許可する事と、ベクタテーブルに処理先の
アドレス
を書き込む事。処理部では割り込みフラグをクリアする
必要はないらしい。
↑処理先にジャンプする命令

とここまで書いて、「眠い」というノンマスカブル・リアル割り込み
が発生したので続きは後日にする。
明日も仕事だし。

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

2006年6月12日 (月)

AVR入門

LDEチカチカ

今週も再びAVR入門。タイマ/カウンタの機能を学ぶ。
Hero'sDownloadIndex からダウンロードした日本語訳の
データシートに何度も目を通す、なかなか手強い。

1読目、タイマの機能そのものと、各種設定用のレジスタ類
を把握していないので、頭の中は???
私の理解度を進化の度合いで表すと→お猿さん状態。

2読目、いくらか全体の構造が見えて来た。
進化の度合い→後ろ足で立ち上がる。

3読目、利用するタイマの設定手順が薄ぼんやりと浮かぶ。
進化の度合い→動物の骨を武器に闘争相手と戦う。

タイマの設定手順が思い浮かんだ所で、テスト方針を整理する。
タイマ0をCTC動作させて、OC0Aピンをトグル出力させる、
OC0AピンにLEDを繋ぎ、その状態変化をLEDの点灯で確認する

方針が決まれば早速コーディング。
進化の度合い→動物の骨を空高く投げ上げ、骨はやがて宇宙空間に・・・

などと、「2001年」に思いを馳せている場合ではなく、
出来上がったコードを実行すると、LED点きっぱなし。
進化の度合いも、お猿さんに逆戻り。ウッキー。

実はプリスケーラの設定にしくじって、タイマの周期が約3.9KHz位に
なってました。この周波数じゃあ点滅を確認出来るわけないですね。
もう一度約3.8Hzで点滅するように再設定して、動作を確認。
ウッキー!

明日の自分の為に

  1. タイマ0の動作/停止及びプリスケーラの設定はTCCR0B
  2. 動作モードの設定はTCCR0AとTCCR0BのWGM00~02
  3. TCCR0AのCOM0A/B0,1でOC0A/Bピン出力設定が出来る

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

2006年6月 9日 (金)

AVR入門

printf( "hello world !\n" );

ぽちぽちとテストプログラムを書いて AVR の世界を味わって
見たいと思う。テストプログラムと言えば(文字出力のある
処理系ならば)お約束として"hello world !"と表示したいところ。
しかし、コントローラーワンチップのテストに文字出力なんて
望めるはずもない。

なので、この手の場合のお約束として"LEDチカチカ"をやって
見たいと思う。あまりにベタな展開だと思うが。

  1. PB0 → タクトスイッチ → VSS
  2. PB1 → LED → それなりの電流制限抵抗 → VCC

こんな具合にブレッドボードに部品を配置

Avrtest00 

 

 

タクトスイッチを押すとLEDが灯るというコードを書くことにする。

「スイッチを押すとLEDが点灯するだけの回路なら、
間に AVR なんか挟むことないじゃん。」

という気分が猛烈に沸いてくるが、構わず AVRStudio を起動する。
インストラクション表を片手にコーディングしていると

LDI     R0, ( 1<< SWITCHBIT ) ; SWITCHBIT = 0 ← PortB 第0ビット

でつまづく。
何でこれがエラーなの?とパニックになりかけるが、コード一覧表で
LDI 命令のディスティネーションオペランドの指定に4ビット分しか
割り当てが無い事を発見し納得。よくよく見ると LDI 命令は
R16 から R31 しか使えないという記述もある。

マニュアルはよく読め>自分。

確かに、他人が書いたコードを見るとレジスタはR16から使われて
いる事に気づき、今更ながら納得。
「命令の直行性」という言葉に疑念を懐きつつ、使用レジスタを
変更する事でプログラムは無事動作。満足。

今夜はスパークリング麦茶(ビールとも言う)を飲んでいるので
これ以上の深追いはしないことにする。
↑つい見栄をはってしまったが、正直に言うと飲んだのは
"その他の雑酒2"だった。

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

2006年6月 8日 (木)

AVRライタ その2

ファーストライト

天体望遠鏡とかの観測装置で、始めてその観測装置に飛び込んで
来た光/画像をファーストライト( First Light )と呼ぶらしいです。

私もせっかく作ったAVRライタで、始めて何かのコードを
ファーストライトさせて見ようと思います。
(ええ、日本人ですもの。Light と Write の聞き分けなんて出来ませんよ。)

このDUALライタ、実際に作成しAVRStudioで認識させたところ、
なんの不具合も無く1発で認識されて、何が起こるかと身構えていた
こちらとしては、ちょっと拍子抜け。
普通こんなにすんなりとはいきません。もちろん、TADさんの設計の
事では無く、私の製作ミスの事を言っているんですがね。

ただ、私のインストールした AVRStudio V4.12 SP2 の環境だと
AVR ボタンを押すたび

2006060701

 

 

 
ファームウェアが 2.04 だから 2.07 にアップデートしろとダイアログが
出るんですよ。しかし、でんし研のDUALライタTiny26版は、
ソースコードが公開されています。そこで、人様のコードに
勝手に手を突っ込むのはちょっと心苦しいのですが、
ソースコード上のファームのバージョンの定義を 2.04 から
2.07 修正します。
また、このコードはプログラムがきちんと書き込まれているか
確認する為、スタート時にプログラム全体のチェックサムを採る
仕組みになっているので、この部分もコメントアウト。

そして修正したソースを AVRStudio で再アセンブルして、
出来上がった Hex ファイルを予備の Tiny26 に書き込みます。
DUALライタで。

これが、このライタの「ファーストライト」でした。

あとは、DUALライタ上の Tiny26 と 書き上がった Tiny26 を交換。
AVRStudio で認識させると、上記のダイアログは出ません。
ああ快適。

当たり前のように、何事も無く AVR にプログラムを書き込める環境が幸せ。
TADさんに感謝。

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

2006年6月 7日 (水)

AVRライタ その1

AVRライタ作成しました。

昨年まで、PICというのは1チップマイコンの総称だと思っとりました。
アトメル社のPICとかルネサス製の16ビットPICとか・・・・
恥ずかしいですね。

そんなひ弱で坊やな知識しか持たなかった私も、
PIC入門書と秋月のPICプログラマキットを購入。
マイクロコントローラの世界に入門。

幾らかマイクロコントローラを理解し始めて数ヵ月、
AVRというコントローラを知りました。あちこちのサイトで
情報収集して見ると、このコントローラかなり良さげです。
良さげというより、AVR関係のサイトでは賞賛の嵐。
なんとなく、昔の80系CPUに対する68系CPUファンの反応を
思い起こさせます。

とりあえずAVRを使ってみようと思います。

今回はAVRプログラマ(ライタと呼ぶのか?)を作る事から始めます。
で、どうやってライタを作ったものかと、ネットサーフィンの果てに
辿り着いたのがTADさんのでんし研
ここのDUAL書き込みRS式に酷く感動!

早速作成したのが

Avrprogramer0

Avrprogramer1

 
 

 
 

これ。
AVRStudioから直接呼び出せるんで非常に便利です。

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