CPLD+SIMMを使ってUSBプロトコルの解析を!
VHDLを速習! XC95144XL+16MB・SIMMを使ってUSBプロトコルアナライザを作ってしまいました!
主目的は差し迫った事情からUSBプロトコルの解析をすることだったのですが、その手段として選んだのがコレ!
[第58回]
●PIC18F14K50のRead−modify−writeの怪
毎度同じことを書いておりますが、またまた何日ぶりかの更新になってしまいました。
このところ葛Z術少年出版様のLegacy8080の仕上げ作業にかかっておりまして、そこにお得意さまからの急ぎの注文が重なってしまったものですから、ホームページの更新にまで手が回りませんでした。
それと今回のタイトル(これもしっかりテーマ違いなのですが)、このことについても書いておかなくてはと思ったのですけれど、書くからには裏づけが必要と。
やっぱりしっかりとウラを取っておきませんと誤認逮捕などで世間を騒がしてしまいますです。
しかしその裏づけのためのテストをしている時間がありません。
ということなどで、ホームページの更新ができませんでした。
やっと少し時間をみつけて、テストを行なってウラが取れたものですから、今回の記事となりました。
ウラを取る必要があるほどの「事件」とは何でありましょうか?
今回のタイトルにありますように、それはPIC18F14K50で発生した奇怪な現象でありました。
それが発生しましたのは、前回まで数回にわたって書いてきました、これもテーマ違いの「Legacy8080のCPU RESETによるウォームブート対策」の作業中の出来事でした。
前回までに説明しましたような経緯で、Z8S180のプログラムとPIC18F14K50のプログラムを書き換えましたところ、どういうわけかプログラムがハングアップしてしまうらしく、先に進んでくれません。
変更した部分のプログラムをチェックしたのですが、プログラムにはおかしいところは見当たりません。
ですがとにかく途中でハングアップしてしまうようです。
あれこれ思いつくところをチェックしたりしたのですが、どうにも原因がつかめません。
こういうことになりますと、やはりロジアナの出番でありましょう。
強力な助っ人でありますカメレオンロジアナは本来の当テーマで使用中で、USBデータ収集装置に変身しておりましたが、急遽もとのロジアナプログラムを再ロードして、本来の機能に復帰していただきました。
怪しいとにらんだのは[第56回]で説明しました、PIC18F14K50とZ8S180とのデータのやり取りの部分です。
RB7,RB6,RB5,RB4の4本の信号線を使ってデータの送受信を制御しています。
その各信号をロジアナで捉えて解析してみれば、どこでハングアップしているかがわかるのではないだろうか?
結果はまさにビンゴ、大当たりでありました。
が。
なんじゃあ。こりゃあ。
上の画像はカメレオンロジアナで、Z8S180がPIC18F14K50にCPU RESETの発生を伝えたのに応えて、PIC18F14K50がRB4とRB5からL出力したのを捉えたときのものです。
PROBE03がRB5でPROBE04がRB4です。
PIC18F14K50のその部分のプログラムは、
BCF PORTB,4
BCF PORTB,5
でした。
上の画像ではRB4がL出力後すぐにHになってしまっていますが、プログラムではそのようなところはありません。
タイミングからすると、最初に BCF PORTB,4 の実行でRB4がLになったあと、BCF PORTB,5 の実行によってRB4の出力が反転してしまったかのように見えます。
うむむ。
おかしい…。
が、すぐに頭に閃いたのは、今回の見出しにありますRead−modify−writeです。
PICのRead−modify−writeについては以前にもどこかに書いたように記憶しています。
PICでは出力に設定したポートから入力を行なうと、出力ラッチのデータを読み込むのではなくて、その端子の状態を読み込みます。
それって同じことじゃないの?
と思うのですが、回路の状態によっては微妙に期待したのと異なった結果になってしまうことがあります。
問題は今回の例のように、BCFやBSFでそのことが無視できなくなる可能性があることです。
BCFやBSFは機能だけを見れば、そのビット出力のみを0または1にするように思えますが、実際にはそうではなくて、PORTBならPORTBの全ビットを一度読み込んだ上で指定したビットだけを変化させて、再度全ビットを出力させる、という動作をしているようです。
どうやらその過程で何かがおきているらしい…。
この問題についてPIC18F14K50のDatasheetをあらためて読んでみましたら、LATB(LATA,LATCもある)というレジスタがあって、PORTBの代わりにLATBを使えばそういうことはおきないらしい、というような記述をみつけました。
[出典]Microchip Technology Inc.PIC18F14K50 Datasheet
(赤線は筆者)
しかしLATなどというレジスタは今まで使ったことがありませんでしたからそういうものはちゃんとしっかり検証してから使いませんと、生兵法は大怪我の元と申します。
思わぬ大怪我をしてしまわないとも限りません。
ここはごくごくオーソドックスに
CLRF PORTB
としてしまいました。
もともとここはもとあったプログラムを手直ししたためにBCFなどという命令を使ったのですが、何もビットごとに出力しなければならないことはありませんから、そのようにした(CLRFを使うようにした)ほうが合理的です。
その結果は下の画像のようにRB4とRB5がともにLになりました。
これでめでたしめでたしです。
これでつかえておりましたプログラムの変更作業も滞りなく進むようになりまして、前回までに説明しましたようにCPU RESETによるウォームブートが無事機能するようになりました。
しかし。
すっきりしないのでありますね。
なぜ、RB4が出力反転してしまうのか。
ええ。
Read−modify−writeは承知しております。
しかし、どう考えたっておかしいじゃありませんか。
だって、さきほどのPIC18F14K50のDatasheetのI/Oポートのブロック図を見てもわかりますように、ポートの出力はラッチされて端子から出力されていますから、それを読めば同じ値が読み込まれる理屈でありましょう。
PICのRead−modify−writeにつきましては、あえて特別な条件を設定して説明されてみえる方もいらっしゃいます。
http://homepage3.nifty.com/mitt/pic/pic1320_06.html
この方はポート出力に0.01μFという大きなコンデンサを取り付けて、そのときに発生する問題を説明していらっしゃいます。
そりゃあその通りでありますけれど。
ちょっと苦しいです。
ふつう回路にそんな大きなコンデンサを入れることは無いわけで。
勿論今回Z8S180とPIC18F14K50との間で発生した異常現象はそんなもんじゃないのでありますね。
どこが奇怪かと言いますと、ほとんど説明不能の異常現象だからであります。
今回の一番最初にお見せしたカメレオンロジアナの画像をもう一度よっくご覧になってください。
あまりの奇怪さに背筋がぞぞぞっとしてきませんか?
あ。RB4とRB5のあたりの回路図は[第56回]でお見せしております。
それを見ていただければおわかりになりますようにごくシンプルなラインで、どこにもコンデンサなど入ってはおりませぬ。
それでは、なぜあのような奇怪な出力になってしまったのでありましょうか。
ええ。
それが謎だったのであります。
ですからその謎を解明しないことには、このことについて何も書くことができませんでした。
今はちゃんとウラが取れましたので、こうして書いているのです。
説明の途中ですが本日は時間がなくなってしまいました。
この続きは次回にいたします。
CPLD+SIMMを使ってUSBプロトコルの解析を![第58回]
2014.6.2upload
前へ
次へ
ホームページトップへ戻る