2009年9月22日火曜日

【AVR】I2C Interface

ITT Mackay MarineのType 3020A受信機である。

 JO1LZX 河内さん宅よりQSYして来た。十分なご研究も済んだようで放出されたものである。 その特徴は河内さんのご解説で詳しいので、改めて行なうつもりは無い。 拙宅ではその使い勝手の改良を検討するつもりでいる。

 写真のように、受信周波数の設定はサム・ホイール・スイッチで行なっている。このような形式は局発をシンセサイザ化した初期の受信機に多い。ある時期の国産プロ用受信機でも見かけるのであるが扱い難いので人気はいま一つのようだ。
 BCLのように決まった周波数にセットしてISが流れてくるのを待つ聞き方なら良いのかも知れない。しかし、HAM Bandや海外放送バンドを隅からずっとスイープするようなワッチには向かないのである。これは使ってみればすぐにわかる。

 ITT 3020Aは商用受信機であるから性能機能共に良く出来ている。Collinsが軍用的なのに対して、JRC製受信機のように船舶用のイメージだろう。現在でも十分な性能を持つから、その操作性を我々向きに改善すれば十分実用的になる筈だ。

写真はPCA9555Nである。

 そう言われても馴染みはないと思う。これは、I2C(アイ・スクゥェアド・シー)と言うシリアル・インターフェース機能を持ったマイコン周辺用ICである。8ビット単位のI/Oポート(パラレルポート:入出力端子)を二組持つている。 写真ではテストのために16個のLEDが並べてある。(PhilipsのI2Cマニュアル:ここ・・pdfファイル4.1MB英文)

 上の受信機を調べた結果、周波数は各桁4BitのBCDコード(2進化10進コード)でセットするようになっていた。(ただしLow activeの負論理)信号はTTLレベルである。従ってロータリ・エンコーダの回転で同じように4Bitずつ数字セットされるようインターフェースしてやればよい。PCA9555Nの出力をサム・ホイール・スイッチの所へ持って行く。

 現在のデバイスで製作すればスイッチ部分を除去して受信機本体に組込むのも可能そうだ。 しかしなるべく受信機本体はそのままにしたいと思う。 従って外付けコントローラでやるのが良さそうだ。 ダイヤルツマミの付いたロータリ・エンコーダと数字表機器を外付けコントローラに設けておけば良いだろう。+5V電源は本体から貰えそうだ。

I2Cは簡単インターフェース

 I2CインターフェースはPhilips社が提唱した規格である。電源とGNDを合わせてもたったの4線でデータの送受信ができる。これでコントローラと受信機の間の配線が簡単になる。 I2Cはあまり高速とは言えないが、プロトコルは単純だからUSB機器のように周辺側がインテリジェンシーを持つ必要はない。 マイコン側は事前に決められたアドレスに対してデータを送受すれば良い。(参考:I2Cに関するマイコミジャーナルの解説記事・・ここ

 特にBASCOM-AVRには専用コマンドが用意されており基本的な扱いさえわかれば使うことができる。 基本的なことだが上記のパラレル・インターフェース:PCA9555Nで写真のLEDをオンオフする操作は旨く行っている。

 以下プログラムについてだが、全部を書くとBlogには冗長に過ぎるので重要そうな部分を「つまみ食い」しておく。なおプログラミング言語はBASCOM-AVRである。

 最初はI2Cのコンフィギュレーション(=設定)から行なう。 I2Cはデータラインとクロックラインで構成されいるが、SDAがデータのポート、SCLがシリアルクロックのポート指定である。この例ではポートCのピン0と1を使っている。またI2cdelay=10と言うのがデータ転送レートを決めている。10でだいたい100kBPS程度となる。

Config Sda = Portc.0
Config Scl = Portc.1
Config I2cdelay = 10

'I2C Clock Rate = 100kBPS

 また、PCA9555N自体の初期化部分はこんな感じになる。さっそくI2C経由で周辺のチップを制御するわけだ。まず、I2cstartで通信を開始し、データを送り終えたらI2cstopで終了する。中身のI2cwbyteと言うコマンドが実際にデータを送っている部分だ。

I2cstart
  I2cwbyte Pca9555write
  I2cwbyte Confreg0
  I2cwbyte &H00
  'Port O0,0 to O0,7 all output
I2cstop

 これでPCA9555Nのセッティングが終わったのでポートに出力すべきデータを送ることになる。この部分は以下のようになる。同じようにI2cstartで通信を開始し、データを送り終えたらI2cstopで終了する。I2cwbyte Outreg0で出力レジスタ0番を指定し、その次の行でポートに&HFF(=16進のFF)と言うデータ・・・即ちオール1を出力する。&H00と書けば0(ゼロ)を出力するわけだ。もちろん&B11111111あるいは&B00000000とバイナリーで書いても良い。その方が直感的だろうか。(笑)

I2cstart
  I2cwbyte Pca9555write
  I2cwbyte Outreg0
  I2cwbyte &HFF
  'Port Output Data = &HFF
I2cstop

 以上はほんの核心部だけなので、大幅に端折った所はBASCOMのマニュアルとPCA9555Nのデータシートを参照しないとわからないかと思う。(これでわかるのは既にBASCOMのI2Cを知ってる人)下記のSAA1064も同じような感じで使う。
 要するにプログラムではI2Cの初期設定をしたら、インターフェース用ICを初期化し、その後データを送ることになる。インターフェースがシリアルだと言うだけでペリフェラルICの使い方としては標準的だ。(懐かしい i8255とかi8251などを使うのと同じなのである・笑)

 GNDを省略する訳には行かないが+5V電源は先側で用意しても良い。その場合はGNDを含めて3線でインターフェースできる。 ペリフェラル側のチップには割り込み出力端子もあってCPUに割り込みを掛けることも出来る。 その場合もう一本割り込みラインが増えるが効率的なデータのやり取りには必要な機能だ。(ここでは一方的に送りっぱなしで良いので割り込みは使わない予定)

写真はSAA1064である。

 I2Cインターフェース付きLEDドライバである。上と同じくPhilips製だ。(現在はNXPセミコンダクタ製のはず) スタティック・ドライブで2桁、ダイナミック・ドラブで4桁の7セグメントLEDを点灯できる。
 マイコン側からは、SAA1064の内部レジスタに桁分の点灯データを書き込んでやれば良いだけでダイナミック・ドライブを意識することなく使える。但しBCD to 7-segment Decoderは内蔵しないからプログラム側でセグメント・パターンを用意しなくてはならない。そのかわり6、7、9と言った字形を好きに決められる。
 なおインターフェースは同じくI2Cである。I2Cインターフェースはバス構造なのでイモづる式に他のI2Cチップと並列接続して行く。 データ線(2線分)はマイコン側もしくはペリフェラル側でPull-UPしておく。 私の設計では低めのデータ・ライン・インピーダンスを目的に2.2kΩを標準にしている。

 製作する際はコントローラ側に周波数表示器を設ける予定である。扱いがさらに簡単なキャラクタ・タイプのLCDモジュールでも良いと思っている。従ってSAA1064の出番は無いかもしれない。 周波数設定も全6桁の必要はないと考えており、kHz台の3桁と100Hz台の1桁を合わせた計4桁にする予定だ。MHz台はサム・ホイール・スイッチで現状のままセットする。大きく周波数を変えるとプリセレクタの再Tuneを行なう必要がある。従って全桁コントローラ側でセットしなくても良いと思う。要するに1MHzの間がダイヤルツマミで連続可変できるようにする訳だ。

 I2Cインターフェースを持ったD/Aコンバータもあるので、入手できれば10Hz刻みのステップも実現できそうである。 ITT 3020AのFine Tuneの部分はVRでバリキャップに加わる電圧を可変している。 この部分をD/Aコンバータで10Hz刻み相当の電圧を順次与えれば良い。10個のプリセット電圧をスイッチする手もあるが、D/Aコンバータ式の方がプログラムだけで片がつくので簡単だ。D/Aコンバータの分解能は8Bitで十分すぎるくらいだ。

自身の考えを纏めるBlogになってしまったようだ。あらかた意味不明だろう。(^^;;

 ステップ式に周波数を変える形式の受信機に回転式のダイヤル・ツマミを付けて使い易くするのが目的である。 昔ならUP-Down CounterのICを並べてハードウエア的に解決したものだが、いまはマイコンで極めてシンプルだ。 さらに、少ない線数で済むシリアル・インターフェースでコントローラと分離すれば配線もスマートになる。
 技術的な問題点は概ね解決済みなのだが、あとはヤル気と根気の問題と言えそうだ。どうもその部分が不足気味なのが問題なのである。(笑)

 突然プログラム(ごく部分的だが)が登場したので、「視線」がそこで停止してしまったかも知れない。プログラムを見るとその途端に自分とは関係ないと思う自作HAMも多いようだ。実際は真空管やトランジスタを使うのと同じで、必要なことを約束どおりに配線する(プログラムを書く)だけなので、恐怖心を抱く必要はないのだが・・・やっぱりちょいと無理ですか?(爆)

18 件のコメント:

T.Takahashi JE6LVE/JP3AEL さんのコメント...

こんにちは。
連休も明日までですね。
私は日曜の夜から熱を出して寝込んでいます。^^;

PCA9555NとSAA1064、懐かしいですね(爆)
サムホイールスイッチタイプの周波数設定はシンセサイザ初期の受信機によく見られますが、今回のように外部からBCDを制御したときにPLLは速度に追いつくのでしょうか?

TTT/hiro さんのコメント...

JE6LVE 高橋さん、こんばんは。 発熱とはたいへんですねえ! インフルエンザなのでしょうか? どうぞゆっくりお休みになってお大事にされてください。

 こちら、県内の酪農系観光牧場に出掛けて来ました。 その後「曼珠沙華」の群生地へ寄ったのですが周辺の道が大混雑でした。こんなとき混みそうな所へ出掛けるものではありませんね。 帰りはナビの指示を無視して空いたルートを回って帰って来ました。地元ですからねえ。hi hi

早速のコメント有難うございます。
> PCA9555NとSAA1064、懐かしいですね(爆)
mixiの日記でこれらを扱ったのは2006年5月20日でした。それほど前でもないのですが、何となく懐かしく感じるものですね。 最近はI2Cインターフェース付きのICもだいぶ増えたようです。 便利なチップもあるので積極的に使いたい感じです。(何を作るか、それが問題ですけれど・笑)

> PLLは速度に追いつくのでしょうか?
実際にはやってみないとわかりませんが、スイッチを切り替えて様子を見るとかなり早そうなので違和感はないでしょう。 あとは切換えに伴ったノイズ出なければ大丈夫でしょう。 ロータリエンコーダ式になるとグンと使い易くなると思います。

cosy さんのコメント...

加藤さん,こんばんは
私なんかより遙かに先を進んでいらっしゃるのでコメントするのはちょっと気が引けますが(笑)

この用途に使えるのなら,当然MC145163とかTC9122/TC9198といった分周回路の制御にも使えますね(例えばIC-2Nのロータリーエンコーダ化とか)
#シリアル制御のPLLやDDSを使えよって声も聞こえてきそうですが(爆),死蔵部品もあることだし(^^;

まだまだ道は険しいです.

TTT/hiro さんのコメント...

JH5ESM 武藤さん、こんばんは。

コメント有難うございます。
> コメントするのはちょっと気が引けますが(笑)
遠慮せずにお願いします。(笑) 大して進んでおりません。 最近は停滞していて細かいことは既に忘れ気味です。(爆)

> ・・といった分周回路の制御にも使えますね。
 それも良い活用法ですね。 無線機内部をモジュールに分け、それぞれをI2Cシリアルバスで結ぶ形式はスマートだと思います。PICマイコンでI2Cを使うのも容易だそうですよ。
 最初からI2Cインターフェース内蔵のPLLチップもあります。CATVチューナ用なのでクセがあるようですが、JRCのNJW1504/1508など安価で高性能です。
 I2Cの汎用I/OチップにはNXP製のほかTI製セカンドソースもあるので入手性は悪くありません。(入手先:Digi-Keyなど)

> まだまだ道は険しいです.
チップの使い方を確立すると、あとはプログラムの話しになりますね。でもあまり得意じゃないんです。(笑)

cosy さんのコメント...

加藤さん,再びこんばんは

PICもデバイスによってはI2CやSPIを内蔵していますから,簡単にできますね.
IOポート数の多いチップを持ってきて,パラレルで直接制御って力業もありますけど(笑)

実は今Mac上で使っているHI-TECH PIC Cは周辺機能を活用するライブラリが整備されていないので(フリー版だけかもしれませんが・苦笑),そこをベンダーのフォーラムとか他所様のWEBから拾ってこなければなりません.
その意味では,後者の力業の方が楽かもしれません(爆)
#40pinのチップを使えば楽勝かな?

#会社で使っているmikroBASIC for PICならBASCOM-AVR同様にライブラリが整備されていてすぐに使えるのですけど

JJ3CMV 酒井 さんのコメント...

こんばんは。

3020Aはロータリエンコーダで、周波数制御ができるようになるのでしょうか?
3020Aはピンとこないのですが、コメントにあったようなIC-2Nならよくわかりますよ。

BASCOMは、I2Cの制御も簡単ですね。私は時計IC(RTC)をI2Cで読み書きしたことがあります。Philipsのプロトコルは読んだことはありませんが、BASCOMにお任せです。


先月、家のPCのHDDがクラッシュしたので、さまざまなことが記憶喪失のまま帰って来ません。BASCOMの自作ソースもすべて無くしてしまいました。コマンド(ステートメント)の振る舞いを理解するために、サンプルをたくさん作っていたのに残念です。

今日、ちょっとAVRを弄ろうとBASCOMをインストールしたところです。バージョンは1.11.9.5でした。


>高橋さん
 折角の休日なのに発熱とは大変ですね。お大事に。

TTT/hiro さんのコメント...

JH5ESM 武藤さん、あらためてこんばんは。 もうすぐ寝るところです。hi

コメント有難うございます。
> パラレルで直接制御って力業もありますけど・・・
制御すべき対称が少ないうちはその方が簡単で良いでしょうね。簡単なQRP機くらいの規模ならそれで十分間に合うと思います。 ユニット分けして・・・たとえば局発ユニット、アンテナチューナユニット・・・と言うような形式にするならI2Cのようなバス形式は機内配線が楽で良いと思います。

BASCOM-AVRは無料版にもすべて同じ機能があるので試してみることができるので有難いと思っています。 PICユーザの数は桁違いなので優れた関数が開発されていると思うので、あとは旨く活用することなのでしょうね。

結局のところ、組込み用マイコンはデータの移動とポートのON/OFFが仕事ですからPICでもAVRでも同じことが出来ますね。あとは実現するためのアルゴリズムでしょうか。(笑)

TTT/hiro さんのコメント...

JJ3CMV 酒井さん、こんばんは。

コメント有難うございます。
> ロータリエンコーダで、周波数制御が・・・
3020Aですが単純に受信周波数を6桁分BCDコードで与えてやればその通り受信するようです。 従って、ロータリエンコーダの信号で周波数をアップダウンするのは容易だと思います。

> Philipsのプロトコルは読んだことは・・・
バスの電気的なスペックとタイミングの説明が主です。あとは、個別チップごとの内部レジスタのアドレスなどを参照し、セットアップのシーケンスを理解すればどれも使える筈なのです・・・。(そう一筋縄にも行かないので悩む所ですが・笑)

> 記憶喪失のまま帰って来ません。
それは大きな損失でしたねえ!! 時間を掛けて自ら解析したことはお金では買えませんから・・・。 記憶が残るうちにすこしでも復帰されると良いでしょう。 私もバックアップしておかないと。。

> バージョンは1.11.9.5でした。
私はまだ1.11.9.1だったと思います。新バージョンにバグがないことを祈ります。あとでアップしておきましょう。

JA6IRK@岩永 さんのコメント...

TTT/加藤さん、おはようございます。
この連休、やっとゆっくりしています(笑)

PCA9555Nの実用的な使用方法ですね!
当局は、I2Cの実験だけでで終わっています(笑)

10Hz台は、D/Aの代わりにAVRのPWM出力を積分してD/Aの代わりにするという手はいかがでしょうか!
そうすると¥100マイコンの2313でも制御でも十分制御できてしまいます。(LED表示だとポートが足りませんが)

I2Cは機器内部制御用I/Fとして考案されたものですが、外部からの使用として耐ノイズ性はどうなんでしょうね?
アマチュア的にはまったく問題はないと思いますが。
もちろん、ハムのノウハウで、きっちりシールドして、ノイズ対策をすれば、KWの電波でも誤動作はないと思います。

データ誤りの補正や、データの再要求などはなかったかと思います。
処理待ちのための、WAITはあったように思いますが(BASCOMが対応しているかは?)。
その分、簡単に使えると言うところがミソです。
当局的にも、使いやすくて、2線で、かつたくさんつなげるということで、色々実験しました。
ただ、BASCOMのプログラムには、不可解な動作があります(当局が使いこなせない?:爆)

TTT/hiro さんのコメント...

JN3XBY 岩永さん、こんにちは。 連休も最終日ですね。

コメント有難うございます。
> PCA9555Nの実用的な使用方法ですね!
はいそうですね。 たいていAVRマイコン1個で済ませるような製作が多いのですが、外部コントローラで制御する際は配線数が少ない方が有利です。
 もっとも、単なるシリアルデータアウトを使いビット列を送る方法でも十分なのかもしれません。その方がイニシャライズなど不要ですから簡単でしょう。I2Cのチップがあるので使ってみたいだけかも。(笑)

> PWM出力を積分してD/Aの代わりに・・・
良さそうなんですが、別体のコントローラからアナログ信号を引いて行かなくてはなりませんね・・・。 LED表示はSAA1064を使えばポート数の支障はありません。 ただ、相手が高感度なジェネカバ受信機ですからLEDのダイナミックドライブは宜しくないかも。(笑)

> 耐ノイズ性はどうなんでしょうね?
比較的低速なので低インピーダンスにしておけば大丈夫ではないかと思っています。 良くシールドするのが前提でしょうね。

> 誤りの補正や、データの再要求などは・・・
高級なプロトコルでデータではないので、高級な制御には向かないかも知れません。機内用にはバス構造が使い易いのが取り柄でしょうね。 BASCOMのバグっぽい挙動もありそうですが、単純なことしかさせないので大丈夫そうです。

量産品ではないためコストは関係ないのでメモリ に余裕のあるmaga168あたりで行こうかと思います。クロックは内蔵の1MHzで良いと思います。

JA6IRK@岩永 さんのコメント...

>別体のコントローラからアナログ信号を引いて行かなくてはなりませんね・・・。
そうですね! 別体でのノイズを心配しながら、片方でケアが足りません(^^;

>SAA1064
ダイナミックスキャンのICでしたね!
高輝度のLEDを使って電流を抑えれば実用判ではないかと思います。
当局も7MHzのTRX「ユーロスター」で使用しましが、ON/OFFでノイズの差は感じませんでした。
スキャン周波数と受信周波数にも夜と思いますが。

でも、さすが加藤さんですね!
色々と事前に練られていることがわかりました。
当局は、いつも行き当たりばったりです。

プロ的にはがんじがらめなんでしょうが、簡単な方法で、同じことを実現するのがアマチュアの醍醐味だと思います(^^)

TTT/hiro さんのコメント...

JN3XBY 岩永さん、こんばんは。 連休も終わってしまいますね。 名残惜しいですが仕方がありません。(笑)

コメント有難うございます。
> 片方でケアが足りません(^^;
いえいえ、やり方次第で旨く行くと思うのですが、なるべくなら配線の本数を減らしたいと思いっているのです。

> 電流を抑えれば実用判ではないかと思います。
ON/OFFする電流を減らすのは効果的でしょうね。それだけエネルギーが少なくなりますから・・・。最近のLEDは僅かな電流でも明るいですからなまじLCDにバックライトよりも省エネなくらいです。(笑)

> 簡単な方法で、同じことを実現するのがアマチュア・・
この受信機が作られたのは30年以上前です。そのころは思いもよらなかったようなテクノロジーで改造を試みようとしているのですから・・・。 やはりアマチュアでなければこんなことは考えません。

 趣味の世界はコストや生産性なんか考えなくても良いので自由な発想で行けるので楽しいですね。(笑)

JS1XFN/KAZ さんのコメント...

加藤さん、こんばんは。
いつも斬新な記事ありがとうございます。
私には受信機の改造というとせいぜい付加回路の追加くらいしか思いつかないので
周波数入力回路を改造するという発想が
驚きでした。こういう改造は一からつくるのと違う謎解きみたいで楽しそうに思いますが、プログラミングの敷居が高いです。

TTT/hiro さんのコメント...

JS1XFN 青木さん、こんばんは。

コメント有難うございます。
> 受信機の改造というとせいぜい付加回路の追加・・・
昔のHAMはジャンクの活用が基本でした。自作も当たり前ですから、受信機の改造などごく普通にやっていました。この改造はまだまだ軽微な方でしょう。(笑)

> プログラミングの敷居が高いです。
何かを制御するプログラムではないので、いたって単純です。 キーになるのはロータリ・エンコーダの読み取り、I2C経由でのデータ伝送くらいです。 人間が操作しますので速度も要求されませんから冗長なソフトを書いても大丈夫です。特に困難ではないと思っています。 あとはやっぱりヤル気の問題ですね。(爆)

tamura さんのコメント...

こんにちは

exJE1UNX 田村です。

連休中に数年前に作ったPIC使用の
子供の自転車ライトを点滅させるソフトを
変更しようと四苦八苦していました。

もうさっぱりハード・ソフトの環境設定忘れて
変更はあきらめました。
(大体よくわかっていないままやっていましたので・・・)

その間、ネットでいろいろ見ていくと
どうやら、AVRの時代のようで環境準備、
ソフト作りのしやすさ等
PICのことはすっかり忘れているので
この際AVRに転向するかと思っています。

アブ蜂取らずか、二兎を追うもの全てを
逃すか、根気もなくなりつつあるので
少しでも、とっつき安いものをと思っています。

まず、ROMライターの自作から始めようと思います。

TTT/hiro さんのコメント...

exJE1UNX 田村さん、こんにちは。

コメント有難うございます。
> ハード・ソフトの環境設定忘れて・・・
しばらく触っていないと忘れてしまいますねえ。私も忘れ気味です。(笑)

> この際AVRに転向するかと思っています。
PCIもAVRもチップの機能・性能にはあまり違いはないと思うので、どちらでも同じようなことができると思います。手持ちのハード、ソフトの環境をお考えになって乗り換えも検討されたら良いと思います。

どちらかと言えば、AVRマイコンの性能と言うよりBASCOMがあるから使っているようなものです。結局、チップの優劣より開発ツールの使い勝手次第ですね。いくらハード的に優秀でも良い開発ツールがないマイコンは廃れてしまいます。PICもAVRもその点は優劣付け難いと思います。(笑)

ex JE1UNX さんのコメント...

加藤さん 皆さんこんばんは

AVRようやくBASCOMでプログラムを
作ることができました。

LEDのチカチカ具合も簡単に変更でき
便利ですね。
(この時点でPICを超えました)

ライターは岩永氏の回路で作成しました。
お決まりの鶏と卵の問題でシリアルアルライターを
先に作り、AVR USBライターを作りました。

見ることができるかわかりませんがURLを
UPしました。

田村

http://photos.yahoo.co.jp/ph/indatatsu/lst?.dir=/1bf6&.src=ph&.order=&.view=t&.done=http%3a//photos.yahoo.co.jp/

TTT/hiro さんのコメント...

ex JE1UNX 田村さん、こんばんは。

コメント有難うございます。
> AVRようやくBASCOMでプログラムを作ることが・・・
さっそく拝見してきました。 ライタも旨く行ったようですね。 お目出度うございます。

> (この時点でPICを超えました)
多少でもBASICのご経験があればワンチップマイコンのプログラムも容易だと実感されたと思います。

> 先に作り、AVR USBライターを作りました。
トレンドはUSBライタだと思いますが、シリアルやパラレルのポートがあればそれからスタートが良いでしょうね。自力で全部で来ますから・・・。

このあとは、色々プログラムを作って試されて下さい。