過去の恥ずかしい記録をまとめました。

デジタル降魔録TOPページ




-過去ログは古い順に並んでいます-

2007年2月1日(木)

ICE は動き出したぞ。でもPICが・・・。


RICE3000というPICICE だが、もともと前バージョンのRICE16を使っていたので、だいたいは同じ操作感覚でいける。PICをお使いの方でICE を使用されている方が、どれぐらいおられるかは定かではないが、使ったことの無い方に、はっきり伝えます。いちど使ったら、もうやめられまへん。(興奮すると大阪弁が出てきてしまう・・・)

 PICにはMPLAB ICD2という低コストのICE があるが、本物のICE と比べるとすこし落ちる。何が気に入らないかというと、ターゲットとなるチップの内部メモリやスタックを消費することと、I/Oピンを数本拝借することなどが気に入らない。
 ただでさえ、I/Oピンやメモリが足りなくて四苦八苦しているのに・・・。一度でいいからI/Oピンがこんなに余ったぁ~。なんて叫んでみたい。

 さて、16F877の資料もそろった。開発支援機の方は万全である。ここからは自分との戦いである。ちょっと大げさだけど、そんな気分。入学した学校の初授業を受ける朝のような気分だ。う~ん。わかりにくいなぁ。まぁ、期待と不安でドキドキしている感じ。
 で、そのドキドキした気分で16F877のマニュアルに目を通す。何度もいうが、PIC暦15年の人間がようやく・・・というか、やっと16F877である。本来ならUSB機能の入った18系のモノに移ってもいいのにである。ま、文句を言ってもしょうがない。そういう規模の仕事がメインだったので仕方がない。とりあえずやるしかない。






2007年2月2日(金)

なんじゃ。このややこしいSFRは・・・


 なんじゃ。このややこしいSFR(Special Function Register)は・・・。
どえりゃ数やなもし・・・。どこの生まれや!

 プログラムエリアは旧タイプ(16C57)の4倍、クロック速度は5倍、各種割り込み機能あり、プログラムエリアのページ分けが旧タイプの4倍に広がっているので、1ページ内にほとんどのブロックが書き込めそうだ。これはうれしい。頼もしい限りである。

 PICの最大の欠点がこのプログラムエリアのページ分けではないかと思う。PIC18シリーズで1Mワードにリニア空間が開けたのでページの概念が無くなったみたいだが・・・。

 各メーカーのCPUを使用したことがあるが、PICは使ったことが無いという技術者に、こっそりお教えしよう。ページ切り換えのプログラムって昔からよくあった。Z80の64KBを超えたらページの切り換えを始める。とか、インテルの16ビットCPUでは、わけの分からないメーカーの信念とかいうものに付き合わされて、永いことページ切り換えで乗り切っていたことと思う。私はそのころ68000CPUだったので16MBのエリアがいつも広がってましたけどぉ・・・。(いやらしぃなぁ。書き方が・・・)そのかわり、PIC16C57で思いっきりページ切り換えの呪縛に襲われてました。罰(バチ)が当ったのです。

 PIC16C57はすごいよ。512アドレスごとにページの切り換えが始まるんすよ。そして、サブルーチンスタックは2レベルまで・・・。考えられまっか。サブルーチンコールの入れ子が2回しか使用できないんよ。割り込みの概念は無い、レジスタ比較の命令は無い、のナイナイ尽くしのCPUでっせ。
 特に割り込みが出来ないなんて組み込み系のCPUとして最悪である。初めて使ったときは呪われたCPUかと思ったぐらいだ。

 ところが何年も使っていると慣れてくるもので、自分なりにページ切り換えのマクロ命令を作って、注意すればページの切り換えはそれほど気にならない存在になっている。
 常にメインルーチンを巡回させてすべての処理をタスク化にすることで、割り込み機能が無くても処理落ちも無く動いている。慣れれば慣れるもんである。贅沢は敵だ!貧乏暮らしは慣れですな。〝リアルタイムOS〟?〝マルチタスク〟?〝セマフォ〟?何それ・・・である。

 こんどの16F877は、1ページが2Kアドレスに広がって、スタックも8レベルまで可能になっているし割り込みもある。久しぶりに楽ができそう。





2007年2月5日(月)

ひぃ~。設定が多いなぁ・・・


 機能アップが図られている16F877だが、動き出すまでに設定項目がいろいろと多い。16C57の時はポートの入出力設定とRTCCタイマーの設定ぐらいで、すぐに自分のプログラムの範囲に移れていたが、こいつはたいへん。アナログポートをデジタルポートに設定したり、各種割り込み設定やタイマー0、1、2の設定などたいへんだ。

 今日はテスト的にINT割り込みとタイマー0割り込みを使用するので、そのように設定してテストプログラムを走らせてみた。

 ICE も順調に動いている。ブレークポイントで一時停止させてワンステップずつ進めててレジスタファイルの中を覗く。えへへ。動いている動いている・・・。飼育しているメダカを水槽越しに覗いている気分である。ICE を使うとCPUだけでなく、ボードの動きまでも完全にコチラで把握できるのでうれしい。MPLAB IDEのシミュレーターでは絶対にこうは行かない。でも、値段が高い。RICE3000はかなり低コストだが、それでも一式そろえると30万円近くになる。 はぁ~。個人では買えんよなぁ。

¶ RICE3000をワンステップ動作させるときに、割り込み処理をスキップさせる方法 …

 何度かワンステップずつ動かしていて異変に気が付いた。メイン処理をワンステップ動作させるとすぐに割り込み処理に飛んでしまう。当たり前だがこれは困った。メイン処理の検証ができない。タイマー0割り込みがそのつど起動して邪魔になる。かといって割り込みを止めるとまともな検証はできないし・・・。こまった、こまった。

 問題はすぐ解決した。ステップオーバーを使用すればよい。RICE3000ではキーボードの〝F3〟を押す。こうすれば割り込み処理に入ってもそこを抜け出し次の命令で停止する。おぉ。これは便利だ。

¶ RICE3000のトリガー機能の不具合・・・?

 次にRICE3000のトリガー機能を使用してみた。これはICE 機能の中でもワンステップ動作の次によく使用するやつだ。
 どのようなものかというと、指定したアドレスの命令を実行した時にICE から出ているトリガーピンにパルスを出してくれる機能である。

 トリガー機能はICE 単体では使用することはないが、ロジアナを使った時に威力を発揮する。ロジアナの読み込みトリガーに利用すればプログラム内のある位置からある位置までで、どれぐらいの時間が経過したかを測定できる。これで思っている通りの速度が出ていればよいが、妙に時間が掛かっているとしたらバグがひそんでいる可能性がある。
 コレを利用してタイマー0割り込み周期を測ってみた。・・・が、おかしい。思っている以上の周期で割り込みが発生している。え~。おかしい。バグも無い。初めて使用するチップだから設定方法に間違いがあるかもしれないので、何度もマニュアルとソースプログラムを見比べてみたが間違いは無かった。

 ハードか?回路の問題だろうか・・・? 

 自分の悪い癖で、バグが無いと思うとすぐにハードのせいにしたがる。まぁ。自分で考えている回路なのでまだよいが、人の設計したハードの場合、こんなコトをいわれると気が悪いだろうな。

 ハードも問題なさそう・・・。頭の中は〝???〟で一杯になる。


	INT_ENT:
		;割り込みエントリー
		 :
		btfsc	T0IF		;TMR0割り込み?
		CALL	TMR_INT		;yes
		btfsc	INTF		;RB0割り込み?
		CALL	RB0_INT		;
		 :
		retfie		
  T⇒	TMR_INT:
		;タイマー0割り込み処理エントリー
		 :
		 :
		 :
		return

 この中の〝T⇒〟の部分でトリガーを掛けている。タイマー0は50mS周期に、RB0の割り込みは1mS~5mS周期になっているので、トリガーは50mS周期に掛かるはずである。

 でも、現実は違うのである。1~5mS周期で発生している。そう、RB0の割り込みの周期である。ちなみに、割り込み関係の全フラグの確認をしているので、タイマー0とRB0の割り込み以外は起動していない。
 こうなると〝T0IF〟フラグが壊れているとしか考えられない。

 そんなアホな。新品のICEでそんな分けが無い。それも何んで〝T0IF〟フラグだけが・・・?

 マニュアルを読んでもそんなエラーの話は載っていないし・・・。悩んだあげく、本当にタイマー0割り込みが発生しているのなら、その処理の最終の〝return〟も通るはずである。その部分にトリガーポイントを置いてみた。

 な、なんと! 50mS周期になった。

 はぁ?

 もう一度、〝TMR_INT〟へトリガーを置く。
 げぇっ! 1~5mS周期になる。
 そんな〝バナナ~〟・・・。ふ、古いって・・・。

 これはRICE3000のトリガー機能に問題があるようだ。でもマニュアルには書かれていない。推測すると、どうもトリガーポイントのひとつ手前の命令でも(ここでは〝retfie〟)トリガーが掛かるようだ。

 それが証拠に次のようにすると〝TMR_INT〟へトリガーを置いてもちゃんと50mS周期になった。


	INT_ENT:
		;割り込みエントリー
		 :
		btfsc	T0IF		;TMR0割り込み?
		CALL	TMR_INT		;yes
		btfsc	INTF		;RB0割り込み?
		CALL	RB0_INT		;
		 :
		retfie		
		nop			;←何もしない命令を追加
  T⇒	TMR_INT:
		;タイマー0割り込み処理エントリー
		 :
		 :
		 :
		return

 最初のトリガーポイントの一つ前の〝retfie〟は、割り込み処理からメイン処理に戻る命令なので、タイマー0とRB0割り込みの発生のたびに、トリガーが掛かっていたことになる。

 まぁ、原因がわかれば対策も取れるので、ど~ってことないか。これからこのICE とも永いお付き合いになることだし、ここはひとつ穏便に対処しましょ。
 同じICE をお使いの皆さん。あなたのはどうですか?・・・もしかして、私のだけだったりして・・・。それは困るぞ。






2007年2月13日(火)

 思っていたこととちがうぞ・・・


 今回の16F877を使用したボードの開発目的は、ある環境で使用されていたマシンに擬似信号を送り込んで、別の環境でも使えるようにするものを作ることである。
 例のごとく守秘義務というのがあるのでこれ以上は書けないが、人がいなくてもある程度自立して動くようにするのである。

 このマシンはパソコンのようなモニターが備わっていなくて、7セグメント表示器が何個かグループになっていて、そのときの状況をモニターしている。その中の一グループをコチラのボードが乗っ取ってデータを表示させることになる。なぜそんなややこしいのかというと、このボードはワンタッチでマシンに装着できるというのが売りなので、電線を切って半田付けして・・・。なんて作業はいっさい無しでやらなくてはいけない。

 これらの表示器はダイナミック点灯方式で行われているので、コチラの必要な表示器の点灯タイミングがわかれば、そのときはコチラのデータを流し込んでやればいいわけだ。そこで、テスト回路で使用していたINT割り込みではなく、表示回路のコモンラインを16F877のポートBへ流し込んで、RB変化割り込みで読み取る回路に変更してみた。

 ・・・が、うまくいかなかった。

 16F877のRB変化割り込みは、速い変化にはうまく対応しきれないようだ。別の方法を考えなければいけない・・・。





2007年2月14日(水)

 ほっと一安心・・・


 RB変化割り込みではうまくいかなかったので、いろんな回路を考えてみた。割り込みの無かった16C57の時の回路も頭をよぎったが、新チップになっているのに同じ回路ではコスト高になって採算が取れない。なんのために高い開発機材を導入したのか・・・。怖い社長の顔がちらつく・・・。うぅ~。怖いよう~。

 ここらが趣味とは違う世界だぁ。1円でも安くしなければ評価されないんだよな。
 今回は部品点数を極限にまで減らさないと意味が無い。ムムのむ、プレッシャーが・・・。

 とりあえずINT割り込みは正常なので、それを利用するしかない。9本のコモン信号をデコードしてコチラの利用する表示タイミングさえわかればOKなんだ。

¶ 部品を増やしたくないのに論理回路が必要になったら…

 デコードするにはTTLが必要だなぁ。でも部品は増やせないし・・・。

 おぉ、そうだ。ダイオードロジックがあったじゃんか。

 さっそくデコード信号をダイオードORで作ってみたところ良好である。ただ、全然関係ないタイミングでも不定期的に割り込みが発生しているが、これはダイオードORが原因ではない。本体マシンのコモン信号に正しい切れ目が無く、少し質が悪いようでヒゲ状の誤信号が出るときがある。ま、これは割り込み処理の中で誤信号かどうかをチェックすればOKである。
 う~ん。これもロジアナのおかげですね。ここまでクリティカルな部分はこいつが無いと絶対わからない。

 これで、なんとかなった。首の皮一枚でつながった・・・。ちょっとおおげさかな。





2007年2月15日(木)

 PIC16F57 が PICSTART Plusで焼けない・・・


 現在仕入れている16C57が製造中止になるらしい。代わりに16F57というのがやってくる。フラッシュ書き込みの出来る16C57だという。へ~。そんなのいつのまに作られてたんだろ。

 我ながら、情報入手の下手さ加減にはゲンナリ来る。マメにセミナーとか行くべきでしょうね。でも、行かしてくれないもんな・・・。うちは・・・。

 そのチップと最新版のPIC START Plusが今日やってきた。早速テスト的に焼いてみる。

 焼けない・・・。 え~。なんで? 16F877はちゃんと焼ける・・・。
 デバイスの選択もコンフィグレーションビットも間違いない。

 何度やっても焼けない。試しに16C57を焼いてみたがそれも焼けない。
 新品の16C57のプログラムエリアを逆に読み込んでみると、全プログラムが
〝0xBFF〟と表示される。真新しいチップは〝0xFFF〟になるはずなのに・・・。

 PIC START Plusがおかしいのかと、購入先の商社へ電話を入れて、直接マイクロチップ社へ尋ねてもらった。が、返答はそんなはずは無いとのこと。
 それよりこっちの扱い方がおかしいのではと・・・。えぇ~。そんなはずは・・・。
 なんせ、初めてのチップなのでコチラも自信が無い。恥ずかしいね。

 ラチがあかないので直接質問させてもらったが、なんともあやふやな解答しか返ってこなかった。16F877は正常に焼けるので、機械に不具合は無いの一点張り。いや、別に文句を言ってるんじゃないですよ。どうして16F57が焼けないのかと尋ねているんす。プログラムエリアが何故〝0xFFF〟になるはずが全部〝0xBFF〟になるんしょ?
 どう考えても、プログラムエリア内の10ビット目がLoに固まっているしか考えられないでしょ。と尋ねているのです。はい。

 結局、良い解答は得られなかった。仕方がないので、英文の文献を読みあさる・・・。読むというより〝眺める〟が正しいね。あははは。

 なんやかんやしているうちに検索で〝16F57〟が引っかかった。場所はPIC START PlusのReleaseNotesの8番だ。  よーく。眺めてみると、なにやら16F57を使用するときは別のソケットをPIC START Plusのソケットに重ねて、26番ピンを切り取って使用せよと書かれている・・・いや書かれているではなく、眺めているとな~んとなくそう見えてきた。

 書かれているまま半信半疑にやってみると・・・。見事成功。ちゃんと焼くことが出来た。

 よかったぁ~。
 嬉しくなったついでに、マイクロチップの担当の方に自己解決しましたのでぇ・・・と明るい声で電話をする。〝ReleaseNotes〟のことも伝えた。まぁ、めったに16F57を使用する会社は無いとは思うけど、今後の参考になればと電話を切る。

 もしかしてこのチップを使用しているのは、わが社だけなんだろか・・・。そうなると私の正体がばれる日も近い・・・か?






2007年2月20日(火)

 順風満帆・・・


 コモン信号でつまずいた〝G30〟ボードだが、それ以外は得意の分野なので順調である。
 今回はどこまで部品点数を減らせるのかがテーマらしい。そらそうだ、そのためにお金を掛けて新しいCPUに移行したんだし・・・。何とか期待に答えたい。

 新しいチップのおかげで、かなりの部品の削減ができる。いままではポートCを外部バスラインのように使って、複数のI/Oをゲート回路で分散して、選択信号でアクセスしていたが、今回はゲート回路をすべて削除できた。

 問題は外部とのインタフェース部分だ。従来はフォトカプラで絶縁した回路を採用していたが、部品点数が多くなるので、今回は部品削減のため電流制限用の抵抗だけを使用した方法で、まずは実験的に繋ぐことにしてみた。

 まずは最低限のノイズ対策でどれぐらいの影響があるか、部品削減のため最悪値から試して、どのあたりで収まるかやってみることにする。そら、フォトカプラで完全に絶縁してしまった方が安全なのは分かっているが、それではコストを下げることができないのだよ。この辺のかけ引きがむずかしいね。





2007年2月23日(金)

 順風満帆②・・・


 今日で試作ボードの手配線が終了。しかしこの作業は地味ですな。もっと、スマートにできないですかね。これだから、みんなが嫌がるんだろうな。
 さて、月曜日からいよいよ火入れ式である。この経費削減回路がうまく動くか、はたまたノイズでシッチャカメッチャカになるか・・・。お楽しみである。
 まぁ、まったく動かないということは無いだろう。






2007年2月24日(土)

 休みの日は・・・


 休みの日は個人的なことで、やはりパソコンに向かっている。パソコンに向かわない日は、大晦日と元旦ぐらいだ・・・。この日は実家に帰っているので嫌でもパソコから離れるのである。人は私のことを〝パソコン中毒〟とか〝パソコン依存症〟とか言うが、知ったこちゃない。これでメシを喰えるようになったんだからいいじゃんか!悔しかったらマネをしてみろ。ってんだ。
 といいつつ、朝4時半から起きてキーボードを叩いている自分はやっぱり変かな?

 普通の人は夜中までパソコンに向かっているのだろうが、自分の場合ははちょっと異なる。夜は一杯呑みたいので晩酌後はさっさと寝てしまう。嫁さんももう慣れているので、自分の時間を楽しんでるのだと思う、何もいわない・・・。だと思う・・・。

 そして、明日はあれして これしてと段取りを考えて早い時間から寝るのである。で、早朝。3時とか4時頃にトイレに行きたくなって眼が覚める。まだ早いので寝ようとするのだが、昨日考えた段取りを思い出すともうだめ。興奮してきて眼が冴えてくる。布団の中でゴロンゴロンしているが、頭の中は冴えわたって来る。「え~い! もうよい! 起きてまえぇ~」となって〝ガバッ〟と起き上がるのである。まるで子供ですな。

 話は変わって・・・。

¶ エッセイ集のホームページ〝西宮文学全集〟のお話し …

 〝西宮文学全集〟というエッセイ集を出しているホームページがあるのだが・・・。

   興味のある方は一度ご訪問ください

 実はここのメンバーとして今年から新規参入させてもらっている。もともとは〝西宮文学全集〟という小冊子を配るだけの活動だったのだが、面白いのでぜひホームページにしようと持ちかけ、私がホームページ化したのだ。そうしたら、どういう訳か私にも原稿依頼がかかり、ちょろっと月イチで昔話を書かせてもらっている。恥ずかしいのでペンネームは伏せるけど、読んだらすぐバレる。

 そのホームページで紹介している原稿の数が、他のメンバーのと合わせるとかなりの量になってきたため、メニューボードの作り直しをすることになったのだ。それをこの休みのあいだにやってしまおうという予定である。

 私の書いている原稿の内容については、このホームページでは、おカド違いなので省略するが、ホームページの構成についてはイロイロとデジタル的なことが多い。

 覗いてみてもらえば分かるが、ここのホームページはオールFlashで作っている。・・・あっ、Flashといってもフラッシュロムではないよ。ホームページコンテンツでいうところのFlashプレーヤーのこと・・・。

 その中ではBGMの読み込みやメニューボードから目的の原稿を開く部分は、すべてアクションスクリプトで書いている。スクリプトは正直言ってプログラムである。いや、プログラム以外の何モノでもないな・・・。

 C言語風なので非常にとっつき易かった。・・・あっ、ちなみいっておくが、C言語は知らないよ。アセンブラひと筋、二十ん年である。見たことはある。JAVA スクリプトもやっているが、C言語みたいだな。。。と思っているだけで、実際にC言語をコンパイルしたこは〝まったく〟ない。えっへん。・・・恥ずかしいだけだな。

¶ フラッシュでmp3を使わずにBGMをループにする方法 …

 話を元にもどすが・・・。このホームページではBGMを選択できるようにして鳴らしているが、これはスクリプトでmp3ファイルを選択して、ループにして鳴らしているのではない。そんなことをするとループのお尻と頭の部分に音の切れ目が出て、非常に聞き苦しいモノになってしまうよ。
 では、どうしているか・・・。

 知っていたらスンマそん・・・。
 まず、別のswfファイルでBGMのwaveデータをスクリプトでループ1万回にして鳴らしているのを作る。それをメインのswfから読み込んでいる。こうしたら、mp3ファイルを使用しないのでループの切れ目に無音が入らないし、音量調整も曲の選択もスクリプトで可能になる。さらに本体のswfをさわらずに、曲の更新もできて結構便利だよ。

 そんなかんだで、今日はメニューボードの作成をやり、明日は投稿原稿の書き溜めをする予定。頭の中は文科系のエリアと理科系のエリアが格闘している。きっと明日も4時起きだろうな。だははは・・・。ジジイか・・・。





2007年2月26日(月)

 休み明けもパソコン三昧(アホです)・・・


 金曜日に出来上がった〝G30〟ボードのプログラム作りが始まった。まずは3桁の7セグメント表示器の時分割処理から始める。コレがうまく動かなければすべてが始まらない。こちらの表示タイミングが始まったら、INT割り込みが掛かるので、そこから1mS周期で本体に送るようにした。
 表示時間以外は1mS周期のタイマー0割り込みで、パネルボードにある数個のスイッチのON/OFFをポーリングさせるという流れだ。

 案の定、表示タイミングにヒゲ状の誤信号が入るので、表示時間以外にINT割り込みが掛かっているが、3桁の表示器に流れるコモン信号が来ていないので、誤信号だというのがすぐ分かる。そのときは何もせずに無視すればよい。5~10mSに1個ほどの誤信号なので、全体の流れには影響は無い。よしよし、順調順調。