ikkei blog

電子工作やパズルのブログです。主にLEDを使った電子工作をやっています。

今日もPICにハメられた...orz

2013年06月28日 23時31分36秒 | PIC
今日は、ノイズを加えて3分間待つのだよ。
と言う簡単なお仕事を2,30回こなしたあと、
やっと本来のPICのコーディングに戻れました。

いつもの様に修正を加えてビルド、PICkit2での書き込み、
あれ、動作がおかしい。
おかしくなるような修正したはずはないのに、
と思って、修正したところを元に戻しました。

でも、まだ動作がおかしいのです。
よく見ると、シリアル通信で、ACKを返していません。

コマンドを読み込んだら、ACKを返すはずなのに
と思って、通過ポイントをチェックしてみると
どうやら、受信データがエラーになっています。

試しに、受信したデータをそのまま送信するように
コードを追加してみると....

なんと、1ビットの長さが114μsになっています。
9600ボーなので、104μsになっていないといけない。
目で見ただけで、長くなっているのが分かるほどです。

逆算してクロックの周波数を計算すると、7.3MHzです。
本来の8MHzに比べて8%も低いのです。

これはどう考えてもおかしい。
普通に書き込みをしただけなのに。

ひょっとして、周波数校正したデータを書き換えてしまった?
ところが、このPIC16F687にはそういうものがありません。
クロックは校正され、それからずらすためのOSCTUNEと言う
レジスタは有るみたいですが、起動時は0になっています。

念のため、OSCTUNE = 0; を入れてやっていましたが
変わりませんでした。
代わりに、初期値として10を入れると、動作が正常になりました。

と言うことは、何らかの原因で、ユーザから操作できないレジスタが
書き換わって、周波数がずれてしまったのかも知れません。

ツイッターで聞いてみたら、PICkit3のバグで書き換わることが有ったそうです。
えー、そんなの怖くて量産で使えないじゃん!
って言ったら、PICkitは量産用のツールじゃ無いとのこと。

なーんだ、そうなのか。





って、そう言う問題じゃないって。


いずれにしても、気持ちが悪いので、
基板から外して調べてみる必要がありますね。
それと、新しいのを貼り付けたらどうなるのか。

んー、どうも最近PICに振り回され続けています。

デジットの32x16ドットマトリクスLEDモジュールの回路図を起こしてみた

2013年06月26日 22時06分20秒 | 電子工作
先日、デジットで見つけた大特価の32x16ドットマトリクスLEDモジュール(500円)ですが、


さっそく購入しました。


参考資料も付いていて信号の端子も分かっていたのですが、一応回路図を起こしてみました。
LEDドライバのBD7851FPは以前使った事のあるICで、馴染みがあります。

資料から、予想通りの回路になっていました。
PDFはこちら

ただ、定電流出力なのに抵抗が付いていました。
電流制限でなければ、おそらく熱がICに集中しないように分散させるためかも。
このICけっこう熱くなりますから。

ただ、制御する側から言わせてもらうと、
なぜシリアルを数珠つなぎにしなかったのだろうかと思います。
マイコンのシリアルI/Fは3本も無い場合が多いし、
有ったとしても、このためだけに3本使ってしまうのはもったいないです。

今日は梅田のキディランドで平野さんに会ってきた

2013年06月23日 23時08分01秒 | パズル
今日は梅田のキディランドに平野さんが来るというので、行ってきました。

居ました、居ました。


相変わらずの名調子です。


S&Sも、ちょちょいのちょいで、この通り!


最新のキャストパズル「G&G」が先行発売です。


さっそく、ゲットしました。

今回のおまけはチョロQです。

難易度は3ですが、去年のグランプリ受賞作品なのです。

これが、初期状態です。







で、とりあえず、サクッと外せました。












が、

しかし、

こ、

これは、

戻すのが難しいパターンだったのね....


ボタンをチョンチョンするとフリーズすると思ったら...

2013年06月22日 14時25分32秒 | 組み込みソフト
今やっていることで、タイミング良くボタンをチョンチョンと押すと
反応が無くなって、キースキャンも止まってしまいます。

これは、きっとコマンドキューの大きさが足りないためだろうと
キューのサイズを大きくしてみましたが、変わりません。
キューが溢れそうになったらポートに信号が出るようにしてみました。

ところが、いくらやっても全然出てきません。
ならば、もっと小さくしてみよう。
どこまで小さくすれば、出てくるか。
どんどん小さくして、2までしたら、やっと出てきました。

4に増やして連打してみましたが、今度は全く出力が出ません。
手が追いつかないのです。高橋名人でないと無理かも。
と言うことは、これが原因ではないということ。

他の原因を探るため、色々信号を見ていくと....
あれ?

ボタンを押すと、シリアル出力が出るのですが、
ハンドシェイクしているので、RTS、CTSを使用しています。

/RTSがLの時は出力してはいけないのですが、どうやら/RTSがLの時にフリーズするようです。
でも、よくよく見てみるとそのタイミングで/CTSがLになっています。
両方ともLになるのは、あり得ないのです。ダメじゃん。

原因は、/CTS出力と/RTSチェックを別の関数でやってました。
そのせいで順序が逆なのに気が付かなかったというものです。

出力のビジー代わりにも/CTSを作っているので、
シリアル出力するとき、/CTSのチェックのあと、/CTSを出力します。

ところが、/RTSのチェックをそのあとにやっていたのです。
これは、出力しようとして受信を拒否しながら相手の送信が終わるのを待つってことです。 こりゃダメだ。

と言うことで、
/CTSをチェックしてから、/RTSをチェックして、送信出来るとなってから、
/CTSを出してシリアル出力するという手順に修正しました。

これで、フリーズすることは無くなりました。ヤレヤレ。