2023年9月15日の日記を表示中
2023年 9月15日 (金)
■PIC
前々からPICのコードを書いていて気になっていたことの1つに、GPIOを入力から出力に変えたとき、なぜかデフォルトで1になっている場合があるというのがあったりするんですが、PICのマニュアルをよく読んだら何か書いてありました。理解が間違っていなければ、以下のようです。
- GPIOの出力ポートの値をBCF命令もしくはBSF命令で1bitずつ変更する場合、GPIOからの出力用のデータを保持したラッチをRead-Modify-Writeをすることになる
- Read-Modify-WriteのReadのときに、GPIOに入力属性のポートがあると、そのポートについては外から入力されている値を読み込んでしまう (出力属性のポートは、出力している値が読み取られる?)
- Read-Modify-WriteのWriteによって、入力属性のポートから読み取った値が、出力用のデータを保持したラッチの、そのポートに対応したビットに設定される
- 後々になって、入力属性のポートを出力属性に変えると、上記でラッチに設定された値が初期値として出てしまう
これが正しいとするなら、GPIOを出力に変える際の初期値をコントロールするには、まず入力属性の状態のうちにそのポートの初期値を設定して、その上で、そのポートだけを出力に切り替えればよいのかな。必ず1ポートずつ操作する感じで。
■基板
これまでの実験結果などから考えると、CPS1の起動時キー書き込みをやってチキチキボーイズが起動しなくなるのは、CPS-A-01がデータバスに信号を流してくるタイミングで、PICが衝突回避のためにGPIOを入力に切り替えているからっぽいですね。その場合、こんな感じの波形が出てくるわけで、CPS-A-01によるバス操作が、(たとえ一瞬であっても)そのままCPS-B-21に認識されちゃうんだと思われます。
ていうか、普通に考えたらそうですよね。何でこれでいけると思ったんだっけ・・・(汗)。あー、当初はCPS-A-01がバスアクセスしている中でも起動時キー書き込みに成功していたからそう思ったのか。今考えてみると、あれはPICのGPIOを出力属性にしたままで、さらにデフォルトはLOWにして書き込んでいたから、そのタイミングでCPS-A-01がデータを流しても、バス上の信号はLOWのままとなり、影響を受けなかったということなのでは・・・。データをデフォルトHIGHにしたら不安定になって、クロックをデフォルトHIGHにしたらまったく起動しなくなったのも、これと辻褄が合いそうです。で、今回、律儀に衝突を避けるようにしたことで、CPS-A-01のアクセスが100% ノイズとして割り込むようになり、キー書き込みの前のロック解除すらうまくいかなくなった、みたいな。
PICのGPIOは出力にしたまま、デフォルトLOWとして、バスアクセスのタイミングだけCPS-A-01とずらすというやり方をすると衝突の影響を無効化できる可能性はありそうですが、多分電気的によろしくない状態ですよね。うーん、やはりバスに横付けする形の起動時キー書き込みは諦めて、当初のようにキー書き込み中はデータバスをBボードから切り離すことにすべきか。この1週間、何も得られなかったわけではないのが救いですが、かなり無駄なことにエネルギーを注いてでしまいましたな。はぁ。
[コメントを書く]
2023年9月15日の日記を表示中
[コメントを書く]