2014.6.7

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

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


[第61回]


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

前回からの続きです。
前回はLegacy8080のPIC18F14K50で発生した異常現象のウラを取るために、簡単なテスト回路とテストプログラムを使って確認をしてみました。
その結果は全く正常でした。
BCF PORTB,5 の実行によってもRB4の出力が反転するなどという異常現象は発生しませんでした。

ということになりますと、前回のテスト回路とLegacy8080の回路との間になにか相違点があるということになります。
しかし、Legacy8080のその部分の回路はシンプルなもので、RB4に特に大きな負荷がかかっているような回路ではありません(Legacy8080のその部分の回路図は[第56回]参照)。

ハードではないらしいということになりますと、それではソフトか?
ということになりますが、PIC18F14K50のプログラムにも特に怪しいところは見当たりません。
それじゃあ全くの謎ではないかと思われるかも知れませんが、実は前回のテストを始めるにあたって、ひょっとしたら、と思ったことがあります。
それはクロックの違いです。

Legacy8080に搭載しているPIC18F14K50はUSB通信を行なうため、48MHzという高い周波数で動作しています。
片や前回のテストでは「PICでUSBを」[第78回]で使ったテストプログラムをちょいと書き換えただけでしたので、とりあえずはそのときのテストと同じ16MHzクロックでした。

16MHzでは問題は発生しませんでしたが、ひょっとすると48MHzでは何かがおきるかもしれません。
しかし48MHzということになりますとクリスタルを外付けしなければなりません。
いやまあそれほど手間のかかることではありませんからそうしたってよいのですけれど、どうせですからこのままで、もう少し高いクロックで試してみたって無駄ではありませんでしょう。

PIC18F14K50は内蔵発振モードではCPUクロックを最高32MHzまで上げることができます(「PICでUSBを」[第79回]参照)。
それそれ。
それを試してみましょう。
ということでさっそく32MHzに変更したプログラムが下のリストです。

;;;pic p18f14k50 test program
;f14k50test2
;10/5/21
;14/6/1 6/2
;
;
       #include<p18f14k50.inc>
;cpuclock=32MHz internal oscillator
;
        CONFIG FOSC = IRCCLKOUT,WDTEN=OFF,LVP=OFF;not WDT          
;
        org 00
        movlw 64;clock=8MHz,select Primary Clock
        movwf OSCCON
		movlw 40;PLL on for intosc=8MHz only
		movwf OSCTUNE
        clrf ANSEL;PORTA,PORTC are digital
        clrf ANSELH;PORTB,PORTC are digital
        clrf TRISA;porta=out
        clrf TRISB;portb=out
        clrf TRISC;portc=out
;
        movlw 0ff
		movwf PORTB		
loop
		bcf PORTB,4
		bcf PORTB,5			
        xorwf PORTC
		bsf PORTB,4
		bsf PORTB,5
        goto loop
;
        end

このプログラムを実行してみましたら。
おお。
出ました、出ましたよ。
お化けが。



上(CH0)がRB5で下(CH1)がRB4です。
前回の画像と見比べてみてください。
というより、もう一度見ていただいたほうが早いですね。
こちらが前回の画像です。



こうやって前回の画像と比べてみるとその違いは一目瞭然です。
今回はRB5がLになるのとほぼ同時にRB4がHになってしまっています。

むむ。
やっぱりCH1の波形がなまっているのがちょいと気になりますですね。
これは前回も書きましたようにCH1に安物のプローブを使ったせいですので、波形そのものがなまっているわけではありません。
でもちょいと気になりますので、CH0とCH1に入れる信号を交換してみました。



上がRB4で下がRB5です。
ほら。やっぱり下がなまっていますでしょう。
しかし、このプローブはひどいですねえ。
やっぱり安物はだめですねえ。

それはともかくとしまして。
そういうことだったのですねえ。

Microchip様もようやりますなあ。
お口あんぐりで、もう言葉もでまへんです。

念のために前回と同様にLATBでも32MHzで試してみました。



こちらは32MHzでも正しい出力が得られています。

おや。
今回は信号のなまりがなくなりました。
安物のプローブは気まぐれだなあ。

それはともかくとしまして。
なるほどPIC18F14K50のDatasheetにありますとおり、PORTxを使わないでLATxを使うべきだということになりますけれど。
素直に納得はいきかねますですねえ。

RB4がLになってからRB5がLになる(BCF PORTB,5が実行される)までに約100nsあるのです(画像の信号をご覧あれ)。
それだけ時間が経過しているというのに、まだ信号の変化が読み込めないことからすると、PICのPORTの入力ゲートはメチャメチャ遅いということになります。
なんでそんなみっともないことになっているのでありましょお。
(むむ。同じ端子にいくつもの信号を多重に割り当てているせいかもしれませんですねえ)

アナログ入力と多重しているせいかと思いましたので、アナログと多重していないRB6とRB7でも試してみたのですが、やっぱり同じでした(BCF PORTB,6とBCF PORTB,7でテスト)。



さて。ここからは推理なのですけれど。

これは当然Microchipの技術者も百も承知のはず。
通常のread−modify−writeでおきるかもしれない問題は出力端子の外部回路が原因だけれど、これは違う。
PIC自身の内部回路のせいだと知れた。

どないしよ…。
それまでのPICは10MHzが相場だったので、まあ問題はなかったのですけれどねえ。
それが30MHzともなると。
あかん。ばれてしもた。

で。
LATxなどというレジスタを追加したんじゃありませんかねえ。Microchipさま。
ちなみにPIC16FにはLATxはありませんです。

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

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