何故, プログラムはstandard I/Oで動作し、fastI/Oでは動作しないのですか?
最初に覚えてほしいことは、fastI/Oモードは、I/Oを操作することではないということです。プログラマーは、I/Oポートの使用に先立ちSET_TRIS_x()関数でポートを入力か出力ポートかに設定します。SET_TRIS_x()関数は、バイト値を与え、'1'ならば入力、'0'ならば出力として値を構成します。 次にfastI/Oモードでは大変高速で次のようなコードになります。:
この場合、BSF6,0、BCF6,1というアセンブリ言語に変換します。マイクロ・プロセッサーはこれらのBSF、BCFのコードを実行する場合、ポートを読み込み、ビットを変更し、
そして書き戻します。この例では、BCFを実行した後、B0ピンの状態が保持されるとは限りません。
bsf、bcf命令では入力バッファからの読み込み後ビットの演算を行ないその後、出力ラッチへの出力と移行します。
よって参照される入力バッファの値により設定した通りの出力が得られない場合があります。standardやfixedI/Oでは
このような連続アクセスを行なわず、ピンの状態が安定するように次の様な命令に展開されます。:
delay_cycles(1)は単に2つのI/Oコマンドの間に1つのNOPを挿入します。従って、挿入されたディレイはNOPと
等しく20MHzのクロックで0.2uSとなります。
ポート外部に接続する回路によってはもう少しリカバリーを取らないといけない場合があるかもしれません。
例えば次の例ではポートBのRB7ポートを入力、他のポートを出力とするものです。:
set_tris_b( 0x80 );
output_high( PIN_B0 );
output_low( PIN_B1 );
output_high( PIN_B0 );
delay_cycles(1); //1命令時間ディレイ
output_high( PIN_B1 );