2009-03

2009-02


キーボードまにあ!!!(スリー)はこちら


3月兎

  • 3月にするのを忘れていた。

今月の目標

  • PIC18F2550を使ってみたい。(けれど、コンパイラがグダグダなので、やらないかも)
  • USBバスアナライザが欲しいです。(これって目標ちゃうけど)
    • BeagleはFPGAかCPLDがあれば作れそうな予感。 (でも作れるほどの技量はないんだよね。)
  • 新しいARM基板に手を出すよりも先に、過去の積み石ARMとかFRマイコンをなんとかせねばなるまいそ。

今月の挫折の記録

  • 簡易抵抗計を作ろうとして、とりあえずLEDのダイナミック点灯までこぎつけた。
    • そこで力尽きているけれど・・・。
    • Atmega88って、I/Oピン数がtn2313より多いはずなんだけど、実は少ないことに気づいた。AVccとvrefのせい?
    • それに、8bitまとまったポートが出てない。






簡易抵抗計

http://psp.dip.jp/web/jpg/rcmeter1.jpg

  • AIN0はATmega88の内部基準電圧(1.1V)を与える。
  • AIN1はコンデンサにチャージされた電位を測る。
  • PC0,PD1はHi-Zにする。

測定方法

(1)

  • AIN1をデジタル出力(L)に設定し、コンデンサを放電させる。
  • AIN1をアナログ入力に設定する。
  • 同時にPC0をHレベルにすると、コンデンサへのチャージが始まる。内部カウンタをスタートさせる。
  • AIN1の電位が1.1Vを越えるとアナログ比較器が反転するので、チャージが行われた時間を内部カウンタで計測する。

(2)

  • 同様にして、こんどはPD1を操作し、リファレンス抵抗(2.2kΩ)に対する1.1Vチャージタイムを計測する。


  • 2者のチャージ時間の比率で抵抗値を計算する。

とりあえず回路を組んでみた。

http://psp.dip.jp/web/jpg/rc-meter.jpg

  • 0Ω近辺の抵抗が繋がれると少しまずいので、実際は被測定Rと直列に47Ω程度を入れておく。
  • 計測後、その抵抗値を引き算する。
  • コンデンサを外付けにして測定対象にすれば、簡易Cメーターになる。
  • 測定可能レンジは狭い。(100Ω〜100kΩくらい。)
  • 抵抗値の低いほうにレンジを伸ばすのは難しい。AVRのポートの外に低抵抗のスイッチFETを用意するとか?

ファームウェア公開

計測中

http://psp.dip.jp/web/jpg/rc-meter2.jpg



問題点

  • LEDのダイナミック点灯はATmega88のポートを直付けで行っている。
  • このため、ポート数が8+4=12ポート消費され、余りポートは少ない。
    • USB接続回路と、bootモード切り替えジャンパーにもポートを使用している(3bit)
    • ATmega88は28pinだが、電源系5pin、RESET 1pin、水晶2pin、USB 3pinが常に使用されるため、
    • 残りは17pin。
    • LED点灯に12pin使用するので、計測用には5pinしか使用できない。
    • 計測には3pin使用したので、残っているのは RxDとAIN0 の2本のみ。
  • 外付けドライバーなしで点灯しているので、やや暗い。
    • これはpnpトランジスタなどでLED COMMONをドライブする回路を用意して、
    • ファーム側はCOMMONのドライブを反転させるとか、
    • 高輝度7セグLEDを使えばOKかも。
  • ATtiny2313に実装するには、LED点灯をやめてべつの表示方法を考えなければならない。
    • AVR-USBでPC側に取得するのが楽かもしれないが、スタンドアロンで動かせない。
    • 液晶モジュールを繋いでみる?
      • 接続に7pinくらい必要なので、計測用3pinを足すと10pin
      • 元々リザーブされるのが電源2pin,RESET 1pin,水晶2pin,合計5pin
      • USBを繋いでいる場合3pin(pull up含む)
      • 足りるかも。
    • USBを繋がない場合、20pinのうち必ず必要なpinは電源2pin,RESET 1pin,水晶2pinを除いた15pinが使用可能。
      • 仮に7セグ4桁を直接駆動するなら12pin,計測用に3pinなので、ぎりぎり入るかも。
      • ファームサイズは2k未満に収まっている(1500byteくらい)

問題は、もう7セグの配線はしたくない、ということと、bootloaderに慣れたのでAVRライタの繋ぎ変えが面倒 だということくらい。






PICのCコンパイラはグダグダ?

  • AVRには、使い慣れたgccがあるけれど、PIC18にはgccが移植されていない。
  • MicroChipが提供しているMPLAB C18は有償。(MAL扱いで税別75,000-)
  • サードパーティのコンパイラとしてはHITECH-C,CCS,IAR-SystemがCもしくはC++コンパイラを有償提供している。
  • フリーのCコンパイラでは、sdccがある。
  • 基本有償だが、事実上無償版を利用できるコンパイラ(SwordFish)もある。
    • http://www.picgames.org/modules/tinyd1/index.php?id=32
    • 制限の弱く、実用的に使える評価版を無料ダウンロード可能
    • (コードサイズ無制限、データサイズ256バイトまで)
    • プログラム開始番地、割り込みベクタを指定可能なのでUBWと相性が良い
    • プロジェクトの概念がないため、ソース1本=プロジェクトになる。C18のようにリンカ、インクルードファイルの場所など複雑な設定項目がない
    • VisualBasicに似た構造化指向を取り入れた言語仕様なので、VisualBasic感覚でプログラム可能。
    • (BASICの皮をかぶったC言語のようなイメージ)

ただし、SwordFishは、Cコンパイラではない


グダグダというのは言いすぎだが、たとえば、

  • MPLABのアプリケーションノートやサンプルソースは、おそらくMPLAB C18で書かれているだろう(と予想している)
  • アマチュアが趣味で使用するのに75,000-も払うつもりはないので、普通は無料のsdccを選択するだろう。
  • スクラッチから自分で起こすなら迷わずsdccだが、
  • 逆に、プロの人たちやMPLABの環境に慣れている人はむしろC18でないと困るだろうし・・・。
  • 同じC言語と言っても、ライブラリの違いやコンパイル方法の違いを吸収するのは骨が折れる
  • なので、お互い行き来出来るようなソースを書くのも大変な労力の無駄。
  • そもそも有償版を入手するところからすでに障壁。
  • つまるところ、同じPICで同じC言語なのに、コンパイル環境ごとにユーザーが分断されてしまうのはなんとも馬鹿馬鹿しい話。






簡易抵抗計の改良

  • 最上位桁表示がゼロサプレスされた場合はダイナミック点灯を3灯切り替えにして、LEDの輝度を上げた。
  • 精度を少し向上した。
  • 抵抗オープン時の表示を 「- - - -」 に変更した。
  • たぶんATtiny2313に移植可能。クロックを12MHzにする場合はコンデンサの容量を0.047uFから0.1uFに変えたほうが 精度が出せそう?
  • コンデンサの精度は超いい加減だし、
  • 電源もパソコンのUSBか、適当なACアダプタつきUSBハブからの給電で、安定化は考慮していないけれど、

意外と使える。

  • 応答速度の速いDMMがあるなら、わざわざ作らなかったと思う。
  • 手持ちのSANWAのポケットDMMだと、抵抗を当ててから正しい値を示すまで最低3秒掛かる。
  • 今回制作したものは、ほぼ一瞬で計れる。
  • 表示が読みづらいので表示間隔(=測定間隔)を0.16秒くらいにしているけれど、
  • 実際0.01秒くらいで計れるので、平均を取ればもうすこしましな表示になるかもしれない。
  • これくらいの応答速度ならアナログテスターより速いし、読み取り精度的にもややgoodかもしれない。
  • ただ、難点があって、100Ω以下と100kΩ以上が実用にならない。なんとかしたいけれど。
  • デジタルテスターなのにレンジ切り替えスイッチを設けるという手はあるか。
  • あとは学校で習ったブリッジ回路と反照型検流計(いつの時代や!*1)で計るやりかたなら精度が出せるけど。
  • AVRにどうやってあの大きな分圧ボリュームを回せるのかは不明。独立電源じゃyないからそもそも平衡回路に出来ないし。

ファームウェア公開


  • でも、よく考えてみたら、普通に5Vを2個の抵抗(1つはリファレンス)で分圧させてAD変換に読ませれば 良かったのか。あほみたいだな俺。
  • その方法だとtn2313に実装出来ないけど。
  • 16bitタイマーカウンターの捕獲方法が解ったので、これで良しとしよう。






あんどろいどOnTP240

http://bird.dip.jp/mt/archives/cat_computer_and_networking.html

http://bird.dip.jp/mt/archives/2009/03/04/Android-x86-x240.jpg

  • 自分は何を隠そうIBMのTP230cs(486SX-33、RAM8MB)ユーザーだったので
  • このスクリーンショットにはもの凄いデジャブを感じる。
  • TP230csはWindows95がぎりぎり入るけれどとても重くて使えないので、デフォルトは Windows3.1だ。
  • あとはIBM-DOS(生DOS)にWeb-BoyというシングルタスクのWebブラウザーを入れて動かすか
  • SlackWare Linuxを入れてごにゅごにょするという感じだった。
  • SlackWareでPCMCIAのNE2000っぽい10BASE-TのEtherLANカードを飼いならすのは大変だったぜぃ。
  • 暫くの間はTP230csにwebサーバーやらせてたこともあった。
  • NetBookの時代になったけれど、やってることは基本全然変わってねえ。






デジタルテスター:新しい回路考案

  • http://psp.dip.jp/web/jpg/rcmeter2.jpg
  • 抵抗測定は、R1:R2で5Vを分圧して、それをADCで計る。
  • コンデンサの充電時間の計測より高速。
  • R1をリファレンス抵抗と仮定して、それを10k、1k、220Ωのどれかから選択するようにしてみた。
  • R2に最も近い値を自動的に選ぶようにすれば、20Ω、100kΩ近辺で約2%誤差、200Ω〜10kΩでは約0.2%誤差 で計れると良いなというレベルになるので、コンデンサの充電時間の計測より高精度。
  • 但しAVRのPORT-Hレベル出力時の内部抵抗を考慮する必要がありそう。
    • 自動計測でなくて、ロータリーSW切り替えならその必要は無くなる。
  • 電圧計測時はPD0,PD1,PD2のどれか1つをLレベルにして、電圧を分圧計測する。
    • 5Vレンジは全てHi-Zでそのまま計る。
  • 電流計測は+1.2Vまでの電圧ドロップを計る。
    • 1Ω負荷なので、1A流れると1Vの電圧降下になる。つまり1Aレンジ。
    • 1digitはおよそ0.005Vなので、5mA/digitくらい。
    • もっと緩くしたい場合はスイッチで1Ωを10Ωに切り替えるかプローブを取り替える。(100mAレンジになる)
    • 60Hz交流は、頑張ってAD変換する。
    • 1.2Vに達していたら、オーバーレンジにする。
  • おまけ的な機能で、ダイオード、発光ダイオードの順方向電圧を測る。あるいはついでに発光テストをすることが可能。
  • 抵抗プローブの先にコンデンサを繋いで、PD0,PD1,PD2のどれかをL,H,L,Hと切り替えながら、2つのスレッショルドレベル (2Vと3Vとか)を行き来するように計れば、その周期から容量を計算できるかもしれない。その場合には、最適なレファレンス抵抗を自動で選べば尚良し。
  • 回路案だけ考えたが、配線はまだ、無い。プログラムも無い。






Charlieplexing - Reduced Pin-Count LED Display Multiplexing

MAXIMだ。

  • 7セグ8桁のLEDダイナミック点灯にはPullDOWNビット線8本と、PullUpコモン線8本 のドライブ信号が必要(つまり、8x8マトリクスLEDを1/8Dutyで点灯させるのとLED個数的に等価)
  • だが、上記リンク先の回路はRAWとCOLUMNを共有させて、9本でドライブしている。
  • LEDがダイオードであることを利用している感じ。ドライブされないほうの全LEDには逆方向の電圧が掛かるようだが・・・
  • ドライブ回路との接続本数は節約できるが、LED側の配線はやや不規則になる。
  • たとえば、数字だけしか表示しないつもりなら、4bit->7bitの変換専用のTTLが昔あったし、8桁のCOMMON側に対しては3bit->8SELのデコーダーTTLをかませば、マイコン側の出力PINを8bit(raw(4+1)bit+column3bit)に節約する方法もある。ICチップは逆に増えるが・・・






簡易抵抗計・完成

  • ほぼこの回路で制作し、ファームウェアも完成した。
  • 精度は、コンデンサの充電時間を計るよりも向上した。
  • 100Ω以下もそれなりの精度で計測できる。(誤差3%程度?安定しているので較正による精度向上は可能)
    • コンデンサ充電の場合は100Ω以下の精度が極端に悪くなっていた。
  • 但し100k以上については数値がパラパラ動き、精度はあまりよくないようだ。(AVccとかArefを安定させる努力が必要?)

ファームウェア公開






オープンソースプロジェクト HIDaspx

HIDaspxは千秋広幸さんが中心となって開発が進められているAVRマイコン用のプログラム書き込みツール。おもな特徴は3つ。 ひとつめは、パソコンとの接続にUSBのHIDクラスを用いている点。HIDはキーボードやマウスの接続に使われる仕様で、どのパソコンも標準で対応している。つまり、HID準拠のデバイスは、ドライバをインストールしなくても使用可能。敷居が一段下がるわけだ。 ふたつめの特徴は、そのHIDクラスをATtiny2313というマイコンひとつで実装している点。この部分はObjective Development社のオープンソースプロジェクトAVR-USBをベースにしている。tiny2313は、秋葉原でも100円で買えてしまう超廉価マイコンだ。それに12MHzの水晶やツェナダイオードなどの部品を加えるとできあがり。とても安上がり。 特徴その3は、IOモジュールとしても使える点。ジャンパを一カ所変更するだけで、ライタからIOモジュールへと早変わり。hidmonというパソコン側のツールを使って、tiny2313のIOをコントロールすることができる。機能はシンプルで、仕組みを理解しやすい。(写真は HIDmon のgraph 機能でポートBを視覚化したところ)






ATtiny2313でA/D変換

  • とりあえず、やり方だけ研究。
  • 参考資料:Atmelのアプリケーションノートの400番と401番

AVR400: Low Cost A/D Converter

AVR401: 8-bit Precision A/D Converter

  • 両方とも、AT90S1200用に書かれたもの。(アセンブラ)
  • 何故AVR401のほうが精度が高いかというと、コンデンサに充電する負荷抵抗の代わりに、PNPトランジスタで 定電流を流しているから、らしい。
  • 負荷抵抗だとLogみたいな曲線(嘘。Logは無限大に発散するが、チャージ電圧はVccが漸近線になる)で充電されていく。
  • でもどのみち、容量誤差の影響をもろに受けるような気がする。もしかして内部基準電圧でのコンパレータ時間 を計って比を取るようなことをしているなら無問題。
  • どっちみち、抵抗測定には応用できるわけではない。

http://psp.dip.jp/web/jpg/tester-sc.jpg

  • ATmega88の5V分圧による抵抗測定では、被測定抵抗がリファレンス抵抗より大きいときに、分圧された電圧が 5V近辺を指すため、不正確になっているような気がする。
  • これは、たとえば分圧された電圧の反対側(Vcc - Vin)を直接計るようなことが出来れば改善すると思う。
  • あるいは、リファレンス抵抗をさらに大きな値に切り替えるもありかも。
  • 5Vを分圧しないで、安定化された3.3Vを用意して、分圧抵抗の中点の電位と、全部の電位を測れば解決する問題かもしれない。
  • 但し、現在、抵抗切り替えがメカニカルSWではなく、PORT出力直結なので、絵に描いたもち。





Intel、AMDに対しクロスライセンス違反を主張

〜「Global FoundriesはAMDの子会社ではない」

  • http://pc.watch.impress.co.jp/docs/2009/0317/intel.htm
  • intelにとっては軽いジャブのつもりだろう。AMDを本気で潰す気ではないと思うけど、結構痛いんじゃないかな。
  • AMDって、昔はi8086の互換チップをライセンス製造してたんだよねー。
  • 今や設計専門会社か。
  • いっそ、ビデオチップ専業になったらいいんじゃないかな(冗談。)
  • というか、AMDごとアラブ石油資本が買い取っとけば良かったんじゃあ?






次世代通信網の「奸計」 プロバイダーが怒号の嵐

マルチプレフィックス問題は,ISPとNGNの両方が端末にIPv6アドレスを配布することで,正常に通信できなくなる現象である。

  • ひでー話だ。
  • ipv6って、まだやってたんだ。とっくに廃れたのかと思っていた。
    • というか、NTTフレッツのipv6は、まるで10.0.0.0/8だな。
    • だったら最初からipv6にもローカルipを用意しておけばよかったのに・・・。
  • 一時給付金を配るくらいなら、日本人とか、全人類に一人づつ/64を生涯無料で割り当てればよいのだ。
    • それならNTTのNGNだって、全部グローバルipでいけたろうに・・・
    • というかプロバイダーに無尽蔵にv6アドレスを供給しといて、そっから無料配布するような仕組みにしておけば、いずれ有料割り当てのipv4なんて廃れるに決まっとる。






HIDmonを改造してA/Dにする。

  • とりあえず、ファームだけ書いた。
  • まだホスト側を書いていない。
  • 配線等もまだ。
  • 割り込みは使わずに、TIMER1の捕獲だけでやる。
  • Pollコマンドの発行タイミングが早くて、まだ捕獲されていないときは次回のPollで取得できると思う。
    • (あるいは、ホスト側でSET_PAGEしたあとPollするまでに待ちを入れる)
  • キャパシタ充電時間は1mS以下〜長くても数mSだと思われる。その場合TIMER1のカウント値は12000〜64000程度
    • 嘘。t=RCでR=1k,C=0.047uFを仮定すると t=47uSecになり12MHzではTIMER1は564を指す。
    • そのときのVは0.63*5V=3V程度。
    • 10倍の時間が過ぎ、t=10*RCとすると、t=470uSecでTIMER1は5640。電圧は5*(1-exp(-10))=4.9997V。それでもUSBの1フレーム以下なので無問題。
  • 精度は8bitも取れると思っていないので、もっと時定数を切り詰めてもいいのかもしれない。
  • 充電電圧曲線は、
    V=V0*(1-exp(-t/RC))  
    ... 自分では導出出来ず、Google先生に聞きました。ちなみに充電エネルギーの50%は抵抗が熱に変換してしまうそうです。
  • なので、あとはホストPC側で<math.h>をインクルードしてごにょごにょ。

アイディアメモ

**********************************************************************
*	アナログ比較器と キャパシタ充電時間計測による A/D 変換の実装.
**********************************************************************
*	変換回路について
(alt.Vref)                          プローブは2択.
AIN0>----------===>-  Rmeter Vmeter <-+-- <--+-
                                     Rin     |
PD6>--R2.2K--*-===>-  Rmeter        <-+-     Vin
             |                               |
AIN1>--------*       +===>-  Vmeter       <--+-
             |       |
    0.047uF ===      |
             |       |
            GND     GND
*	  AIN1 にキャパシタとプルアップ抵抗を繋いで掃引します。
*	  変換動作後は AIN1 を L にして キャパシタ放電します。
*	  アナログ電圧入力 は AIN0 に接続してください。
*
*	A/D 変換動作について
*  ★page_mode == 0xa0 のとき.
*    AIN0 を 内部基準電圧入力(1.23V)に設定したのち、AIN1をアナログ入力にします。
*    同時に、TIMER1をスタートさせます。
*
*  ★Pollコマンドに対する応答
*    TIMER1捕獲カウンタ(捕獲条件:AIN1 > AIN0)の値を返します。
*	  捕獲されていなかった場合は 0xffff を返します。
*
*  ★page_mode == 0xa1 のとき.
*    AIN0 を 比較器入力に設定したのち、AIN1をアナログ入力にします。
*    同時に、TIMER1をスタートさせます。
*
*  ★Pollコマンドに対する応答は page_mode == 0xa0のときと同じです。
*
* 抵抗測定動作について
*	  AIN0 を出力ポートとして使い、被測定抵抗をPULLUPして掃引します。
*	  PD6  は参照抵抗(2.2KΩ)です。
*  ★page_mode == 0xa2 のとき.
*    AIN0 を 内部基準電圧入力(1.23V)に設定したのち、AIN1をアナログ入力にします。
*    同時に、TIMER1をスタートさせます。
*    PD6はオープンにして、AIN0をHiレベルにします。
*  抵抗測定の参照計測は ★page_mode == 0xa0 と同一です。
*  Pollコマンドの戻りパケット構造.
*  ( 5 bytes )
*  [Report ID] [ page_mode ] [ Timer1_L ] [ Timer1_H ] [ reserved ]
*
*/

電圧測定方法

Vref(1.23V)のときのTrefと、
Vin(xxx V)のときのTin をUSB経由で取得して、
1.23V=5.0V * (1-exp(-Tref/RC)) にて、RCの積の値を得て
Vin  =5.0V * (1-exp(-Tin/RC)) を計算すればOK。  

ただし5Vの精度も影響してくると思われる。

  • RCの逆算式は
    exp(-Tref/RC))=1-(1.23/5.0)=0.754
    RC = Tref/0.28236
  • Tref=159カウント程度を予定。

もっとキャパシタをでかくするか、Rを4.7kとかにしたほうがよいかな。






googleは神。

「Google Earth」に火星のほぼ生中継の画像

「Google Earth」に過去画像を大量追加、各地で歴史的比較可能に

Google はいったいどこに行こうとしているのだろうか...

  • Googleは神になろうとしているのではないだろうか。
  • 神というと宗教的に考えてしまいそうだが、
  • そうではなくて、「全人類の知識」を集約し、(なんでも知っておられる)
  • いつでも(誰でも)アクセス出来る。(どこにでもあらせられる)

まさに神。(あれっ?)

  • SFで言うところの、「マザーコンピュータ」 --- こいつが機能停止したときに人類は皆石器時代に戻る。
    • 既にgoogleがないとカンニングが出来なくて知識が得られなくて困る人たちがいっぱい(自分含む)


  • J.P.ホーガンだったら、ZoracとかVisorクラスのコンピューター(ネットワーク)のような・・・。
  • 願わくば「知識の神」であるところのgoogle様には、ずっと皆に平等で、いてほしい。(貧しい者の味方で居て欲しい)

(有料化しないでね)






続:HIDmonを改造してA/Dにする。

仮ファームウェアとhidmon.exe公開

配線したPinが1ピンづつずれていて、全然動かなくてあせった・・・。

スクリーンショットはこんな感じ。

http://psp.dip.jp/web/jpg/testerbmp.jpg

A/Dの精度を上げるには

  • どうやら、内部基準電圧はあまりあてにならないようだ(理由は不明。USBホストによってはジッタが目立つ)
  • むしろVref(Tref)を計測せずに、だいたいわかっている固定値を使ったほうが、はるかにジッタが減る傾向にある。
  • 但し、Vccを3.3Vに安定化させておくと、ジッタはそれほどでもない。(あるいはUSBホストによるのかも)
  • USB1.1ハブなどを通した場合、あからさまにVccが落ちる(4.75V程度になる)ので、計算式を変えないと駄目。
  • 手持ちDMMの精度は一応1%未満なので、これを利用してなんらかの較正が出来ると良いな。

較正方法は検討中・・・

  • ファーム側で、TIMER1捕獲イベント(AIN0<AIN1)が発生しないことがある(2とおり)
    • VRが0Vになっていると常に(最初から)AIN0<AIN1であることがあり、Tin=0xffff(捕獲発生せず)になる。
    • VRが5Vフルになっていると、AIN1よりAIN0の電圧がわずかに高くて、トリガーに到達しない。このときにTin=0xffff
  • 区別するにはACOのビットを見ればいいはずだ。いまは区別していないので5V天井で0Vと勘違いする。

*1 製造会社:株式會社横河電機製作所。実習当時すでにとうのむかしに製造完了のため技官の方が修理しながら現役で使っていた。