前回のブログではハイサイドスイッチ回路について書きました。今回はこのハイサイドスイッチボードを最大で8枚接続できる制御用ボードについてです。ステンシルを使ってペーストハンダを塗り、部品を置いてからオーブントースターでリフロー。今回は試作検討用なので1枚だけ。

ATmega328PBとRS-232C通信用のトランシーバ、I/Oエキスパンダ(MCP23S17)とトランジスタアレーが載っています。マイコンの発振回路は水晶は使わず16MHzのクロックオシレータです。(今後はこの組み合わせが基本になる予定。)リフロー終了後はプログラム書き込み用に最低限必要なDCジャックと5Vレギュレータ、プログラム書き込み用のピンヘッダだけを実装。プログラムは無事に書き込めたので、次にRS-232C用のDsubコネクタを実装。これでデバッグの準備が整いました。

色々とつなげてデバッグ開始。写真ではプログラマとRS-232C、ロジックアナライザ、ブレッドボード上のLEDとプッシュスイッチをつなげてあります。I/Oエキスパンダ(MCP23S17)を出力/入力の混在で使うのはおそらく今回が初めて。出力はさほど悩むことなく動くのですが、今回は入力の割り込み処理もあって確認が少し手間です。そこでロジックアナライザが登場するのですが初期設定からして何かおかしい。今回はSPIが2系統使えるATmega328PBなので、プログラム書き込み用のSPI0とは独立させたSPI1をハードウエアとして使用することにしましたが。動かすたびにMCP23S17のチップセレクト(イネーブル)が関係ないところでhigh-lowしたりする現象が発生。そのためか動作もおかしく悩むこと数時間。コンパイラのBASCOM-AVRのバグなのか。
万策尽きて?ハードSPIからソフトSPIに変更し、チップセレクトもSPIOUT/SPIINとは別に制御。(これならあえてSPIが2系統ある必要などなかったですね。)

上はロジックアナライザで見た初期設定の様子。上からMOSI、MISO、SCK、チップセレクト、そして入力ポートから発生させる割り込み信号のINTB。

これ(上)は初期設定の初めの部分を少し大きくしたもの。

ハイサイドスイッチ回路から過電流検出のfault信号が入ってくると、上の写真の一番下(Channel4)のINTBがLowに落ち、これをマイコンで割り込み信号として検出。次にChannel3のチップセレクトをLow(有効)にしてINTCAPBを読み込むとINTBはクリアされHighに戻る。次に出力ポートの制御ビットをLowに落としてハイサイドスイッチを切断するために制御信号をオフするためOLATAにAポートの出力データを書き込みというのが上の写真。ここも悩んだところで、はじめの構想ではプルアップされた入力ポートが過電流でLowに落ちる=比較用としてDEFVALBをHighに設定してあるので、ここで不一致となり割り込みが入る=というものだったのですが、割り込みは入るもののINTCAPB(あるいはGPIOB)を読み込んでもINTBがクリアされないというデータシートとは違う謎の現象。そこで比較一致はあきらめて状態変化割り込みで対応することに。これであると入力がLowになったときとLowからHighになったとき、どちらも割り込みが入ってしまいます。必要なのはLowに落ちたときだけなので割り込み検知後にINTCAPBを読み、その値がHighであれば処理しないという流れにして対応することにしました。(文章だけだとよくわかりませんね。)
そんなこんなでデバッグに丸一日程度かかりましたが、構想通りに動くようになりました。ハイサイドスイッチボードの改良版が届いたらこのボードとつなげて実機検討を再度行うことにします。今回はエキスパンダでこんなに悩むとは思いませんでした。まあ、これで入力/出力とも使えるというソフトウエア資産ができたので「めでたしめでたし」ということで。でも、データシート通りに設定しているはずなのに動かないのはなぜでしょうか。どこか理解していないところがあるのかも。