2014.6.3

前へ
次へ
ホームページトップへ戻る

CPLD+SIMMを使ってUSBプロトコルの解析を!
VHDLを速習! XC95144XL+16MB・SIMMを使ってUSBプロトコルアナライザを作ってしまいました!
主目的は差し迫った事情からUSBプロトコルの解析をすることだったのですが、その手段として選んだのがコレ!


[第59回]


●PIC18F14K50のRead−modify−writeの怪(2)

前回からの続きです。
前回は、カメレオンロジアナで観測した、Z8S180がPIC18F14K50にCPU RESETの発生を伝えたのに応えて、PIC18F14K50がRB4とRB5からL出力したときの画像をお見せして、説明不能な異常現象です、と書きました。
どこがそれほどに異常なのでしょうか?

もう一度カメレオンロジアナの画像を見ていただきましょう。



PROBE03がRB5でPROBE04がRB4です。
前回書きましたように、PIC18F14K50のその部分のプログラムは、
BCF PORTB,4
BCF PORTB,5
でした。
タイミングからすると、最初に BCF PORTB,4 の実行でRB4がLになったあと、BCF PORTB,5 の実行によってRB4の出力が反転してしまったかのように見えます。

PICのポート出力はRead−modify−writeになっています。
出力ポートの全ビットを一度に変更するような使い方の場合には、この機能は意味を持ちません。
通常の出力と異なってくるのは、特定のビットのみを出力する場合です。

たとえばBCFやBSFは、そのビット出力のみを0または1にするのではなくて、PORTBならPORTBの全ビットを一度読み込んだ上で指定したビットだけを変化させて、再度全ビットを出力させるという動作をしているようです。
この場合に出力ラッチの値を再読み込みするのならば、特に問題は発生しません。
しかしPICでは出力に設定したポートから入力を行なうと、出力ラッチのデータを読み込むのではなくて、その端子の状態を読み込みます。

もしもなんらかの理由で出力ラッチの値と出力端子の値が違っていた場合には、BCFあるいはBSFによって読み込まれた値は、その直前に出力された値とは異なってしまう可能性が無いとは言えません。
これはしかしかなり特殊な状況の場合に限られると思います。

ふつうはそんな異常な状態は想定することはできませんが、あるとすれば出力端子に非常に大きな負荷がかかっていて出力ラッチの値がそのまま維持できないとか、大きな容量負荷のために出力ラッチの値がすぐには出力端子に反映されないといったような場合が考えられます。
そのいずれの場合でも、当然出力端子を測定すればそのような異常な値であることはわかるはずです。

では上の画像の場合にはどうでしょうか?
カメレオンロジアナの測定端子はPICの出力端子の値をそのまま忠実に捉えています。
そのことから考えると、PROBE04(RB4)はBCF PORTB,5 が実行されるときまでにちゃんとLに下がっていたはずです。
それなのにその時点でRB4の出力をread−modify−writeによって読み込んで再出力したら(当然Lであるべきはずなのに)なんとHになってしまったというのはどう考えてもおかしいではありませんか。

一体何がどうなっているのか、これはこのまま捨て置くわけにはまいりませぬ。
まずはテストプログラムを作って再現性のテストから始めることにいたしました。
といいましてもそれをLegacy8080でやるというのはちょっと乱暴でありましょう。
簡単なテスト回路を組んでそこでテストをするのが一番なのですけれど、さて何か適当なものはありますでしょうか?

過去記事をさぐってみましたら、ありましたよ。
ちょうどおあつらえ向きのものが。
「PICでUSBを」[第78回]です。
おお。これですよ、これ。
超シンプルな回路に、ちょうど手頃なサンプルプログラムまであるじゃありませんか。
さっそくこれを使ってテストをしてみることにいたしました。

説明の途中ですが本日は時間がなくなってしまいました。
この続きは次回にいたします。

CPLD+SIMMを使ってUSBプロトコルの解析を![第59回]
2014.6.3upload

前へ
次へ
ホームページトップへ戻る